Помогите пожалуйста исправить код,он должен выводить победителя с максимальным баллом и правильной фамилией.
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
#define DL_NUM 3 /* nomer uchastnica */
#define DL_FIO 25 /* dlina polya familii v fayle */
#define DL_SCHOOL 5 /* dlina polya nomera school */
#define DL_BALL 7 /* dlina polya 5 ocenok + '\n'+'\0' */
#define DL_SUM 3 /*dlina polya summi ballov*/
struct olimpiada /* struktura zapisi vkhodnogo fayla */
{ char num[DL_NUM]; /* nomer uchastnika */
char fio[DL_FIO]; /* familiya i initsialy patsi */
char school[DL_SCHOOL]; /* nomer school */
char ball[DL_BALL]; /* spisok ballov */
char sum[DL_SUM];
};
/* Prototipy funktsiy */
void SCHOOL(FILE *f);
void POBEDIT(FILE *f);
/*--------------------*/
/* Glavnaya funktsiya */
/*--------------------*/
int main()
{
FILE *f; /* ssylka na vkhodnoy fayl */
char n; /* nomer punkta menyu */
clrscr();
f= fopen("olimpia.txt","r");
if (f==NULL)
{ puts("File olimpia.txt ne najden");
getch();
return 1;
}
do
{ puts ("\n========================================================");
puts ("Vyberite nomer punkta menyu:");
puts ("1 - vyvod FIO pobediteley,zanjavschie pervie 3 mesta");
puts ("2 - vihod");
puts ("------------------------------------------------------");
n = getche();
switch(n)
{
case '1': POBEDIT(f); break;
case '2': break;
default: puts("\nNuzhno vvodit nomer punkta ot 1 do 2");
}
if (n!='2')
{ puts("\nDlya prodolzheniya nazhmite lyubuyu klavishu");
getch();
}
}
while (n!= '2');
fclose(f);
return 0;
}
/*---------------------------------------------------*/
/* Funktsiya vyvoda spiska pobediteley, */
/* zanjavschie pervie 3 mesta */
/*---------------------------------------------------*/
void POBEDIT(FILE *f)
{
struct olimpiada tz;
const int N=5;
int i,n=0,S[N],nMax,max;
int success=0;
nMax=0;
max=S[0];
puts ("\n\n -----------------------------------------------");
puts (" | N Familiya I.O. N school Summa |");
puts (" -----------------------------------------------");
while (fgets((char*)&tz,sizeof(olimpiada),f)!=NULL)
{ for (i=0,S[N]=0; i<N; i++)
S[N] += tz.ball[i]-'0';
if (S[i] >max)
max=S[i];
}
printf(" %d %d",i ,max);
fclose(f);
getch();
}
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
#define DL_NUM 3 /* nomer uchastnica */
#define DL_FIO 25 /* dlina polya familii v fayle */
#define DL_SCHOOL 5 /* dlina polya nomera school */
#define DL_BALL 7 /* dlina polya 5 ocenok + '\n'+'\0' */
#define DL_SUM 3 /*dlina polya summi ballov*/
struct olimpiada /* struktura zapisi vkhodnogo fayla */
{ char num[DL_NUM]; /* nomer uchastnika */
char fio[DL_FIO]; /* familiya i initsialy patsi */
char school[DL_SCHOOL]; /* nomer school */
char ball[DL_BALL]; /* spisok ballov */
char sum[DL_SUM];
};
/* Prototipy funktsiy */
void SCHOOL(FILE *f);
void POBEDIT(FILE *f);
/*--------------------*/
/* Glavnaya funktsiya */
/*--------------------*/
int main()
{
FILE *f; /* ssylka na vkhodnoy fayl */
char n; /* nomer punkta menyu */
clrscr();
f= fopen("olimpia.txt","r");
if (f==NULL)
{ puts("File olimpia.txt ne najden");
getch();
return 1;
}
do
{ puts ("\n========================================================");
puts ("Vyberite nomer punkta menyu:");
puts ("1 - vyvod FIO pobediteley,zanjavschie pervie 3 mesta");
puts ("2 - vihod");
puts ("------------------------------------------------------");
n = getche();
switch(n)
{
case '1': POBEDIT(f); break;
case '2': break;
default: puts("\nNuzhno vvodit nomer punkta ot 1 do 2");
}
if (n!='2')
{ puts("\nDlya prodolzheniya nazhmite lyubuyu klavishu");
getch();
}
}
while (n!= '2');
fclose(f);
return 0;
}
/*---------------------------------------------------*/
/* Funktsiya vyvoda spiska pobediteley, */
/* zanjavschie pervie 3 mesta */
/*---------------------------------------------------*/
void POBEDIT(FILE *f)
{
struct olimpiada tz;
const int N=5;
int i,n=0,S[N],nMax,max;
int success=0;
nMax=0;
max=S[0];
puts ("\n\n -----------------------------------------------");
puts (" | N Familiya I.O. N school Summa |");
puts (" -----------------------------------------------");
while (fgets((char*)&tz,sizeof(olimpiada),f)!=NULL)
{ for (i=0,S[N]=0; i<N; i++)
S[N] += tz.ball[i]-'0';
if (S[i] >max)
max=S[i];
}
printf(" %d %d",i ,max);
fclose(f);
getch();
}
Пример входного файла
1 Ivanov A.I. 9 34545
2 Sidorov I.I. 5 54545
3 Petrov N.S. 2 47733
4 Gatin I.G. 2 56669
5 Huzin N.N. 3 13456
6 Marhanova A.N. 6 56667
7 Salihov V.V. 7 77777
8 Grushin A.A. 3 35555
9 Melnikova E.D. 3 63456
10 Elistratova O.M. 6 33333
Первое, что бросилось в глаза - чтение из файла + заполнение полей структуры. Вы должны считывать построчно (или посимвольно до символа '\n') в строковый буфер достаточной длины. Затем парсить считанную строку - разбить на лексемы по делимитеру ' ' ("пробел") и копировать ФИО при помощи функций для работы со строками. Сумму баллов удобнее сделать int. Поскольку Вам необходимо вывести 3-х победителей, а не 1, Вам понадобится хранить все структуры в массиве и затем сортировать этот массив по полю sum. В целом задача оказывается немного сложнее, чем она решена у Вас. Еще одно замечание касается форматированного вывода: избегайте форматирования полей таблицы при помощи пробелов. В функции printf() можно задать ширину для каждого поля. При таком подходе можно добиться более предсказуемого вывода, независимо от длины выводимых в поле строк.