КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Листинг 1.6 ⇐ ПредыдущаяСтр 5 из 5
#include <stdio.h> #include <string.h> #include <stdlib.h>
const int l name = 30;
struct Man { char name[l name + 1]; int birth year; float pay; }
int compare(const void *man1. const void *man2);//1 int main() { FILE *fbin;
if ((fbin = fopen("dbase.bin", "rb")) == NULL) { puts("Ошибка открытия файла\n"); return 1; }
fseek(fbin.0.SEEK_END); int n record = ftell(fbin)/sizeof(Man);
Man *man=new Man[n record]; //2
fseek(fout. num*sizeof(man). SEEK SET); //3 fread(man. Sizeof(Man). n record. fbin); //4 fclose(fbin);
qsort(man. n record. sizeof(Man). compare); //5
for (int i = 0; i < n record; i++)
printf("%s%5i&10.2f\n". man[i].name. man[i]. birth year. man.pay);
return 0; }
int compare(const void *man1. const void *man2) { return stromp(((Man*) man1) -> name. ((Man*)man2) -> name); }
Рассмотрим моменты, которые отличают эту программу от предыдущих. Во-первых, это чтение из бинарного файла. После открытия файла мы, как и в предыдущей программе, заносим в переменную n record его размер в записях, а затем выделяем в динамической памяти место под весь массив структур (оператор 2). Функция fread позволяет считать весь файл за одно обращение (оператор 4), после чего файл уже больше не требуется, поэтому лучше его сразу же закрыть. Для сортировки мы в образовательных целях и для разнообразия использовали стандартную функцию qsort (оператор 5). Ее прототип находится в заголовочном файле <stdlib.h>. Функция может выполнять сортировку массивов любых размеров и типов. У нее четыре параметра: 1) указатель на начало области, в которой размещается упорядочиваемая информация; 2) количество сортируемых элементов; 3) размер каждого элемента в байтах; 4) имя функции, которая выполняет сравнение двух элементов. Раз функция qsort универсальна, мы должны дать ей информацию, как сравнивать сортируемые элементы и какие выводы делать из сравнения. Значит, мы должны сами написать функцию, которая сравнивает два любых элемента, и передать ее в qsort. Имя функции может быть любым. Мы назвали ее compare. Оператор 1 представляет собой заголовок (прототип) функции, он необходим компилятору для проверки правильности ее вызова. Для правильной работы qsort требуется, чтобы наша функция имела два параметра - указатели на сравниваемые элементы. Они должны иметь тип void. Функция должна возвращать значение, меньшее нуля, если первый элемент меньше второго, равное нулю, если они равны, и большее нуля, если первый элемент больше. При этом массив будет упорядочен по возрастанию. Если мы хотим упорядочить массив по убыванию, нужно изменить возвращаемые значения так: если первый элемент меньше второго, возвращать значение, большее нуля, а если больше - меньшее. Внутри функции надо привести указатели на void к типу указателя на структуру Man. Для этого мы использовали операцию приведения типа в стиле С (Man *). Более грамотно применять для этого операцию reinterpret_cast, введенную в стандарт C++ относительно недавно. Старые компиляторы могут ее не поддерживать. Функция compare с использованием reinterpret_cast выглядит вот таким устрашающим образом:
int compare(const void *man1. const void *man2) { return stromp((reinterpret cast < const Man* > (man1)) -> name.(reinterpret cast < const Man* > (man2)) -> name); }
Чтобы описание структуры было известно в функции compare, мы перенесли описание структуры, а вместе с ней и описание необходимой ей константы lname в глобальную область. Для упорядочивания массива по другому полю надо изменить функцию сравнения. Вот, например, как она выглядит при сортировке по возрастанию года рождения:
int compare(const void *man1. const void *man2) { int p;
if(((Man*)man1) -> birth year < ((Man*)man2)-> birth year)p =- 1; else if(((Man*)man1) -> birth year < ((Man*)man2)-> birth year) p = 0; else p = 1;
return p; }
int compare(const void *man1. const void *man2) { return ((Man*)man1)->pay==((Man*)man2)->pay?-1; ((Man*)man1)->pay == ((Man*)man2) -> pay?0; 1; } Методика и порядок выполнения работы.Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем.Порядок выполнения работы: 1.Проработать примеры, приведенные в лабораторной работе. 2. Составить программу с использованием структур. Индивидуальное задание №1. Вариант: 1. Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы; номер группы; успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию номера группы; вывод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4.0; если таких студентов нет, вывести соответствующее сообщение. 2. Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы; номер группы; успеваемость (массив из пяти элементов). 3. Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы; номер группы; успеваемость (массив из пяти элементов). 4. Описать структуру с именем AEROFLOT, содержащую следующие поля: название пункта назначения рейса; номер рейса; тип самолета. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть упорядочены по возрастанию номера рейса; вывод на экран номеров рейсов и типов самолетов, вылетающих в пункт назначения, название которого совпало с названием, введенным с клавиатуры; если таких рейсов нет, выдать на дисплей соответствующее сообщение. 5. Описать структуру с именем AEROFLOT, содержащую следующие поля: название пункта назначения рейса; номер рейса; тип самолета. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения; вывод на экран пунктов назначения и номеров рейсов, обслуживаемых самолетом, тип которого введен с клавиатуры; если таких рейсов нет, выдать на дисплей соответствующее сообщение. 6. Описать структуру с именем TRAIN, содержащую следующие поля: название пункта назначения; номер поезда; время отправления. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения; вывод на экран информации о поездах, отправляющихся после введенного с клавиатуры времени; если таких поездов нет, выдать на дисплей соответствующее сообщение. 7. Описать структуру с именем TRAIN, содержащую следующие поля: название пункта назначения; номер поезда; время отправления. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из шести элементов типа TRAIN; записи должны быть упорядочены по времени отправления поезда; вывод на экран информации о поездах, направляющихся в пункт, название которого введено с клавиатуры; если таких поездов нет, выдать на дисплей соответствующее сообщение. 8. Описать структуру с именем TRAIN, содержащую следующие поля: название пункта назначения; номер поезда; время отправления. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть упорядочены по номерам поездов; вывод на экран информации о поезде, номер которого введен с клавиатуры; если таких поездов нет, выдать на дисплей соответствующее сообщение. 9. Описать структуру с именем MARSH, содержащую следующие поля: название начального пункта маршрута; название конечного пункта маршрута; номер маршрута. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH; записи должны быть упорядочены по номерам маршрутов; вывод на экран информации о маршруте, номер которого введен с клавиатуры; если таких маршрутов нет, выдать на дисплей соответствующее сообщение. 10. Описать структуру с именем MARSH, содержащую следующие поля: название начального пункта маршрута; название конечного пункта маршрута; номер маршрута. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH; записи должны быть упорядочены по номерам маршрутов; вывод на экран информации о маршрутах, которые начинаются или оканчиваются в пункте, название которого введено с клавиатуры; если таких маршрутов нет, выдать на дисплей соответствующее сообщение. 11. Описать структуру с именем NOTE, содержащую следующие поля: фамилия, имя; номер телефона; дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по датам рождения; вывод на экран информации о человеке, номер телефона которого введен с клавиатуры; если такого нет, выдать на дисплей соответствующее сообщение. 12. Описать структуру с именем NOTE, содержащую следующие поля: фамилия, имя; номер телефона; дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть размещены по алфавиту; вывод на экран информации о людях, чьи дни рождения приходятся на месяц, значение которого введено с клавиатуры; если таких нет, выдать на дисплей соответствующее сообщение. 13. Описать структуру с именем NOTE, содержащую следующие поля: фамилия, имя; номер телефона; дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по трем первым цифрам номера телефона; вывод на экран информации о человеке, чья фамилия введена с клавиатуры; если такого нет, выдать на дисплей соответствующее сообщение. 14. Описать структуру с именем ZNAK, содержащую следующие поля: фамилия, имя; знак Зодиака; дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по датам рождения; вывод на экран информации о человеке, чья фамилия введена с клавиатуры; если такого нет, выдать на дисплей соответствующее сообщение. 15. Описать структуру с именем ZNAK, содержащую следующие поля: фамилия, имя; знак Зодиака; дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по датам рождения; вывод на экран информации о людях, родившихся под знаком, название которого введено с клавиатуры; если таких нет, выдать на дисплей соответствующее сообщение. 16. Описать структуру с именем ZNAK, содержащую следующие поля: фамилия, имя; знак Зодиака; дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по знакам Зодиака; вывод на экран информации о людях, родившихся в месяц, значение которого введено с клавиатуры; если таких нет, выдать на дисплей соответствующее сообщение. 17. Описать структуру с именем PRICE, содержащую следующие поля: название товара; название магазина, в котором продается товар; стоимость товара в руб. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE; записи должны быть размещены в алфавитном порядке по названиям 18. Описать структуру с именем PRICE, содержащую следующие поля: название товара; название магазина, в котором продается товар; стоимость товара в руб. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE; записи должны быть размещены в алфавитном порядке по названиям магазинов; вывод на экран информации о товарах, продающихся в магазине, название которого введено с клавиатуры; если такого магазина нет, выдать на дисплей соответствующее сообщение. 19. Описать структуру с именем ORDER, содержащую следующие поля: расчетный счет плательщика; расчетный счет получателя; перечисляемая сумма в руб. Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ORDER; записи должны быть размещены в алфавитном порядке по расчетным счетам плательщиков; вывод на экран информации о сумме, снятой с расчетного счета плательщика, введенного с клавиатуры; если такого расчетного счета нет, выдать на дисплей соответствующее сообщение. Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из: 1. Названия лабораторной работы. 2. Цели и содержания лабораторной работы. 3. Ответов на контрольные вопросы лабораторной работы. 4. Формулировки индивидуальных заданий и порядка их выполнения. Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю. Вопросы для защиты работы 1. Для чего применяют структуры? 2. Что представляют собой поля структуры? 3. Варианты ввода-вывода структур. 4. Какие функции могут использоваться для формирования полей структуры? 5. Что такое бинарные файлы? Для чего они применяются и каковы их основные преимущества? 6. Назовите параметры функции qsort. В каком заголовочном файле находится ее прототип?
Пример выполнения лабораторной работы №1: 1. Индивидуальное задание №1: 1.1. Постановка задачи: Составить программу с использованием двумерных локальных массивов для решения задачи. Размерности локальных массивов задавать именованными константами, значения элементов массива — в списке инициализации. Задача: описать структуру с именем WORKER, содержащую следующие поля: фамилия и инициалы работника; G - название занимаемой должности; год поступления на работу. Написать программу, выполняющую следующие действия: - ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; - записи должны быть размещены по алфавиту; - вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры; - если таких работников нет, вывести на дисплей соответствующее сообщение. 1.2. Листинг программы: // Лабораторная работа №1 // Индивидуальное задание №1
#include "stdafx.h" #include <iostream> #include "conio.h" #include "math.h" #include "windows.h" #include "stdio.h" #include "stdlib.h" #include "time.h" #include <dos.h>
using namespace std; struct WORKER { string fio; string post; int iyear; };
int _tmain(int argc, _TCHAR* argv[]) { setlocale( LC_ALL, "Russian" ); cout << "Лабораторная работа № 9\n" << "\nГорошко А.А., БАС-051\n" << "\nВариант № 6\n" << "\n\nИндивидуальное задание № 1:\n" << "\nОписать структуру с именем WORKER, содержащую следующие поля:\n" << "\nфамилия и инициалы работника;\n" << "\nназвание занимаемой должности;\n" << "\nгод поступления на работу.\n" << "\n\nНаписать программу, выполняющую следующие действия:\n" << "\nввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER;\n" << "\nзаписи должны быть размещены по алфавиту;\n" << "\nвывод на дисплей фамилий работников, чей стаж работы в организации\n" << "\nпревышает значение, введенное с клавиатуры;\n" << "\nесли таких работников нет, вывести на дисплей соответствующее сообщение.\n" << "\n\nРабота программы:\n";
SYSTEMTIME sm; GetLocalTime(&sm);
setlocale(LC_ALL, ".1251"); string temp_str; time_t *timeanddate; int const n = 10; int i, j, stag, current_year = sm.wYear, kol = 0; char temp[255]; WORKER *works = new WORKER[n]; for (i = 0; i < n; i++) { cout << "\nВведите данные " << i + 1 << "-го сотрудника:\n" << "Введите ФИО: "; cin >> temp; works[i].fio = temp; cout << "Введите должность: "; cin >> temp; works[i].post = temp; cout << "Введитие год поступления на работу: "; cin >> works[i].iyear; }
for (i = 0; i < n; i++) for (j = 0; j < n-1; j++) { if (strcmp((const char*) works[j].fio.c_str(), (const char*) works[j + 1].fio.c_str()) > 0) { temp_str = works[j].fio; works[j].fio = works[j + 1].fio; works[j+1].fio = temp_str; } } cout << "\n\nСортировка записей по алфавиту:\n ";
for (i = 0; i < n; i++) { cout << '\n' << i + 1 << "-ый сотрудник:\n"; cout << "ФИО: " << works[i].fio.c_str() << '\n'; cout << "Должность: " << works[i].post.c_str() << '\n'; cout << "год поступления на работу: " << works[i].iyear << '\n'; } cout << "\n\nВведите стаж для отбора: "; cin >> stag; cout << "\nСотрудники, удовлетворяющие отбору:\n"; for (i = 0; i < n; i++) { if (current_year-works[i].iyear >= stag) { kol++; if (kol!=0) cout << "\nФИО: " << works[i].fio.c_str() << '\n'; cout << "Должность: " << works[i].post.c_str() << '\n'; cout << "год поступления на работу: " << works[i].iyear << '\n'; } } if (kol==0) cout << "\n\nНе найдены сотрудники, удовлетворяющие отбору!\n";
getch(); return 0; } 2.3. Результаты работы программы:
|