Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Demagnetizare (minimala) ori ba?

Cum pot sa vad pe un proiector pr...

Joc Drone

Dropshipping
 Sfat achizitie AC Gree Fairy vs P...

MONITOR LG fara sonor !

Batalia pentru Bucuresti - ND, Fi...

Identificare font
 problema ping in jocuri online

Problema calculator

Samsung Galaxy A35

Sfat pentru aprinderea automata a...
 Masina de copt paine - pareri

Rfg crescut

Cum reactivez Google Maps?

Conectare tableta X220la Tv
 

Problema citire matricea adiacenta (c code)

- - - - -
  • Please log in to reply
30 replies to this topic

#1
valeriusmen14

valeriusmen14

    Junior Member

  • Grup: Members
  • Posts: 74
  • Înscris: 09.12.2014
Cum as putea sa reduc acest program la un cod mult mai scurt. ?
#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;
}



#2
PhilipGeek

PhilipGeek

    Junior Member

  • Grup: Junior Members
  • Posts: 48
  • Înscris: 25.01.2015
Holy Crap Posted Image  Deci tu ai vrea sa "ghicesc" eu ce face codul asta, apoi sa il optimizez? Sau n-am inteles.  Fi si tu putin mai explicit!

#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Asta da challenge. Are si goto, si mai fain :D
Dar ce inseamna "converteaza"?

Edited by dani.user, 16 February 2015 - 20:19.


#4
valeriusmen14

valeriusmen14

    Junior Member

  • Grup: Members
  • Posts: 74
  • Înscris: 09.12.2014

View PostPhilipGeek, on 16 februarie 2015 - 19:54, said:

Holy Crap Posted Image  Deci tu ai vrea sa "ghicesc" eu ce face codul asta, apoi sa il optimizez? Sau n-am inteles.  Fi si tu putin mai explicit!

Deci asta e un program care , reprezinta un graf prin 3 metode : 1) Matricea de adiacenta 2) de incidenta 3) lista de adiacenta.
Am facut sa se introduca arcele si virfurile de la tastatura .  El urmeaza sa reprezinte  valorile introduse prin aceste 3 metode.  Mai jos  se convertesc  reprezentarile din una in alta . Din matrice in lista , din lista in matrice , in arce . ... . Pentru a accesa toate functiile am facut un meniu . Codul programului s-a primit foarte mare  .

View Postdani.user, on 16 februarie 2015 - 20:11, said:

Asta da challenge. Are si goto, si mai fain Posted Image
Dar ce inseamna "converteaza"?

Converteaza = transforma .
cu pointerii mai greu .  Si de aia am folosit metoda clasica , goto


Baieti ! Daca reusiti sa ma ajutati , JOS PALARIA .

Edited by valeriusmen14, 16 February 2015 - 20:33.


#5
Unliving

Unliving

    Junior Member

  • Grup: Members
  • Posts: 161
  • Înscris: 06.09.2005
Ai incercat sa-l arhivezi?

cu toate ironiile pe langa, nu vad rostul sa ai tot carnatul ala de cod intr-un singur fisier. Ia si aplica un principiu, ceva.

Edited by Unliving, 16 February 2015 - 20:53.


#6
valeriusmen14

valeriusmen14

    Junior Member

  • Grup: Members
  • Posts: 74
  • Înscris: 09.12.2014

View PostUnliving, on 16 februarie 2015 - 20:51, said:

Ai incercat sa-l arhivezi?

cu toate ironiile pe langa, nu vad rostul sa ai tot carnatul ala de cod intr-un singur fisier. Ia si aplica un principiu, ceva.
Cum adica sa-l arhivez?

#7
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,025
  • Înscris: 24.02.2006

View Postvaleriusmen14, on 16 februarie 2015 - 19:19, said:

Cum as putea sa reduc acest program la un cod mult mai scurt. ?
.................

scoate toate enter-urile din cod(mai putin cele de la directivele de preprocesare), sunt oricum ignorate de compilator. mai poti scoate spatiile multiple si tab-urile multiple (le poti inlocui pe toate cu un singur spatiu). o sa iasa ceva mult mai scurt.

#8
PhilipGeek

PhilipGeek

    Junior Member

  • Grup: Junior Members
  • Posts: 48
  • Înscris: 25.01.2015
@Initiator: Daca vrei mai putine linii de cod, simplu: compreseaza-ti codul:
int main() { int a=1,b=1,s; s=a+b; cout<<s; return 0; }



Sau poate te referi la optimizarea codului. Nu cred ca o sa gasesti pe cineva care sa isi bata capul cu 600 de linii de cod, gratuit. Cauta pe Google niste tehnici de optimizare si aplica-le pe codul tau. Vino cu solutii si noi te ajutam. Nu iti putem da "mura-n gura". Succes!

#9
EnachescuAlin

EnachescuAlin

    Active Member

  • Grup: Members
  • Posts: 1,008
  • Înscris: 08.07.2013

View PostPhilipGeek, on 16 februarie 2015 - 22:30, said:

@Initiator: Daca vrei mai putine linii de cod, simplu: compreseaza-ti codul:
int main() { int a=1,b=1,s; s=a+b; cout<<s; return 0; }

Nu mi se pare o solutie inteligenta.

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Codul nu trebuie sa fie mic, trebuie sa fie lizibil. Al tau e departe de asa ceva, plin de litere ale alfabetului, si un meniu destul de ciudat.
Uite o idee de imbunatatire ca tot am vrut sa testez CLion.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	int start;
	int stop;
} Arc;

char *extensions[] = {".arc", ".in", ".ad", ".li"};

void clear() { system("cls"); }
void pause() { system("pause"); }

int **alloc_matrix(size_t nrRows, size_t nrCols) {
	int **matrix = NULL;
	int i;
	matrix = (int **) malloc(nrRows * sizeof(int *));
	if (matrix == NULL)
		return matrix;
	for (i = 0; i < nrRows; i++) {
		matrix[i] = (int *) malloc(nrCols * sizeof(int));
		if (matrix[i] == NULL)
			return NULL;
	}
	return matrix;
}

int **free_matrix(int **data, size_t nrRows) {
	int i;
	if (data == NULL)
		return data;
	for (i = 0; i < nrRows; i++)
		free(data[i]);
	free(data);
	data = NULL;
	return data;
}

void manual_arc_entry(Arc *arcs, size_t nrArcs, size_t nrNodes) {
	int i;
	for (i = 0; i < nrArcs; i++) {
		while(1) {
			clear();
			printf("Introdu datele arcului %d\n", i + 1);
			printf("Introdu inceputul: X");
			scanf("%d", &arcs[i].start);
			printf("Introdu sfarsitul: X");
			scanf("%d", &arcs[i].stop);
			if (arcs[i].start >= 1 && arcs[i].start <= nrNodes && arcs[i].stop >= 1 && arcs[i].stop <= nrNodes) {
				break;
			}
			printf("Ati introdus varfuri care nu exista!\n");
			printf("Incercati din nou\n");
			pause();
		}
	}
}

void manual_incidence_entry(int **data, int u, int x) {
	int i, j;
	for (i = 0; i < u; i++) {
		printf("Matricea de incidenta:\n");
		printf("Randul %d\n", i + 1);
		for (j = 0; j < x; j++) {
			while(1) {
				printf("[U%d][X%d]=", i + 1, j + 1);
				scanf("%d", &data[i][j]);
				if ((data[i][j] >= -1 && data[i][j] <= 2)) {
					break;
				}
				printf("Matricea de incidenta poate sa contina doar ( -1, 0, 1, 2 )\n");
				printf("Incercati din nou!\n");
				pause(); clear();
			}
		}
		clear();
	}
	printf("Introducerea s-a efectuat cu succes!\n");
}

void manual_adj_matrix_entry(int **data, size_t nrNodes) {
	int i, j;
	for (i = 0; i < nrNodes; i++) {
		printf("Matricea de adiacenta:\n");
		printf("Randul %d\n", i + 1);
		for (j = 0; j < nrNodes; j++) {
			printf("[X%d][X%d]=", i + 1, j + 1);
			scanf("%d", &data[i][j]);
		}
		clear();
	}
	printf("Introducerea s-a efectuat cu succes!\n");
}

void manual_adj_list_entry(int **data, size_t nrNodes) {
	int i, j;
	for (i = 0; i < nrNodes; i++) {
		printf("Lista de adiacenta:\n");
		printf("Randul %d\n", i + 1);
		printf("%d\n-\n", i + 1);
		data[i][0] = i + 1;
		for (j = 1; j < nrNodes + 2; j++) {
			scanf("%d", &data[i][j]);
			if (data[i][j] == 0)
				break;
		}
		clear();
	}
	printf("Introducerea s-a efectuat cu succes!\n");
}

void convert_inc_to_arcs(Arc *destination, int **source, size_t nrArcs, size_t nrNodes) {
	int i, j;
	for (i = 0; i < nrArcs; i++) {
		for (j = 0; j < nrNodes; j++) {
			if (source[i][j] == -1)
				destination[i].start = j + 1;
			if (source[i][j] == 1)
				destination[i].stop = j + 1;
			if (source[i][j] == 2) {
				destination[i].start = j + 1;
				destination[i].stop = j + 1;
			}
		}
	}
}

void convert_adj_matrix_to_arcs(Arc *destination, int **source, size_t nrNodes) {
	int i, j, l = 0;
	for (i = 0; i < nrNodes; i++) {
		for (j = 0; j < nrNodes; j++) {
			if (source[i][j] == 1) {
				destination[l].start = i + 1;
				destination[l].stop = j + 1;
				l++;
			}
		}
	}
}

void convert_adj_list_to_arcs(Arc *destination, int **source, size_t nrNodes) {
	int i, j, l = 0;
	for (i = 0; i < nrNodes; i++) {
		for (j = 1; j < nrNodes + 2; j++) {
			if (source[i][j] != 0) {
				destination[l].start = i + 1;
				destination[l].stop = source[i][j];
				l++;
			} else
				break;
		}
	}
}

void display_arcs(Arc *arcs, size_t nrArcs) {
	int i;
	for (i = 0; i < nrArcs; i++) {
		printf("Datele arcului %d\n", i + 1);
		printf("X%d --> X%d\n", arcs[i].start, arcs[i].stop);
	}
}

void display_matrix(int **data, size_t nrRows, size_t nrCols) {
	int i, j;
	for (i = 0; i < nrRows; i++) {
		for (j = 0; j < nrCols; j++)
			printf("\t%d", data[i][j]);
		printf("\n");
	}
}

void display_list(int **data, int n, int m) {
	int i, j;
	for (i = 0; i < n; i++) {
		printf("%d |", data[i][0]);
		for (j = 1; j < m; j++) {
			printf("  %d", data[i][j]);
			if (data[i][j] == 0)
				break;
		}
		printf("\n");
	}
}

void convert_arcs_to_inc(Arc *source, int **destination, size_t nrArcs, size_t nrNodes) {
	int i, j;
	for (i = 0; i < nrArcs; i++) {
		for (j = 0; j < nrNodes; j++) {
			if (source[i].start == source[i].stop && source[i].start == j + 1)
				destination[i][j] = 2;
			else if (source[i].start == j + 1)
				destination[i][j] = -1;
			else if (source[i].stop == j + 1)
				destination[i][j] = 1;
			else
				destination[i][j] = 0;
		}
	}
}

void convert_arcs_to_adj(Arc *source, int **destination, size_t nrArcs, size_t nrNodes) {
	int i, j, l, k = 0;
	for (i = 0; i < nrNodes; i++) {
		for (j = 0; j < nrNodes; j++) {
			for (l = 0; l < nrArcs; l++) {
				if (source[l].start == i + 1 && source[l].stop == j + 1) {
					destination[i][j] = 1;
					k++;
				}
			}
			if (!k)
				destination[i][j] = 0;
			k = 0;
		}
	}
}

void convert_arcs_to_inc_list(Arc *source, int **destination, size_t nrArcs, size_t nrNodes) {
	int i, j, l, k = 1;
	for (i = 0; i < nrNodes; i++) {
		destination[i][0] = i + 1;
		k = 1;
		for (j = 1; j < nrNodes + 1; j++) {
			for (l = 0; l < nrArcs; l++) {
				if (source[l].start == i + 1 && source[l].stop == j) {
					destination[i][k] = j;
					k++;
				}
			}
		}
		destination[i][k] = 0;
	}
}

void change_arc(Arc *arcs, size_t index) {
	printf("Datele arcului %d", index);
	printf("X%d --> X%d\n", arcs[index - 1].start, arcs[index - 1].stop);
	printf("Introdu inceputul: X");
	scanf("%d", &arcs[index - 1].start);
	printf("Introdu sfirsitul: X");
	scanf("%d", &arcs[index - 1].stop);
}

void read_arcs_from_file(Arc *arcs, FILE *file) {
	int i = 0;
	while (!feof(file)) {
		fscanf(file, "%d%d", &arcs[i].start, &arcs[i].stop);
		i++;
	}
	printf("Citirea a avut loc cu succes!\n");
}

void read_matrix_from_file(int **destination, FILE *file, int n, int m) {
	int i = 0, j = 0;
	while ((!feof(file)) && i < n) {
		while (j < m) {
			fscanf(file, "%d", &destination[i][j]);
			j++;
		}
		i++;
		j = 0;
	}
	printf("Citirea a avut loc cu succes!\n");
}

void read_adj_list_from_file(int **destination, FILE *file, size_t nrNodes) {
	int i = 0, j = 0;
	while ((!feof(file)) && i < nrNodes) {
		while (destination[i][j - 1] != 0) {
			fscanf(file, "%d", &destination[i][j]);
			j++;
		}
		i++;
		j = 0;
	}
	printf("Citirea a avut loc cu succes!\n");
}

void save_arcs_to_file(Arc *arcs, FILE *file, size_t nrArcs, size_t nrNodes) {
	int i;
	fprintf(file, "%d %d", nrArcs, nrNodes);
	for (i = 0; i < nrArcs; i++)
		fprintf(file, "\n%d %d", arcs[i].start, arcs[i].stop);
}

void save_inc_matrix_to_file(int **data, FILE *file, int u, int x) {
	int i, j;
	fprintf(file, "%d %d", u, x);
	for (i = 0; i < u; i++) {
		fprintf(file, "\n");
		for (j = 0; j < x; j++)
			fprintf(file, "%d ", data[i][j]);
	}
}

void save_adj_matrix_to_file(int **data, FILE *file, int u, int x) {
	int i, j;
	fprintf(file, "%d %d", u, x);
	for (i = 0; i < x; i++) {
		fprintf(file, "\n");
		for (j = 0; j < x; j++)
			fprintf(file, "%d ", data[i][j]);
	}
}

void save_adj_list_to_file(int **data, FILE *file, int u, int x) {
	int i, j;
	fprintf(file, "%d %d", u, x);
	for (i = 0; i < x; i++) {
		fprintf(file, "\n");
		for (j = 0; j < x + 2; j++) {
			fprintf(file, "%d ", data[i][j]);
			if (data[i][j] == 0)
				break;
		}
	}
}

int mainMenu(Arc **arcs, int*** inc_matrix, int*** adj_matrix, int*** adj_list, size_t *nrArcs, size_t *nrNodes) {
	int choice, continueMenu = 1;
	char filename[20];
	FILE *file;

	while (continueMenu) {
		continueMenu = 0;
		clear();
		printf("Home:\n");
		printf("Introducerea manula:\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("Citire din fisier:\n");
		printf("[ 5 ] Arcele\n");
		printf("[ 6 ] Matricea de incidenta\n");
		printf("[ 7 ] Matricea de adiacenta\n");
		printf("[ 8 ] Lista de adiacenta\n");
		printf("[ 0 ] Iesire\n");
		printf("Comanda << ");
		scanf("%d", &choice);
		clear();
		if (choice == 0) {
			return 0;
		}
		else if (choice > 8) {
			printf("Ati introdus o comanda gresita!  { %d }\n", choice);
			continueMenu = 1;
		}
		else if (choice > 0 && choice < 5) {
			printf("Introdu numarul de arce: ");
			scanf("%d", nrArcs);
			printf("Introdu numarul de varfuri: ");
			scanf("%d", nrNodes);
			clear();
			switch (choice) {
				case 1:
					*arcs = (Arc *) malloc(*nrArcs * sizeof(Arc));
					manual_arc_entry(*arcs, *nrArcs, *nrNodes);
					break;
				case 2:
					*inc_matrix = alloc_matrix(*nrArcs, *nrNodes);
					manual_incidence_entry(*inc_matrix, *nrArcs, *nrNodes);
					break;
				case 3:
					*adj_matrix = alloc_matrix(*nrNodes, *nrNodes);
					manual_adj_matrix_entry(*adj_matrix, *nrNodes);
					break;
				case 4:
					*adj_list = alloc_matrix(*nrNodes, *nrNodes + 2);
					manual_adj_list_entry(*adj_list, *nrNodes);
					break;
				default:
					break;
			}
		}
		else {
			printf("Introdu numele fisierului (extensia este pusa automat %s)\n", extensions[choice - 5]);
			scanf("%s", filename);
			strcat(filename, extensions[choice - 5]);
			file = fopen(filename, "rt");
			if (file == NULL) {
				printf("Eroare la deschiderea fisierului!\n");
				printf("1) Posibil fisierului nu a fost gasit!");
				printf("2) Posibil extensia fisierului nu este corecta!\n");
				continueMenu = 1;
			} else {
				fscanf(file, "%d%d", nrArcs, nrNodes);
				*arcs = (Arc *) malloc(*nrArcs * sizeof(Arc));
				read_arcs_from_file(*arcs, file);
				display_arcs(*arcs, *nrArcs);
				switch (choice) {
					case 5:
						*arcs = (Arc *) malloc(*nrArcs * sizeof(Arc));
						read_arcs_from_file(*arcs, file);
						display_arcs(*arcs, *nrArcs);
						break;
					case 6:
						*inc_matrix = alloc_matrix(*nrArcs, *nrNodes);
						read_matrix_from_file(*inc_matrix, file, *nrArcs, *nrNodes);
						display_matrix(*inc_matrix, *nrArcs, *nrNodes);
						break;
					case 7:
						*adj_matrix = alloc_matrix(*nrNodes, *nrNodes);
						read_matrix_from_file(*adj_matrix, file, *nrNodes, *nrNodes);
						display_matrix(*adj_matrix, *nrNodes, *nrNodes);
						break;
					case 8:
						*adj_list = alloc_matrix(*nrNodes, *nrNodes + 2);
						read_adj_list_from_file(*adj_list, file, *nrNodes);
						display_list(*adj_list, *nrNodes, *nrNodes);
						break;
					default:
						break;
				}
				fclose(file);
			}
			break;
		}

		if (*arcs == NULL) {
			*arcs = (Arc *) malloc(*nrArcs * sizeof(Arc));
			if (inc_matrix != NULL)
				convert_inc_to_arcs(*arcs, *inc_matrix, *nrArcs, *nrNodes); //convertarea din matr. de incidenta in arce
			else if (adj_matrix != NULL)
				convert_adj_matrix_to_arcs(*arcs, *adj_matrix, *nrNodes); //convertarea din matr. de adiacenta in arce
			else if (adj_list != NULL)
				convert_adj_list_to_arcs(*arcs,* adj_list, *nrNodes); //convertarea din lista de adiacenta in arce
		}
		pause();
	}

	return 1;
}

int secondMenu(Arc **arcs, int*** inc_matrix, int*** adj_matrix, int*** adj_list, size_t nrArcs, size_t nrNodes) {
	char filename[20];
	FILE *file;
	size_t choice, subChoice, currentArc;

	printf("Meniu:\n");
	printf("[ 1 ] Afisarea arcelor\n");
	printf("[ 2 ] Modificarea arcelor\n");
	printf("[ 3 ] Matricea de incidenta\n");
	printf("[ 4 ] Matricea de adiacenta\n");
	printf("[ 5 ] Lista de incidenta\n");
	printf("[ 6 ] Salveaza in fisier\n");
	printf("[ 0 ] Iesire\n");
	printf("Comanda << ");
	scanf("%d", &choice);
	clear();
	if (choice == 0) {
		return 0;
	}
	else if (choice == 1) {
		display_arcs(*arcs, nrArcs);
	}
	else if (choice == 2) {
		while(1) {
			clear();
			display_arcs(*arcs, nrArcs);
			printf("Introdu numarul arcului pentru modificare: ");
			scanf("%d", &currentArc);
			if (currentArc >= 1 && currentArc <= nrArcs) {
				break;
			}
			clear();
			printf("Arcul introdus nu exista! Incercati din nou.\n");
			pause();
		}
		clear();
		change_arc(*arcs, currentArc);
	}
	else if (choice == 3) {
		printf("Matricea de incidenta:\n");
		if (inc_matrix) {
			display_matrix(*inc_matrix, nrArcs, nrNodes);
		}
		else {
			*inc_matrix = alloc_matrix(nrArcs, nrNodes);
			convert_arcs_to_inc(*arcs, *inc_matrix, nrArcs, nrNodes);
			display_matrix(*inc_matrix, nrArcs, nrNodes);
		}
	}
	else if (choice == 4) {
		printf("Matricea de adiacenta:\n");
		if (adj_matrix) {
			display_matrix(*adj_matrix, nrArcs, nrNodes);
		}
		else {
			*adj_matrix = alloc_matrix(nrNodes, nrNodes);
			convert_arcs_to_adj(*arcs, *adj_matrix, nrArcs, nrNodes);
			display_matrix(*adj_matrix, nrNodes, nrNodes);
		}
	}
	else if (choice == 5) {
		printf("Lista de incidenta:\n");
		if (adj_list != NULL) {
			display_list(*adj_list, nrNodes, nrNodes + 2);
		} else {
			*adj_list = alloc_matrix(nrNodes, nrNodes + 2);
			convert_arcs_to_inc_list(*arcs, *adj_list, nrArcs, nrNodes);
			display_list(*adj_list, nrNodes, nrNodes + 2);
		}
	}
	else if (choice == 6) {
		printf("Save menu:\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("Comanda << ");
		scanf("%d", &subChoice);
		clear();
		switch (subChoice) {
			case 1:
				printf("Salveaza Arcele:\n");
				printf("Introduceti numele fisierului pentru salvare\n");
				scanf("%s", filename);
				strcat(filename, ".arc");
				file = fopen(filename, "w");
				save_arcs_to_file(*arcs, file, nrArcs, nrNodes);
				fclose(file);
				break;
			case 2:
				if (!inc_matrix) {
					printf("Mai intii converteaza!\n");
				} else {
					printf("Salveaza Matricea de incidenta:\n");
					printf("Introduceti numele fisierului pentru salvare\n");
					scanf("%s", filename);
					strcat(filename, ".in");
					file = fopen(filename, "w");
					save_inc_matrix_to_file(*inc_matrix, file, nrArcs, nrNodes);
					fclose(file);
				}
				break;
			case 3:
				if (!adj_matrix) {
					printf("Mai intii converteaza!\n");
				} else {
					printf("Salveaza Matricea de adiacenta:\n");
					printf("Introduceti numele fisierului pentru salvare\n");
					scanf("%s", filename);
					strcat(filename, ".ad");
					file = fopen(filename, "w");
					save_adj_matrix_to_file(*adj_matrix, file, nrArcs, nrNodes);
					fclose(file);
				}
				break;
			case 4:
				if (!adj_list) {
					printf("Mai intii converteaza!\n");
				} else {
					printf("Salveaza Lista de adiacenta:\n");
					printf("Introduceti numele fisierului pentru salvare\n");
					scanf("%s", filename);
					strcat(filename, ".li");
					file = fopen(filename, "w");
					save_adj_list_to_file(*adj_list, file, nrArcs, nrNodes);
					fclose(file);
				}
				break;
			default:
				printf("Ati introdus o comanda gresita!  { %d }\n", choice);
				break;
		}
	}
	else {
		printf("Ati introdus o comanda gresita!  { %d }\n", choice);
	}
}

/*************************************************************************************************/
int main() {
	Arc *arcs = NULL; //tablou unidimensional de tip structura pentru arce
	int **inc_matrix = NULL, **adj_matrix = NULL, **adj_list = NULL; //tablou bidimensional pentru matrice
	size_t nrArcs = 0, nrNodes = 0;
	while (1) {
		/*   Meniul pentru introducere a datelor			   */
		if (mainMenu(&arcs, &inc_matrix, &adj_matrix, &adj_list, &nrArcs, &nrNodes) == 0) break;
		/*   Meniul afisare/salvare/modificare				 */
		clear();
		if (secondMenu(&arcs, &inc_matrix, &adj_matrix, &adj_list, nrArcs, nrNodes) == 0) break;
		pause();
	}

	if (arcs)
		free(arcs);
	if (inc_matrix)
		inc_matrix = free_matrix(inc_matrix, nrArcs);
	if (adj_matrix)
		adj_matrix = free_matrix(adj_matrix, nrNodes);
	if (adj_list)
		adj_list = free_matrix(adj_list, nrNodes + 2);
	return 0;
}



Edited by dani.user, 16 February 2015 - 22:38.


#11
PhilipGeek

PhilipGeek

    Junior Member

  • Grup: Junior Members
  • Posts: 48
  • Înscris: 25.01.2015

View PostEnachescuAlin, on 16 februarie 2015 - 22:37, said:

Nu mi se pare o solutie inteligenta.

Evident. Nu are nici un impact asupra performantei. Era mai mult ironic.

#12
paulicaFX

paulicaFX

    Member

  • Grup: Members
  • Posts: 792
  • Înscris: 08.08.2011
Scoate spatiile si new lineurile

#13
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postvaleriusmen14, on 16 februarie 2015 - 19:19, said:

Cum as putea sa reduc acest program la un cod mult mai scurt. ?
Codul sursa nu se va regasi in fisierul .exe rezultat in urma compilarii finale. Asadar lungimea codului sursa nu va afecta performanta programului.

Codul sursa trebuie optimizat pentru a fi citit si inteles de catre alti programatori.

#14
cookiemonster

cookiemonster

    Junior Member

  • Grup: Members
  • Posts: 58
  • Înscris: 09.07.2010
Daca nu te superi, de unde ti-a venit ideea sa faci un asemenea program?

#15
valeriusmen14

valeriusmen14

    Junior Member

  • Grup: Members
  • Posts: 74
  • Înscris: 09.12.2014

View Postcookiemonster, on 17 februarie 2015 - 12:37, said:

Daca nu te superi, de unde ti-a venit ideea sa faci un asemenea program?
Am nevoie de el pentru un poiect de an .   . Dar  trebuie sa fie cit mai optimizat daca vreau o nota mare  si sa nu pierd bursa . P.S Sa reduc numaul de spatii e inutil, nu asta era ideea .

#16
LittleWho

LittleWho

    Member

  • Grup: Members
  • Posts: 288
  • Înscris: 30.11.2013
Pai daca ai nevoie de el pentru un proiect prezinta si tu un pic de "profesionalism"... Indenteazal bine, comenteaza-l corespunzator, imparte codul in mai multe fisiere...
In legatura cu optimizarea... Cauta pe google cum se optimizeaza codul sau cred ca ar trebui sa stii deja cate ceva... Apoi vin-o cu bucati mai mici de cod, functii individuale unde nu reusesti sa optimizezi nimic si noi te ajutam... Nu te va ajuta nimeni sa optimizezi 600 de linii de cod fara ceva "stimulent", daca intelegi ce zic Posted Image ...

PS Nu printa inutuil la finalul functiilor gen read_matrix_from_file, in schimb functia poate returna o valoare pt succes si una pt esec si tu te folosesti de asta. Functia trebuie sa isi faca doar treaba ei si tu ar trebui printezi chestii pt user in functie de ce face si ce returneaza... ... Ideea e sa separi User Interface de restul...

Edited by LittleWho, 19 February 2015 - 20:07.


#17
spider15101994

spider15101994

    Junior Member

  • Grup: Members
  • Posts: 68
  • Înscris: 28.02.2015
Buna , am facut un program pentru reprezentarea unui graf cu introducerea de la tastatura in 4 moduri: introducerea sipla a arcelor , matricea de adiacenta , de incidenta si lista de adiacenta . Recunosc m-am inspirat de pe niste forumuri straine (U.S.A).  Programul merge perfect , dar as vrea sa indeplineasca un mic capriciu de-al meu .  Cind introduc datele in matrici sau lista  dupa ce a fost citita valoarea 1   automat la celelalte sa se puna 0 sa nu trebuiasca sa le introduc manual ;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define p1 printf("Introduceti numarul de arce dorit: ");
#define s1 scanf("%d",&u);
#define p2 printf("Introduceti numarul de virfuri dorit: ");
#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("Meniul Principal:\n\n");
printf(" Introducerea datelor:\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;
}


Intrebati orice nu este clar . Sunt aici .

Edited by spider15101994, 16 March 2015 - 19:38.


#18
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postspider15101994, on 16 martie 2015 - 19:37, said:

Buna , am facut un program pentru reprezentarea unui graf cu introducerea de la tastatura in 4 moduri: introducerea sipla a arcelor , matricea de adiacenta , de incidenta si lista de adiacenta . Recunosc m-am inspirat de pe niste forumuri straine (U.S.A).  Programul merge perfect , dar as vrea sa indeplineasca un mic capriciu de-al meu .  Cind introduc datele in matrici sau lista  dupa ce a fost citita valoarea 1   automat la celelalte sa se puna 0 sa nu trebuiasca sa le introduc manual ;
Ai mai multe posibilitati. Cea mai naiva ar fi sa initializezi listele / matricile cu 0, si sa suprascrii cu 1 unde e nevoie. O alta posibilitate, mai avansata, ar fi folosirea de sparse matrices. Nu e, strict vorbind, o alternativa la prima posibilitate, ci mai degraba o oportunitate de optimizare a memoriei.

View Postspider15101994, on 16 martie 2015 - 19:37, said:

Intrebati orice nu este clar . Sunt aici .
De ce imi e greu sa iti inteleg codul?

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate