Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Требования к выполнению лабораторной работы
ЛАБОРАТОРНАЯ РАБОТА №9 Комбиированный тип - Структура
Тип данных –- struct Структура – тип определяемый пользователем. Этот тип данных используется для представления в программе объектов, обладающих несколькими свойствами возможно различного типа. Например, объект Книга, может быть определена свойствами: фамилия автора, название книги, год издания, издательство. Структура позволяет представить объект, обладающий несколькими свойствами, одной переменной.
Формат определения типа
struct ИМЯ { список определений простых полей – переменные и константы любого типа языка; [список битовых полей – переменные, позволяющие именовать последовательность битов] }
Формат определения простого поля Простое поле – это переменная или константа. Они определяются по тем же правилам, то и просто переменная и константа. спецификатор типа имя поля Пример определения структуры с простыми полями для хранения данных по служащему: ФИО – строка длиной 20, возраст – целое число целое, пол – символ, количество детей – целое число. struct Employee { char fio [20]; unsigned sort age; //возраст 0..100 – 2байта unsigned char sex; // пол М или Ж -1 байт unsigned sort children; // количество детей – 2 байта }; Employee e; // e – переменная типа Employee
Формат определения списка битовых полей Используется для более экономного использования памяти. Очень эффективно использовать структуру с битовыми полями в структуре типа uion. В списке битовых полей могут быть указаны два вида полей: · Битовое поле; · Заполнитель. Формат определения битового поля спецификатор типа имя типа:количество битов Формат определения заполнителя Поле – заполнитель используется для выравнивания битовых полей на границу определенного бита. спецификатор типа : количество битов Пример определения битовых полей Организации прямого доступа к трем первым битам, двум битам с номерами, 7 и 8, и четырем старшим битам ячейки типа short. struct two_byte { unsigned short bit13_14_15:3; unsigned short : 4; unsigned short bit7_8:2; unsigned short : 4; unsigned short bit0_1_2:3; }; two_byte x; //переменная типа two_byte
Правила создания типа struct 1. Имя поля должно быть уникально в пределах одного типа struct. 2. Тип поля – это любой тип языка, включая массивы и структуры Си. 3.Если несколько полей имеют одинаковый тип, то их имена можно перечислить через запятую. Примеры определения переменных типа struct 1) Для хранения информации о точке на плоскости. struct point { double x,y; }; point P; 2) Определение переменной и ее инициализация struct point { double x,y; }; point P={0,1};
3) Переменная должна хранить фамилию студента и шесть оценок за экзамены в сессию. struct TSessia { char Fam[40]; unsigned short marks[6]; }; TSessia S; TSessia S={“Иванов”,{4, 5, 4, 5, 4, 5}; 4) Переменная должна хранить анкетные данные сотрудника: фамилия, дата рождения, адрес. Дата рождения характеризуется тремя значениями: номер дня, номер месяца, номер года. Адрес характеризуется значениями: город, улица, номер дома, номер квартиры. Определим три структуры: Tdate, Tadress, TEmploye struct Tdate { unsigned short day; unsigned short month; unsigned short year; }; struct Tadress { char city[30]; char street[50]; unsigned short NumHause, NumRoom; }; struct Temploye { char Fam[40]; Tdate Date; Tadress Adress; }; Temploye E; Temploye E1={“Иванов”,{1,12,1999},{“Москва”, “ул.Xxxxxx”, 15,20}};
Tadress A; Tdate d; 5) Массив структур. Требуется хранить данные по 40 точкам на плоскости. Tpoint mas[40]; Пример более экономного использования памяти для размещения переменной struct emp { char fam[40]; unsigned short age; // возраст unsigned short sex; //пол unsigned short child; //количество детей }; emp e; //для переменной 46 байт
Значение возраста до 120 – достаточно 7 бит, для значения пола достаточно одного бита, для количества детей достаточно 5 бит. В итоге всего достаточно 13 бит. Так как память выделяется байтами, то под эти значения достаточно двух байтов. struct emp { char fam[40]; unsigned short age:7; // возраст unsigned short sex:1; //пол unsigned short child:5; //количество детей unsigned short:3; }; emp e; //объем памяти переменной 42 байта Представление переменной типа struct в памяти 1) Переменная R для представления точки на плоскости Tpoint R;
2) Переменная S типа Tsession
3) Переменная Е типа TEmploye
Доступ к значению поля в структуре Доступ к полю прямой – по имени поля - уточненное имя. Уточненное имя формируется по правилу: имя переменной.имя поля. Если имя поля в свою очередь представляет переменную типа запись, то правило распространяется на имя этого поля. Примеры формирования имени. 1) Имя поля переменной R Tpoint R; R.x или R.y 2) Доступ к значению оценки по третьему экзамену в сессию. TSession S; S.marks[3] 3) Доступ к значению поля сity переменной E. TEmploye E; E.Adress.сity или E.Adress.street 4) Доступ к полю элемента массива. Tpoint mas[40]; mas[3].x или mas[3].y 5) Доступ к битовым полям e.age=43; 6) Структура и указатель TEmploye *e; Доступ к полю через разыменование. Два способа:. · явно имя поля (*указатель).имя поля · неявно указатель->имя поля Employee *e2; int main(int argc, char* argv[]) { // способ 1- явное разыменование cout<<(*e2).fio; //скобки (*e2). т.к. операция «точка» имеет // приоритет выше чем * cout<<(*e2).age<<endl; //способ 2 – неявное разыменование cin>>(e2->fio); cin>>age; e2->age=age; cout<<(e2->fio); cout<<(e2->age)<<endl; return 0; }
Расчет объема памяти, выделяемого переменной типа struct Количество байтов памяти, выделяемой простым полям плюс количество байтов для списка битовых полей, с учетом выравнивания полей на границу в соответствии с типом поля. Правила выравнивания: поля в памяти выравниваются на границу (номер байта) кратной своему размеру. 1 байтовые поля не выравниваются (на границу байта); 2 байтовые поля на четные позиции; 3 байтовые на позиции кратные четырем. Пример структуры с выравниванием struct ex1 { char x; int y; } A; Переменной А выделено 8 байт, так как поле y выравнено на границу байта 4.
Рис. Представление переменной А в памяти Количество памяти можно определить функцией sizeof(имя типа).
Операции над переменными типа struct Присваивание 1 Статической переменной типа struct можно присвоить однотипную структуру (выражение). Temploye E,E1={“Иванов”,{1,12,1999},{“Москва”, “ул.Xxxxxx”, 15,20}}; E=E1; 2 Указателю на структуру данных можно присвоить указатель на однотипную структуру, но оба указателя будут ссыаться на одно и то же значение. Заполнение записи (структуры) Выполняется по полям. Каждое поле заполняется отдельно. Операции над полями Над полями выполняются операции в соответствии с типом поля. Пример выполнения операций над массивом структур. Результаты сессии группы из n студентов · Ввод данных по сессии одного студента. · Вывод данных по сессии одного студента.. · Заполнение массива данными сессии по студентам группы. · Поиск результатов сессии заданного студента, по его фамилии. · Определить средний балл группы студентов. Все операции оформить функциями. Реализация #include "stdafx.h" #include "iostream" #define n 2 using namespace std; struct TSession { char Fam[40]; unsigned short marks[6]; }; // Ввод данных по сессии одного студента. void inp_sessin_1(TSession *s)//изменяется в функции {
int i; puts("Fam="); scanf("%s",&(*s).Fam);//разыменование puts("Vvedite 6 chisel"); for(i=0;i<6;i++) { scanf("%d",&(*s).marks[i]); }
} // Заполнение массива данными сессии по студентам группы. void inp_massiv_group(TSession *mas, int nn)//а это массив сессий { int i; for(i=0;i<nn;i++) { inp_sessin_1(&mas[i]); } } // Вывод данных по сессии группы студентов void out_massiv_group(TSession *mas, int nn) { int i,j; for(i=0;i<nn;i++) { printf("%s", mas[i].Fam); for(j=0;j<6;j++) printf("%d ", mas[i].marks[j]); printf("\n"); } } // Вывод данных по сессии одного студента.. void out_sessia(TSession s) { int j;
printf("%s", s.Fam); for(j=0;j<6;j++) printf("%d ", s.marks[j]); } // Поиск результатов сессии заданного студента, по его фамилии. TSession finde(TSession *mas, int nn,char *fam) { int i; for(i=0;i<nn;i++) { if(strcmp(mas[i].Fam,fam)==0) { return mas[i]; } } } // Определить средний балл группы студентов. double average(TSession *mas, int nn) { int i,j; double s=0; for(i=0;i<nn;i++) {
for(j=0;j<6;j++) s=s+mas[i].marks[j]; } return s/nn; }
int _tmain(int argc, _TCHAR* argv[]) { TSession Group[n]; inp_massiv_group(Group, 2); char f[20]; getchar(); puts("Fam="); gets(f); puts(f); out_sessia(finde(Group,n,f));
printf("\n Srednii Ball = %lf",average(Group,n)); return 0; }
Пример управления битами ячейки памяти посредством битовых полей. Требования к выполнению лабораторной работы Требуется создать сначала консольное одномодульное приложение, затем из одномодульного создать многомодульное приложение. Задание 1. Создание одномодульного приложения 1. Включить в приложение тип данных, который определяет структуру варианта. 2. Разработать тип – динамический массив, элементами которого является структура (далее запись), определенная вариантом и реализованная в соответствии с п.1. 3. Разработать функции: · заполнение отдельной записи; · вывод записи; · добавление нового элемента (записи) в динамический массив; · сортировка массива записей (методом, указанным в варианте); · подзадач, которые будут выявлены вами при разработке дополнительной операции; · вывод массива записей; · вывод результатов операций. Примечание. Обмен данными между функциями обеспечить через механизм параметров. 4. Разработать консольное приложение, управляемое пользовательским интерфейсом и продемонстрируйте работу всех операций. Задание 2. Создание многомодульного приложения Создание многомодульного приложения. Создайте копию приложения, созданного в задании 1. 1. Создайте заголовочный файл с именем Unit_Def и переместите (т.е. в коде его не будет) в него из кода приложения: · определение типа записи; · определение типа массива записей. 2. Создайте модуль Unit_Input_Output, · включите в него: · модуль Unit_Def , используя для включения директивы препроцессора по условной компиляции · переместите в него функции: · заполнение отдельной записи; · вывод записи; · вывод массива записей; · вывод результатов операций. 3. Создайте заголовочный файл с именем Unit_Operation · включите в него модуль Unit_Def · переместите в него функции: · добавление нового элемента в динамический массив; · подпрограммы по сортировке массива и дополнительным операциям. 4. Проверьте работоспособность приложения. Оно должно выполнять все операции как и в одномодульном. Таблица 5 Варианты заданий
Пример разработки одномодульно [1] При вводе данных в строковые поля предусмотреть преобразование их к формату: первая буква большая, остальные маленькие) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 160. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |