Программирование на языке высокого уровня
1.
Задание
Дан файл содержащий информацию о результатах
городской олимпиады по математике.
Структура записи файла:
номер участника;
фамилия;
количество баллов по каждой из пяти задач;
Написать программу выдающую:
фамилии победителей, занявших первые три призовых
места, с указанием суммарного количества баллов и номеров школ;
сведения о результатах участников заданной
школы;
2.
Описание применения
2.1
Запуск программы
Запуск программы (файл Olimpiad.c)
можно выполнить из среды Turbo
C 2.0 (или Borland
C++ 3.1), либо из
командной строки MS
DOS, введя Olimpiad.exe.
2.2
Входные данные
Входные данные программы находятся в файле “School.txt”.
Число строк в файле - 50. Каждая строка содержит номер участника (3 символа),
фамилию (25 символов), номер школы (6 символов), баллы за каждую из пяти задач
(3 символа - баллы за одну задачу). Пример строки файла:
1
Ivanov 3 4 5 4 5 4
|3
| 25 | 6 | 3 | 3 | 3 | 3 | 3 |
Пример входного файла приведен в приложении 2.
По запросу программы с клавиатуры необходимо
ввести номер пункта меню (см. раздел 2.3), номер школы.
2.3
Выходные данные
Программа выводит на экран меню:
При выборе пункта 1 на экран выводиться
результат в виде:
Примеры выходных данных для остальных пунктов
меню см. в приложении 3.
2.4
Сообщения программы
Ниже приводится перечень возможных сообщений
программы:
. Файл ‘School.txt’
не найден
. Введите номер пункта меню
. Введен неверный номер пункта меню
. Введите номер школы
. Участников из данной школы нет
. №п/п Фамилия 1з 2з 3з 4з 5з Сумма баллов Место
. №п/п Фамилия №школы Сумма баллов Место
3.
Описание программы
3.1
Метод решения задачи
Задачу можно разбить на две отдельные подзадачи:
1. Последовательный просмотр таблицы. Если
номер школы данного участника совпадает с заданным, то вывод сведений о данном
участнике с указанием баллов за каждую из пяти задач, суммы баллов и места.
2. Последовательный просмотр массива,
содержащего места всех участников и вывод на экран фамилий победителей,
занявших первые три призовых места, с указанием суммарного количества баллов и
номеров школ.
Каждая подзадача решается методом линейного
поиска (последовательного просмотра элементов таблицы).
Чтобы пользователь мог выбирать, какую из
подзадач решать и в каком порядке, программа выводит на экран меню (см. раздел
2.3).
3.2
Структура программы
Рис.1. Функциональная структура программы
Программа состоит из четырех функций: главной
функции main и трех
подпрограмм.
Form_tab
- Чтение файла и формирование таблицы из данных, содержащихся в файле.
Используя поля баллов за каждую из пяти задач полученной таблицы создание
массива, который будет содержать суммы баллов всех участников. Затем сортировка
таблицы и полученного массива по убыванию сумм баллов. Затем на основании
массива, в котором содержатся суммы баллов всех участников создание другого
массива, в котором будут храниться места всех участников.
Uch_school
- вывод
сведений об участнике заданной школы, с указанием баллов за каждую из пяти задач,
суммы баллов и места.
Pobidit
- вывод фамилий победителей, занявших первые три призовых места,
с указанием суммарного количества баллов и номеров школ
3.3
Описание функций
3.3.1
main
- главная функция
Заголовок функции:
int
main ()
Значение функции:
- в случае успешного завершения;
- если входной файл не найден.
Рабочие данные:
f - указатель на
структуру с информацией о входном файле;
n - номер пункта
меню.
d - количество
участников
sum[dl_tab]
- массив содержащий суммы баллов всех участников
mesto[dl_tab]
- массив содержащий места всех участников
tablica[dl_tab]
- таблица из данных, содержащихся в файле
Структура записи файла:
num - номер
участника
fam - фамилия
участника
school_num
- номер участника
_zad
- баллы за первую задачу
_zad
- баллы за второю задачу
_zad
- баллы за третью задачу
_zad
- баллы за четвертую задачу
_zad
- баллы за пятую задачу
Заголовок функции:form_tab(FILE
*f, struct el_tab tab[], float sum [], int mesto[], int d)
Значения функции:
d - количество
участников
Входные данные:
*f - ссылка на входной файл
Выходные
данные: [] - таблица данных из файла - количество участников [] - массив
содержащий суммы баллов всех участников
mesto[] - массив содержащий места
всех участников
Рис.
2. Блок-схема функции формирования таблицы данных из файла
3.3.3
Uch_school
- вывод сведений об учащихся заданной школы
Заголовок функции:Uch_school(struct
el_tab tab[], float sum[], int d, int mesto[])
Входные
данные:[] - таблица данных из файла - количество участников [] - массив
содержащий суммы баллов всех участников
mesto[] - массив содержащий места
всех участников
Рис. 3. Блок-схема функции вывода сведений об
учащихся заданной школы
3.3.4
Pobedit
- вывод фамилии победителей, занявших первые три призовых места, с указанием
суммарного количества баллов и номеров школ
Заголовок функции:
void Pobedit(struct el_tab tab[],
int d, float sum[], int mesto[])
Входные
данные:[] - таблица данных из файла - количество участников [] - массив
содержащий суммы баллов всех участников
mesto[] - массив содержащий места
всех участников
Рис.5. Блок-схема функции вывода фамилии
победителей, занявших первые три призовых места, с указанием суммарного
количества баллов и номеров школ
Литература:
функция данные программа
1.
Основы программирования на языке С: Учебное пособие.- Казань: Изд-во Казан.
техн. ун-та. 2009. -215 с. Шершуков К.В. Бикмурзина .А.Р.
.
Программирование на языке Си К. Поляков 2009.г 4 главы.
Приложение
1. Текст программы
#include
<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include
<string.h>
#define dl_num 3 /* длина поля номера участника
*/
#define dl_fam 25 /* длина поля фамилии
участника */
#define dl_num_school 6 /* длина поля номера
школы участника */
#define dl_zad 3 /* длина поля балла за одну
задачу */
#define dl_sum 4 /* длина поля суммы баллов */
#define dl_tab 50 /* максимальная длина таблицы
*/el_tab /* стрктура элемента таблицы */
{
char num [dl_num]; /* номер участника */
char fam [dl_fam]; /* фамилия участника */
char school_num [dl_num_school]; /* номер
школы
участника
*/
char zad_1
[dl_zad]; /* баллы за первую задачу */
char zad_2 [dl_zad]; /* баллы за вторую задачу
*/
char zad_3 [dl_zad]; /* баллы за третью задачу
*/
char zad_4 [dl_zad]; /* баллы за четвертую
задачу */
char zad_5 [dl_zad+1];/* баллы за пятую задучу +
/n */
};
/*_______________________________________________________________*/
/* ПРОТОТИПЫ
ФУНКЦИЙ
*/
/*---------------------------------------------------------------*/form_tab(FILE
*f,struct el_tab tab[], float sum[],int d,int mesto[]);pobedit(struct el_tab
tab[dl_tab],int d,float sum[dl_tab],int mesto[]);uch_school(struct el_tab
tab[dl_tab],float sum[],int d,int mesto[]);
/*________________________________________________________________*/
/* ГЛАВНАЯ ФУНКЦИЯ */
/*----------------------------------------------------------------*/main()
{
FILE *f; /* ссылка на входной файл */
int d; /* количесво участников олипиады */
char n; /* номер пункта меню */
float sum[dl_tab]; /*массив содержащий суммы
баллов всех участников*/
int mesto[dl_tab]; /*массив содержащий места
всех участников */
struct el_tab tablisa[dl_tab]; /*таблица в
которую данные из файла
будут копироваться*/
f=fopen("school.txt","r");
if(f==NULL)
{
clrscr();
puts("\nФайл
'School.txt'
не найден");
getch();
return 1;
}
d=form_tab(f,tablisa,sum,d,mesto);
do
clrscr();
puts("\n==============================================");
puts("ВВЕДИТЕ НОМЕР ПУНКТА МЕНЮ\n 1 - Вывод
фамилий победителей");
puts(" 2 - Вывод сведений об участниках
данной школы\n 3 - Выход");
puts("==============================================\n");
n=getche();
switch(n)
{
case '1' :
pobedit(tablisa,d,sum,mesto); break;
case
'2' : printf("\nВведите
номер школы\n ");
uch_school(tablisa,sum,d,mesto);
break;
case '3' : break;
default
: puts("\nВведен
неверный номер пункта меню");
getchar();
}
}
while(n!='3');
fclose(f);
return 0;
}
/*________________________________________________________*/
/*
ФУНКЦИЯ
ФОРМИРОВАНИЯ
ТАБЛИЦЫ
*/
/*--------------------------------------------------------*/form_tab(FILE
*f,struct el_tab tab[],float sum [],int d,
int
mesto[])
/* входные данные: *f - ссылка на входной файла
выходные
данные: tab[] - таблица данных из файла- количесво участников олимпиады[] -
массив содержащий места всех участников[]-массив содержащий суммы баллов всех
участников*/
{
float
x; /* промежуточная переменная */
struct
el_tab s ; /* промежуточная переменная */
int
i, /* индекс очередного элемента таблицы */
k,
/* длинна поля zad_5 */
n,
/* промежуточная переменая для условия продолжительности цикла */
g;
/* индекс очередного элемента массива school_num */
for(i=0;fgets((char*)&tab[i],sizeof(struct
el_tab),f)!=NULL;i++)
{
k=strlen(tab[i].zad_5);
tab[i].zad_5[k-1]=' ';
tab[i].school_num[dl_num_school-1]='\0';
tab[i].fam[dl_fam-1]='\0';
tab[i].num[dl_num-1]='\0';
sum[i]=atof(tab[i].zad_1)+atof(tab[i].zad_2)+atof(tab[i].zad_3)+
atof(tab[i].zad_4)+atof(tab[i].zad_5);
}
d=i;
k=i;
for(n=k-1;n>0;n--)
for(i=0;i<k;i++)
{
if(sum[i]<sum[i+1])
{
s=tab[i];
x=sum[i];
tab[i]=tab[i+1];
tab[i+1]=s;
sum[i]=sum[i+1];
sum[i+1]=x;
}
}
n=1;
for(i=0;i!=d;i++)
if(i==0)
mesto[i]=n;
else
if (sum[i]==sum[i-1])
mesto[i]=n;
else
{
n++;
mesto[i]=n;
return d;
/*__________________________________________________________________*/
/*
ФУНКЦИЯ ВЫВОДА УЧАСТНИКОВ ИЗ ДАННОЙ ШКОЛЫ */
/*------------------------------------------------------------------*/UCH_SCHOOL(struct
el_tab tab[],float sum[],int d,int mesto[])
/*
входные данные: tab[]-таблица данных из файла
d-количество
участников олимпиады
sum[]-массив
содержащий сумму баллов всех участников
mesto[]-массив
соднржащий места всех участников*/
{
char
n=0; /* номер школы */
int
i, /* индекс очередного элемента таблицы */
k=0,
/* промежуточная переменая */
x=0,
/* промежуточная переменная */
v=1,
/* промежуточная переменная */
g=0;
/* индекс очередного элемента массива school_num */
for(i=0;i!=d;i++)
{
for(g=dl_num_school-2;tab[i].school_num[g]==' ';g--);
tab[i].school_num[g+1]='\0';
}
do
gets(n);
while (strcmp(n,"")==0);
for(i=0;i!=d;i++)
if(strcmp(tab[i].school_num,n)==0)
{
if(x==0)
{
printf("\n№п.п Фамилия
1з
2з
3з
4з
5з Сумма баллов Место\n");
printf("---------------------------------------------------\n");
x=1;
}
printf(" %s %s %s
%.1f%d\n",
tab[i].num,tab[i].fam,tab[i].zad_1,sum[i],mesto[i]);
k++;
}
if(k==0
&& v==1) printf("Участников из данной школы нет");
for(i=0;i!=d;i++)
{
k=0;
for(g=0;g!=dl_num_school;g++)
if(strcmp(tab[i].school_num[g],'\0')==0
&& k==0)
{
tab[i].school_num[g]=' ';
k=1;
}
}
getchar();
}
/*__________________________________________________________________*/
/*
ФУНКЦИЯ ВЫВОДА ПОБЕДИТЕЛЕЙ ОЛИМПИАДЫ */
/*------------------------------------------------------------------*/POBEDIT(struct
el_tab tab[],int d,float sum[],int mesto[])
/*
входные данные: tab[]-таблица данных из файла
sum[]-массив
содержащий суммы баллов всех участников
mesto[]-массив
соднржащий места всех участников*/
{
int
i,n=1,k=1,q=0;
printf("\n\n№п/п
Фамилия №школы Сумма баллов Место \n");
printf("--------------------------------------------------------\n");
for(i=0;i!=d;i++)
{
tab[i].num[dl_num-1]='\0';
tab[i].school_num[dl_num_school-1]='\0';
}
for(i=0;i!=d;i++)
if (mesto[i]==1 || mesto[i]==2 ||
mesto[i]==3)
printf("\n %s %s%s
%.1f%d",
tab[i].num,tab[i].fam,tab[i].school_num,sum[i],mesto[i]);
printf("\n");
getchar();
}
1 Ivanov 3 4 5 4 5 4
2 Sidorov 5 4 5 4 5 4
Kurochkin 5 4 5 4 5 4
Petuxov 5 7 7 7 7 7
Petrov 4 7 7 7 7 7
Suzdalcev 1 7 7 7 7 7
Gatin 10 6 6 6 2 3
Galimzhanov 7 5 3 7 3 2
Zuzin 3 4 7 2 3 5
Molodsov 6 7 7 7 7 7
Huzin 1 3 4 5 6 3
Malcev 2 3 4 5 6 1
Pankratov 9 2 3 4 4 4
Kruger 8 3 3 3 7 4
Salimov 4 4 4 4 4 4
Bochkov 3 5 5 5 5 5
Balbesov 6 3 4 5 6 7
Vanushin 8 4 3 3 5 7
Sakibaev 3 6 6 5 3 1
Limonov 6 6 6 6 6 6
Приложение
3. Результаты тестирования программы
Тест 1.
Входного файла нет в текущем каталоге.
Результат:
Файл School.txt
не найден
В следующих тестах используется файл из
приложения 2.
Тест 2.
Тест 3
Тест 4
Тест 5