Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Требования к выполнению лабораторной работы




ЛАБОРАТОРНАЯ РАБОТА №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;

x y

2) Переменная S типа Tsession

             
Поле Fam

Поле marks-массив

3) Переменная Е типа TEmploye

  day month year city street NumHouse NumRoom
               
Fam

Date

Adress

 

Доступ к значению поля в структуре

Доступ к полю прямой – по имени поля - уточненное имя. Уточненное имя формируется по правилу:

имя переменной.имя поля.

Если имя поля в свою очередь представляет переменную типа запись, то правило распространяется на имя этого поля.

Примеры формирования имени.

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.

Поле х пусто пусто пусто Байт y Байт y Байт y Байт y

Рис. Представление переменной А в памяти

    Количество памяти можно определить функцией 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 Сведения о студенте: Номер зачетной книжки, Фамилия, Имя, Дата рождения, Номер телефона, Дата поступления, Признак удаления записи Метод прямого выбора. Отсортировать массив по дате рождения(перевести ее сначала в число исчисляя начало 1900 годом) Найти и удалить всех окончивших институт (т.е. более срок обучения более 6 лет)
2 Сведения о спортсмене :Фамилия, Имя, Дата рождения, Вес, Рост, Пол Метод “Пузырька”. Отсортировать массив по полю Вес. Сформировать список спортсменов мужчин не старше 22 лет
3 Сведения о расписании занятий: Номер группы, название дисциплины, вид занятия (лек, лаб, практ), номер аудитории, день недели, номер пары, фамилия преподавателя.. Отсортировать массив по номеру группы, используя алгоритм Шейкер сортировки. Сформировать список групп, у которых лекция проходит в потоке.
4 Сведения о жителе: Фамилия, Город, Адрес: улица, дом, квартира. Отсортировать массив методом вставки, упорядочивая по возрастанию по городам Вывести фамилии двух жителей, живущих в разных городах по одному адресу.
5 Сведения о книге: Автор, Название, Инвентарный номер, Издательство, Количество страниц, Цена Отсортировать массив по по Автору, используя метод улучшенного Пузырька.  Вставить новую книгу в упорядочен -ный массив.
6 Сведения об успеваемости одного студента по одной дисциплине: Номер зачетной книжки, Шифр группы, Название дисциплины, Дата получения оценки, Оценка, Фамилия преподавателя[1]. Отсортировать массив методом Вставки по Названию дисциплины Сформировать ведомость успеваемости группы по определенной дисциплине (Шифр группы и Название дисциплины вводятся). Найти средний балл группы по Дисциплине.
7 Учет выдачи книг пользователям библиотеки. Карточка пользователя библиотеки содержит сведения, о выданной книге: Инвентарный номер, Автор, Название, Дата выдачи, Дата возврата Отсортировать по дате выдачи методом прямого выбора Сформировать список книг, которые не возвращены вовремя.
8 Успеваемость группы студентов. Сведения по одному экзамену одного студента: Номер зачетной книжки, Название дисциплины, Дата получения оценки, Оценка, Фамилия преподавателя. ( по каждому студенту будет столько записей сколько экзаменов он сдал). При вводе данных в строковые поля предусмотреть преобразование их к формату: первая буква большая, остальные маленькие Отсортировать в хронологическом порядке по дате получения оценки. Найти студентов с наибольшим баллом и вывести их фамилии.
9 Список экспортируемых товаров. Об отдельном товаре хранятся данные: Наименование товара, Страна импортирующая товар, Количество(в штуках). Отсортировать список методом Пузырька по Стране Сформировать массив стран, в которые импортируется указанный товар(название товара вводит пользователь)
10 Магазин игрушек. Сведения об игрушке: Название(например: кукла, конструктор и т.д.), стоимость в копейках(вводится может дробное число, содержащее рубли и копейки), возрастные границы детей, для кого игрушка предназначена( два поля – начальный возраст и конечный) Отсортировать методом улучшенного пузырька по возрастным группам Сформировать список игрушек для детей указанного возраста и определенной стоимости.
11 Служба знакомств. Структура данных хранит сведения о претендентах. Об отдельном претенденте: Фамилия, Имя Отчество, Возраст, Рост, Цвет глаз, Цвет волос, Зарплату, Наличие квартиры, Наличие машины. Отсортировать список претендентов по возрасту методом прямой вставки. Сформировать список пар, которые можно построить на основе некоторого критерия. Критерий определите сами
12 Продажа квартир. Сведения о продаваемой квартире: Общая площадь, Жилая площадь, Площадь кухни, Наличие лоджии, Наличие санузла и его характеристики(совмещенный или нет), Панельный или кирпичный дом, Этаж, Общее количество этажей, Адрес, Стоимость, Район города Отсортировать по убыванию методом Пузырька по общей площади и по району Сформировать список квартир по заданному критерию. Критерий составить самим. Отбор должен осуществляться минимум по трем параметрам.
13 Поликлиника. Структура содержит данные о жителях, обслуживаемых данной поликлиникой. О жителе хранятся сведения: Фамилия , Имя, Отчество, Адрес, Место работы, Наличие прививки от гриппа, Дата последней флюорографии Отсортировать методом прямой вставки по дате флюорографии. Сформировать список не сделавших прививку от гриппа.
14 ГИБДД. Структура хранит данные об автомашинах, О каждой машине: Модель, Номер(код региона, цифровой код, буквенный код), Цвет, Сведения о владельце(Фамилия, Имя , Адрес), дата последнего техосмотра. Отсортировать по моделям методом бинарной сортировки Сформировать список номеров машин модели “Волга” не прошедших техосмотр в этом году.
15 Справочник владельца видеотеки. О каждом видеофильме хранятся данные: Название, Студия, Жанр, Год выпуска, Режиссер, Исполнители главных ролей(не более 10): фамилия. Отсортировать по возрастанию методом прямого выбора по жанру. Сформировать список видеофильмов данного режиссера, за данный год и указанного жанра
16 Справочник фаната. Содержит данные о спортсменах: Анкетные и антропологические данные, Гражданство, Вид спорта, Клуб, Данные о личном рекорде(дата, призовое место) Отсортировать по призовому месту методом улучшенного пузырька. Сформировать список спортсменов различных стран, по одному виду спорта, принадлежащих одному клубу
17 Справочник коммерческих банков. Об отдельном банке хранятся данные: Наименование, Адрес, Статус(форма собственности), условия хранения средств на личном счету(годовые проценты на различных видах вкладов)   Отсортировать в порядке убывания по годовым процентам методом прямого выбора.     Выбрать банк с наибольшим процентом для заданного вида вклада
18 Автосалон. Об отдельном автомобиле: Марка, Год выпуска, Мощность двигателя, Количество цилиндров, Запрашиваемая цена. Сведения о покупателях: контактный телефон, Марка, Технические характеристики, Финансовые возможности. Отсортировать по марке и году выпуска методом Пузырька Выполнить подбор вариантов для покупателя ( подбор по всем поля покупателя, кроме контактного телефона)
19 Справочник туриста. Турагенство предлагает услуги: Страна, Город, Условия проживания(Отель-звезды, Автобус и т. д.), Условия проезда, Экскурсионное обслуживание, Сервис принимающей стороны, Стоимость путевки. Выполнить сортировку методом прямой вставки по стране и стоимости Сформировать список туров по стране и стоимости

Пример разработки одномодульно


[1] При вводе данных в строковые поля предусмотреть преобразование их к формату: первая буква большая, остальные маленькие)










Последнее изменение этой страницы: 2018-04-12; просмотров: 160.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...