Студопедия — Программа и тестовые примеры
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Программа и тестовые примеры






#include < fstream.h> #include < string.h> #include < stdlib.h> // #include < windows.h> // 0 int main () { const int l_name = 30, l_year = 5, l_pay = 10, l_buf = l_name + l_yеаг + l_pay; // 1 struct Man { // 2 int birth_year; char name[l_name + 1]; float pay; }; const int l_dbase = 100; Man dbase[l_dbase]; // 3 char buf [l_buf + 1]; // 4 char name[l_name + 1]; // 5 ifstream fin(" dbase.txt", ios:: in | ios:: nocreate); // 6 if (! fin) { cout < < " Ошибка открытия файла"; return 1; } int i = 0; while (fin.getline(buf, l_buf)) { // 7 if (i > = l_dbase) { cout < < " Слишком длинный файл "; return 1; } strncpy (dbase[i].name, buf, l_name); dbase[i].name[l_name] Щ '\0'; dbase[i].birth_year = atoi(& buf[l_name]); dbase[i].pay = atof(& buf[l_name + l_year]); i++; } int n_record = i, n_man = 0; // 8 float mean_pay = 0; while (true) { // 9 cout < < " Введите фамилию или слово end: "; cin > > name; // OemToChar(name, name); // 10 if (strcmp(name, " end") == 0)break; // 11 bool not_found = true; // 12 for (i = 0; i < n_record; i++) { // 13 if (strstr(dbase[i].name, name)) // 14 if (dbase[i].name[strlen(name)] ==' ') { // 15 strcpy(name, dbase[i].name); // CharToOem(name. name); // 16 cout < < name < < dbase[i].birth_year < < ' ' < < dbase[i].pay < < endl; n_man++; mean_pay += dbase[i].pay; not found = false; } } if (not_found) cout < < " Такого сотрудника нет" < < endl; } if (n_man > 0) cout < < " Средний оклад: " < < mean_pay / n_man < < endl; return 0; }

 

Рассмотрим приведенную выше программу подробно. В операторе 1 заданы именованные константы, в которых хранится формат входного файла, то есть длина каждого из полей записи (строки файла). Такой подход позволяет при необходимости легко вносить в программу изменения. Длина буфера, в который будет считываться каждая строка файла, вычисляется как сумма длин указанных полей.

 

В операторе 2 определяется структура Man для хранения сведений об одном сотруднике. Длина поля, в котором будет находиться фамилия, задана с учетом завершающего нуль-символа. В операторе 3 определяется массив структур dbase для хранения всей базы. Его размерность также задается именованной константой. В операторах 4 и 5 задаются промежуточные переменные: буфер buf для ввода строки из файла и строка name для фамилии запрашиваемого сотрудника.

 

В операторе 6 выполняется открытие файла dbase.txt для чтения. Предполагается, что этот файл находится в том же каталоге, что и текст программы, иначе следует указать полный путь. Входной файл следует создать в любом текстовом редакторе1 до первого запуска программы в соответствии с форматом, заданным в условии задачи. Файл для целей тестирования должен состоять из нескольких строк, причем необходимо предусмотреть случай, когда одна фамилия является частью другой (например, Иванов и Ивановский). Не забудьте проверить, выдается ли диагностическое сообщение, если файл не найден.

 

 

Цикл 7 выполняет построчное считывание из файла в строку buf и заполнение очередного элемента массива dbase. Счетчик i хранит индекс первого свободного элемента массива. Для формирования полей структуры используются функции копирования строк strncpy, преобразования из строки в целое число atoi и преобразования из строки в вещественное число atof. Они были рассмотрены на предыдущем семинаре (см. с. 94). Обратите внимание на то, что завершающий нуль-символ в поле фамилии заносится «вручную», поскольку функция strncpy делает это только в случае, если строка-источник короче строки-приемника. В функцию atoi передается адрес начала подстроки, в которой находится год рождения.

 

Обратите внимание на то, что при каждом проходе цикла выполняется проверка, не превышает ли считанное количество строк размерность массива. При тестировании программы в этот цикл следует добавить контрольный вывод на экран считанной строки, а также сформированных полей структуры. Для проверки выдачи диагностического сообщения следует временно задать константу l_dbase равной, а затем меньшей фактического количества строк в файле.

 







Дата добавления: 2014-11-10; просмотров: 630. Нарушение авторских прав; Мы поможем в написании вашей работы!



Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Уравнение волны. Уравнение плоской гармонической волны. Волновое уравнение. Уравнение сферической волны Уравнением упругой волны называют функцию , которая определяет смещение любой частицы среды с координатами относительно своего положения равновесия в произвольный момент времени t...

Медицинская документация родильного дома Учетные формы родильного дома № 111/у Индивидуальная карта беременной и родильницы № 113/у Обменная карта родильного дома...

Основные разделы работы участкового врача-педиатра Ведущей фигурой в организации внебольничной помощи детям является участковый врач-педиатр детской городской поликлиники...

Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

Краткая психологическая характеристика возрастных периодов.Первый критический период развития ребенка — период новорожденности Психоаналитики говорят, что это первая травма, которую переживает ребенок, и она настолько сильна, что вся последую­щая жизнь проходит под знаком этой травмы...

РЕВМАТИЧЕСКИЕ БОЛЕЗНИ Ревматические болезни(или диффузные болезни соединительно ткани(ДБСТ))— это группа заболеваний, характеризующихся первичным системным поражением соединительной ткани в связи с нарушением иммунного гомеостаза...

Studopedia.info - Студопедия - 2014-2024 год . (0.026 сек.) русская версия | украинская версия