Sunteți pe pagina 1din 10

Ministerul Educației și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

RAPORT
Lucrarea de laborator nr. 1
la Matematica Discreta

A efectuat:
st. gr. SI-221 Boian Marius

A verificat: V. Melnic

Chişinău - 2023
Lucrarea de laborator nr. 1

Tema: Păstrarea grafurilor în memoria calculatorului.

Scopul lucrării:
1. Studierea metodelor de definire a unui graf: matrice de incidenţă, matrice de
adiacenţă, liste;
2. Elaborarea unor proceduri de introducere, extragere şi transformare a diferitor forme de
reprezentare internă a grafurilor cu scoaterea rezultatelor la display şi imprimantă.
3. Elaborarea programelor de determinare a matricei drumurilor într-un graf orientat.

Sarcina :
1. Elaboraţi procedura introducerii unui graf în memoria calculatorului în formă
de:
• matrice de incidenţă (orientat)
• matrice de adiacenţă (graf neorientat, graf orientat).
2. Folosind procedurile menţionate elaboraţi programul care va permite:
• introducerea grafului reprezentat sub oricare din cele trei forme cu
posibilităţi de corecţie a datelor;
• extragerea informaţiei la display.
3. Elaborați procedura de determinare a matricei drumurilor într-un graf orientat.
4. Realizaţi un program cu următoarele funcţii:
• introducerea grafului ca matrice de adiacență (graf orientat) cu posibilităţi
de corectare a informaţiei;
• determinarea matricei drumurilor;
• extragerea informaţiei la display;

Imaginile a reprezentarii grafurilor:

1
2
Codul (textul) programului în limbajul C/C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int go = 1;
int userChose = 0;
int a[20];

int Menu() {
printf("-------------------------Meniul Aplicatiei-------------------------\n");
printf("1 . \tCiteste matricea incidenta\n");
printf("2 . \tPrinteaza matricea incidenta\n");
printf("3 . \tCiteste matricea neorientata adiacenta\n");
printf("4 . \tPrinteaza matricea neorientata adiacenta\n");
printf("5 . \tCiteste matricea orientata adiacenta\n");
printf("6 . \tPrinteaza matricea orientata adiacenta\n");
printf("7 . \tMatricea Drumului din matricea orientata adiacent\n");
printf("8 . \tPrinteaza matricea Drumului din matricea orientata adiacent\n");
printf("8 . \tEditeaza matricea orientata adiacent\n");
printf("0 . \tExit\n");
printf("---------------------------------------------------------------------\nOptiunea aleasa --> ");
int op;
scanf("%d", &op);
return op;
}
3
int **AlocMat(int nr, int nc) {
int i;
int **a = (int **) malloc(nc * sizeof(int *));
if (a == NULL) return a;
for (i = 0; i < nc; i++) {
a[i] = (int *) malloc(nr * sizeof(int));
if (a[i] == NULL) return NULL;
}
return a;
}

void ReadAd(int **a, int nrc) {


printf("introduceti matricea grafului reprezentat prin ne/orientat adiacent\n");
for (int i = 0; i < nrc; ++i) {
for (int j = 0; j < nrc; ++j) {
scanf("%d", &a[i][j]);
}
}
}

void PrintAd(int **a, int nrc) {


printf("\n Afisarea matricei ne/orientata adiacent\n");
for (int i = 0; i < nrc; ++i) {
for (int j = 0; j < nrc; ++j) {
printf("%2d", a[i][j]);
}
printf("\n");
}
}

//matrice incidenta
void ReadInc(int **c, int nr, int nc) {
printf("introduceti matricea grafului reprezentat prin matrice incident\n");
for (int i = 0; i < nr; ++i) {
for (int j = 0; j < nc; ++j) {
scanf("%d", &c[i][j]);
}
}
}

void PrintInc(int **c, int nr, int nc) {


printf("\n Afisarea matricei incident\n");
for (int i = 0; i < nr; ++i) {
for (int j = 0; j < nc; ++j) {
printf("%2d", c[i][j]);
}
printf("\n");
}
4
}

//matricea drumului
void MatricDrum(int **a, int **d, int x) {
int o;
for (int i = 0; i < x; ++i) {
for (int j = 0; j < x; ++j) {
d[i][j] = a[i][j];
}
}
for (int i = 0; i < x; ++i) {
for (int j = 0; j < x; ++j) {
if (d[i][j] == 1) {
o = j;
for (int k = 0; k < x; ++k) {
if (d[i][k] == 0 && d[o][k] == 1) {
d[i][k] = 1;
j = 0;
}
}
}
}
}
printf("matricea a fost realizata\n");
}

void ModifyMat(int **a) {


int r, t, m;
printf("introduceti pozitia ce doriti modificata i x j\n");
scanf("%d%d", &r, &t);
printf("introduceti ce valoare doriti pe acea pozitie\n");
scanf("%d", &m);
a[r][t] = m;
printf("elementul de pe pozitia %d x %d a fost modificat la valoarea %d", r, t, m);
}

void PressAnyKey() {
printf("\nAtingeti o tasta pentru a continua\n");
getch();
system("cls");
}

void Chooser(int **a, int **b, int **c, int **d, int x, int u) {
switch (userChose) {
case 1: {
ReadInc(c, x, u);
PressAnyKey();
}
break;
5
case 2: {
PrintInc(c, x, u);
PressAnyKey();
}
break;
case 3: {
ReadAd(b, x);
PressAnyKey();
}
break;
case 4: {
PrintAd(b, x);
PressAnyKey();
}
break;
case 5: {
ReadAd(a, x);
PressAnyKey();
}
break;
case 6: {
PrintAd(a, x);
PressAnyKey();
}
break;
case 7: {
MatricDrum(a, d, x);
PressAnyKey();
}
break;
case 8 : {
PrintAd(d, x);
PressAnyKey();
}
break;
case 9: {
ModifyMat(a);
PressAnyKey();
}
break;
case 0: {
free(a);
free(b);
free(c);
free(d);
go = 0;
system("cls");
printf("Aplicatia s-a oprit cu succes");
getch();
}
6
break;

default:
printf("Optiune necunoscuta\nIncercati din nou");
break;
}
}

int main() {
int **a, **b, **c, **d, x, u;
printf("introduceti numarul de varfuri si de arcuri\n");
scanf("%d", &x);
scanf("%d", &u);
a = AlocMat(x, x);
b = AlocMat(x, x);
c = AlocMat(x, u);
d = AlocMat(x, x);
while (go) {
userChose = Menu();
Chooser(a, b, c, d, x, u);
}
}

Rezultatele testării și funcţionării programului (screenshot-uri):

7
Analiza rezultatelor și concluzii:
Au fost obţinute deprinderi de elaborare, compilare, rulare și testare a unui program simplu în
limbajul de programare C.
Verificarea rezultatelor obţinute confirmă că programul elaborat lucrează corect.
Programul elaborat nu verifică datele de intrare, ce reprezintă un dezavantaj al algoritmului.

8
Programul elaborat poate fi dezvoltat ulterior prin adăugarea operațiilor de verificare a datelor de
intrare.

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