Facultatea Calculatoare, Informatic si Microelectronic
RAPORT Lucrare de laborator :1 Disciplina : Matematica Discret Tema: Pstrarea grafurilor in memoria calculatorului.
A elaborat: st. gr. ISBM-131 Moscalu Adrian
A verificat: Gheorghe Cebanu
Chisinu 2014 1)Scopul lucrrii: 1) Studierea metodelor de definire a unui graf : matricea de inciden, matricea de adiacen, liste. 2) Elaborarea unor proceduri de introducere , extragere si transformare a diferitelor forme de reprezentare intern a grafurilor cu scoaterea rezultatelor la display si imprimant. 2)Sarcina de baz: 1) De elaborat procedura de introducere a unui graf n memoria calculatorului n form de matrice de inciden, de matrice de adiacen i list de adiacen cu posibiliti de analiz a certitudinii. 2) De elaborat proceduri de transformare dintr-o form de reprezentare in alta. 3) Folosind procedurile enumerate ,de elaborat programul care va permite: >> introducerea grafului reprezentat sub oricare forma din cele trei forme cu posibiliti de corecie a datelor. >> pstrarea grafului n memoria extern n form de lista de adiacen. >> extragerea informaiei ntr-una dintre cele trei forme la imprimant i display. Teorie : Se numeste graf ansamblu format dintr-o multime finite X si o aplicatie F a lui X in X. Se noteaza G=(X,F). Numarul elementelor multimilor X determina ordinal grafului finit. Daca card X=n, graful G=(X,F) se numeste graf finit de ordinul n. Elementele multimii X se numesc varfurile grafului. Geometric, varfurile unui graf le reprezentam prin puncte sau cerculete. Perechea de varfuri (x,y) se numeste arc varful x se numeste originea sau extremitatea initiala a arcului (x,y) iar varful y se numeste extremitatea finala sau terminal. Un arc (x,y) il reprezentam geometric printr-o sageata orientate de la varful x la varful y. Daca un varf nu este extremitatea nici unui arc el se numeste varf izolat, iar daca este extremitatea a mai mult de doua arce- nod. Un arc (x,y) pentru care extremitatea initiala coincide cu cea finala se numeste bucla.Arcele unui graf le mai notam si cu u1,u2,..., iar multimea arcelor grafului o noatam cu U. Doua arce se numesc adiacente daca sunt distncte si au o extremitate comuna.Doua varfuri se numesc adiacente daca sunt distinct si sunt unite prtr-un arc. Un arc (x,y) se spune ca este incident cu virful x spre exterior si este incident cu varful y spre interior.
3) Continutul programului : #include"stdlib.h" #include"conio.h" #include"iostream.h" #include"fstream.h" main( ){ system("cls"); ofstream out("date.txt"); float A[20][20]; int AA[20]; int BB[20]; int z,t,i,j,n,p=0,b,o,k,r,s,k1,r1,nm,w,po,pp,d,ee=0; cout<<"\n\n\t\t Lucrare de laborator nr.1 la Matematica discreta"; cout<<"\n Dati nr. de varfuri: "; out<<"\n Dati nr. de varfuri: "; cin>>n; out<<n; n=n+1; cout<<"\n Introducem legaturile dintre virfuri:\n"; out<<"\n Introducem legaturile dintre virfuri:\n"; for(i=1;i<n;i++){ for(j=1;j<n;j++) { cout<<"x"<<i<<"x"<<j<<" "; out<<"x"<<i<<"x"<<j<<" "; cin>>A[i][j]; out<<A[i][j]; }} eticheta: n=n+ee; ee=0; cout<<"\n Optiuni disponibile:\n-------------------------------------------"; out<<"\n Optiuni disponibile:\n-------------------------------------------"; cout<<"\n 1) Vezi matriciea de adiacenta."; out<<"\n 1) Vezi matriciea de adiacenta."; out<<"\n 2) Vezi matriciea de incidenta."; cout<<"\n 2) Vezi matriciea de incidenta."; out<<"\n 3) Vezi lista de adiacenta."; cout<<"\n 3) Vezi lista de adiacenta."; out<<"\n 4) Modifica legaturile intre virfuri."; cout<<"\n 4) Modifica legaturile intre virfuri."; out<<"\n 5) Adauga un varf si laturile comune cu el."; cout<<"\n 5) Adauga un varf si laturile comune cu el."; out<<"\n 6) Evita un varf."; cout<<"\n 6) Evita un varf."; cout<<"\n 7) Iesire.\n-------------------------------------------"; out<<"\n 7) Iesire.\n-------------------------------------------"; out<<"\n Alege optiunea dorita:"; cout<<"\n Alege optiunea dorita:\n"; cin>>nm; out<<nm; switch(nm) {case 1 : { cout<<"\n\n Matricea de adiacenta este:\n"; out<<"\n\n Matricea de adiacenta este:\n"; cout<<" | "; out<<" | "; for(r=1;r<n;r++){ cout<<"x"<<r<<" | "; out<<"x"<<r<<" | ";} for(i=1;i<n;i++){ cout<<"\n"; out<<"\n"; cout<<"====="; out<<"====="; for(k=1;k<n;k++){cout<<"=====";out<<"=====";} cout<<"\nx"<<i<<" | "; out<<"\nx"<<i<<" | "; for(j=1;j<n;j++){ cout<<A[i][j]<<" | " ;out<<A[i][j]<<" | " ;}} cout<<"\nDoriti sa alegeti alta optiune ? Daca da atunci tastati 0: "; out<<"\nDoriti sa alegeti alta optiune ? Daca da atunci tastati 0: "; cin>>w; out<<w; if(w==1){ return 0;} if(w!=1){system("cls"); goto eticheta;}} case 3 : {cout<<"\n\n\nLista este :"; out<<"\n\n\nLista este :"; for(i=1;i<n;i++){ out<<"\nx"<<i<<" | "; cout<<"\nx"<<i<<" | "; for(j=1;j<n;j++){ if(A[i][j]!=0){ out<<j<<" " ;cout<<j<<" " ;}} out<<"0";cout<<"0";} out<<"\nDoriti sa alegeti alta optiune ? Daca da atunci tastati 0: "; cout<<"\nDoriti sa alegeti alta optiune ? Daca da atunci tastati 0: "; cin>>w; out<<w; if(w==1){ return 0;} if(w!=1){system("cls"); goto eticheta;}} case 2 :{ cout<<"\n\Matricea de incidenta este:\n"; out<<"\n\Matricea de incidenta este:\n"; k=0; p=0; for(i=1;i<n;i++){ for(j=1;j<n;j++){ if(A[i][j]!=0){ k++; AA[k]=i; BB[k]=j; p++;}} } cout<<" "<<" | "; out<<" "<<" | ";k=0; for(o=1;o<n;o++){ cout<<" x"<<o<<" | "; out<<" x"<<o<<" | ";} for(s=1;s<p+1;s++){ k++; cout<<"\n"; out<<"\n"; for(o=1;o<n+1;o++){ cout<<"====="; out<<"=====";} cout<<"\nu"<<s<<" | "; out<<"\nu"<<s<<" | ";b=0; k1=AA[k]; r1=BB[k]; for(o=1;o<n;o++){ if(k1==r1){if(k1==o){b=2;}if(k1!=o){b=0;}} if(k1!=r1){if(k1==o){b=-1;}if(k1!=o){b=0;}if(r1==o){b=1;}} if(b<0) {cout<< b<<" | "; out<< b<<" | ";} if(b>=0){ cout<<" "<<b<<" | "; out<<" "<<b<<" | ";}}} cout<<"\nDoriti sa alegeti alta optiune ? Daca da atunci tastati 0:"; out<<"\nDoriti sa alegeti alta optiune ? Daca da atunci tastati 0:"; cin>>w; out<<w; if(w==1){return 0;} if(w!=1){system("cls"); goto eticheta;}} case 4: {cout<<"\n Alege virfurile la care vrei sa faci modificari:\n"; cin>>po; cin>>pp; i=po; j=pp; cout<<"Dam valoarea noua a legaturii : "; cout<<"x"<<i<<"x"<<j; cin>>A[i][j]; system("cls"); goto eticheta;} case 5: {for(i=n;i<n+1;i++){ for(j=1;j<n+1;j++) { cout<<"x"<<i<<"x"<<j<<" "; cin>>A[i][j];}} for(i=1;i<n;i++){ for(j=n;j<n+1;j++) { cout<<"x"<<i<<"x"<<j<<" "; cin>>A[i][j];}} ee=1; goto eticheta; } case 7: {cout<<"Lucrare efectuata de Moscalu Adrian .Tastati 1 pentru e iesi defenitiv :"; cin>>w; if(w==1){ return 0;} if(w!=0){ system("cls"); goto eticheta;} } case 6: { cout<<" Indicati virful care doriti sa fie evitat:"; cin>>d; i=d; for(j=1;j<n;j++) { A[i][j]=NULL;} j=d; for(i=1;i<n;i++); { A[i][j]=NULL;} goto eticheta; } default: {system("cls"); cout<<"Alegeti optiunea necesara:"; goto eticheta; } } out.close(); return 0;}
Remarca : Programul contine o eroare : La eliminarea unui virf se elimin legaturile lui si virful astfel la indeplinirea punctului 6 matricea de incidenta , de adiacenta si lista de adiacenta se prezinta cu erori !