Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Разработка программ с составными типами данных

Поиск

(2часа)

Цель: выработать практические навыки в написании программ с использованием комбинированных типов данных.

Теоретические сведения

Структуры

С поддерживает определённый пользователем составной тип, объявляемый с ключевым словом struct, который определяет структуры. Эти структуры подобны записям, используемым в других языках программирования. Структура содержит данные-члены, которые являются данными базовых типов, либо являются предварительно объявленными структурами. Структуры не могут содержать структуры своего типа, но могут содержать указатели на такие структуры.

Объявление структур

В С ключевое слово struct используется не только для объявления объектов структурного типа, но и для объявления нового (структурного) типа. Объявленный тип структуры можно использовать для объявления объектов структурного типа.

Представим общий синтаксис для объявления структуры типа (stt) и приведём несколько примеров структур

struct sttype { type1 dataMember1; type2 dataMember2; //другие данныe-члены }[<имя_объекта 1>, <имя_объекта 2>];// объявление типа структуры и необязательное // объявление объектов struct Point { float x; float y; } Apoint, Bpoint, *Ppoint, Mpoint[10]; объявление типа и объектов struct Person {char firstname[12]; char lastname[15]; int birthday; float weight; }; // объявление // типа структуры

После объявления типа (<strucType>), его можно использовать для объявления объектов, например

sttype Astr, Mstr[5], *pstr;

Объявлены объекты структурного типа:

Astr - структура;

Mstr[5]- массив из 5 -ти структур;

pstr- указатель на структуру данного типа.

Структура типа Point имеет два члена-данных типа float.

Структура типа Person - пример структуры, которая содержит данные-члены, которые являются массивами:

firstname []- массив из 12 символов, в котором хранится имя.

lastname []- массив из 15 символов, в котором хранится фамилия.

birthday типа int, в котором хранится год рождения.

weight типа float, в котором хранится вес.

Объявление структуры-переменной (объекта структурного типа) не отличается от объявления переменных с базовыми или предварительно определёнными типами.

Общий синтаксис объявления Пример объявления объектов (переменных) структурного типа
//объявление единственной переменной //sttype sttype structVar; //объявление массива структур sttype sttype stArray[Kol_elem]; Point Origin, StartPoint, Points[10]; Person You, Me, Us[30], *PYou;  

 

В этом примере объявлены переменные- структуры Origin, StartPoint типа Point, массив Points [10], имеющий 10 элементов - структур типа Point, переменные Me и You типа Person, массив Us [30], имеющий 30 элементов- структур типа Person и указатель на тип Person.

С позволяет инициализировать данные-члены структур. Инициализация осуществляется подобно инициализации массивов и следует тем же правилам. Общий синтаксис для инициализации данных-членов структуры:

sttype strucVar ={value1,value2,...};

Компилятор присваивает значение value1 первому данному-члену структуры strucVar, value2 - второму данному-члену структуры strucVar и т.д. С требует соблюдения следующих правил:

1 Присваиваемые значения должны быть совместимы с соответствующими им данными-членами по типу, диапазону и количеству (для массивов).

2 Можно объявлять меньшее количество присваиваемых значений, чем количество данных. Компилятор присваивает нули остальным данным- членам структуры.

3 Нельзя указывать больше инициализирующих значений, чем количество данных-членов.

4 Значения из списка инициализации последовательно присваиваются данным-членам вложенных структур и массивов.

Пример инициализации структуры - Point fPoint={12.4,34.5};

В этом примере объявлена переменная fPoint типа Point и инициализированы данных члены х, у значениями 12.4 и 34.5.

Доступ к данным-членам осуществляется с помощью операции (.)"точка".

 

Общий синтаксис для доступа к данным-членам структуры Примеры доступа к данным - членам структуры
StrucVar.dataMember <Имя_структуры>. <данное_член>; Point myPoint; //объявление MyPoint. x=10.9; //доступ кх MyPoint. y=21.89;

 

myPoint -структурная переменная, доступ к её данным-членам х, у осуществляется с помощью выражения myPoint. x и myPoint. y соответственно.

 

Пример

 

/* ЗАНЯТИЕ N 14

Разработал Петров Ю.В.

Объявить составные типы данных, выполнить их

инициализацию. Массив структур инициализировать с

использованием операторов организации цикла. Получить доступ

к элементам структур. Вывести значения элементов массива

структур на экран с применением функции. */

 

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <alloc.h>

 

#define N 20

#define M 5

typedef struct Adr //Adr -тип структуры

{ char town[N]; char *country;

char region; float indeks; int kolvo;

} adr; //adr -тоже тип структуры (синоним Adr)

//input_st() -функция для инициализация структуры типа adr

adr input_st(char *town, char *coun, char reg, float ind, int kol);

void print_st(adr adr3); //Функция вывода элементов структуры

 

int main(void)

{ clrscr();

int a; float f1;

char str[125]; //Буфер для ввода строки символов

adr adress[M]; //Массив структур

adr adr1,adr2={"Kiev","Ukr",'r',12.3,15}; //Явная инициализация

adr1=adr2; //Инициализация adr1 присваиванием

printf("Вывод элементов структуры ");

print_st(adr1); //Вывод adr1

adr1=input_st("Kr","Ukr",'t',134.5,2); //Инициализация adr1

printf("Вывод элементов структуры ");

print_st(adr1); //Вывод adr1

int i=0,j;

 

while (a&&i<M) //Ввод элементов массива структур

{ printf("Ввод города (char array[N]) ");

scanf("%s",&adress[i].town); fflush(stdin);

printf("Ввод страны (char *) ");

scanf("%s",str); fflush(stdin);

adress[i].country=(char*)malloc(strlen(str)+1);

strcpy(adress[i].country,str);

//adress[i].country=strdup(str); //Возможный вариант иниц.

printf("Ввод кода региона (char) ");

scanf("%c", &adress[i].region); fflush(stdin);

printf("Ввод цифрового кода (float) ");

scanf("%f",&f1); fflush(stdin);

adress[i].indeks=f1;

printf("Ввод количества (int) ");

scanf("%i",&adress[i].kolvo); fflush(stdin);

printf("\n\t\t\t Продолжить ввод? y/n: ");

char c=getche(); printf("\n");

if (c=='n' || c=='N') a=0;

i++;

} //end while---------------------------------------------

printf("Вывод элементов структур\n ");

j=i;

for(i=0;i<j;i++) print_st(adress[i]);

getche();

return 0;

} //end main()-----------------------------------------------

 

adr input_st(char *t, char *c, char r, float f, int k)

{ adr ad; //Объявление локальной структуры

strcpy(ad.town,t); //Копирование "t" в "ad.town"

ad.country=(char*)malloc(strlen(c)+1); //Выделение памяти

strcpy(ad.country, c); //Копирование "c" в "ad.country"

// ad.country=strdup(c); //Возможный вариант инициализации

ad.region=r; ad.indeks=f; ad.kolvo=k;

return ad; //Возврат структуры из функции

} //end input_st ()---------------------------------------

void print_st(adr adr3) //Функция вывода элементов структуры

{ printf("| %s ", adr3.town);

printf("| %s ", adr3.country);

printf("| %4c | %10f|%6i|\n",adr3.region, adr3.indeks, adr3.kolvo);

} //end print_st()-----------------------------------------

 

/*Вывод элементов структуры | Kiev | Ukr | r | 12.300000| 15|

Вывод элементов структуры | Kr | Ukr | t | 134.500000| 2|

Ввод города (char array[N]) Don

Ввод страны (char *) Ukr

Ввод кода региона (char) t

Ввод цифрового кода (float) 45.67

Ввод количества (int) 8

Продолжить ввод? y/n: y

Ввод города (char array[N]) Khar

Ввод страны (char *) Ukr

Ввод кода региона (char) g

Ввод цифрового кода (float) 67.84

Ввод количества (int) 4

Продолжить ввод? y/n: n

Вывод элементов структур | Don | Ukr | t | 45.669998| 8|

| Khar | Ukr | g | 67.839996| 4| */

 

Ход работы

1 Изучить теоретические сведения.

2 В соответствии с индивидуальным заданием разработать алгоритм решения задачи. Объявить составные (комбинированные) типы, массивы структур, использовать указатели в качестве членов структуры, объявить объединение и выполнить работу с объединением. Результаты инициализации, изменения членов комбинированных типов в процессе вычисления вывести на экран.

3 Разработать программу, набрать программу на компьютере, устранить ошибки.

4 Получить результат.

5 Оформить отчет.

6 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.

 

Требования к содержанию отчёта приведены в лабораторной работе №1.

 

Индивидуальное задание к лабораторной работе №14 взять из работы №3.

 

Контрольные вопросы для подготовки и самостоятельной работы

1 Какие типы данных могут быть членами структур?

2 Каков синтаксис объявления структур?

3 Как объявляются переменные (объекты) структурного типа?

4 Какие виды объектов структурного типа можно объявить?

5 Как производится инициализация данных-членов структуры? Каковы особенности инициализации массивов и структур-членов структуры (вложенных структур)?

6 Можно ли производить неполную инициализацию структуры (не для всех членов структуры)?

7 Какие правила инициализации данных-членов структур Вы знаете?

8 Как располагаются данные-члены структур в памяти?

9 Что такое объединение (union)?

10 Как располагаются в памяти данные-члены объединения?

11 Каков синтаксис объявления типа и объектов типа объединения?

12 В чём отличие объединения от структуры?

13 Как осуществляется доступ к данным-членам структуры, объединения?

14 Как осуществляется доступ к данным-членам структуры, расположенной в массиве структур?

Лабораторная работа № 15



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 395; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.217.168 (0.006 с.)