Краткие теоретические сведения. 1. 1. Структуры в языке C/C++
1. 1. Структуры в языке C/C++
Структурой в языке C называется совокупность логически связанных переменных различных типов, сгруппированных под одним именем для удобства дальнейшей обработки. Структура ‑ то способ связать воедино данные разных типов и создать пользовательский тип данных.
Структура ‑ тип данных, задаваемый пользователем. В общем случае при работе со структурами следует выделить четыре момента:
· объявление и определение типа структуры,
· объявление структурной переменной,
· инициализация структурной переменной,
· использование структурной переменной.
Определение типа структуры начинается с ключевого слова struct и содержит список объявлений, заключенных в фигурные скобки. За словом struct следует имя типа, называемое тегом структуры (tag – ярлык, этикетка). Элементы списка объявлений называются членами структуры или полями. Каждый элемент списка имеет уникальное для данного структурного типа имя. Однако следует заметить, что одни и те же имена полей могут быть использованы в различных структурных типах. Определение типа структуры представляется в виде
struct ID
{
<тип> <имя 1-го элемента>;
<тип> <имя 2-го элемента>;
…………
<тип> <имя последнего элемента>;
};
Создание структурной переменной возможно двумя способами: с использованием шаблона (типа) или без него.
Создание структурной переменной pt на основе шаблона выполняется следующим образом:
struct point //Определение типа структуры
{
int x;int y;
};
struct point pt; //Создание структурной переменной
Структурная переменная может быть задана уникальным образом:
struct //Определение анонимного типа структуры
{
char name[20];
char f_name[40];
char s_name[20];
} copymy; //Создание структурной переменной
Работа со структурной переменной обычно сводится к работе с отдельными полями структуры. Доступ к полю структуры осуществляется с помощью операции. (точка) посредством конструкции вида:
имя_структуры.имя_поля_структуры;
при этом обращение к полю структуры представляет собой переменную того же типа, что и поле, и может применяться везде, где допустимо использование переменных такого типа. Например:
struct list copy = {"Ivanov","Petr",1980};
Блоковый ввод-вывод
Для блокового ввода и вывода используются функции :
int fread( void *ptr, int size, int n, FILE *fp)
· void *ptr - указатель на область памяти, в которой размещаются считываемые из файла данные;
· int size - размер одного считываемого элемента;
· int n - количество считываемых элементов;
· FILE *fp - указатель на файл, из которого производится считывание.
В случае успешного считывания информации функция возвращает число прочитанных элементов (а не байтов), иначе возвращает EOF.
int fwrite( void *ptr, int size, int n, FILE *fp)
· void *ptr - указатель на область памяти, в которой размещаются записываемые в файл данные;
· int size - размер одного записываемого элемента;
· int n - количество записываемых элементов;
· FILE *fp - указатель на файл, в который производится запись.
В случае успешной записи информации функция возвращает число записанных элементов, иначе возвращает EOF.
Пример:
typedef STRUCT
{
char name [40];
char post [40];
float rate;
}EMPLOYEE;
void main ()
{
FILE *f; // указатель связанный с файлом
EMPLOYEE e; // переменная
EMPLOYEE mas[10] //массив
//открываем файл
if ((f=fopen("f.dat", "wb")==NULL) exit(1);
int i;
for(i=1; i<=10;i++)
{
//формируем запись е
printf("name="); scanf("%s",&e.name);
printf("post="); scanf("%s",&e.post);
printf("rate="); scanf("%f",e.rate);
// записываем запись е в файл
fwrite(&e, sizeof(EMPLOYEE),1,f);
if (ferror(f)==NULL) exit(2);
}
fclose(f);
//чтение записей из файла
if ((f=fopen("f.dat", "rb")==NULL) exit(3);
i=0;
while(!feof(f)&&i<=10)
{
fread(&mas[i], sizeof(EMPLOYEE),1,f);
i++;
}
fclose(f);
}
Постановка задачи
Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое, выполнить удаление и добавление элементов в соответствии со своим вариантом, используя для поиска удаляемых или добавляемых элементов функцию. Формирование, печать, добавление и удаление элементов оформить в виде функций. Предусмотреть сообщения об ошибках при открытии файла и выполнении операций ввода/вывода.
Варианты
1. Структура "Абитуриент":
- фамилия, имя, отчество;
- год рождения;
- оценки вступительных экзаменов (3);
- средний балл аттестата.
Удалить элемент с указанным номером, добавить элемент после элемента с указанной фамилией.
2. Структура "Сотрудник":
- фамилия, имя, отчество;
- должность
- год рождения;
- заработная плата.
Удалить элемент с указанной фамилией, добавить элемент после элемента с указанным номером.
3. Структура "Государство":
- название;
- столица;
- численность населения;
- занимаемая площадь.
Удалить все элементы, у которых численность меньше заданной, добавить элемент после элемента с указанным номером.
4. Структура "Человек":
- фамилия, имя, отчество;
- домашний адрес;
- номер телефона;
- возраст.
Удалить все элементы с заданным возрастом, добавить элемент после элемента с заданным номером.
5. Структура "Человек":
- фамилия, имя, отчество;
- год рождения;
- рост;
- вес.
Удалить все элемент с указанным ростом и весом, добавить элемент после элемента с указанной фамилией.
6. Структура "Школьник":
- фамилия, имя, отчество;
- класс;
- номер телефона;
- оценки по предметам (математика, физика, русский язык, литература).
Удалить все элементы, у которых есть 2 хотя бы по одному предмету, добавить элемент в начало файла.
7. Структура "Студент":
- фамилия, имя, отчество;
- домашний адрес;
- группа;
- рейтинг.
Удалить все элементы, у которых рейтинг меньше заданного, добавить 1 элемент в конец файла.
8. Структура "Покупатель":
- фамилия, имя, отчество;
- домашний адрес;
- номер телефона;
- номер кредитной карточки.
Удалить 3 элемента из начала файла, добавить 3 элемента в конец файла.
9. Структура "Пациент":
- фамилия, имя, отчество;
- домашний адрес;
- номер медицинской карты;
- номер страхового полиса.
Удалить элемент с заданным номером медицинской карты, добавить 2 элемента в начало файла.
10. Структура "Информация":
- носитель;
- объем;
- название;
- автор.
Удалить первый элемент с заданным объемом информации, добавить элемент перед элементом с указанным номером.
11. Структура "Видеокассета":
- название фильма;
- режиссер;
- продолжительность;
- цена.
Удалить все элементы с ценой выше заданной, добавить 3 элемента в конец файла.
12. Структура "Музыкальный диск":
- название;
- автор;
- продолжительность;
- цена.
Удалить первый элемент с заданной продолжительностью, добавить 2 элемента после элемента с заданным номером.
13. Структура "Спортивная команда":
- название;
- город;
- количество игроков;
- количество набранных очков.
Удалить все элементы с количеством очков меньше заданного, добавить 2 элемента в начало файла.
14. Структура "Стадион":
- название;
- адрес;
- вместимость;
- виды спорта.
Удалить элемент с заданным названием, добавить 2 элемента после элемента с указанным номером.
15. Структура "Автомобиль":
- марка;
- год выпуска;
- цена;
- цвет.
Удалить все элементы, у которых год выпуска меньше заданного, добавить элемент в начало файла.
16. Структура "Владелец автомобиля":
- фамилия, имя, отчество;
- номер автомобиля;
- телефон;
- номер техпаспорта.
Удалить элемент с заданным номером, добавить 2 элемента перед элементом с заданной фамилией.
17. Структура "Фильм":
- название;
- режиссер;
- год выпуска;
- стоимость.
Удалить все элементы, у которых стоимость превышает заданную, добавить элемент в начало файла.
18. Структура "Книга":
- название;
- автор;
- год издания;
- количество страниц.
Удалить 3 элемента из начала файла, добавить элемент перед элементом с указанным названием.
19. Структура "Фильм":
- название;
- режиссер;
- страна;
- приносимая прибыль.
Удалить 2 элемента из конца файла, добавить элемент после элемента с указанным названием.
20. Структура "Государство":
- название;
- государственный язык;
- денежная единица;
- курс валюты относительно $.
Удалить элемент с указанным названием, добавить 2 элемента в конец файла.
21. Структура "Автомобиль":
- марка;
- серийный номер;
- регистрационный номер;
- год выпуска.
Удалить 3 элемента из начала файла, добавить элемент поле элемента с указанным регистрационным номером.
22. Структура "Владелец автомобиля":
- фамилия, имя, отчество;
- номер автомобиля;
- номер техпаспорта;
- отделение регистрации ГАИ.
Удалить элемент с заданным номером, добавить 2 элемента перед элементом с заданной фамилией.
23. Структура "Стадион":
- название;
- год постройки;
- количество площадок;
- виды спорта.
Удалить все элементы, у которых год постройки меньше заданного, добавить 2 элемента перед элементом с указанным номером.
24. Структура "Студент":
- фамилия, имя, отчество;
- номер телефона;
- группа;
- оценки по 3 основным предметам.
Удалить все элементы из группы с указанным номером, у которых среднее арифметическое оценок меньше заданного, добавить элемент после элемента с заданной фамилией.
25. Структура "Студент":
- фамилия, имя, отчество;
- дата рождения;
- домашний адрес;
- рейтинг.
Удалить элементы, у которых даты рождения совпадают, добавить элемент перед элементом с заданной фамилией.
Методические указания
· Для заполнения файла можно использовать функцию, формирующую одну структуру, указанного в варианте типа. Значения элементов структуры вводятся с клавиатуры. Для ввода можно использовать операцию >> и функцию gets().
· При вводе структур можно реализовать один из следующих механизмов:
o ввод заранее выбранного количества структур (не менее 5);
o ввод до появления структуры с заданным количеством признаков;
o диалог с пользователем о необходимости продолжать ввод.
· Для записи структуры в файл и чтения структуры из файла использовать функции блочного ввода/вывода fread и fwrite.
· Для удаления/ добавления элементов в файл использовать вспомогательный файл.
Лабораторная работа № 7 "Информационные динамические структуры"
Цель: Знакомство с динамическими информационными структурами на примере одно- и двунаправленных списков.