Студопедия

КАТЕГОРИИ:

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


Листинг 1.6




 

#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, содержащую следующие поля: фамилия и инициалы; номер группы; успеваемость (массив из пяти элементов).
Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла; вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5; если таких студентов нет, вывести соответствующее сообщение.

3. Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы; номер группы; успеваемость (массив из пяти элементов).
Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по алфавиту; вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2; если таких студентов нет, вывести соответствующее сообщение.

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. Результаты работы программы:

 

 

 

 

 

 

 


Поделиться:

Дата добавления: 2015-04-15; просмотров: 197; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты