СТРУКТУРЫ. ДИНАМИЧЕСКИЕ МАССИВЫ И ПЕРЕМЕННЫЕ


ЛАБОРАТОРНАЯ РАБОТА№ 5

 

ЦЕЛЬ РАБОТЫ: Изучить правила создания произвольного типа данных с помощью структуры и правила работы с этим типом. Освоить создание и работу с динамическими массивами и переменными.
1. Порядок выполнения работы.
1.1. Выполнить программу 1.
1.2. В программе 1 вывести на экран наименования граф выходной таблицы и начальное значение реквизита Итого.
1.3. Переделать программу для произвольного числа записей.

 

2. Текст программы

#include <stdio.h>
struct Entry_struct // Описание структуры
{
char name[20];
int time;
float salary_1;
} entry[20];

void main(void)
{
char label[20];
int entries = 0;
int loop ;
double salar;
float summa;
printf(«%d»,sizeof(entry)); // Определение размера памяти
printf(«\n\nВведите наименование таблицы : «);
scanf(«%20s», label);
printf(«Введите количество записей (меньше чем 20) «);
scanf(«%d», &entries);
for (loop=0;loop<entries;++loop)
{
printf(«Запись %d\n», loop);
printf(» Имя : «);
scanf(«%20s», entry[loop].name);
printf(«Количество отработанных часов (целое число) :»);
scanf(«%d», &entry[loop].time);
printf(» Зарплата : «);
scanf(«%f», &entry[loop].salary_1);
}
printf(«Введите начальное значение реквизита ‘Итого’ :»);
scanf(«%f», &summa);
/* Вывод введенных данных */
printf(«\n\nТаблица %s\n»,label);
printf(«———————————————-\n»);
for (loop=0;loop<entries;++loop)
{ printf(«%4d | %-20s | %5d | %15.2f\n»,
loop + 1,
entry[loop].name, Лист 8-2
entry[loop].time,
entry[loop].salary_1);
printf(«- — — — — — — — — — — — — — — — — — — — — — -\n»);
}
for (loop=0;loop<entries;++loop)
summa+=entry[loop].salary_1;
printf (» Итого | %10.4f»,summa);
}

 

2. Индивидуальные задания
1. Структура «Человек»:
— фамилия;
— имя;
— пол;
— национальность;
— дата рождения (число, месяц, год);
— номер телефона;
— домашний адрес (город, улица, номер дома, номер квартиры).
2. Структура «Школьник»:
— фамилия;
— имя;
— отчество;
— класс;
— пол;
— дата рождения (число, месяц, год);
— домашний адрес (город, улица, номер дома, номер квартиры).
3. Структура «Покупатель»:
— фамилия;
— имя;
— отчество;
— домашний адрес (город, улица, номер дома, номер квартиры).
— номер кредитной карточки.
4. Структура «Пациент»:
— фамилия;
— имя;
— отчество;
— год рождения;
— номер телефона;
— домашний адрес (город, улица, номер дома, номер квартиры).
— номер медицинской карты.
5. Структура «Спортивная команда»:
— название;
— из какого города;
— сколько игр сыграла;
— сколько набрала очков(проиграла, выиграла, ничья);
— количество игроков.
6. Структура «Стадион»:
— название;
— виды спорта;
— год постройки;
— адрес(город, улица, номер дома);
— вместимость;
— количество арен, площадок.
7. Структура «Владелец автомобиля»:
— ФИО (фамилия, имя, отчество);
— номер автомобиля;
— номер техпаспорта;
— дата рождения (день, месяц, год);
— телефон.
8. Структура «Автомобиль»:
— марка;
— цвет;
— серийный номер;
— регистрационный номер;
— количество дверей;
— дата выпуска (день, месяц, год);
— цена.
9. Структура «Фильм»:
— название;
— режиссер (фамилия, имя, отчество);
— страна;
— год выпуска;
— стоимость;
— доход.
10. Структура «Музыкальный товар»:
— носитель (пластинка, аудиокассета, лазерный диск);
— порядковый номер в каталоге;
— название;
— исполнитель (фамилия, имя);
— время звучания;
— количество произведений;
— цена по каталогу.
11. Структура «Альбом ВИА»:
— название группы;
— руководитель группы (фамилия, имя, отчество);
— название альбома;
— количество песен на диске/кассете;
— год выпуска альбома;
— фирма-производитель.
12. Структура «государство»:
— название страны;
— столица;
— государственный язык;
— население (число жителей);
— площадь территории;
— денежная единица;
— государственный строй.
Задания.

1. Задать с клавиатуры размер массива структур.
2. Написать функцию для формирования одномерного массива структур, значения которых вводятся с клавиатуры.
3. Написать функцию вывода форматированной таблицы структур на экран с шапкой.
4. Написать функцию дополнения уже существующего массива структур новыми структурами.
5. Написать функцию поиска структуры с заданным значением выбранного элемента.
6. Написать функцию постраничного вывода на экран содержимого массива структур.
7. Написать функцию поиска структур с заданными признаками (например, по заданному диапазону значений элемента).
8. Написать функцию упорядочения массива структур по заданному полю (элементу).

 

3. Содержание отчета.
1. Результаты работы программы 1 и ее модификации. Исходный текст модифицированной программы 1.
2. Индивидуальное задание .

4. Вопросы к защите лабораторной работы
1. Описать программу 1.
2. Объявление структуры. Определение переменных типа структура.
3. Инициализация структурной переменной.
4. Вложенные структуры.
5. Доступ к элементам структуры.
6. Доступ к элементам структуры с использованием указателей.
7. Массивы структур.
8. Передача структуры в функцию.
9. Передача массива структур в функцию.
10. Передача элементов структуры в функцию.
11. Создание динамических переменных.
12. Создание динамических массивов.
13. Ошибки при работе с динамической памятью.
ПРИЛОЖЕНИЕ

1. Структура — это одна или несколько переменных (возможно различных типов), которые для удобства работы с ними сгруппированы под одним именем.
Более формальное определение структуры — это объект, состоящий из последовательности именованных членов различных типов.
Над объектами типа структуры могут выполняться операции присваивания (entry[1]=entry[0];). Можно определять размер и адрес (&) структур и осуществлять доступ к членам структуры.

Пример описания структуры. Ведомость …
struct tip1 { !- — — — — — — — — — — — — — — !
char famil; ! !Дата рождения ! Доход !
struct tip2 { !Фамилия! — — — — — — — ! !
int den; ! !День Месяц Год ! (руб.) !
int mes; !- — — — — — — — — — — — — — — — !
int god; !Сидоров 26 04 75 65000 !
} data_ro,*pt2; !Петров 17 02 76 28600 !
float dohod;
} vedovost, *pt1;

Структура с типом структуры (тегом) tip1 называется vedovost. Структура с типом структуры (тегом) tip2 называется data_ro. Переменная pt1 есть указатель на структуру типа tip1.
Переменная pt2 есть указатель на структуру типа tip2.
Переменные den, mes и god называются членами (элементами) структуры data_ro. Переменные famil и dohod, а также структура data_ro являются членами (элементами) структуры vedomost. Структура data_ro является ВЛОЖЕННОЙ в структуру vedomost.
Доступ к отдельному члену структуры осуществляется посредством конструкции

 

ИМЯ_СТРУКТУРЫ.ЧЛЕН_СТРУКТУРЫ.

Например vedomost.dohod=12000;
или vedomost.data_ro.god=75;.

2. Если pp есть указатель на структуру, то pp->ЧЛЕН_СТРУКТУРЫ есть ее отдельный член.

Например pt1->famil=»Сидоров».

Операторы доступа к членам структуры. и -> вместе с операторами вызова функции () и индексации массивов [] занимают самое высокое положение в иерархии приоритетов и выполняются раньше любых других операторов.

3. Объявление struct ti {
char a;
int b;
} tim[kol];
описывает структуру типа ti и определяет массив tim, каждый элемент которого есть структура типа ti и которому будет выделена память для kol экземпляров структуры типа ti.

4. Динамические переменные и массивы.
Операции new и delete выполняют динамическое распределение и отмену распределения памяти, аналогично, но с более высоким приоритетом, нежели стандартные библиотечные функции семейства malloc и free.
Упрощенный синтаксис:
указатель-на-тип = new тип <инициализатор-имени>;
…
delete указатель-на тип;
Указатель может быть любого типа.
new пытается создать объект с типом, распределив (при возможности) sizeof(имя) байт в свободной области памяти (которую также называют «кучей»). Продолжительность существования в памяти данного объекта — от точки его создания и до тех пор, пока операция delete не отменит распределенную для него память.
В случае успешного завершения new возвращает указатель нового объекта. Пустой указатель означает неудачное завершение операции (например, недостаточный объем или слишком большая фрагментированность кучи). Как и в случае malloc, прежде чем пытаться обращаться к новому объекту, следует проверить указатель на наличие пустого значения. Возвращаемый указатель будет иметь правильный тип, «указатель-на-тип», без необходимости явного приведения типов.
name *nameptr // name может иметь любой тип, кроме функции
…
if (!(nameptr = new name)) {
errmsg(«Недостаточно памяти для name»);
exit (1);
}
…
delete nameptr; //удаление name и отмена выделения
//sizeof(name) байтов памяти
new, будучи ключевым словом, не нуждается в прототипе.

 

5. Если «имя» это массив, то возвращаемый new указатель указывает на первый элемент массива. При создании с помощью new многомерных массивов следует указывать все размерности массива:

mat_ptr = new int[3][10][12]; // так можно
mat_ptr = new int[3][][12]; // нельзя
…
delete [] mat_ptr; //освободить память, занятую массивом,
//на который указывает mat_ptr

Другим преимуществом операции new по сравнению с malloc является возможность инициализации. При отсутствии явных инициализаторов объект, создаваемый new, содержит непредсказуемые данные («мусор»). Объекты, распределяемые new, за исключением массивов, могут инициализироваться соответствующим выражением в скобках:
int_ptr = new int(3);
Для очистки выделенной памяти операцией new можно использовать функцию meset(), объявленную в <mem.h>. Ей передаются 3 параметра: адрес очищаемой памяти, символ для очистки, количество байт.

Загрузка...