17118

Використання покажчиків для роботи зі складеними типами даних

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

Информатика, кибернетика и программирование

Лабораторна робота № 27 Тема: Використання покажчиків для роботи зі складеними типами даних Ціль роботи: виробити практичні навички у використанні покажчиків при роботі зі складеними комбінованими типами даних. Обладнання: ПКПО Borland C Теоретичні відомості ...

Украинкский

2013-06-29

98 KB

1 чел.

Лабораторна робота № 27

Тема: Використання покажчиків для роботи зі складеними типами даних

Ціль роботи: виробити практичні навички у  використанні покажчиків при роботі зі складеними (комбінованими) типами даних.

Обладнання: ПК,ПО Borland C++

Теоретичні відомості

Можна оголосити покажчики на структури й одержати доступ до дан-членів цих структур, використовуючи покажчики. С++ вимагає, щоб при цьому використовувалася операція доступу до покажчика (->) замість операції доступу (.) "крапка". Загальний синтаксис для оголошення покажчика на перемінну структурного типу той же, що і для звичайної перемінної.

Приклад оголошення покажчика на перемінн-структуру і використання його для доступу до дан-членів цієї структури.

Оголошення типу структури

Використання структур і покажчиків

за допомогою 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[і].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&&і<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]

    і++;

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

 printf("Висновок значень елементів масиву структур arrloc[і]\n ");

 printf("з використанням покажчика\n ");

 j=i; pstr=&arrloc[0];

 for(i=0;i<j;i++)

  { print_ptr(pstr);

    dloc[і] = new stud; //Виділення пам'яті для структури в "купі"

    dloc[і] = pstr;     //Ініціалізація елементів локального масиву

    pstr++;

  }

 printf("Уведення відсутніх значень елементів масиву структур\n ");

 printf("з використанням масиву покажчиків\n ");

 for ( і=j; і<N; і++)

     dloc[і]=init_ptr(); //Виділення пам'яті для структури у функції

 printf("Висновок значень елементів масиву структур\n ");

 printf("з використанням масиву покажчиків\n ");

 for ( і=0; і<N; і++)

  { print_ptr(dloc[і]);

    data[і] = *dloc[і]; //Ініціалізація елементів глобального

  }                     //масиву структур

 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 ( і=0; і<N; і++)  delete dloc[і]; //Звільнення пам'яті в "купі"

 getch();

}//End main()----------------------------------------------------------

int poisk(int j)   //Функція пошуку даних (data[і].day==j)

 {int a=-1;        //у глобальному масиві структур data[і]

  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 і=0; і<num; і++)      //структур для висновку

   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[і]

с використанням покажчика

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

Приклад програми на С++

Скласти програму для збереження й обробки інформації яка включає різні типи даних. Індивідуальне завдання приведене в таблиці 3.2.

Варіант

Номер і зміст даних

1

2

3

4

5

6

7

6

Назва магазина

Вид товару

Адреса

Час роботи

Кількість продавців

Номер магазина

#include<iostream.h>

#include<math.h>

void H(char(*func1)(unsigned int*),char(*func2)(int*,float*,double*),char(*func3)(void*));

int*func4(char*be,int*b);

char f1(unsigned int*c);

char f2(int*d,float*e,double*f);

char f3(void*g);

void main()

{int r,*my=&r,y;

char p;

p='w';

y=54;

H(f1,f2,f3);

*my=*func4(&p,&y);

cout<<*my;

}

void H(char(*func1)(unsigned int*),char(*func2)(int*,float*,double*),char(*func3)(void*))

{int a2;

unsigned int a1;

float a4;

double a3;

void *a5;

char z1,z2,z3;

a1=12;

a2=10;

a3=3.5;

a4=8.1;

z1=(*func1)(&a1);

z2=(*func2)(&a2,&a4,&a3);

z3=(*func3)(a5);

cout<<z1<<' '<<z2<<' '<<z3<<'\n';

}

char f1(unsigned int*c)

{if (*c<10) return 'a';

 else return 'b';

}

char f2(int*d,float*e,double*f)

{if((*d>*e)&&(*f>0)) return'a';

 else return 'b';

}

char f3(void*g)

{return 'v';

}

int*func4(char*be,int*b)

{int a,*c=&a;

if(*be=='w') *c=*b;

 else *c=0;

return c;

}

Хід роботи

1.Вивчити теоретичні відомості.

2.Відповідно до індивідуального завдання розробити алгоритм рішення задачі. Оголосити комбіновані типи, масиви структур, покажчики на структуру. Використовувати покажчики як члени структури, а також для доступу до членів структури і роботи з ними. Оголосити об'єднання і виконати роботу з об'єднанням з використанням покажчиків. Результати ініціалізації, зміни членів комбінованих типів вивести на екран.

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

4.Одержати результат.

5.Оформити звіт.

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

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

Індивідуальне завдання

Скласти програму для збереження й обробки інформації яка включає різні типи даних. Індивідуальне завдання приведене в таблиці 3.2.

Таблиця 3.2 - Індивідуальне завдання

Варіант

Номер і зміст даних

1

2

3

4

5

6

7

1

ФИО

Ріст

Вага

Рік народження

Підлога

Рейтинг

2

Назва ЕОМ

Тип процесора

Обсяг пам'яті

Тип дисплея

Кількість дисководів

Вартість

3

Тип автомобіля

Колір

Кількість коліс

Кількість місць

Вантажопідйомність

Вартість

4

Тип автобуса

Кількість місць

Вантажопідйомність

Номер маршруту

Пункт призначення

Час відправлення

5

ФИО

Номер школи

Клас

Середній бал атестата

Улюблений предмет

Нелюбимий предмет

6

Назва магазина

Вид товару

Адреса

Час роботи

Кількість продавців

Номер магазина

7

ФИО

Вид спорту

Особистий рекорд

Іноземна мова

Термін занять

Кількість знайомих слів

8

Назва фірми

Обсяг річного обороту

ФИО директора

Штат

Стаж роботи

Вік директора

9

ФИО

Наявність братів і сестер

Число

Місяць

Рік народження

Вага

10

Назва книги

Автор

Видавництво

Дата видання

Країна

Кількість сторінок

11

ФИО

Номер у групі

Назва групи

Курс

Оцінки

Рейтинг

12

Назва велосипеда

Кількість коліс

Діаметр коліс

Колір

Вантажопідйомність

Швидкість

13

Назва програмного продукту

Область застосування

Обсяг займаної пам'яті

Операційна система

Режим: текстовий чи графічний

Вартість

14

Назва доля групи

Дата створення

Стиль

Склад групи

Кількість альбомів

Вартість квитка

15

ФИО

Номер залікової книжки

Улюблений предмет

Оцінки по математиці

середній бал

Мова програмування

16

Назва журналу

Вік читачів

Кількість сторінок

Початок видання

Тираж

Передплатний індекс

17

Назва літака

Дальність польоту

Кількість місць

Кількість двигунів

Час вильоту

Час у повітрі

18

Назва праски

Ціна

Країна виробник

Вага

Температура

Наявність регулятора

19

Місто

Країна

Область

Поштовий індекс

Число жителів

Площа

20

Операційна система

Многозадачность

Обсяг пам'яті

Версія

Фірма розроблювач

Вартість

Контрольні запитання

1.Чи можна використовувати покажчики як дан-члени структур?

2.Чи можна використовувати масиви і структури як дан-члени структур (вкладені оголошення)?

3.Чи можна використовувати в якості вкладені структури що повідомляється (свого) типу, а також покажчики на структури свого типу?

4.Як оголосити покажчик на структуру, масив покажчиків на структури?  Чи існують різні варіанти оголошення?

5.Чи можна використовувати typedef для оголошення типу структури?

6.Як одержати доступ до елемента структури за допомогою покажчика?

7.Як здійснюється доступ до дан-членів структури при використанні масиву покажчиків на структури?

 8.Чи можна використовувати різні класи пам'яті стосовно до перемінних структурного типу?

 9.Чи обов'язково вказувати ключове слово struct при оголошенні структурного типу, перемінних структурного типу?

 10.Чи можна зберігати адреса структури в самій структурі?


 

А также другие работы, которые могут Вас заинтересовать

47528. Методичні рекомендації. Банківська справа 411 KB
  Укладачі: Пшик Богдан Іванович кандидат економічних наук доцент Рисін Віталій Васильович кандидат економічних наук доцент Рецензенти: Славюк Ростислав Анатолійович доктор економічних наук професор заступник директора з наукової роботи Вербицька Тетяна Петрівна заступник директора Львівської філії АТ Укрінбанк†кандидат економічних наук Відповідальна за випуск: Табачук Галина Прокопівна кандидат економічних наук...
47532. Методические указания. Менеджмент организации 311.5 KB
  В них содержаться основные требования предъявляемые к организации и проведению преддипломной практики к содержанию дипломных работ порядку их выполнения и защиты приведены формы основных документов используемых при оформлении дипломных работ дана примерная тематика дипломных работ по кафедре экономики предприятия и производственного менеджмента. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ОРГАНИЗАЦИИ И ПРОВЕДЕНИЮ ПРЕДДИПЛОМНОЙ ПРАКТИКИ ОБЩИЕ ПОЛОЖЕНИЯ Преддипломная практика студентов является важнейшей частью подготовки высококвалифицированных...
47533. Методические указания. Экономика и бухгалтерский учет 171.5 KB
  Наумова СОДЕРЖАНИЕ 1 Общие вопросы организации дипломного проектирования.4 2 Содержание дипломного проекта .1 Требования к структуре дипломного проекта .4 Требования к содержанию пояснительной записки дипломного проекта.
47534. Осложнения послеоперационного периода – роль сестринского процесса и их профилактика 2.06 MB
  Послеоперационный период - это время от момента операции до выздоровления или перевода пациента на инвалидность. В этот период пациент находится в определенном состоянии, которое обусловлено предшествующей болезнью, оперативным вмешательством по ее устранению и наркотическими средствами, применяемыми во время операции.