среда, 4 декабря 2013 г.

c++

/*Problema 17 - Metoda 1
Se da un graf neorientat cu n noduri.  Numarul de noduri si muchiile grafului se citesc din fisierul "graf.txt".
Sa se verifice daca graful este complet si sa se afiseze un mesaj adecvat.
Daca graful nu este complet si se afiseaza muchiile care ar trebui adaugate astfel  оncвt  graful sa devina complet.
Exemplu: Daca fisierul "graf.txt" are urmatorul continut:
5
1 3
1 4
1 5
2 4
3 5
Se va afisa mesajul "Graful nu este complet" dupa care se vor afisa muchiile lipsa:
1 2
2 3
2 5
3 4
4 5
*/

#include<iostream.h>
#include<fstream.h>
ifstream f("graf.txt");

int n,m,i,j,a[10][10];//m nr de muchii

void citeste()
{
//citesc numarul de noduri n
f>>n;
//initializez matricea de adiacenta cu 0
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               a[i][j]=0;

//citesc muchiile din fisierul de intrare graf.txt
while(!f.eof())
{
int m=0;//numar cate muchii are graful
f>>i>>j;//citesc muchia
a[i][j]=a[j][i]=1;
if(a[i][j]==1)
                m++;
//completez matricea de adiacenta cu valori de 1 acolo unde exista muchii
}
}

void matrice_adiacenta()
{
int i,j;
cout<<"Matricea de adiacenta este:"<<endl;
for(i=1;i<=n;i++)
{
                for(j=1;j<=n;j++)
                               cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}

//Un graf este complet daca numarul de muchii este egal cu n*(n-1)/2
void graf_complet()
{
if(m==n*(n-1)/2)
                cout<<"Graful este complet";
else
                cout<<"Graful nu este complet";
cout<<endl;
}

void muchii_lipsa()
{
//parcurg matricea de adiacenta de deasupra diagonalei principale
cout<<"Muchiile care lipsesc pentru ca graful sa devina complet sunt: "<<endl;
for(i=1;i<=n-1;i++)
                for(j=i+1;j<=n;j++)
                               if(a[i][j]==0)
                                               cout<<i<<" "<<j<<endl;
               

}

int main()
{
citeste();
matrice_adiacenta();
graf_complet();
muchii_lipsa();
return 0;
f.close();
}



/*Problema 18
Se da un graf neorientat cu n noduri.  Numarul de noduri si muchiile grafului se citesc din fisierul „graf.txt”.
Sa se verifice daca graful este regulat. In situatia in care graful nu este regulat sa se afiseze nodurile terminale
si numarul de noduri izolate. (Un graf neorientat se numeste regulat daca toate nodurile sale au acelasi grad).
Exemplu: Daca fisierul „graf.txt” are urmatorul continut:
5
1 3
1 5
2 4
3 5
Se va afisa mesajul “Graful nu este regulat” dupa care se vor afisa nodurile terminale: 2, 4 si numarul de noduri izolate: 0 */

#include<iostream.h>
#include<fstream.h>
ifstream f("graf.txt");

int n,a[10][10];

void citeste()
{
int i,j;
f>>n;//citesc numarul de noduri din fisier
//initializez matricea de adiacenta cu 0
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               a[i][j]=0;
//citesc muchiile din fisier
while(!f.eof())//cat timp nu s-a ajuns la sfarsitul fisierului
{
f>>i>>j;
a[i][j]=a[j][i]=1;
}
f.close();
}


void afisare_matrice_adiacenta()
{
int i,j;
for(i=1;i<=n;i++)
{
                for(j=1;j<=n;j++)
                                cout<<a[i][j]<<" ";

cout<<endl;
}
cout<<endl;
}

//determin gradul unui nod x
int grad(int x)
{
int i,gr=0;
                for(i=1;i<=n;i++)
                if(a[i][x]==1)
                               gr++;
return gr;
}

//verific daca graful este regulat
//Un graf neorientat se numeste regulat daca toate nodurile sale au acelasi grad
int regulat()
{
int i,g,ok=1;//pp ca graful e regulat
g=grad(1);//determin gradul primului nod in vederea compararii cu celelalte
//daca toate sunt egale cu gradul primului nod atunci graful este regulat
for(i=1;i<=n;i++)
                if(g!=grad(i))
                               ok=0;//noduri cu grade diferite
return ok;          
}

void afisare_regulat()
{
if(regulat()==1)
                cout<<"\nGraful este regulat";
else
                cout<<"\nGraful nu este regulat";
}

void noduri_terminale()
{
int i;
cout<<"\nNodurile terminale sunt: ";
for(i=1;i<=n;i++)
       if(grad(i)==1)
                                  cout<<i<<" ";
}

void noduri_izolate()
{
int i,nr=0;
for(i=1;i<=n;i++)
                if(grad(i)==0)
                               nr++;
cout<<"\nNumarul nodurilor izolate este "<<nr;
}

int main()
{
citeste();
afisare_matrice_adiacenta();
afisare_regulat();
noduri_terminale();
noduri_izolate();
return 0;
}

/*
Fisierul text „graf.in” contine pe prima linie un numar natural n reprezentand numarul de varfuri ale unui graf neorientat,
 iar pe fiecare din urmatoarele n randuri cate n valori de 0 si 1 separate prin spatii, reprezentand elementele unei linii a matricei de adiacenta corespunzatoare grafului.
a)Sa se scrie o functie grad ce primeste ca parametru un numar natural x si returneaza gradul varfului x.
b)Sa se scrie programul C++ care citeste datele din fisier si care afiseaza in fisirul text „graf.out”, pe primul rand, separate
prin cate un spatiu varfurile terminale ale grafului, sau mesajul „Nu exista”, daca in graf nu sunt varfuri terminale, folosind apeluri
utile ale subprogramului grad.

Exemplu: Daca fisierul ”graf.in”  are forma:
     5
     0 0 1 0 1
     0 0 0 1 1
     1 0 0 0 0
     0 1 0 0 0
     1 1 0 0 0 
atunci fisierul „graf.out” va contine numerele 3 si 4.
*/


#include<fstream.h>
ifstream f("graf.in");
ofstream g("graf.out");

int k,n,a[10][10],d[10],i,j;

void citeste()
{
//citesc numarul de noduri
f>>n;
//citesc matricea de adiacenta din fisier              
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               f>>a[i][j];
f.close();
}

void scrie()
{
g<<"Matricea de adiacenta este:";
g<<"\n";
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
                g<<a[i][j]<<" ";
g<<"\n";
}
g<<"\n";
}

int grad(int x)
{
int gr=0;
for(j=1;j<=n;j++)
                if(a[x][j]==1)
                               gr++;
return gr;
}0


void varf_terminal()
{
int gasit=0;//pp ca nu sunt noduri terminale
g<<"\nVarfurile terminale sunt: ";
for(i=1;i<=n;i++)
                if(grad(i)==1)
                               {
                               g<<i<<" ";
                               gasit=1;
                               };
                if(gasit==0)
                               g<<"Nu exista varfuri terminale in graf!";

}

int main()
{
citeste();
scrie();
varf_terminal();
return 0;
}
/*
Fisierul text "muchii.txt" contine pe prima linie un numar natural n reprezentвnd numarul de vвrfuri ale unui graf neorientat, pe al doilea
rвnd un numar natural m reprezentвnd numarul de munchii ale unui graf neorientat, iar pe fiecare din urmatoarele m rвnduri cвte doua
 numere naturale, separate pritr-un spatiu, reprezantвnd extremitatile unei muchii a grafului.
a)            Sa se scrie o functie grad ce primeste ca parametru un numar natural x si returneaza gradul vвrfului x.
b)           Sa se scrie programul C++ care citeste datele din fisier, construieste matricea de adiacenta asociata grafului, si care afiseaza
 оn fisirul text "grade.txt", separate prin cвte un spatiu vвrfurile de grad maxim ale grafului, folosind apeluri utile ale subprogramului grad.

Exemplu: Daca fisierul "muchii.txt"  are forma:
     5
     6
     1 2
     2 3
     2 4
     3 4
     3 5
     4 5
atunci fisierul "grade.txt" va contine numerele 2, 3 si 4.

Descriere solutie
Gradul unui vвrf x reprezinta numarul muchiilor incidente cu vвrful x.
Pentru determinarea vвrfurilor de grad maxim se memoreaza gradele vвrfurilor оntr-un vector, fiecare element d[i]
a vectorului va memora gradul vвrfului i. Se determine elementul maxim din vector, apoi se afiseaza pozitiile ocupate
оn vector de valoarea maxima.
*/

#include<fstream.h>
ifstream f("muchii.txt");
ofstream g("grade.txt");

int n,m,i,j,a[10][10],d[20];

void citeste()
{
int k;
f>>n>>m;//citesc numarul de vrfuri si numarul de muchii din fisier
//initializez matricea de adiacenta cu 0
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               a[i][j]=0;
//incrementez vectorul gradelor cu 0
for(k=1;k<=m;k++)
                d[k]=0;
//citesc muchiile din fisier si construiesc matricea de adiacenta
for(k=1;k<=m;k++)       
                {
                f>>i>>j;
                a[i][j]=1;a[j][i]=1;
                d[i]++;d[j]++;
                }
}

void afisare_vector_grade()
{
g<<"Vectorul gradelor este:";
for(i=1;i<=n;i++)
                g<<d[i]<<" ";
g<<"\n";
}


void afisare_matrice()
{
g<<"\nMatricea de adiacenta este:";
g<<"\n";
for(i=1;i<=n;i++)
                {
                for(j=1;j<=n;j++)
                               g<<a[i][j]<<" ";
                g<<"\n";
                }
g<<"\n";
}

//determin maxim din vectorul gradelor
int grad_max()
{
int max;
max=d[1];
for(i=2;i<=n;i++)
                if(d[i]>max)
                               max=d[i];
return max;
}

//afisez nodurile de grad maxim
void afisare_grad_max()
{
int k;
g<<"\nVarfurile cu grad maxim sunt:";
for(k=1;k<=n;k++)
                if(d[k]==grad_max())
                               g<<k<<" ";
}


int main()
{
citeste();
afisare_vector_grade();
afisare_matrice();
g<<"Gradul maxim este:"<<grad_max();
afisare_grad_max();
return 0;
}

#include<fstream.h>
ifstream f("adiacenta.in");
ofstream g("noduri.out");

int n,a[10][10];

void citeste()
{
int i,j;
f>>n;
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               f>>a[i][j];
f.close();
}


//Gradul extern al unui nod x reprezinta numarul arcelor care ies din nodul  x
int grad_extern(int x)
{
int j,gr=0;
for(j=1;j<=n;j++)
                if(a[x][j]==1)
                               gr++;
return gr;
}


//gradul intern al unui nod x reprezinta numarul arcelor care intra оn nodul x (segmentul x ------ j)
int grad_intern(int x)
{
int i,gr=0;
for(i=1;i<=n;i++)
                if(a[i][x]==1)
                               gr++;
return gr;
}

void afisare_grad()
{
int i;
g<<"Nodurile care au gradul intern egal cu gradul extern sunt:";
for(i=1;i<=n;i++)
                if(grad_intern(i)==grad_extern(i))
                               g<<i<<" ";
                              
}

int main()
{
citeste();
afisare_grad();
g.close();
return 0;
}

/*
Problema 26
Fi?ierul text "arce.txt" con?ine pe prima linie un num?r natural n reprezentвnd num?rul de noduri ale unui graf orientat, pe al doilea rвnd un num?r natural m reprezentвnd num?rul de arce ale unui graf orientat, iar pe fiecare din urm?toarele m rвnduri cвte dou? numere naturale separate prin spa?ii, reprezentвnd arcele corespunz?toare unui graf orientat.
a)            S? se scrie o func?ie grad_intern ce prime?te ca parametru un num?r natural x ?i returneaz? gradul intern al nodului x.
Func?ia grad_extern prime?te ca parametru un num?r natural x ?i returneaz? gradul extern al nodului x.
b)           S? se scrie programul C++ care cite?te datele din fi?ier, construie?te matricea de adiacen?? asociat? grafului, ?i care afi?eaz? оn fi?irul text "izolate.txt", separate prin cвte un spa?iu nodurile izolate ale grafului, sau mesajul "Nu exist?", dac? оn graf nu sunt noduri izolate, folosind apeluri utile ale subprogramelor grad_intern ?i grad_extern.

Exemplu: Dac? fi?ierul "arce.txt"  are forma:
     5
     3
     1 2
     2 1
     2 4
atunci fi?ierul "izolate.txt" va con?ine numerele 3 ?i 5.

*/

#include<fstream.h>
ifstream f("arce.txt");
ofstream g("izolate.txt");

int n,m,a[20][20];

void citeste()
{
int i,j,k;
f>>n>>m;//citesc numarul de vrfuri si numarul de muchii din fisier
//initializez matricea de adiacenta cu 0
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               a[i][j]=0;

//citesc muchiile din fisier si construiesc matricea de adiacenta
for(k=1;k<=m;k++)       
                {
                f>>i>>j;
                a[i][j]=1;
                }
}

//cerinta a)
int grad_extern(int x)
{
    int j,k=0;
    for(j=1;j<=n;j++)
        k=k+a[x][j];
    return k;
}
//cerinta a)
int grad_intern(int x)
{
    int i,k=0;
    for(i=1;i<=n;i++)
        k=k+a[i][x];
    return k;
}

void afisare_matrice()
{
int i,j;
g<<"Matricea de adiacenta este:";
g<<"\n";
for(i=1;i<=n;i++)
                {
                for(j=1;j<=n;j++)
                               g<<a[i][j]<<" ";
                g<<"\n";
                }
g<<"\n";
}
void afisare_grade_izolate()
{
                int i,ok=0;//pp ca nu exista noduri izolate
                g<<"Nodurile izolate ale grafului sunt:";
for(i=1;i<=n;i++)
                if(grad_extern(i)==0&&grad_intern(i)==0)
                               {
                               g<<i<<" ";ok=1;//am gasit un nod izolat}
                }
                if(ok==0)
                               g<<"Nu exista!";
}

int main()
{
                citeste();
                afisare_matrice();
                afisare_grade_izolate();
    f.close();
    g.close();
    return 0;
}

/*Problema 27.
Se citesc numere naturale din fisierul text "numere.txt".
Sa se afiseze numerele care au proprietatea de palindrom (numarul citit de la dreapta la stвnga este egal
cu numarul citit de la sвnga la dreapta) si suma cifrelor sa fie para. Se vor folosi: un subprogram palin care va implementa
un algoritm de determinare a proprietatii de numar palindrom si un subprogram care sa calculeze suma cifrelor unui numar natural.
Exemplu: Pentru numerele 12, 12321, 565, 45, 18, 121 se va afisa  565, 121.
*/


#include<fstream.h>
ifstream f("numere.txt");
ofstream g("numere.out");

int v[10],n,i;

void citeste()
{
i=1,n=0;
while(!f.eof())
{
f>>v[i];i++;n++;
}
}

int nrinv(int n)
{
int ninv=0;
while(n!=0)
{
ninv=ninv*10+n%10;
n=n/10;
}
return ninv;
}

int suma_cifre(int n)
{
int s=0;
while(n!=0)
{
s=s+n%10;
n=n/10;
}
return s;
}

void palin()
{
g<<"Numerele palindrom cu suma cifrelor para sunt: ";
for(i=1;i<n;i++)
                if(v[i]==nrinv(v[i])&&suma_cifre(v[i])%2==0)
                               g<<v[i]<<" ";    
}

int main()
{
citeste();
palin();
return 0;
}

#include<fstream.h>
#include<math.h>
ifstream f("date.in");
ofstream g("date.out");

int n,i,j,a[10][10];

void citeste()
{
f>>n;
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               f>>a[i][j];
f.close();
}

void afisare_matrice()
{
g<<"\nMatricea este: "<<"\n";
for(i=1;i<=n;i++)
                {
                for(j=1;j<=n;j++)
                               g<<a[i][j]<<" ";
                g<<"\n";
                }
}

int nrprim(int n)
{
int d,prim=1;//pp ca nr este prim
for(d=2;d<=sqrt(n);d++)
                if(n%d==1)
                               prim=0;
return prim;
}
 
void afisare_prime()
{
int s=0,k=0;
g<<"Numerele prime de deasupra diagonalei principale sunt:";
for(i=1;i<=n-1;i++)
                for(j=i+1;j<=n;j++)
                               if(nrprim(a[i][j]==1)&&(a[i][j]>0)&&(a[i][j]!=1))
                                               {
                                               g<<a[i][j]<<" ";
                                               k++;//numar elementele prime
                                               s=s+a[i][j];//construiesc suma elementelor prime
                                               }
g<<"\nMedia aritmetica a numerelor prime aflate deasupra diagonalei principale este "<<float(s)/k<<".";                      
}

int main()
{
citeste();
afisare_matrice();
afisare_prime();
f.close();
g.close();
return 0;
}

#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");

int a[10][10], n,i,j;

void citeste()
{
for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                               f>>a[i][j];
}

int nrinv(int n)
{
int ninv=0;
while(n)
{
ninv=ninv*10+n%10;
n=n/10;
}
return ninv;
}

void palindrom()
{
int nr=0;
for(i=1;i<=n-1;i++)
                for(j=1;j<=n-1;j++)
                               if(i+j<n+1&&nrinv(a[i][j])==a[i][j])
                               nr++;
if(nr)
                g<<nr;
else
                g<<"Nu exista!";
}

int main()
{
f>>n;
if(n>=1&&n<=50)
{
citeste();
palindrom();
}
else
                g<<"Numarul "<<n<<" nu respecta restrictia problemei!";
return 0;

}

Комментариев нет:

Отправить комментарий