Лабораторная работа №6
Структурированные типы данных
Структуры
Структура – это объединение одного или более объектов (переменных, массивов, указателей, других структур и т.п.). Как и массив она представляет собой совокупность данных. Отличием является то, что к ее элементам необходимо обращаться по имени и что различные элементы структуры необязательно должны принадлежать одному типу. Объявление структуры осуществляется с помощью ключевого слова struct, за которым идет ее тип и далее список элементов, заключенных в фигурные скобки:
struct тип {
Тип_элемента_1 имя_элемента_1;
…
Тип_элемента_n имя_элемента_n;
};
Именем элемента может быть любой идентификатор. Как и выше, в одной строке можно записывать через запятую несколько идентификаторов одного типа. Рассмотрим пример:
struct date {
Int day;
Int month;
Int year;
};
Следом за фигурной скобкой, заканчивающей список элементов, могут записываться переменные данного типа, например: struct date {int day;int month;
int year;} a,b,c; В этом случае для каждой переменной выделяется память, объем которой определяется суммой длин всех элементов структуры. Описание структуры без последующего списка не вызывает выделения никакой памяти, а просто задает шаблон нового типа данных, которые имеют форму структуры. Введенное имя типа позже можно использовать для объявления структуры, например struct date days;. Теперь переменная days имеет тип date. При необходимости структуры можно инициализировать, помещая за объявлением список начальных значений элементов. Разрешается вкладывать структуры одна в другую, например:
struct man { char name [30], fam [20];
Struct date bd;
int voz; };
Определенный выше тип data включает три элемента: day, month, year, содержащий целые значения (int). Структура man включает элементы: name[30], fam[20], bd и voz. Первые два name[30] и fam[20] – это символьные массивы из 30 и 20 элементов каждый. Переменная bd представлена составным элементом (вложенной структурой) типа data. Элемент voz содержит значения целого типа (int). Теперь разрешается объявить переменные, значения которых принадлежат введенному типу:
struct man _ man_ [100];
Здесь определен массив _man_, состоящий из 100 структур типа man. В языке Си разрешено использовать массивы структур. Структуры могут состоять из массивов и других структур.
Чтобы обратиться к отдельному элементу структуры, необходимо указать ее имя, поставить точку и сразу за ней написать имя нужного элемента, например:
_man_ [i].voz = 16;
_man_ [j].bd.day = 22;
_man_ [j].bd.year =1976;
При работе со структурами необходимо помнить, что тип элемента определяется соответствующей строкой объявления в фигурных скобках. Например, _man_ имеет тип man, year - является целым числом и т.п. Поскольку каждый элемент структуры относится к определенному типу, его имя может появляться везде, где разрешено использовать значения этого типа. Допускаются конструкции вида _man_[i] = _ man_[j]; где _man_[i] и _man_[j] - объекты, соответствующие единому описанию структуры. Другими словами, разрешается присваивать одну структуру другой по их именам.
Унарная операция & позволяет взять адрес структуры. Предположим, что задано объявление
struct date { int d,m,y; } day;
Здесь day - это структура типа date, включающая три элемента: d,m,у. Другое объявление struct date _*db; устанавливает тот факт, что db - это указатель на структуру типа date. Запишем выражение: db = &day;. Теперь для выбора элементов d, m, у структуры необходимо использовать конструкции: (*db).d, (*db).m, (*db).y. Действительно, db - это адрес структуры, *db - сама структура. Круглые скобки здесь необходимы, так как точка имеет более высокий, чем звездочка приоритет. Для аналогичных целей в языке Си предусмотрена специальная операция ->. Она тоже выбирает элемент структуры и позволяет представить рассмотренные выше конструкции в более простом виде: db->d, db->m, db->y.
Битовые поля
Особую разновидность структур представляют поля. Поле - это последовательность соседних бит внутри одного целого значения. Оно может иметь тип signed int либо unsigned int и занимать от 1 до 16 бит. Поля размещаются в машинном cлове в направлении от младших к старшим разрядам.
Например, структура
struct prim {int a:2; unsigned b:3; int :5;
int с:1; unsigned d:5; } f,j;
обеспечивает размещение, показанное на рис. 4.6. Если бы последнее поле было задано так: unsigned d:6;, то оно размещалось бы не в первом слове, а в разрядах 0-5 второго слова.
d | d | d | d | d | b | не используется | b | b | b | a | a | |||||||
Рис. 4.6.Пример блока памяти, выделенного под битовое поле
В полях типа signed крайний левый бит является знаковым. Например, такое поле шириной 1 бит может только хранить значения -1 и 0, так как любая ненулевая величина будет интерпретироваться как -1.
Поля используются для упаковки значений нескольких переменных в одно машинное слово с целью экономии памяти. Они не могут быть массивами и не имеют адресов, поэтому к ним нельзя применять унарную операцию &. Пример:
#include <stdio.h>
struct {unsigned a : 1; unsigned b : 1; unsigned y : 1; unsigned c : 2; } f;
void main () { int i;
printf("размер f=%d байт \n",sizeof(f));
f.a =f.b=1;// в поля а и b записывается 1
for (i=0;i<2;i++)
{ f.y =f.a && f.b; // конъюнкция a и b
printf(" цикл %d;f.y =%d\n", i, f.y);
f.b=0; }
f.c = f.a +!f.b;// сложение значений f.а и отрицание f.b (=1)8)
printf("f.c=%d", f.c);} // f.c=2
результаты работы:
размер f=1 байта
цикл о;f.y =1
цикл 1;f.y =0
f.c=2
Смеси
Смесь - это разновидность структуры, которая может хранить (в разное время) объекты различного типа и размера . В результате появляется возможность работы в одной и той же области памяти с данными различного вида. Для описания смеси используется ключевое слово union, а соответствующий синтаксис аналогичен синтаксису структуры.
Пусть задано объявление:
union r { int ir; float fr; char сr; } z;
Здесь ir имеет размер 2 байта, fr - 4 байта и сr - 1 байт. Для z будет выделена память, достаточная чтобы сохранять самый большой из трех приведенных типов. Таким образом, размер z будет 4 байта. В один и тот же момент времени в z может иметь значение только одна из указанных переменных (ir, fr, сr). Пример:
#include <stdio.h>
union r{ int ir; float fr; char cr;} z;
Float f;
// объявлена смесь z типа r: .Размер смеси будет определяться размером самого //длинного элемента, в данном случае fr,
Void main (void)
{//в версии Borland C++ версии 3.1 обнаружена ошибка при
//использовании в вычислениях и преобразованиях вывода
//вещественных значений элементов структур . Чтобы обойти ошибку, //выбираем вещественное значение элемента union в простую
//вещественную переменную f (f=z.fr;), а затем используем f в
//выражениях и наоборот.
printf ("размер z=%d байта \n",sizeof(z));
// sizeof(z) вычисляет длину переменной z и printf распечатывает
//вычисленную длину
printf ("введите значение z.ir \n"); //выдача приглашения для ввода
scanf ("%d",&z.ir);//ввод целого значения в элемент z.ir
printf ("значение ir =%d \n",z.ir);//вывод значения z.ir
printf ("введите значение z.fr \n"); //приглашение для ввода
//вещественного значения
scanf ("%f",&f); //ввод вещественного значения в переменную f и
z.fr=f;//запись в z.fr (фактически реализован ввод: scanf ("%f",&z.ir);.
printf ("значение fr=%f \n",f); //вывод значения вещественной переменной
printf ("введите значение z.cr \n"); // приглашение на ввод информации
flushall(); // очистка буферов ввода-вывода.
//Такая очистка буфера здесь необходима, так как в буфере ввода остается
//символ конца строки от предыдущего ввода, который затем введется //спецификацией %c , вместо реально набираемого символа
scanf ("%c",&z.cr); //чтение символа, введенного с клавиатуры
printf ("значение сr=%c;\n",z.cr);//вывод значения символа
}
Пример сеанса работы с программой («Enter» - это нажатие этой клавиши):
размер z= 4 байта
введите значение z.ir
7 «Enter»
значение ir=7
Введите значение z.fr
З8.345678«Enter»
Значение fr=8.345678
Введите значение z/cr
P«Enter»
Значение cr= P;
Варианты задания (в программе использовать структуры, битовые поля и смеси; все логически законченные части программы оформить в виде отдельных функций):
1.Разработать программу учета покупок ювелирного магазина. Данные о покупках хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по стоимости ювелирного украшения.
2. Разработать программу учета жилищного фонда. Данные о жилом фонде хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру жилищного договора.
3. Разработать программу учета стройматериалов. Данные о стройматериалах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру договора.
4. Разработать программу учета посадок на участке в ботаническом саду. Данные о участках хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру участка.
5. Разработать программу расчета закупки сырья промышленного предприятия. Данные о закупках хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по типу сырья.
6. Разработать программу расчета прибыли от выполняемых работ по ремонту офиса многофилиального концерна. Данные о выполняемых работах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по сумме выполненных работ.
7. Разработать программу расчета деталей, использованных при изготовлении какого-либо изделия. Данные о деталях хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по стоимости деталей, используемых в данном изделии.
8. Разработать программу расчета закупки сырья промышленного предприятия. Данные о закупках хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру накладной
9. Разработать программу определения затрат рабочего времени на выполнение строительных работ. Данные о строительных работах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру заказа.
10. Разработать программу определения пробега автомобиля на основе путевых листов. Данные о путевых листах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру путевого листа.
11. Разработать программу определения величины таможенных сборов на базе контрактов коммерческой фирмы. Данные о таможенных сборах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру контракта.
12. Разработать программу определения процента выхода годных изделий на основе актов приема ОТК. Данные о тестируемых партиях хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру заказа.
13. Разработать программу оценки экспорта фирмы. Данные об экспортных операциях хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру контракта.
14. Разработать программу оценки роста промышленного предприятия по данным за последние годы. Данные о финансовых отчетах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по номеру финансового документа.
15. Разработать программу оценки продаж театральных билетов от времени года. Данные о продажах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по величине прибыли.
16. Разработать программу определения суммарной продажи проездных билетов за определенный месяц. Данные о продажах хранить в виде массива структур. Итоговая информация должна выводиться на экран в виде таблицы, отсортированной по величине прибыли.
Дата добавления: 2016-04-14; просмотров: 758;