Пример КР.ppt
- Количество слайдов: 15
Задача 1 Входной файл st. txt содержит сведения о сдаче студентами группы экзаменационной сессии. Каждая запись файла содержит фамилию и инициалы студента (15 символов) и пять оценок (5 символов) и завершается символом ”перевод строки”. Напечатать список студентов с указанием среднего балла каждого студента.
Пример входного файла st. txt: 1 16 20 ------------------Анисимов А. И. 54435 Берхеев П. В. 55445 Вавилова С. Н. 45343. . .
/*----------------------------*/ /* Печать среднего балла каждого студента */ /*----------------------------*/ #include
void main() { FILE *f; /* указатель на входной файл */ struct STUDENT tz; /* текущая запись файла */ int i, s; /* сумма оценок */ if ((f= fopen("st. txt", "r")) == NULL) { puts ("Файл st. txt не найден"); return; }
puts ("n. Фамилия и. о. Ср. балл"); puts ("---------------"); while (fgets((char *)&tz, sizeof(struct STUDENT), f) != NULL) { for (i=0, s=0; i<5; i++) s+=tz. oc[i]-'0'; tz. fio[14]=' '; printf("%s %. 1 fn", tz. fio, (float)s/5); } fclose(f); getch(); }
Задача 2 Дан текстовый файл “phone. txt”, содержащий телефонный справочник. Каждая строка файла содержит запись об одном абоненте. Структура записи: номер телефона (8 символов), фамилия и инициалы абонента (25 симв. ), адрес (не более 30 симв. ). Записи в файле не упорядочены по алфавиту. Напечатать в алфавитном порядке список телефонов абонентов, фамилии которых начинаются с заданной буквы, (адреса не выводить).
Пример записи файла: 2984556 Нигматуллин Р. А. ул. Даурская, д. 15, кв. 13 Пример результата: Укажите первую букву (прописную) фамилий абонентов З Список абонентов: 1. Забиров Б. Ш. 2345467 2. Забиров Р. И. 2355639 3. Завойский А. В. 5710076 4. Завьялова А. С. 2649215 ….
Алгоритм решения задачи: 1. Построчное чтение файла и запоминание в массиве номеров телефонов и фамилий, начинающихся с заданной буквы. 2. Сортировка массива в алфавитном порядке (в порядке возрастания кодов фамилий). 3. Печать массива.
Итак, задачу разбили на три отдельные подзадачи, которые нужно решить последовательно. Удобно первые две подзадачи оформить как отдельные подпрограммы (функции). Третья подзадача (печать массива) – более простая, поэтому ее можно не выделять в виде отдельной функции. Таким образом, программа будет состоять из трех функций: main() – главная функция; Vvod() – функция чтения файла и формирования массива структур, содержащих фамилии и номера телефонов; Sort() – функция сортировки массива структур.
#include
/* тип структуры записи файла */ struct ABONENT { char nom[DL_NOM]; /* номер телефона */ char fio[DL_FIO]; /* фамилия и инициалы абонента */ char adr[DL_ADR+2]; /* адрес + 'n' + ' ' */ }; /* тип элемента массива */ struct EL_MAS { char nom[DL_NOM]; /* номер телефона */ char fio[DL_FIO]; /* фамилия и инициалы абонента */ }; /* прототипы функций */ void Vvod(struct EL_MAS ms[NMAX], int *n); void Sort(struct EL_MAS ms[NMAX], int n);
/*-----------*/ /* главная функция */ /*-----------*/ int main() { struct EL_MAS ms[NMAX]; /* массив, содержащий номера телефонов и фамилии, начинающиеся с заданной буквы */ int n; /* число элементов массива ms */ int i; /* индекс тек. эл-та массива */ Vvod(ms, &n); if (n == 0) puts ("Нет абонентов, фамилии которых начинаются с указанной буквы"); else { Sort(ms, n); puts ("n. Список абонентов: "); for (i=0; i
/*--------------------*/ /* Функция чтения файла и формирования */ /* массива структур */ /*--------------------*/ void Vvod (struct EL_MAS ms[NMAX], int *n) /* Вых. данные: ms - массив, содержащий номера телефонов и фамилии */ /* *n – число элементов массива { FILE *f; /* указатель на входной файл */ char b; /* заданная буква (1 -я буква фамилий) */ struct ABONENT tz; /* текущая запись файла */ clrscr(); f = fopen("phone. txt", "r"); if (f == NULL) { puts ("Файл phone. txt не найден"); getch(); exit (1); } */
puts ("Укажите первую букву (прописную) фамилий абонентов"); b = getchar(); *n=0; while (*n