Программирование на языке высокого уровня
Mesto — массив содержащий места всех участников Рис. 2. Блок-схема функции формирования таблицы данных из файла. Каждая подзадача решается методом линейного поиска (последовательного просмотра элементов таблицы). По запросу программы с клавиатуры необходимо ввести номер пункта меню (см. раздел 2.3), номер школы. Дан файл содержащий информацию о результатах городской олимпиады по математике… Читать ещё >
Программирование на языке высокого уровня (реферат, курсовая, диплом, контрольная)
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 Сообщения программы
Ниже приводится перечень возможных сообщений программы:
1. Файл `School.txt' не найден
2. Введите номер пункта меню
3. Введен неверный номер пункта меню
4. Введите номер школы
5. Участников из данной школы нет
6. №п/п Фамилия 1з 2з 3з 4з 5з Сумма баллов Место
7. №п/п Фамилия №школы Сумма баллов Место
3. Описание программы
3.1 Метод решения задачи
Задачу можно разбить на две отдельные подзадачи:
1. Последовательный просмотр таблицы. Если номер школы данного участника совпадает с заданным, то вывод сведений о данном участнике с указанием баллов за каждую из пяти задач, суммы баллов и места.
2. Последовательный просмотр массива, содержащего места всех участников и вывод на экран фамилий победителей, занявших первые три призовых места, с указанием суммарного количества баллов и номеров школ.
Каждая подзадача решается методом линейного поиска (последовательного просмотра элементов таблицы).
Чтобы пользователь мог выбирать, какую из подзадач решать и в каком порядке, программа выводит на экран меню (см. раздел 2.3).
3.2 Структура программы
Рис. 1. Функциональная структура программы Программа состоит из четырех функций: главной функции main и трех подпрограмм.
Form_tab — Чтение файла и формирование таблицы из данных, содержащихся в файле. Используя поля баллов за каждую из пяти задач полученной таблицы создание массива, который будет содержать суммы баллов всех участников. Затем сортировка таблицы и полученного массива по убыванию сумм баллов. Затем на основании массива, в котором содержатся суммы баллов всех участников создание другого массива, в котором будут храниться места всех участников.
Uch_school — вывод сведений об участнике заданной школы, с указанием баллов за каждую из пяти задач, суммы баллов и места.
Pobidit — вывод фамилий победителей, занявших первые три призовых места, с указанием суммарного количества баллов и номеров школ
3.3 Описание функций
3.3.1 main — главная функция
Заголовок функции:
int main ()
Значение функции:
0 — в случае успешного завершения;
1 — если входной файл не найден.
Рабочие данные:
f — указатель на структуру с информацией о входном файле;
n — номер пункта меню.
d — количество участников
sum[dl_tab] - массив содержащий суммы баллов всех участников
mesto[dl_tab] - массив содержащий места всех участников
tablica[dl_tab] - таблица из данных, содержащихся в файле Структура записи файла:
num — номер участника
fam — фамилия участника
school_num — номер участника
1_zad — баллы за первую задачу
2_zad — баллы за второю задачу
3_zad — баллы за третью задачу
4_zad — баллы за четвертую задачу
5_zad — баллы за пятую задачу
3.3.2 Form_tab — формирование таблицы данных из файла
Заголовок функции:
int form_tab (FILE *f, struct el_tab tab[], float sum [], int mesto[], int d)
Значения функции:
d — количество участников
Входные данные:
*f — ссылка на входной файл
Выходные данные:
tab[] - таблица данных из файла
d — количество участников
sum[] - массив содержащий суммы баллов всех участников
mesto[] - массив содержащий места всех участников Рис. 2. Блок-схема функции формирования таблицы данных из файла
3.3.3 Uch_school — вывод сведений об учащихся заданной школы
Заголовок функции:
void Uch_school (struct el_tab tab[], float sum[], int d, int mesto[])
Входные данные:
tab[] - таблица данных из файла
d — количество участников
sum[] - массив содержащий суммы баллов всех участников
mesto[] - массив содержащий места всех участников Рис. 3. Блок-схема функции вывода сведений об учащихся заданной школы
3.3.4 Pobedit — вывод фамилии победителей, занявших первые три призовых места, с указанием суммарного количества баллов и номеров школ
Заголовок функции:
void Pobedit (struct el_tab tab[], int d, float sum[], int mesto[])
Входные данные:
tab[] - таблица данных из файла
d — количество участников
sum[] - массив содержащий суммы баллов всех участников
mesto[] - массив содержащий места всех участников Рис. 5. Блок-схема функции вывода фамилии победителей, занявших первые три призовых места, с указанием суммарного количества баллов и номеров школ
Литература:
функция данные программа
1. Основы программирования на языке С: Учебное пособие.- Казань: Изд-во Казан. техн. ун-та. 2009. -215 с. Шершуков К. В. Бикмурзина .А.Р.
2. Программирование на языке Си К. Поляков 2009. г 4 главы.
Приложение 1. Текст программы
#include
#include
#include
#include
#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 /* максимальная длина таблицы */
struct el_tab /* стрктура элемента таблицы */
{
char num [dl_num]; /* номер участника */
char fam [dl_fam]; /* фамилия участника */
char school_num [dl_num_school]; /* номер школы участника */
char zad1 [dl_zad]; /* баллы за первую задачу */
char zad2 [dl_zad]; /* баллы за вторую задачу */
char zad3 [dl_zad]; /* баллы за третью задачу */
char zad4 [dl_zad]; /* баллы за четвертую задачу */
char zad5 [dl_zad+1]; /* баллы за пятую задучу + /n */
};
/*_______________________________________________________________*/
/* ПРОТОТИПЫ ФУНКЦИЙ */
/*———————————————————————————————-*/
int form_tab (FILE *f, struct el_tab tab[], float sum[], int d, int mesto[]);
void pobedit (struct el_tab tab[dl_tab], int d, float sum[dl_tab], int mesto[]);
void uch_school (struct el_tab tab[dl_tab], float sum[], int d, int mesto[]);
/*________________________________________________________________*/
/* ГЛАВНАЯ ФУНКЦИЯ */
/*————————————————————————————————*/
int 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;
}
/*________________________________________________________*/
/* ФУНКЦИЯ ФОРМИРОВАНИЯ ТАБЛИЦЫ */
/*————————————————————————————*/
int form_tab (FILE *f, struct el_tab tab[], float sum [], int d,
int mesto[])
/* входные данные: *f — ссылка на входной файла
выходные данные: tab[] - таблица данных из файла
d — количесво участников олимпиады
mesto[] - массив содержащий места всех участников
sum[]-массив содержащий суммы баллов всех
участников*/
{
float x; /* промежуточная переменная */
struct el_tab s; /* промежуточная переменная */
int i, /* индекс очередного элемента таблицы */
k, /* длинна поля zad5 */
n, /* промежуточная переменая для условия продолжительности цикла */
g; /* индекс очередного элемента массива school_num */
for (i=0;fgets ((char*)&tab[i], sizeof (struct el_tab), f)≠NULL;i++)
{
k=strlen (tab[i]. zad5);
tab[i]. zad5[k-1]=' ';
tab[i]. school_num[dl_num_school-1]='';
tab[i]. fam[dl_fam-1]='';
tab[i]. num[dl_num-1]='';
sum[i]=atof (tab[i]. zad1)+atof (tab[i].zad2)+atof (tab[i].zad3)+
atof (tab[i]. zad4)+atof (tab[i].zad5);
}
d=i;
k=i;
for (n=k-1;n>0;n—)
for (i=0;i
{
if (sum[i]
{
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;
/*__________________________________________________________________*/
/* ФУНКЦИЯ ВЫВОДА УЧАСТНИКОВ ИЗ ДАННОЙ ШКОЛЫ */
/*—————————————————————————————————*/
void 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]='';
}
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%dn» ,
tab[i]. num, tab[i].fam, tab[i].zad1, 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 && k==0)
{
tab[i]. school_num[g]=' ';
k=1;
}
}
getchar ();
}
/*__________________________________________________________________*/
/* ФУНКЦИЯ ВЫВОДА ПОБЕДИТЕЛЕЙ ОЛИМПИАДЫ */
/*—————————————————————————————————*/
void POBEDIT (struct el_tab tab[], int d, float sum[], int mesto[])
/* входные данные: tab[]-таблица данных из файла
sum[]-массив содержащий суммы баллов всех участников
mesto[]-массив соднржащий места всех участников*/
{
int i, n=1,k=1,q=0;
printf («nn№п/п Фамилия №школы Сумма баллов Место n»);
printf («————————————————————————————n»);
for (i=0;i≠d;i++)
{
tab[i]. num[dl_num-1]='';
tab[i]. school_num[dl_num_school-1]='';
}
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 ();
}
Приложение 2. Пример входного файла School.txt
1 Ivanov 3 4 5 4 5 4
2 Sidorov 5 4 5 4 5 4
3 Kurochkin 5 4 5 4 5 4
4 Petuxov 5 7 7 7 7 7
5 Petrov 4 7 7 7 7 7
6 Suzdalcev 1 7 7 7 7 7
7 Gatin 10 6 6 6 2 3
8 Galimzhanov 7 5 3 7 3 2
9 Zuzin 3 4 7 2 3 5
10 Molodsov 6 7 7 7 7 7
11 Huzin 1 3 4 5 6 3
12 Malcev 2 3 4 5 6 1
13 Pankratov 9 2 3 4 4 4
14 Kruger 8 3 3 3 7 4
15 Salimov 4 4 4 4 4 4
16 Bochkov 3 5 5 5 5 5
17 Balbesov 6 3 4 5 6 7
18 Vanushin 8 4 3 3 5 7
19 Sakibaev 3 6 6 5 3 1
20 Limonov 6 6 6 6 6 6
Приложение 3. Результаты тестирования программы
Тест 1. Входного файла нет в текущем каталоге.
Результат:
Файл School.txt не найден
В следующих тестах используется файл из приложения 2.
Тест 2.
Тест 3
Тест 4
Тест 5