{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. Вывод
Программа работает верно, что подтверждают проведенные тесты.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.