Использование указателей для работы с составными типами данных 


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



ЗНАЕТЕ ЛИ ВЫ?

Использование указателей для работы с составными типами данных



(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 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.

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

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

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

1 Можно ли использовать указатели в качестве данных-членов структур?

2 Можно ли использовать массивы и структуры в качестве данных-членов структур (вложенные объявления)?

3 Можно ли использовать в качестве вложенных структуры объявляемого (своего) типа, а также указатели на структуры своего типа?

4 Как объявить указатель на структуру, массив указателей на структуры? Существуют ли различные варианты объявления?

5 Можно ли использовать typedef для объявления типа структуры?

6 Как получить доступ к элементу структуры с помощью указателя?

7 Как осуществляется доступ к данным-членам структуры при использовании массива указателей на структуры?

8 Можно ли использовать различные классы памяти применительно к переменным структурного типа?

9 Обязательно ли указывать ключевое слово struct при объявлении структурного типа, переменных структурного типа?

10 Можно ли хранить адрес структуры в самой структуре?

 

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



Поделиться:


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

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