Индивидуальное задание к лабораторной работе №14 взять из работы №3.
Контрольные вопросы для подготовки и самостоятельной работы
1 Какие типы данных могут быть членами структур?
2 Каков синтаксис объявления структур?
3 Как объявляются переменные (объекты) структурного типа?
4 Какие виды объектов структурного типа можно объявить?
5 Как производится инициализация данных-членов структуры? Каковы особенности инициализации массивов и структур-членов структуры (вложенных структур)?
6 Можно ли производить неполную инициализацию структуры (не для всех членов структуры)?
7 Какие правила инициализации данных-членов структур Вы знаете?
8 Как располагаются данные-члены структур в памяти?
9 Что такое объединение (union)?
10 Как располагаются в памяти данные-члены объединения?
11 Каков синтаксис объявления типа и объектов типа объединения?
12 В чём отличие объединения от структуры?
13 Как осуществляется доступ к данным-членам структуры, объединения?
14 Как осуществляется доступ к данным-членам структуры, расположенной в массиве структур?
Лабораторная работа № 15
Использование указателей для работы с составными типами данных
(2часа)
Цель работы: выработать практические навыки в использовании указателей при работе с составными (комбинированными) типами данных.
Теоретические сведения
Можно объявить указатели на структуры и получить доступ к данным-членам этих структур, используя указатели. С требует, чтобы при этом использовалась операция доступа к указателю (->) вместо операции доступа (.) "точка". Общий синтаксис для объявления указателя на переменную структурного типа тот же, что и для обычной переменной.
Пример объявления указателя на переменную-структуру и использования его для доступа к данным-членам этой структуры.
Объявление типа структуры | Использование структур и указателей |
с помощьюtypedef struct myComplex { float my_real; float my_mag; } MyComp; //тип структуры – // myCompиMyCompсинонимы | void main() { myComp comvar={1.0, 2.8} MyComplex * pComplex=&comlexvar; cout <<"Complex number = " << pComp ->my_real << pComp ->my_mag; } |
В примере объявлена структура myComp или MyComp с членами данных my_real и my _ mag типа float. В функции main() объявляется и инициализируется переменная-структура comvar. В функции также объявляется указатель pComp на тип myComp и инициализируется адресом переменной compvar. При выводе в поток cout используется операция -> для доступа с помощью указателя pComp к данным-членам my_real и my_mag переменной-структуры compvar.
Пример
/* ЗАНЯТИЕ N 15
Разработал Петров Ю.В.
Объявить структуры и указатели на них, выполнить инициализацию.
Массив указателей на структурный тип инициализировать с
выделением памяти в куче. Получить доступ к элементам структур
с использованием указателей. Вывести значения элементов
массива структур на экран с применением функции. Структура
содержит фамилию и дату рождения (число, месяц, год) студента.
Ввести информацию о студентах и найти данные о первом
в массиве структур студенте, который родился заданного числа.*/
#include <stdio.h>
#include <conio.h>
#define N 3
#define M 20
struct stud
{ char name[M];
int day,month,year;
};
stud data[N]; //Глобальный массив из N структур типа stud
//Функция поиска данных в глобальный массиве data[i].day==j)
int poisk(int j);
//print_st() -Функция вывода элементов структуры из глобальнго
void print_st(int num); //массива, num -кол. структур для вывода
//init_loc() -функция для инициализация структуры типа stud
stud *init_ptr(void);
void print_ptr(stud *); //Функция вывода элементов структуры
void main()
{ int i=0,j,a; clrscr();
stud arrloc[N]; //Массив из N структур
stud *dloc[N]; //Массив указателей на структурный тип stud
stud *pstr; //Указатель на структурный тип stud
pstr=arrloc; //Аналогично pstr=&arrloc[0];
while (a&&i<N) //Ввод элементов массива структур arrloc[N]
{ printf("Введите фамилию студента: ");
scanf("%s",pstr->name); fflush(stdin);
printf("Введите дату рождения(чч мм гг): ");
scanf("%d%d%d",&pstr->day,&pstr->month,&pstr->year);
fflush(stdin);
// printf("%-15s - %2d.%2d.%4d\n",pstr->name,pstr->day,
// pstr->month,pstr->year); //Контроль значений при вводе
printf("t\t Продолжить ввод? y/n ");
char c=getche(); printf("\n");
if (c=='n' || c=='N') a=0;
pstr++;//Переход к следующей структуре в массиве arrloc[N]
i++;
} //end while---------------------------------------------
printf("Вывод значений элементов массива структур arrloc[i]\n ");
printf("с использованием указателя\n ");
j=i; pstr=&arrloc[0];
for(i=0;i<j;i++)
{ print_ptr(pstr);
dloc[i] = new stud; //Выделение памяти для структуры в "куче"
dloc[i] = pstr; //Инициализация элементов локального массива
pstr++;
}
printf("Ввод недостающих значений элементов массива структур\n ");
printf("с использованием массива указателей\n ");
for (i=j; i<N; i++)
dloc[i]=init_ptr(); //Выделение памяти для структуры в функции
printf("Вывод значений элементов массива структур\n ");
printf("с использованием массива указателей\n ");
for (i=0; i<N; i++)
{ print_ptr(dloc[i]);
data[i] = *dloc[i]; //Инициализация элементов глобального
} //массива cтруктур
printf("Вывод (N-2) первых значений элементов глобального \
массива структур\n");
print_st(N-2);
printf("Введите день для поиска первого в массиве структур \
студента: ");
scanf("%d",&j); fflush(stdin);
a=poisk(j);
if (a!=-1) print_ptr(&data[a]);
else printf("Нет таких студентов ");
for (i=0; i<N; i++) delete dloc[i]; //Освобождение памяти в "куче"
getch();
}//End main()----------------------------------------------------------
int poisk(int j) //Функция поиска данных (data[i].day==j)
{int a=-1; //в глобальном массиве структур data[i]
for (int i=0; i<N; i++)
if (data[i].day==j) {a=i; return a;}
return a;
}//------------------------------------------------------------
//print_st() -Функция вывода элементов структуры из глобальнго
void print_st(int num) //массива, num -количество
{ for (int i=0; i<num; i++) //структур для вывода
printf("%-15s - %2d.%2d.%4d\n",data[i].name,data[i].day,
data[i].month,data[i].year);
}//------------------------------------------------------------
//init_loc() -функция для инициализация структуры типа stud
stud *init_ptr(void)
{ stud *pst = new stud; //Выделение памяти в "куче"
printf("Введите фамилию студента: ");
scanf("%s",&pst->name);
printf("Введите дату рождения(чч мм гг): ");
scanf("%d%d%d",&pst->day,&pst->month,&pst->year);
return pst;
}//------------------------------------------------------------
void print_ptr(stud *pdt) //Функция вывода элементов структуры
{ printf("%-15s - %2d.%2d.%4d\n",pdt->name,pdt->day,
pdt->month,pdt->year);
}//------------------------------------------------------------
/* Введите фамилию студента: Petrov
Введите дату рождения(чч мм гг): 12 7 1980
Продолжить ввод? y/n y
Введите фамилию студента: Sidorov
Введите дату рождения(чч мм гг): 24 8 1983
Продолжить ввод? y/n n
Вывод значений элементов массива структур arrloc[i]
с использованием указателя
Petrov - 12. 7.1980
Sidorov - 24. 8.1983
Ввод недостающих значений элементов массива структур
с использованием массива указателей
Введите фамилию студента: Ivanov
Введите дату рождения(чч мм гг): 24 5 1982
Вывод значений элементов массива структур
с использованием массива указателей
Petrov - 12. 7.1980
Sidorov - 24. 8.1983
Ivanov - 24. 5.1982
Вывод (N-2) первых значений элементов глобального массива структур
Petrov - 12. 7.1980
Sidorov - 24. 8.1983
Введите день для поиска первого в массиве структур студента: 24
Sidorov - 24. 8.1983 */
Ход работы
1 Изучить теоретические сведения.
2 В соответствии с индивидуальным заданием разработать алгоритм решения задачи. Объявить комбинированные типы, массивы структур, указатели на структуру. Использовать указатели в качестве членов структуры, а также для доступа к членам структуры и работы с ними. Объявить объединение и выполнить работу с объединением с использованием указателей. Результаты инициализации, изменения членов комбинированных типов вывести на экран.
3 Разработать и набрать программу на компьютере, устранить ошибки.
4 Получить результат.
5 Оформить отчет.
6 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.