Пояснить листинг программы с динамическим массивом структур (и создание файлов) - C (СИ)
Формулировка задачи:
/*Sozdaite fail katalog knig. Naidite spetsialinosti p k-roi imeetsea naibolishee 4islo knig.*/ #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<malloc.h> typedef struct Kniga { char spetsialinosti[40], avtor[40], nazvanie[80]; int god;} Kniga ; typedef struct Spets{ char nazv_sp[40]; int kol_vo; } Spets ; int main() { Kniga katalog; Spets *sp; int i, imax; int n; FILE *fk; sp=(Spets*)calloc(n,sizeof(Spets)); //sp=(Spets*)calloc(n,(sizeof(int)+sizeof(char))); printf ("Vvesti kol-vo spetsialinostei: n="); scanf("%d",&n); for (i=0; i<n; i++ ) {printf(" vvedite nazvanie spetsialinosti %d :",i); scanf("%s",sp[i].nazv_sp); (sp[i].kol_vo)=0; printf("sp[%d].kol_vo=%d\n",i,sp[i].kol_vo); } if ((fk = fopen("katalog.dat","w"))==NULL) printf("Nevozmojno otkriti fail!!!\n"); else { printf("vvesti spetsialinosti, avtora, nazvanie knigi, god izdania \n"); printf("vvesti EOF dlea zavershenie programi\n"); // - Po4emu???? printf("? "); scanf("%s %s %s %d",katalog.spetsialinosti,katalog.avtor,katalog.nazvanie,&katalog.god); while (!feof(stdin)){ fprintf(fk,"%s %s %s %d\n",katalog.spetsialinosti,katalog.avtor,katalog.nazvanie,katalog.god); printf("? "); scanf("%s %s %s %d",katalog.spetsialinosti,katalog.avtor,katalog.nazvanie,&katalog.god); } fclose( fk ); } if ((fk = fopen("katalog.dat","r"))==NULL) printf("Nevozmojno otkriti etot fail!!!\n"); else { while ( !feof(stdin)) { printf("!!!"); for (i=0; i<n; i++ ) { printf("!!!"); if (sp[i].nazv_sp==katalog.spetsialinosti) sp[i].kol_vo=sp[i].kol_vo+1; else printf("drug spets!!!\n"); } } } //rewind(fk); for (i=0; i<n; i++) {printf("Po spetsialinosti nr.%d - %s - %d knig\n ", i, sp[i].nazv_sp, sp[i].kol_vo);} imax=0; { for (i=1; i<n; i++) if (sp[i].kol_vo>sp[imax].kol_vo) { sp[imax].kol_vo=sp[i].kol_vo; imax=i;} } printf ("Maximalinaya spetsialinosti: spetsialinosti nr.%d - %s - %d knig\n", imax,sp[imax].nazv_sp, sp[imax].kol_vo); printf("zavershenie raboti \n"); fclose(fk); free(sp); getch(); return 0; }
Решение задачи: «Пояснить листинг программы с динамическим массивом структур (и создание файлов)»
textual
Листинг программы
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<malloc.h> typedef struct Kniga { char spetsialinosti[40], avtor[40], nazvanie[80]; int god;} Kniga ; typedef struct Spets{ char nazv_sp[40]; int kol_vo; } Spets ; int main() { Kniga katalog; Spets *sp; int i, imax; int n; FILE *fk; sp=(Spets*)calloc(n,sizeof(Spets)); printf ("Vvesti kol-vo spetsialinostei: n="); scanf("%d",&n); for (i=0; i<n; i++ ) {printf(" vvedite nazvanie spetsialinosti %d :",i); scanf("%s",sp[i].nazv_sp); (sp[i].kol_vo)=0; printf("sp[%d].kol_vo=%d\n",i,sp[i].kol_vo); } if ((fk = fopen("katalog.dat","w"))==NULL) printf("Nevozmojno otkriti fail!!!\n"); else { printf("vvesti spetsialinosti, avtora, nazvanie knigi, god izdania \n"); printf("vvesti EOF dlea zavershenie programi\n"); // - Po4emu???? printf("? "); scanf("%s %s %s %d",katalog.spetsialinosti,katalog.avtor,katalog.nazvanie,&k atalog.god); while (!feof(stdin)){ fprintf(fk,"%s %s %s %d\n",katalog.spetsialinosti,katalog.avtor,katalog.nazvanie, katalog.god); printf("? "); scanf("%s %s %s %d",katalog.spetsialinosti,katalog.avtor,katalog.nazvanie,&k atalog.god); } fclose( fk ); } if ((fk = fopen("katalog.dat","r"))==NULL) printf("Nevozmojno otkriti etot fail!!!\n"); else { while ( !feof(stdin)) { for (i=0; i<n; i++ ) { if (sp[i].nazv_sp==katalog.spetsialinosti) sp[i].kol_vo=sp[i].kol_vo+1; else printf("drug spets!!!\n"); } } } for (i=0; i<n; i++) { printf("Po spetsialinosti nr.%d - %s - %d knig\n ", i, sp[i].nazv_sp, sp[i].kol_vo); } imax=0; for (i=1; i<n; i++) if (sp[i].kol_vo>sp[imax].kol_vo) { sp[imax].kol_vo=sp[i].kol_vo; imax=i;} printf ("Maximalinaya spetsialinosti: spetsialinosti nr.%d - %s - %d knig\n", imax,sp[imax].nazv_sp, sp[imax].kol_vo); printf("zavershenie raboti \n"); fclose(fk); free(sp); getch(); return 0; }