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 |
Problema citire matricea adiacenta (c code)
#1
Posted 16 February 2015 - 19:19
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
Posted 16 February 2015 - 19:54
Holy Crap 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
Posted 16 February 2015 - 20:11
Asta da challenge. Are si goto, si mai fain
Dar ce inseamna "converteaza"? Edited by dani.user, 16 February 2015 - 20:19. |
#4
Posted 16 February 2015 - 20:29
PhilipGeek, on 16 februarie 2015 - 19:54, said:
Holy Crap 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 . dani.user, on 16 februarie 2015 - 20:11, said:
Asta da challenge. Are si goto, si mai fain 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
Posted 16 February 2015 - 20:51
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
Posted 16 February 2015 - 20:57
#7
Posted 16 February 2015 - 22:14
valeriusmen14, 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
Posted 16 February 2015 - 22:30
@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
Posted 16 February 2015 - 22:37
#10
Posted 16 February 2015 - 22:37
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", ¤tArc); 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
Posted 16 February 2015 - 22:54
#13
Posted 17 February 2015 - 07:23
valeriusmen14, on 16 februarie 2015 - 19:19, said:
Cum as putea sa reduc acest program la un cod mult mai scurt. ? Codul sursa trebuie optimizat pentru a fi citit si inteles de catre alti programatori. |
#14
Posted 17 February 2015 - 12:37
Daca nu te superi, de unde ti-a venit ideea sa faci un asemenea program?
|
#15
Posted 19 February 2015 - 18:22
cookiemonster, on 17 februarie 2015 - 12:37, said:
Daca nu te superi, de unde ti-a venit ideea sa faci un asemenea program? |
|
#16
Posted 19 February 2015 - 20:02
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 ... 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
Posted 16 March 2015 - 19:37
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
Posted 16 March 2015 - 19:56
spider15101994, 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 ; spider15101994, on 16 martie 2015 - 19:37, said:
Intrebati orice nu este clar . Sunt aici . |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users