Упорядочивание данных таблицы «Факультет» (Лабораторная работа № 5), страница 2

{int i,j;

 student k,x;

 i=L; j=2*L+1;

 x=T->elem[L];

 if ((j<R) && strcmp(T->elem[j].familiya,T->elem[j+1].familiya)<0)

 j++;

 while ((j<=R) && strcmp(x.familiya,T->elem[j].familiya)<0)

 {k=T->elem[i];

  T->elem[i]=T->elem[j];

  T->elem[j]=k;

  i=j; j=2*j+1;

  if ((j<R) && strcmp(T->elem[j].familiya,T->elem[j+1].familiya)<0)

  j++;}}

void HeapSort (tabl*T, int n)

{int L,R;

 student x;

 L=n/2; R=n-1;

 // построение пирамиды из исходного массива

 while (L>0)

 {L=L-1; Sift(T,L,R);}

  //сортировка:пирамида=>отсортированный массив

 while (R>0)

 {x=T->elem[0];

  T->elem[0]=T->elem[R];

  T->elem[R]=x;

  R--;

  Sift (T,L,R);}}

void main()

{

  FILE *f,*out;

  int i=0;

  tabl* T;

  student A;

  T=new tabl;

  T->n=0;

  if((f=fopen("in.txt","r")) == NULL) printf("File ne naiden");

  else {

        fscanf(f,"%s %s %s %s %f",&A.familiya,&A.name, &A.otchestvo, &A.gruppa,&A.srball);

  T->elem[i]=A;

  T->n=T->n+1;

  while (!feof(f)&&T->n!=N)

{fscanf(f,"%s %s %s %s %f",&A.familiya,&A.name,&A.otchestvo, &A.gruppa,&A.srball);

  i=i+1;

    while (A.srball>(*T).elem[i-1].srball && i>0)

  {T->elem[i]=T->elem[i-1];

      i=i-1;}

   T->elem[i]=A;

   T->n=T->n+1;

   i=T->n-1;}

  i=0;}

HeapSort (T,T->n);

table* t;

t=new table;

int j=0;

while(T->n!=i-1)

{

while(T->elem[i].srball>=4.0)

{

      strcpy(t->el[j].fami,T->elem[i].familiya);

      strcpy(t->el[j].nam,T->elem[i].name);

      strcpy(t->el[j].otch,T->elem[i].otchestvo);

      strcpy(t->el[j].grup,T->elem[i].gruppa);

      i++;

      j++;

}

i++;

}

if(T->n==N && !feof(f)) printf("Table is full, not all information from file check");

t->n=j;

j=0;

if((out=fopen("out.txt","w")) == NULL) printf("File ne naiden");

else

{

while(j<t->n)

{fprintf (out,"%s %s %s %s\n", t->el[j].fami, t->el[j].nam, t->el[j].otch, t->el[j].grup);

j++;}}

getch();

fclose (f);

fclose (out);}

6. Тесты

Исходный файл in.txt  будет содержать следующие данные:

ФИО

Группа

Средний балл

Rufanov Sergey Romanovich

PM-75

3

Farafonov Ivan Vladimirovich

PM-55

5

Ulyanov Konstantin Vladimirovich

PMI-91

3

Fedorova Oksana Yurevna

PM-93

3.75

Sidorov Alexey Nikolaevich

PM-93

5

Semenov Petr Grigorevich

PM-45

4

Solovev Aleksandr Leonidovich

PM-93

5

Alimova Alina Aleksandrovna

PM-73

4.25

После сортировки и создания таблицы «Отличники»  будет выведена следующая последовательность данных:

Фамилия, Имя

Группа

Балл

Alimova Alina Aleksandrovna

PM-73

4.25

Farafonov Ivan Vladimirovich

PM-55

5

Semenov Petr Grigorevich

PM-45

4

Sidorov Alexey Nikolaevich

PM-93

5

Solovev Aleksandr Leonidovich

PM-93

5

Если же фактическое количество элементов таблицы будет больше доступного, то программа выведет  сообщение о том, что таблица заполнена, и не все элементы из файла просмотрены.

Например:

Если как в данном случае n=8, а N=6, то таблица «Отличники»  примет вид:

Фамилия, Имя

Группа

Балл

Farafonov Ivan Vladimirovich

PM-55

5

Semenov Petr Grigorevich

PM-45

4

Sidorov Alexey Nikolaevich

PM-93

5

7. Вывод

Программа работает верно, что подтверждают проведенные тесты.