Sunteți pe pagina 1din 10

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei Facultatea de Calculatoare, Informatic i Microelectronic

R !"RT #
la disciplina $Matematica %iscret& Tema' &!strarea (rafurilor )n memoria calculatorului&

efectuat studentul (rupei C*#+#' Ceban %umitru veri,cat profesorul ' %ohotaru -eonid

Chiinu ./#0

1e numete (raf, ansamblul format dintr*o mulime ,nit X i o aplicaie F a lui X )n Y 2 1e notea3 G=(X,F). 4umrul elementelor mulimii X determin ordinul (rafului ,nit2 %ac card X = n , (raful G = (X,F) se numete graf finit de ordin n 2 Elementele mulimii X se numesc vrfurile (rafului2 5eometric, v)rfurile unui (raf le repre3entm prin puncte sau cerculee2 !erechea de v)rfuri 67,89 se numete arc 2 :)rful x se numete ori(inea sau e7tremitatea iniial a arcului 67,89 iar v)rful y se numete e7tremitatea ,nal sau terminal2 Un arc 67,89 )l repre3entm (eometric printr*o s(eat de la v)rful x la v)rful y2 E7ist trei metode de ba3 de de,nire a unui (raf' #2 Matricea de inciden;< .2 Matricea de adiacen;< +2 -ista de adiacen; 6inciden;92 Matricea de inciden; Este o matrice de tipul m7n, )n care m este numrul de muchii sau arce 6pentru un (raf orientat9, iar n este numrul v=rfurilor2 -a intersec;ia liniei i cu coloana > se vor considera valori de / sau # )n conformitate cu urmtoarea re(ul' # * dac muchia i este incident cu v=rful > 6dac arcul i ?intr? )n v=rful > )n ca3ul unui (raf orientat9< / * dac muchia 6arcul9 i @i v=rful > nu sunt incidente< *# * numai pentru (rafuri orientate, dac arcul i ?iese? din v=rful >2 x1 u1 u2 u3 u4 u5 u6 u7 u8 -1 -1 0 0 0 0 0 x2 0 0 0 0 -1 -1 -1 x3 1 0 0 -1 1 0 0 x4 0 1 -1 0 0 0 0 x5 0 0 0 0 0 1 0 x6 0 0 0 0 0 0 1 x7 0 0 1 1 0 0 0 0

0 0 -1 0 0 1 Fi(2# E7emplu de matrice de inciden

Este u@or de observat c aceast metod este de o e,cacitate mic )n sensul utili3rii memoriei calculatorului' ,ecare linie con;ine doar dou elemente diferite de 3ero 6o muchie poate , incident cu nu mai mult de dou v=rfuri92 Matricea de adiacen; Este o matrice ptrat n7n, aici n este numrul de v=rfuri2 Fiecare element poate , /, dac v=rfurile respective nu sunt adiacente, sau #, )n ca3 contrar2 !entru un (raf fr bucle putem observa urmtoarele' dia(onala principal este format numai din 3erouri<

pentru (rafuri neorientate matricea este simetric fa; de dia(onala principal2 x1 x1 x2 x3 x4 x5 x6 x7 0 0 0 0 0 0 x2 0 0 0 0 0 0 x3 1 1 0 0 0 0 x4 1 0 0 0 0 0 x5 0 1 0 0 0 0 x6 0 1 1 0 0 0 x7 0 0 1 1 0 0 0

0 0 0 0 0 0 Fi(2# E7emplu de matrice de adiacen

1e observ c @i )n acest ca3 memoria calculatorului este utili3at nu prea e,cace din care cau3 matricea de adiacen; ca @i matricea de inciden; se vor utili3a de obicei doar )n ca3ul )n care se va re3olva o problem concret pentru care repre3entarea (rafului )n aceast form aduce unele facilit;i al(oritmului respectiv2 -ista de adiacen; -ista de adiacen; este o list cu n linii 6dup numrul de v=rfuri n9, )n linia cu numrul i vor , scrise numerele v=rfurilor adiacente cu v=rful i2 Repre3entarea (rafurilor prin intermediul acestor liste permite utili3area mai e,cace a memoriei calculatorului, )ns aceste forme sunt mai complicate at=t )n reali3are, c=t @i )n timpul procesrii2 !entru a lua )n considera;ie lun(imea variabil a liniilor vor , utili3ate variabile dinamice @i pointeri2 1copul -ucrrii' %e elaborat un pro(ram cu meniu pentru ' #2 introducerea (rafului )n toate cele trei forme* matricea de adiacen;, matricea de inciden; @i lista de adiacen; .2 convertirea (rafului dintr*o form )n alta2 -istin(ul !ro(ramului' #include <stdio.h> #include <stdlib.h> #include <string.h> #define p1 printf("Cite arce are graful dvs: "); #define s1 scanf("%d",&u); #define p2 printf("Cite virfuri exista in graful dvs: "); #define s2 scanf("%d",&x); typedef struct{ int inc; int sfr;} arc; //functia pentru alocarea a memoriei dinamice int** aloc(int n,int m){ int **vect=NULL; int i; vect=(int**)malloc(n*sizeof(int*));

if(vect==NULL) return vect; for(i=0;i<n;i++){ vect[i]=(int*)malloc(m*sizeof(int)); if(vect[i]==NULL) return NULL; } return vect; } //functia pentru eliberarea a memoriei dinamice int** freemem(int **vect,int n){ int i; if(vect==NULL) return vect; for(i=0;i<n;i++) free(vect[i]); free(vect);vect=NULL; return vect; } //functia pentru introducere manuala a arcelor void COMANDA1(arc *a,int u,int x){ int i; for(i=0;i<u;i++){ in:system("cls"); printf("Introdu datele arcului %d\n",i+1); printf("Inceputul lui: X"); scanf("%d",&a[i].inc); printf("Sfirsitul lui: X"); scanf("%d",&a[i].sfr); if(!(a[i].inc >=1 && a[i].inc <= x && a[i].sfr >=1 && a[i].sfr <= x)) { printf("\a\nAti introdus virfuri care nu exista!\nIncercati din nou\n\n"); system("pause"); goto in; } } } //functia pentru introducere manuala a matricei de incidenta void COMANDA2(int **tab_1,int u,int x){ int i,j; for(i=0;i<u;i++){ printf("Matricea de Incidenta:\n"); printf("Rindul %d\n\n",i+1); for(j=0;j<x;j++){ er: printf("[U%d][X%d]=",i+1,j+1); scanf("%d",&tab_1[i][j]); if(!(tab_1[i][j]>=-1 && tab_1[i][j]<=2)){ printf("\a\n\nMatricea de Incidenta poate sa contina doar ( -1, 0 , 1, 2 )\n"); printf("Incercati din nou!\n"); system("pause"); system("cls"); goto er; } } system("cls"); } printf("Introducerea sa efectuat cu succes!\a\n"); } //functia pentru introducere manuala a matricei de adiacenta void COMANDA3(int **tab_2,int x){ int i,j; for(i=0;i<x;i++){ printf("Matricea de Adiacenta:\n"); printf("Rindul %d\n\n",i+1); for(j=0;j<x;j++){ printf("[X%d][X%d]=",i+1,j+1); scanf("%d",&tab_2[i][j]); } system("cls"); } printf("Introducerea sa efectuat cu succes!\a\n"); }

//functia pentru introducere manuala a listei de adiacenta void COMANDA4(int **tab_3,int x){int i,j; for(i=0;i<x;i++){ printf("Lista de Adiacenta:\n"); printf("Rindul %d\n\n",i+1); printf("%d\n-\n",i+1); tab_3[i][0]=i+1; for(j=1;j<x+2;j++){ scanf("%d",&tab_3[i][j]); if(tab_3[i][j] == 0) break; } system("cls"); } printf("Introducerea sa efectuat cu succes!\a\n"); } //functia matrice de incidenta --> arce void INCIDENTA_ARC(arc *a,int **tab_1,int u,int x){ int i,j; for(i=0;i<u;i++){ for(j=0;j<x;j++){ if(tab_1[i][j]==-1) a[i].inc=j+1;if(tab_1[i][j]==1) a[i].sfr=j+1; if(tab_1[i][j]==2){ a[i].inc=j+1; a[i].sfr=j+1;} } } } //functia matrice de adiacenta --> arce void ADIACENTA_ARC(arc *a,int **tab_2,int x){ int i,j,l=0; for(i=0;i<x;i++){ for(j=0;j<x;j++){ if(tab_2[i][j]==1){ a[l].inc=i+1; a[l].sfr=j+1; l++;} } } } //functia lista de adiacenta --> arce void lISTA_ARC(arc *a,int **tab_3,int x){ int i,j,l=0; for(i=0;i<x;i++){ for(j=1;j<x+2;j++){ if(tab_3[i][j]!=0){ a[l].inc=i+1; a[l].sfr=tab_3[i][j]; l++;} else break;} } } //functia pentru afisarea arcelor void AFISARE_1(arc *a,int u){ int i; for(i=0;i<u;i++){ printf("Datele arcului %d\n",i+1); printf(" X%d --> X%d\n\n",a[i].inc,a[i].sfr); } } //functia pentru afisarea matricelor void AFISARE_2(int **vect,int n, int m){ int i,j; for(i=0;i<n;i++){ for(j=0;j<m;j++) printf("\t%d",vect[i][j]); printf("\n\n"); } } //functia pentru afisarea listei void AFISARE_LISTA(int **vect,int n,int m){ int i,j; for(i=0;i<n;i++){ printf("%d |",vect[i][0]); for(j=1;j<m;j++){ printf(" %d",vect[i][j]);

if(vect[i][j]==0) break; } printf("\n\n"); } } //functia pentru matricea de incidenta void MATRICEA_INCIDENTA(arc *a,int **vect,int u,int x){int i,j; for(i=0;i<u;i++){for(j=0;j<x;j++){ if(a[i].inc==a[i].sfr && a[i].inc==j+1) vect[i][j]=2; else if(a[i].inc==j+1) vect[i][j]=-1; else if(a[i].sfr==j+1) vect[i][j]=1; else vect[i][j]=0; } } } //functia pentru matricea de adiacenta void MATRICEA_ADIACENTA(arc *a,int **vect,int u,int x){ int i,j,l,k=0; for(i=0;i<x;i++){ for(j=0;j<x;j++){ for(l=0;l<u;l++){ if(a[l].inc==i+1 && a[l].sfr==j+1){ vect[i][j]=1; k++; }} if(!k) vect[i][j]=0; k=0; } } } //functia pentru lista de incidenta void LISTA_INCIDENTA(arc *a,int **tab_3,int u,int x){int i,j,l,k=1; for(i=0;i<x;i++){ tab_3[i][0]=i+1; k=1; for(j=1;j<x+1;j++){ for(l=0;l<u;l++){ if(a[l].inc==i+1 && a[l].sfr==j){ tab_3[i][k]=j; k++; } } } tab_3[i][k]=0; } } //functia pentru modificare a datelor arcelor void MODIFICARE(arc *a,int ar){ printf("Datele arcului %d",ar); printf(" X%d --> X%d\n\n",a[ar-1].inc,a[ar-1].sfr); printf("Inceputul lui: X"); scanf("%d",&a[ar-1].inc); printf("Sfirsitul lui: X"); scanf("%d",&a[ar-1].sfr); } / ********************************************************************* ***************/ int main(){ arc *a=NULL; //tablou unidimensional de tip structura pentru arce int **tab_1=NULL,**tab_2=NULL,**tab_3=NULL; //tablou bidimensional pentru matrice int i,u=0,x=0,ar,m=1; int comanda1,comanda2,comanda3; char filename[20]; while(1){ /*

Meniul pentru introducere a datelor */ while(m){ m=0; system("cls"); printf("[ 1 ] Introduceti arcele\n"); printf("[ 2 ] Introduceti matricea de incidenta\n"); printf("[ 3 ] Introduceti matricea de adiacenta\n"); printf("[ 4 ] Introduceti lista de adiacenta\n"); printf("[ 0 ] Iesire\n"); printf("\nEu aleg >> "); scanf("%d",&comanda1); system("cls"); switch(comanda1){ case 0: exit(0); break; case 1: p1 s1 p2 s2 system("cls"); a=(arc*)malloc(u*sizeof(arc)); COMANDA1(a,u,x); break; case 2: p1 s1 p2 s2 system("cls"); tab_1=aloc(u,x); COMANDA2(tab_1,u,x); break; case 3: p1 s1 p2 s2 system("cls"); tab_2=aloc(x,x); COMANDA3(tab_2,x); break; case 4: p1 s1 p2 s2 system("cls"); tab_3=aloc(x,x+2); COMANDA4(tab_3,x); break;} if(a==NULL){ a=(arc*)malloc(u*sizeof(arc)); if(tab_1!=NULL) INCIDENTA_ARC(a,tab_1,u,x); //convertarea din matr. de incidenta in arce else if(tab_2!=NULL)ADIACENTA_ARC(a,tab_2,x); //convertarea din matricea de adiacenta in arce else if(tab_3!=NULL) lISTA_ARC(a,tab_3,x);} //convertarea din lista de adiacenta in arce system("pause"); } system("cls"); /* Meniul afisare/salvare/modificare */ printf("\n\n[ 1 ] Afisarea arcelor\n"); printf("[ 2 ] Modificarea arcelor\n\n"); printf("[ 3 ] Matricea de incidenta\n"); printf("[ 4 ] Matricea de adiacenta\n"); printf("[ 5 ] Lista de incidenta\n\n"); printf("[ 0 ] Iesire\n"); printf("\nEu aleg >> "); scanf("%d",&comanda2); system("cls"); switch(comanda2){ case 0: if(a) free(a); if(tab_1) tab_1=freemem(tab_1,u); if(tab_2) tab_2=freemem(tab_2,x); if(tab_3) tab_3=freemem(tab_3,x+2); exit(0); break; case 1: AFISARE_1(a,u); break; case 2: lm: system("cls"); AFISARE_1(a,u);

printf("\n\nIntroduceti numarul arcului pentru modificare: "); scanf("%d",&ar); if(!(ar >= 1 && ar <= u)){ system("cls"); printf("\aArcul introdus nu exista! Incercati din nou.\n"); system("pause");goto lm; } system("cls"); MODIFICARE(a,ar); break; case 3: printf("Matricea de incidenta:\n\n"); if(tab_1){ AFISARE_2(tab_1,u,x); } else{ tab_1=aloc(u,x); MATRICEA_INCIDENTA(a,tab_1,u,x); AFISARE_2(tab_1,u,x); } break; case 4: printf("Matricea de adiacenta:\n\n"); if(tab_2){ AFISARE_2(tab_2,u,x); } else{tab_2=aloc(x,x); MATRICEA_ADIACENTA(a,tab_2,u,x);AFISARE_2(tab_2,x,x);} break; case 5:printf("Lista de incidenta:\n\n"); if(tab_3!=NULL){AFISARE_LISTA(tab_3,x,x+2); } else { tab_3=aloc(x,x+2); LISTA_INCIDENTA(a,tab_3,u,x); AFISARE_LISTA(tab_3,x,x+2);} break;} system("pause");} return 0; }

Conclu3ie ' Elabor)nd aceast lucrare de laborator am obinut cunotine )n efectuarea operaiilor cu (rafuri, modurile de repre3entare a lor2 m )neles modul de pstrare a (rafurilor )n memoria calculatorului, proprietile ,ecrei forme ce ine de volumul de memorie i prelucrare2 -a prelucrarea (rafului )n toate cele + forme*matricea de adiacen;, matricea de inciden; @i lista de adiacen; am lucrat cu tablouri bidimensionale, operaii i structura lor2 stfel, mi*am aprofundat cuno@tin;ele )n prelucrarea matricelor @i consolidat teoria de la matematica discret reali3)nd pro(ramul )n limba>ul C2