Sunteți pe pagina 1din 18

Ministerul Educatiei Culturii si Cercetarii al Republicii Moldova

Universitatea Tehnica a Moldovei


Departamentul ISA

RAPORT
despre lucrarea de laborator nr.2
la disciplina Matematica Discreta

A elaborat: s.gr.172 Secrieru Andrei


A verificat: Andrievschi-Bagrin Veronica

CHISINAU 2018
CUPRINS:

Sarcina lucrarii.....................................pag.3

Mersul lucrarii......................................pag.3

Prezentarea rezultatelor........................pag.4

Concluzia..............................................pag.5

Anexa(A)..............................................pag.6

Anexa(B)..............................................pag.16
Sarcina lucrarii:

De realizat un program care sa permita introducerea datelor unui graf si


afisarea acestor date in 3 forme ( matrice de adiacenta , matrice de adiacenta si
lista de adiacenta ) . Programul trebuie sa permita redactarea datelor (
adaugarea/stergerea unui arc , adaugarea/stergerea unui varf , editarea unui
varf .

Mersul lucrarii:

Pentru inceput a fost creata functia “citire” care permite introducerea numarul
de arcuri si de varfuri . Sa creat o functie “aranjare” care sa aranjeze arcele
crescator ce permite o vizualizare a acestora mai buna in program !
Se creaza functia “mAdiacenta” care creaza matricea , functia “afisareMa”
permite afisarea matricei de adiacenta . Functia “mIncidenta” creaza matricea
de incidenta si afiseaza la ecran . Urmeaza functia “CreareaLi” care creaza lista
de adiacenta iar “afisareLi”permite afisarea listei pe ecran .
Se creaza o functie pentru afisarea arcelor existent / introduce de la tastatura
“afisare_v”
In continuare se creaza functiile destinate prelucrarii datelor introduce .
Functia “adaugare_v” adauga la numarul de varfuri existente , un varf ( n+1)
. Functia “stergere_v” permite selectarea unui varf din cele existente si
stergerea acestuia . La stergerea varfului “ n “ urmatoarele varfuri si arcurile
legate de aceste varfuri vor fi reindexate primind valoarea (n-1) .
Se creaza functia “ adaugare_a” care permite sa adaugam la arcele existente un
arc iar functia “stergere_a” permite selectarea unui arc si stergerea acestuia .
Arcele-a ce il succede vor fi reindexate (n-1) .Functia “editare_a” permite sa
selectam un arc existent si sa ii schimbam datele ( adica varful initial sic el
final ) .
Programul dat contine 2 meniuri : 1 . Meniul Principal , 2.Meniul de Redactare
, acestea structureaza informatia si face citirea programului mai eficienta .
Programul e realizat astfel incat sa nu permita introducerea unor date incorecte
, acesta te va oblige sa introduci datele din nou !
Prezentarea rezultatelor:

a[1]= 1,1
a[2]= 1,2
a[3]= 2,3
a[4]= 3,1

->Afisarea matricei de adiacenta:


110
001
100

->Afisarea matricei de incidenta:


200
-1 1 0
0 -1 1
1 0 -1

->Afisarea listei de incidenta:


1 1_2_0
2 3_0
3 1_0
Concluzia:
In urma realizarii laboratorului nr 1 la Matematica Discreta , am invatat
introducerea si editarea datelor unui graf . Citirea datelor unui graf este mai
eficienta datorita unui program specializat pentru aceasta . Programul a fost
realizat in limbajul de programare “C” . Acest program permite sa introducem
lejer numarul de varfuri si de arcuri , corect , fara greseli , programul fiind
optimizat si nu permite introducerea datelor incorecte . Programul afiseaza
datele grafului in 3 forme ( matrice de adiacenta , matrice de incidenta si lista
de adiacenta ) . Aceste optiuni sunt introduse intr-un meniu ce permite usor sa
citim si sa selectam optiunea dorita . In meniul principal este optiunea de a
intra in alt meniul si anume Meniul de redactare a datelor . Meniul de
redactare permite sa editam datele introduse si sa modificam graful .
Un astfel de program usureaza lucrul cu grafurile . Realizarea acestui laborator
a contribuit esential la dezvoltarea personala si a cunostintelor in domeniul
limbajului “C” .
Anexa(A)
Textul programului:
#include <stdio.h>
#include <stdlib.h>

void mAdiacenta(int ma[100][100] , int arcuri[100][2] , int varf, int nrarce );


void afisareMa(int ma[100][100] , int varf);
void mIncidenta(int mi[100][100], int varf , int nrarce , int arcuri[100][2]);
void creareLi(int li[100][100], int varf , int nrarce, int arcuri[100][2]);
void afisareLi( int li[100][100], int varf, int arcuri[100][2],int nrarce);
void afisare_v(int arc[100][2],int *nrarce);
void meniu2(int ma[100][100], int varf , int nrarce , int arc[100][2],int mi[100][100],int
li[100][100]);
void adaugare_v(int *varf);
void stergere_v(int ma[100][100],int arcuri[100][2],int *varf,int *nrarce);
void adaugare_a(int arcuri[100][2],int *nrarce, int varf );
void editare_a(int arcuri[100][2], int nrarce);
void stergere_a(int arcuri[100][2],int *nrarce);
void aranjare(int arcuri[100][2],int nrarce);
void citire(int Arcuri[100][2], int *varf , int *nrarce);

MENIUL PRINCIPAL :
void meniu(int ma[100][100], int varf , int nrarce , int arc[100][2],int mi[100][100],int
li[100][100])
{
int alegere;
if(varf==0)
return;

printf(" \n * * * Meniul Principal * * *\n");


printf("\n---> Alegeti o optiune:\n\t[1] Crearea matricei de adiacenta\n\t[2] Crearea
matricei de incidenta\n\t[3] Crearea Listei\n\t[4] Afisarea arcelor \n\t[5] Meniu -
Redactare\n\t--------------------- \n\t[6] Graf Nou \n\t[7] Iesire\n");
scanf("%d", &alegere);

switch (alegere)
{
case 1:
system("cls");

mAdiacenta(ma,arc,varf,nrarce);
afisareMa(ma,varf);
meniu(ma,varf,nrarce,arc,mi,li);
break;

case 2:
system("cls");
mIncidenta(mi,varf,nrarce,arc);
meniu(ma,varf,nrarce,arc,mi,li);
break;

case 3:

system("cls");
printf("\n ---> Lista de incidenta <--- \n");
creareLi(li,varf,nrarce,arc);
afisareLi(li,varf,arc,nrarce);
meniu(ma,varf,nrarce,arc,mi,li);
break;
case 4:
system("cls");
printf("\n ---> Afisarea varfurilor <--- \n");
aranjare(arc,nrarce);
afisare_v(arc,&nrarce);
meniu(ma,varf,nrarce,arc,mi,li);
break;

case 5:
system("cls");
meniu2(ma,varf,nrarce ,arc,mi,li);
break;

case 6:
system("cls");
citire(arc,&varf,&nrarce);
meniu(ma,varf,nrarce,arc,mi,li);

case 7:
system("cls");
printf("\n * * * A-ti iesit din program ! * * * \n");
return;

default:
system("cls");
printf("\n\n * * * O optiune inexistenta * * *0 \n\n");
meniu(ma,varf,nrarce,arc,mi,li);
break;
}
}

CITIREA DATELOR :
void citire(int Arcuri[100][2], int *varf , int *nrarce)
{
int n=0, m=0, vi, vf,nra=0,k;
printf("---> Introduceti numarul de varfuri:\t");
scanf("%d",varf);
if(*varf==0) {return;}
else
printf("---> Introduceti arcele:\n");
while(1)
{
printf("Arcul[%d]=",m+1);
scanf("%d %d",&vi,&vf);
if ((vi == 0) || (vf == 0))
break;
while (1)
{
for(k=1;k<=m;k++)
{
while(vi==Arcuri[k][0] && vf==Arcuri[k][1])
{
printf("---> Arcul deja exista ! Introduceti alt arc <--- \n");
printf("Arcul[%d]=",m+1);
scanf("%d %d",&vi,&vf);
}
if ((vi == 0) || (vf == 0))
break;
}
if(vi!=Arcuri[k][0] && vf!=Arcuri[k][1])
break;
}
if((vi==0) || (vf==0))
break;
while(vi>*varf || vf>*varf || vi<0 || vf<0 )
{
printf(" ---> A-ti introdus un arc dintr-un varf inexistent <--- \n");
printf("Arcul[%d]=",m+1);
scanf("%d %d",&vi,&vf);
}
m++;
Arcuri[m][0] = vi;
Arcuri[m][1] = vf;
nra++;
}
*nrarce=nra;
system("cls");
}

CREAREA MATRICEI DE ADIACENTA :


void mAdiacenta(int ma[100][100] , int arcuri[100][2] , int varf, int nrarce )
{
int i,j,m,n ;
for(i=1;i<=varf;i++)
{
for(j=1;j<=varf;j++)
{
ma[i][j]=0;
}
}
for(n=1;n<=nrarce;n++)
for(i=1;i<=varf;i++)
{
for(j=1;j<=varf;j++)
if(i==arcuri[n][0] && j==arcuri[n][1])
ma[i][j]=1;
}
}

AFISAREA MATRICEI DE ADIACENTA :


void afisareMa(int ma[100][100] , int varf)
{
int i ,j ;
printf("\n\n ---> Matricea de adiacenta <--- \n");
for(i=1;i<=varf;i++)
{
printf("\tV%d",i);
}
printf("\n");
for (i=1;i<=varf;i++)
{
printf("V%d\t",i);
for (j=1;j<=varf;j++)
{
printf("%d\t",ma[i][j]);
}
printf("\n");}printf("\n");
}

CRAREA SI AFISAREA MATRICEI DE


INCIDENTA :
void mIncidenta(int mi[100][100], int varf , int nrarce , int arcuri[100][2])

{ int i,j;
printf("\n");
printf("\n ---> Matricea de incidenta <---\n");
for (i=1; i<=varf; i++)
printf("\tV%d",i);
printf("\n");
for (i=1; i<=nrarce; i++)
{
printf("U%d",i);
for (j=1; j<=varf; j++)
{
if ((arcuri[i][0]==j) && (arcuri[i][1]==j))
printf("\t2");
else {
if (arcuri[i][0]==j)
printf("\t-1");
else if (arcuri[i][1]==j)
printf("\t1");
else printf("\t0");
}
}
printf("\n");
}}

CREAREA LISTEI DE ADIACENTA :


void creareLi(int li[100][100], int varf , int nrarce, int arcuri[100][2])
{
int i, j , k;
for (i=1;i<=varf;i++)
{
j=1;
for (k=1;k<=nrarce;k++)
if (arcuri[k][0]==i) li[i][j++]=arcuri[k][1];
}
}

AFISAREA LISTEI DE ADIACENTA :


void afisareLi( int li[100][100], int varf, int arcuri[100][2],int nrarce)
{int j,i;
printf("\n");
for (i=1; i<=varf; i++)
{
printf("%d | ",i);
for (j=i; j<=nrarce; j++)
if (arcuri[j][0]==i)
{
printf("%d_",arcuri[j][1]);
}
printf("0\n");
}
}

void afisare_v(int arc[100][2],int *nrarce)


{
aranjare(arc,*nrarce);
int k;
for(k=1;k<=*nrarce;k++)
{
printf("Arcul[%d] : (%d,%d) \n",k,arc[k][0],arc[k][1]);

}
}

MENIUL DE REDACTARE :
void meniu2(int ma[100][100], int varf , int nrarce , int arc[100][2],int mi[100][100],int
li[100][100])
{
int alegere;
printf("\n\t * * * Meniul - Redactare * * * ");
printf("\n\n ---> Alegeti o optiune :");
printf("\n\t [1] Adaugarea unui varf\n\t [2] Stergerea unui varf\n\t [3] Adaugarea unui
arc\n\t [4] Stergerea unui arc\n\t [5] Editarea unui arc");
printf("\n\t [6] Meniul Principal\n\t [7] Iesire\n");
scanf("%d",&alegere);
switch(alegere)
{
case 1:
system("cls");
printf("\n\t * * * Adaugarea de n varfuri * * * \n\n");
adaugare_v(&varf);
meniu2(ma,varf,nrarce,arc,mi,li);

break;

case 2:
system("cls");
printf("\n\t * * * Stergerea unui varf * * * \n\n");
stergere_v(ma,arc,&varf,&nrarce);
meniu2(ma,varf,nrarce,arc,mi,li);
break;

case 3:
system("cls");
printf("\t\n * * * Adaugarea unui arc * * *");
adaugare_a(arc,&nrarce,varf );
meniu2(ma,varf,nrarce,arc,mi,li);
break;

case 4:
system("cls");
printf("\n * * * Stergerea unui arc * * * \n");
stergere_a(arc,&nrarce);
meniu2(ma,varf,nrarce,arc,mi,li);
break;

case 5:
system("cls");
printf("\n\t * * * Editare Arc * * * \n\n");
editare_a(arc,nrarce);
meniu2(ma,varf,nrarce,arc,mi,li);
break;

case 6:
system("cls");
meniu(ma,varf,nrarce,arc,mi,li);
break;

case 7:
system("cls");
printf("\n * * * A-ti iesit din program ! * * * \n ");
break;

default:
system("cls");
printf("\n\n * * * Optiune inexistenta * * * \n\n");
meniu2(ma,varf,nrarce,arc,mi,li);
break;
}
}

ADAUGAREA UNUI VARF :


void adaugare_v(int *varf)
{
int valoare;
printf(" ---> Cate varfuri doriti sa adaugati ? <---> ");
scanf("%d",&valoare);
*varf=*varf+valoare;
printf(" ! ! ! A-ti adaugat %d varf/uri cu succes ! ! !\n",valoare) ;
}

void stergere_v2 (int *varf,int *nrarce,int arcuri[100][2],int i)


{
for (i;i<*nrarce;i++)
{
arcuri[i][0]=arcuri[i+1][0];
arcuri[i][1]=arcuri[i+1][1];
}
(*nrarce)--;
}

STERGEREA UNUI VARF :


void stergere_v(int ma[100][100] , int arcuri[100][2] , int *varf,int *nrarce)
{
int varfsters,i;
printf("\n ---> Indicati care varf din cele %d doriti sa il stergeti ? <--- ",*varf);
scanf("%d",&varfsters);
for (i=1;i<=*nrarce;i++)
{
if (arcuri[i][0] == varfsters || arcuri[i][1] == varfsters)
{

stergere_v2(varf,nrarce,arcuri,i);
i--;
}
}
(*varf)--;
for (i=1;i<=*nrarce;i++)
{
if (arcuri[i][0]>varfsters) arcuri[i][0]--;
if (arcuri[i][1]>varfsters) arcuri[i][1]--;
}

printf("\n ---> Varful %d a fost sters cu succes <--- \n",varfsters);


}

ADAUGAREA UNUI ARC :


void adaugare_a(int arcuri[100][2],int *nrarce , int varf )
{
char c;
int vi, vf , k ,n ;
n=*nrarce;
printf("\n ---> Numarul de arcuri curente : %d <---",n);
n++;
printf("\n ---> Introduceti arcul. (Vi Vf) <--- \n");
scanf("%d %d",&vi,&vf);
while (1)
{
for(k=1;k<=n;k++)
{
while(vi==arcuri[k][0] && vf==arcuri[k][1])
{
printf("\n ---> Arcul deja exista ! Introduceti alt arc <--- \n");
scanf("%d %d",&vi,&vf);
}
while(vi>varf || vf>varf)
{
printf("\n ---> Arcul nu a fost adaugat.Varful initial sau final nu corespunde cu numarul
de varfuri , adica %d <--- \n",varf);
printf(" ---> Introduceti alt arc <---\n");
scanf("%d %d",&vi,&vf);
}
}
if(vi!=arcuri[k][0] && vf!=arcuri[k][1])
break;
}
arcuri[n][0]=vi;
arcuri[n][1]=vf;
(*nrarce)++;
system("cls");
printf(" --->Arcul a fost adaugat cu succes ! <--- \n ---> Numarul de arce curente : %d <---
\n",*nrarce);

EDITAREA UNUI GRAF:


void editare_a(int arc[100][2], int nrarce)
{
int vi,vf,k;
printf("---> Arcele existente <---\n");
afisare_v(arc,&nrarce);
printf(" ---> Introduceti numarul arcului pe care doriti sa il editati <--- \n");
scanf("%d",&k);
while (1)
{
{
if(k>nrarce)
{
printf("\n ---> Nu exista arcul introdus . Selectati alt arc <--- \n");
scanf("%d %d",&k);
}
}
if(k<=nrarce)
break;
}
printf(" ---> Introduceti datele noi ( Varful Initial | Varful Final) <---\n");
scanf("%d %d",&vi,&vf);
arc[k][0]=vi;
arc[k][1]=vf;
system("cls");
printf("\n ---> Arcul a fost editat cu succes <--- \n");
}

STERGEREA UNUI ARC :


void stergere_a(int arcuri[100][2],int *nrarce)
{
int i,k;
printf("\n ---> Arcele existente <--- \n");
AFISAREA ARCURILOR:
afisare_v(arcuri,nrarce);
printf("\n ---> Indica numarul arcului pe care doresti sa il stergi <--- \n", *nrarce);
scanf("%d",&k);
if (k <= *nrarce)
{
for (i = k ; i <= *nrarce - 1; i++)
{

arcuri[i][0] = arcuri[i+1][0];
arcuri[i][1] = arcuri[i+1][1];
}

(*nrarce)--;
system("cls");
printf("\n ---> Arcul a fost sters cu succes ! <--- \n");
}
}

ARANJAREA ARCURILOR :
void aranjare(int arcuri[100][2],int nrarce)
{
int i, k;
for (i=1; i<nrarce; i++)
if ((arcuri[i][0] > arcuri[i+1][0]) || ((arcuri[i][0]==arcuri[i+1][0]) &&
(arcuri[i][1]>arcuri[i+1][1])))
{
k= arcuri[i][0];
arcuri[i][0] = arcuri[i+1][0];
arcuri[i+1][0] = k;
k= arcuri[i][1];
arcuri[i][1] = arcuri[i+1][1];
arcuri[i+1][1] =k;
i=0;

}
}
FUNCTIA PRINCIPALA :

int main()
{
int varf ;
int ma[100][100];
int mi[100][100];
int li[100][100];
int arc[100][2];
int nrarce;

citire(arc,&varf,&nrarce);
meniu(ma,varf,nrarce,arc,mi,li);

return 0 ;
}

Anexa(B) :
Introducerea datelor :
Meniul Principal :

Executie :

S-ar putea să vă placă și