Краткие теоретические сведения. Структурой в языке 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
“Информационные динамические структуры”

Цель: Знакомство с динамическими информационными структурами на примере одно- и двунаправленных списков.