Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите пожалуйста исправить код,он должен выводить победителя с максимальным баллом и правильной фамилией.

80K
21 декабря 2012 года
yamaschi
2 / / 10.04.2012
Помогите пожалуйста исправить код,он должен выводить победителя с максимальным баллом и правильной фамилией.

Код:
#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();
                }

Пример входного файла
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
20K
13 января 2013 года
sem2711
124 / / 23.09.2009
Первое, что бросилось в глаза - чтение из файла + заполнение полей структуры. Вы должны считывать построчно (или посимвольно до символа '\n') в строковый буфер достаточной длины. Затем парсить считанную строку - разбить на лексемы по делимитеру ' ' ("пробел") и копировать ФИО при помощи функций для работы со строками. Сумму баллов удобнее сделать int. Поскольку Вам необходимо вывести 3-х победителей, а не 1, Вам понадобится хранить все структуры в массиве и затем сортировать этот массив по полю sum. В целом задача оказывается немного сложнее, чем она решена у Вас. Еще одно замечание касается форматированного вывода: избегайте форматирования полей таблицы при помощи пробелов. В функции printf() можно задать ширину для каждого поля. При таком подходе можно добиться более предсказуемого вывода, независимо от длины выводимых в поле строк.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог