Sunteți pe pagina 1din 16

Ministerul Educaiei i Tineretului al Republicii Moldova

Universitatea Tehnic a Moldovei

RAPORT
Lucrare de laborator Nr.1

A efectuat:St. gr.TI-144

Olaru Cristian

Chiinu 2015
Scopul Lucrrii:

-Studierea metodelor de definirea unui graf:matrice de inciden , matrice de adiacen,


liste ;
-Elaborarea unor proceduri de introducere, extragere i transformare a diferitor forme de reprezentare
intern a grafurilor cu scoaterea rezultatelor la display i imprimant
Enunul Problemei: S se alcutiasc un program (n limbajul de programare ce-l posedm)ce va
efectua urmtoarele condiii:
1.
s introducem graful n unul din cele trei moduri
2.
graful introdus s-l putem afia n toate trei moduri
3.
s putem efectua modificri asupra grafului introdus
4.
s putem salva rezultatele ntr-un fiier
5.
s putem accesa datele salvate n fiier
Textul programului:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define p1 printf("Introdu numarul de arce: ");
#define s1 scanf("%d",&u);
#define p2 printf("Introdu numarul de virfuri: ");
#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 intro1(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("Introdu inceputul: X");
scanf("%d",&a[i].inc);
printf("Introdu sfirsitul: 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 intro2(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 intro3(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 intro4(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 inc_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 ad_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 li_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_li(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 matr_inc(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 matr_ad(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 list_inc(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 modif(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("Introdu inceputul: X");
scanf("%d",&a[ar-1].inc);
printf("Introdu sfirsitul: X");
scanf("%d",&a[ar-1].sfr);
}
//citirea din fisier a arcelor
void read_ar(arc *a,FILE *demo){
int i=0;
while(!feof(demo)){
fscanf(demo,"%d%d",&a[i].inc,&a[i].sfr);

i++;
}
printf("\a\nCitirea a avut loc cu succes!\n\n");
}
//citirea din fisier a matr. de incidenta/adiacenta
void read_matr(int **vect,FILE *demo,int n,int m){
int i=0,j=0;
while((!feof(demo)) && i<n){
while(j<m){
fscanf(demo,"%d",&vect[i][j]);
j++;
}
i++;
j=0;
}
printf("\a\nCitirea a avut loc cu succes!\n\n");
}
//citirea din fisier a listei de adiacenta
void read_li(int **vect,FILE *demo,int n){
int i=0,j=0;
while((!feof(demo)) && i<n){
while(vect[i][j-1]!=0){
fscanf(demo,"%d",&vect[i][j]);
j++;
}
i++;
j=0;
}
printf("\a\nCitirea a avut loc cu succes!\n\n");
}
//functia pentru salvare in fisier a arcelor
void save(arc *vect,char *fname,int u,int x){
int i;
FILE *demo=fopen(fname,"w");
fprintf(demo,"%d %d",u,x);
for(i=0;i<u;i++)
fprintf(demo,"\n%d %d",vect[i].inc,vect[i].sfr);
fclose(demo);
}
//functia pentru salvare a matricelor de incidenta
void save_1(int **tab_1,char *fname,int u,int x){
int i,j;
FILE *demo=fopen(fname,"w");
fprintf(demo,"%d %d",u,x);
for(i=0;i<u;i++){
fprintf(demo,"\n");
for(j=0;j<x;j++)
fprintf(demo,"%d ",tab_1[i][j]);
}
fclose(demo);
}
//functia pentru salvare a matricelor de adiacenta

void save_2(int **tab_2,char *fname,int u,int x){


int i,j;
FILE *demo=fopen(fname,"w");
fprintf(demo,"%d %d",u,x);
for(i=0;i<x;i++){
fprintf(demo,"\n");
for(j=0;j<x;j++)
fprintf(demo,"%d ",tab_2[i][j]);
}
fclose(demo);
}
//functia pentru salvare a listei de adiacenta
void save_3(int **vect,char *fname,int u,int x){
int i,j;
FILE *demo=fopen(fname,"w");
fprintf(demo,"%d %d",u,x);
for(i=0;i<x;i++){
fprintf(demo,"\n");
for(j=0;j<x+2;j++){
fprintf(demo,"%d ",vect[i][j]);
if(vect[i][j]==0)
break;
}
}
fclose(demo);
}
/
***********************************************************************************
**************/
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 com1,com2,com3;
char filename[20];
FILE *demo;
while(1){
/*
Meniul pentru introducere a datelor
*/
while(m){ m=0;
system("cls");
printf("Home:\n\n");
printf(" Introducerea manula:\n\n");
printf("[ 1 ] Introdu arcele\n");
printf("[ 2 ] Introdu matricea de incidenta\n");
printf("[ 3 ] Introdu matricea de adiacenta\n");
printf("[ 4 ] Introdu lista de adiacenta\n");
printf("\n Citire din fisier:\n\n");
printf("[ 5 ] Arcele\n");
printf("[ 6 ] Matricea de incidenta\n");
printf("[ 7 ] Matricea de adiacenta\n");
printf("[ 8 ] Lista de adiacenta\n\n");
printf("[ 0 ] Iesire\n");
printf("\nComanda << ");

scanf("%d",&com1);
system("cls");
switch(com1){
case 0:
exit(0);
break;
case 1:
p1 s1 p2 s2
system("cls");
a=(arc*)malloc(u*sizeof(arc));
intro1(a,u,x);
break;
case 2:
p1 s1 p2 s2
system("cls");
tab_1=aloc(u,x);
intro2(tab_1,u,x);
break;
case 3:
p1 s1 p2 s2
system("cls");
tab_2=aloc(x,x);
intro3(tab_2,x);
break;
case 4:
p1 s1 p2 s2
system("cls");
tab_3=aloc(x,x+2);
intro4(tab_3,x);
break;
case 5:
printf("Introdu numele fisierului (extensia este pusa automat .arc)\n");
scanf("%s",&filename);
strcat(filename,".arc");
demo=fopen(filename,"rt");
if(demo==NULL){
printf("\n\aEroare la deschiderea fisierului!\n");
printf("\n1) Posibil fisierului nu a fost gasit!");
printf("\n2) Posibil extensia fisierului nu este corecta!\n\n");
m=1;
} else {
fscanf(demo,"%d%d",&u,&x);
a=(arc*)malloc(u*sizeof(arc));
read_ar(a,demo);
afisare_1(a,u);
fclose(demo);
}
break;
case 6:
printf("Introdu numele fisierului (extensia este pusa automat .in)\n");
scanf("%s",&filename);
strcat(filename,".in");

demo=fopen(filename,"rt");
if(demo==NULL){
printf("\n\aEroare la deschiderea fisierului!\n");
printf("\n1) Posibil fisierului nu a fost gasit!");
printf("\n2) Posibil extensia fisierului nu este corecta!\n\n");
m=1;
} else {
fscanf(demo,"%d%d",&u,&x);
tab_1=aloc(u,x);
read_matr(tab_1,demo,u,x);
afisare_2(tab_1,u,x);
fclose(demo);
}
break;
case 7:
printf("Introdu numele fisierului (extensia este pusa automat .ad)\n");
scanf("%s",&filename);
strcat(filename,".ad");
demo=fopen(filename,"rt");
if(demo==NULL){
printf("\n\aEroare la deschiderea fisierului!\n");
printf("\n1) Posibil fisierului nu a fost gasit!");
printf("\n2) Posibil extensia fisierului nu este corecta!\n\n");
m=1;
} else {
fscanf(demo,"%d%d",&u,&x);
tab_2=aloc(x,x);
read_matr(tab_2,demo,x,x);
afisare_2(tab_2,x,x);
fclose(demo);
}
break;
case 8:
printf("Introdu numele fisierului (extensia este pusa automat .li)\n");
scanf("%s",&filename);
strcat(filename,".li");
demo=fopen(filename,"rt");
if(demo==NULL){
printf("\n\aEroare la deschiderea fisierului!\n");
printf("\n1) Posibil fisierului nu a fost gasit!");
printf("\n2) Posibil extensia fisierului nu este corecta!\n\n");
m=1;
} else {
fscanf(demo,"%d%d",&u,&x);
tab_3=aloc(x,x+2);
read_li(tab_3,demo,x);
afisare_li(tab_3,x,x);
fclose(demo);
}
break;
default:
printf("\aAti introdus o comanda gresita! { %d }\n",com1);

m=1;
break;
}
if(a==NULL){
a=(arc*)malloc(u*sizeof(arc));
if(tab_1!=NULL)
inc_arc(a,tab_1,u,x); //convertarea din matr. de incidenta in arce
else
if(tab_2!=NULL)
ad_arc(a,tab_2,x); //convertarea din matr. de adiacenta in arce
else
if(tab_3!=NULL)
li_arc(a,tab_3,x); //convertarea din lista de adiacenta in arce
}
system("pause");
}
/*
Meniul afisare/salvare/modificare
*/
system("cls");
printf("Meniu:\n\n");
printf("[ 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("[ 6 ] Salveaza in fisier\n\n");
printf("[ 0 ] Iesire\n");
printf("\nComanda << ");
scanf("%d",&com2);
system("cls");
switch(com2){
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\nIntrodu 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");
modif(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);
matr_inc(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);
matr_ad(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_li(tab_3,x,x+2);
} else {
tab_3=aloc(x,x+2);
list_inc(a,tab_3,u,x);
afisare_li(tab_3,x,x+2);
}
break;
case 6:
printf("Save menu:\n\n");
printf("[ 1 ] Salveaza Arcele\n");
printf("[ 2 ] Salveaza Matricea de incidenta\n");
printf("[ 3 ] Salveaza Matricea de adiacenta\n");
printf("[ 4 ] Salveaza Lista de adiacenta\n");
printf("\n Comanda << ");
scanf("%d",&com3);
system("cls");
switch(com3){
case 1:
printf("Salveaza Arcele:\n\n");
printf("Introduceti numele fisierului pentru salvare\n");
scanf("%s",&filename);

strcat(filename,".arc");
save(a,filename,u,x);
break;
case 2:
if(!tab_1){
printf("\aMai intii converteaza!\n");
} else {
printf("Salveaza Matricea de incidenta:\n\n");
printf("Introduceti numele fisierului pentru salvare\n");
scanf("%s",&filename);
strcat(filename,".in");
save_1(tab_1,filename,u,x);
}
break;
case 3:
if(!tab_2){
printf("\aMai intii converteaza!\n");
} else {
printf("Salveaza Matricea de adiacenta:\n\n");
printf("Introduceti numele fisierului pentru salvare\n");
scanf("%s",&filename);
strcat(filename,".ad");
save_2(tab_2,filename,u,x);
}
break;
case 4:
if(!tab_3){
printf("\aMai intii converteaza!\n");
} else {
printf("Salveaza Lista de adiacenta:\n\n");
printf("Introduceti numele fisierului pentru salvare\n");
scanf("%s",&filename);
strcat(filename,".li");
save_3(tab_3,filename,u,x);
}
break;
default:
printf("\aAti introdus o comanda gresita! { %d }\n",com2);
break;
}
break;
default:
printf("\aAti introdus o comanda gresita! { %d }\n",com2);
break;
}
system("pause");
}
return 0;
}

Concluzii: Efectund lucrarea dat am fcut cunotin cu metodele de prelucrare a grafurilor.n


program pentru a prelucra grafurile le-am reprezentat sub form de matrici.
Aceast metod nu este cea mai eficient , dar este mai uoar n aplicare. Deasemenea n program am
folosit i fiiere pentru a salva rezultatele sau pentru a folosi rezultatele salvate mai nainte.

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