You are on page 1of 10

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Raport
Lucrarea de laborator Nr.1
la Matematica Discreta

Pastrarea grafurilor in memoria calculatorului

A efectuat: st. gr. RM-201 Ghirea Gabriel

A verificat: conf. univ. Gorban Maria

Chişinău, 2021
Lucrare de laborator Nr.1

Listing-ul programului

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void granita(int n)
{int i;
printf("М");
for (i=0;i<n;i++) {printf("НННО");}
printf("ННН№\n");
}

void antet_mat_adiac(int n, char a)


{int i,j;
printf("Й");
for (i=0;i<n;i++) {printf("НННЛ");}
printf("ННН»\n");
printf("є %c є",a);
for (i=0;i<n;i++) {printf("x%2dє",i+1);}
printf("\n");
}

void afis_mat_adiac(int **mat, int n)


{int i,j;
antet_mat_adiac(n,'A');
for (i=0;i<n; i++){
granita(n);
printf("єx%2dє",i+1);
for (j=0;j<n;j++){printf(" %d є",mat[i][j]);}
printf("\n");
}
printf("И");
for (i=0;i<n;i++) {printf("НННК");}
printf("НННј\n");
}
//-------------matricea de adiacenta------------------------------

void afis_mat_inc(int **mat, int n, int m)


{int i, j;
antet_mat_adiac(n,'B');
for (i=0;i<m; i++){
granita(n);
printf("єU%2dє",i+1);
for (j=0;j<n;j++){printf(" %2dє",mat[i][j]);}
printf("\n");
}
printf("И");
for (i=0;i<n;i++) {printf("НННК");}
printf("НННј\n");
}
//---------------Matricea de incidenta-------------

void antet_list_adiac(int n)
{int i, pin=0, dupa=0;
printf("ЙНННЛ");
for (i=0;i<n;i++) {printf("ННН");}
printf("ННН»\n");
printf("є Xiє");
pin=((3*(n+1))-3)/2;
dupa=((n+1)*3)-3-pin;
for (i=0;i<pin;i++) printf(" ");
printf("Fxi");
for (i=0;i<dupa; i++) printf(" ");
printf("є\n");
}

void granita_list(int n)
{int i;
printf("МНННО");
for (i=0;i<n+1;i++) {printf("ННН");}
printf("№\n");
}

void afis_list_adiac(int **list, int n)


{int i,j,test=0;
antet_list_adiac(n);
for (i=0;i<n;i++){
granita_list(n);
printf("єx%2dє",i+1); test=0;
for (j=0;j<n+1;j++) {
if (list[i][j]!=0) printf("%2d,",list[i][j]);
if ((list[i][j]==0)&&(test==0)) {test++; printf(" 0 ");} else
{if ((list[i][j]==0)&&(test!=0)) {printf(" ");}
}
}
printf("є\n");
}

printf("ИНННК");
for (i=0;i<n+1;i++) {printf("ННН");}
printf("ј\n");
}
//--------------lista de adiacenta----------

//functions
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

int ** elib (int**a, int n)


{int i;
for (i=0;i<n;i++) {free(a[i]);}
free(a); return(NULL);
}

int ferifymem(int **a, char str[],int n)


{int i;
if (a) {printf("%s a fost definita deja...\n",str);
puts("Doriti redefinirea ei?(1-da/0-nu)");
scanf("%d",&i);
if (i==1) {a=elib(a,n);return 1;}
if (i==0) return 0;
}
return 1;
}
void zerografiere(int **a, int n, int m)
{int i,j;
for (i=0;i<n; i++)
{ for(j=0;j<m;j++)
{
a[i][j]=0;
}
}
}

int** aloc(int n, int m)


{int **a;
int i;
a=(int**) malloc (n*sizeof(*a));
if (a==NULL) {return a;}
for (i=0;i<n;i++) {
a[i]=(int*) malloc (m*sizeof(int));
if (a[i]==NULL) {return NULL;} }
return a; }

int input_mat_adiac(int **a,int n)


{int m=0;
int i, j,temp;
for (i=0; i<n;i++) {
for (j=0;j<n;j++) {
printf("x%d->x%d:",i+1,j+1);
scanf("%d",&temp);
while ((temp!=1)&&(temp!=0)) {puts("Introduceti o valoare corecta
(0/1)");
scanf("%d",&temp); }
if (temp==1) m++;
a[i][j]=temp; } }
return m;
}

int contr_linie_inc(int **a, int m, int n)


{int result;
int i,test=0, doi=0, minus=0;
for (i=0;i<n; i++){
if (a[m][i]!=0) test=test+abs(a[m][i]);
if (a[m][i]==2) doi++;
if (a[m][i]==-1) minus++; }
if (test==0) return 0;
if (test==2) {
if (doi==1) return 1;
if ((doi==0)&&(minus==1)) return 1;
if (minus>1) return 5;
if ((doi==0)&&(minus==0)) return 7;
} else
if (test<2) {
if (minus==0) return 2;
if(minus==1) return 3;}
else
if (test>2){
if(doi>1) return 4;
if(minus>1) return 5;
if ((doi==1)&&(minus>0)) return 6;
if ((doi==1)&&(minus==0)) return 8;}
return 0;}

void linie_mat_inc(int **a, int m, int n)


{int i,temp,test;
do {
for (i=0; i<n;i++) {
printf("x%d: \n",i+1);
scanf("%d", &temp);
while ((temp!=0)&&(temp!=1)&&(temp!=-1)&&(temp!=2))
{ puts("Introduceti o valoare corecta (-1/0/1/2)");
scanf("%d",&temp);
}
a[m][i]=temp;}
test=contr_linie_inc(a,m,n);
if (test==0) puts("Nu a fost introdus arcul, incercati din
nou...");
if (test==2) puts("Arcul nu este adiacent exterior cu nici un
virf, incercati din nou...");
if (test==3) puts("Arcul nu este adiacent interior cu nici un
virf, incercati din nou...");
if(test==4) puts("Sunt prea multe bucle, incercati din nou");
if(test==5) puts("Arcul are prea multe virfuri adiacente
exterioare, incercati din nou...");
if(test==7) puts("Arcul are prea multe virfuri adiacente
interioare, incercati din nou...");
if(test==6) puts("Exista o bucla, sunt prea multe virfuri
adiacente exterioare, incercati din nou...");
if(test==8) puts("Exista o bucla, sunt prea multe virfuri
adiacente interioare, incercati din nou...");
} while(test!=1);
}

int repeta_linie(int **d, int n,int k)


{int i,j,a,b,c,test=0;
for (i=0; i<n;i++){
if (d[k][i]==2) c=i;
if (d[k][i]==-1) a=i;
if (d[k][i]==1) b=i;}
for (j=0;j<k;j++)
for(i=0;i<n;i++) {
if (d[j][i]==2&&i==c) return 1;
if (d[j][i]==-1&&i==a) test++;
if (d[j][i]==1&&i==b) test++;}
if (test==2) return 1;
return 0;
}

void input_mat_inc(int **a, int n, int m)


{int i,j,test;
for (i=0; i<m; i++) {
printf("Dati valorile pentru U%d:\n",i+1);
linie_mat_inc(a,i,n);
test=repeta_linie(a,n,i);
if (test==1) {puts("Arcul se repeta, mai introduceti-l inca o
data..."); i--;}
} }

int control(int **a, int n, int curent,int temp)


{int i;
if (temp==0) return 1;
if ((temp>=0)&&(temp<=n)){
for (i=0;i<n;i++) {
if (temp==a[curent][i]) return 0;} };
return 1; }

int input_lis_adiac(int **a, int n)


{int i,j=0,m=0, temp, test;
for (i=0; i<n;i++) {j=0;
printf("x%d:",i+1);
do {
scanf("%d",&temp);
while ((temp<0)||(temp>n)) {printf("Introduceti o valoare corecta
(0..%d)\n",n);
scanf("%d",&temp); }
test=control(a,n,i,temp);
while(test!=1) {printf("Valoarea %d a mai fost introdusa... introduceti
alta valoare\n",temp);
scanf("%d", &temp);test=control(a,n,i,temp);}
a[i][j]=temp; if (temp!=0) m++;
j++;} while ((temp!=0)&&(j!=n));
}
return m;
}

void mat_adiac_list_adiac(int **mat, int **list, int n)


{int i,j,ind=0;
for (i=0; i<n;i++) {
ind=0;
for (j=0; j<n;j++) {
if (mat[i][j]==1) {list[i][ind]=j+1;ind++;}
}}}

void list_adiac_mat_inc(int **list, int **mat, int n)


{int i,j, ind=0;
for (i=0; i<n;i++){
for (j=0; j<n; j++) {
if (list[i][j]!=0) {
if (list[i][j]==(i+1)) mat[ind][i]=2;
if (list[i][j]!=(i+1)) {
mat[ind][i]=-1;
mat[ind][(list[i][j])-1]=1;
}
ind++;
}}}}

void mat_inc_adiac(int **inc, int**adiac, int n, int m)


{int i,j, lin=0, col=0,test=0;
for (j=0; j<m;j++) {
lin=0;col=0; test=0;
for (i=0; i<n; i++) {
if (inc[j][i]==2) {adiac[i][i]=1;}
if (inc[j][i]==-1) {lin=i;test=1;}
if (inc[j][i]==1) {col=i; test=1;}}
if (test==1) adiac[lin][col]=1;
}}

#include"lab1/fundiscr.cpp"
#include"lab1/afisare.cpp"
int main()
{int **matinc=NULL, **matadiac=NULL, **listadiac=NULL;
int n=0, m=0;
int nr,temp;
goto definire;
Again:
while (1) {
textcolor(11);
clrscr();
cprintf(" *****Meniu****");cprintf("\r\n");
cprintf(" 1. Definirea grafului");cprintf("\r\n");
cprintf(" 2. Afisarea grafului"); cprintf("\r\n");
cprintf(" 0. Iesire");cprintf("\r\n");
scanf("%d", &nr);
switch(nr) { //afisare

definire:
case 1:textcolor(10);clrscr();
cprintf(" ***Alegeti modul de definire***");cprintf("\r\n");
cprintf(" 1. Matricea de adiacenta");cprintf("\r\n");
cprintf(" 2. Matricea de incidenta");cprintf("\r\n");
cprintf(" 3. Lista de adiacenta");cprintf("\r\n");
scanf("%d", &nr);
switch(nr) {

case 1:
temp=ferifymem(matadiac,"Matricea de adiacenta",n);
if (temp==0) {puts("Nu s-a dorit introducerea.."); getch();break;}
clrscr();
puts("Dati numarul de virfuri");
virfuri1:
scanf("%d", &n); if(n<2) {puts("Dati numarul de virfuri n>1"); goto
virfuri1;}
matadiac=aloc(n,n);
if (!matadiac) {puts("Nu a fost alocata memorie pentru Matrice, lucrul
va fi intrerupt...");
getch(); break;}
zerografiere(matadiac,n,n);
m=input_mat_adiac(matadiac,n);
puts("Matricea de adiacenta a fost introdusa...");
printf("S-au format %d arcuri\n",m);
getch();

listadiac=aloc(n,n+1);
if (!listadiac) {puts("Lista de adiacenta nu va fi disponibila, lucrul
va fi intrerupt...");
getch(); break;}
zerografiere(listadiac,n,n+1);
mat_adiac_list_adiac(matadiac,listadiac,n);

matinc=aloc(m,n);
if (!matinc){puts("Matricea de incidenta nu va disponibila, lucrul va
fi intrerupt...");getch();break;}
zerografiere(matinc,m,n);
list_adiac_mat_inc(listadiac,matinc,n);

break;
case 2:
temp=ferifymem(matinc,"Matricea de incidenta",m);
if (temp==0) {puts("Nu s-a dorit introducerea.."); getch();break;}
clrscr();
puts("Dati numarul de virfuri");
virfuri2:
scanf("%d", &n); if(n<2) {puts("Dati numarul de virfuri n>1"); goto
virfuri2;}
arce:
puts("Dati numarul de arce"); scanf("%d", &m);
if(n==2&&m>4) {puts("Ati introdus un numar prea mare de arce, incercati
din nou...");getch();goto arce;}
if(m>n*2+n) {puts("Ati introdus un numar prea mare de arce, incercati
din nou..."); getch(); goto arce;}
matinc=aloc(m,n);
if (!matinc) {puts("Nu a fost alocata memorie pentru Matrice, lucrul va
fi intrerupt...");
getch();
break;}
zerografiere(matinc,m,n);
input_mat_inc(matinc,n,m);
puts("Matricea de incidenta a fost introdusa corect"); getch();

matadiac=aloc(n,n);
if (!matadiac){puts("Matricea de adiacenta nu va disponibila, lucrul nu
va continua...");getch();break;}
zerografiere(matadiac,n,n);
mat_inc_adiac(matinc,matadiac,n,m);

listadiac=aloc(n,n+1);
if (!listadiac) {puts("Lista de adiacenta nu va fi disponibila, lucrul
va fi intrerupt...");getch(); break;}
zerografiere(listadiac,n,n+1);
mat_adiac_list_adiac(matadiac,listadiac,n);
break;

case 3:
temp=ferifymem(listadiac,"Lista de adiacenta",n);
if (temp==0) {puts("Nu s-a dorit introducerea.."); getch();break;}
clrscr();
puts("Dati numarul de virfuri");
virfuri3:
scanf("%d",&n); if(n<2) {puts("Dati numarul de virfuri n>1"); goto
virfuri3;}
listadiac=aloc(n,n+1);
if (!listadiac) {puts("Nu a fost alocata memorie pentru Lista, lucrul
va fi intrerupt...");
getch(); break;}
zerografiere(listadiac,n,n+1);
m=input_lis_adiac(listadiac,n);
printf("Lista de adiacenta a fost introdusa, sau obtinut %d arcuri",m);

matinc=aloc(m,n);
if (!matinc){puts("Matricea de incidenta nu va disponibila, lucrul nu
va continua...");getch();break;}
zerografiere(matinc,m,n);
list_adiac_mat_inc(listadiac,matinc,n);

matadiac=aloc(n,n);
if (!matadiac){puts("Matricea de adiacenta nu va disponibila, lucrul nu
va continua...");getch();break;}
zerografiere(matadiac,n,n);
mat_inc_adiac(matinc,matadiac,n,m);

getch();break;
} break;

case 0: if(listadiac!=NULL) listadiac=elib(listadiac,n);


if (matinc!=NULL) matinc=elib(matinc,m);
if (matadiac!=NULL) matadiac=elib(matadiac,n);
return 1;

case 2:
while (1) {
textcolor(13); clrscr();// afisare
cprintf(" ***Alegeti modul de afisare***");cprintf("\r\n");
cprintf(" 1. Matricea de adiacenta");cprintf("\r\n");
cprintf(" 2. Matricea de incidenta");cprintf("\r\n");
cprintf(" 3. Lista de adiacenta");cprintf("\r\n");
cprintf(" 4. Inapoi");cprintf("\r\n");
scanf("%d", &nr);
switch(nr) {
case 1:
if (!matadiac) {puts("Matricea nu a fost definita, definiti-o intii de
toate..."); getch(); break;}
clrscr();
puts(" Matricea de adiacenta");
afis_mat_adiac(matadiac,n);
getch();
break;

case 2:
if (!matinc) {puts("Matricea nu a fost definita, definiti-o intii de
toate..."); getch(); break;}
clrscr();
puts(" Matricea de incidenta");
afis_mat_inc(matinc,n,m);
getch();
break;

case 3:
if (!listadiac) {puts("Lista nu a fost definita, definiti-o intii de
toate..."); getch(); break;}
clrscr();
puts(" Lista de adiacenta");
afis_list_adiac(listadiac,n);
getch();
break;

case 4:goto Again;}


}//while(1)
}
}
}

You might also like