Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_cpp.doc
Скачиваний:
10
Добавлен:
07.06.2015
Размер:
2.81 Mб
Скачать

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

  1. Приведите примеры объявления массивов с различной размерностью. Объясните организацию хранения элементов массива.

  2. Как происходит масштабирование при последовательном разыменовании указателя (имени массива) в процессе доступа к элементам? Какие синтаксические конструкции можно использовать для доступа к элементам массива?

  3. Приведите общую формулу для массива Тип Имя [N][M][K] при доступе к заданному элементу Имя [i][j][k] и объясните её.

  4. Как осуществляется инициализация многомерных массивов?

  5. Зависит ли инициализация массива от класса памяти при объявлении?

  6. Как использовать средство typedef для объявления типа массива.

  7. Какой из индексов можно не указывать при явной инициализации массивов?

  8. Можно ли указывать не все элементы при инициализации? Как использовать скобки при инициализации?

  9. Какой индекс не используется при расчёте величины смещения указателя в процессе доступа к элементу массива?

  10. Для чего используется указанный индекс?

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

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

(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| */

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]