Программирование на языке высокого уровня

 

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 - баллы за пятую задачу


3.3.2 Form_tab - формирование таблицы данных из файла


Заголовок функции: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();

}

Приложение 2. Пример входного файла School.txt


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



1. Задание Дан файл содержащий информацию о результатах городской олимпиады по математике. Структура записи файла: номер участника; фамилия;

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ