КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Листинг 1.2
#include <stdio.h> #include <string.h> //#include <windows.h> //0 int main() const int l name = 30; //1
struct Man { int birth year; char name[l name + 1]; float pay; }; const int l dbase = 100; Man dbase[l dbase]; char name[l name + 1];
FILE *fin;
if ((fin = fopen("dbase.txt", "r"))== NULL) { puts("Ошибка открытия файла\n"); return 1; }
int i = 0; while(!feof(fin)) { fgets(dbase[i].name.l name.fin); fscanf(fin. "%l%f\n" .&dbase[i].birth year. &dbase[i].pay); //2 i++; if (i > 1 dbase) { puts("Слишком длинный файл\n"); return 1; } }
int n record = i, n man = 0; float mean pay = 0;
while(true) { puts("Введите фамилию или нажмите Enter для окончания:"); gets(name); if(strlen(name) == 0)break; //3 //OemToChar(name, name); //4
bool not found = true; for (i = 0; i < n record; i++) {
if (strstr(dbase[i]. name. name)) if (dbase[i]. name[strlen(name)] == '') { strcpy(name. dbase[i]. name); // CharToOem(name.name); //5 printf("%30s%5i%10.2f\n".name. dbase[i].birth year. dbase[i].pay); //6 n man++; mean_pay += dbase[i].pay; not found = false; } } if (not found) puts("Такого сотрудника нет\n"); } if(n man > 0) printf("Средний оклад: %10.2f\n".mean pay/n man};
return 0; }
Из всех именованных констант осталась одна, задающая длину поля фамилии (l name, оператор 1). Все остальные константы определять нет смысла, потому что ввод осуществляется не через буферную переменную, а непосредственно в поля структуры с помощью функции чтения строки fgets и форматного ввода fscanf (оператор 2). Эта функция сама выполняет действия по преобразованию подстроки в число, которые мы явным образом задавали в предыдущей программе. Мы упростили выход из цикла ввода запросов, теперь для завершения цикла достаточно нажать клавишу Enter (оператор 3). Для вывода сведений о сотруднике мы использовали функцию pri ntf (оператор 6).
Пример 1.2. Сортировка массива структур
Написать программу, которая упорядочивает описанный в предыдущей задаче файл по году рождения сотрудников. Изменим предыдущую программу таким образом, чтобы она вместо поиска упорядочивала массив, а затем записывала его в файл с тем же именем, что исходный. Для сортировки применим метод выбора. При всей своей простоте он достаточно эффективен. Основная идея этого метода: из массива выбирается наименьший элемент и меняется местами с первым элементом, затем рассматриваются элементы, начиная со второго, наименьший из них меняется местами со вторым элементом, и так далее. Для упорядочивания требуется количество просмотров, на единицу меньшее, чем количество элементов в массиве (при последнем проходе цикла при необходимости меняются местами предпоследний и последний элементы массива).
|