Пояснить листинг программы с динамическим массивом структур (и создание файлов) - 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;
}

Оцени полезность:

15   голосов , оценка 4.333 из 5
Похожие ответы