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.Чи можна зберігати адреса структури в самій структурі?


 

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

6393. Основы Web-программирования на PHP 29.74 KB
  PHP. Быстрый старт. Первая программа на PHP. Вставив инструкцию print междуPHP-тегами, мы даем команду серверу послать приветствие Hello, world! в браузер. Это аналогично тому, что мы ввели данный текст в HTML-код...
6395. Мировоззрение и его исторические типы 72.5 KB
  Мировоззрение и его исторические типы Менталитет и мировоззрение Мировоззрение в современную эпоху Исторические типы мировоззрения Мифология как исторически первый тип мировоззрения Религия как тип мировоззрения Ме...
6396. Философия как тип мировоззрения 62.5 KB
  Философия как тип мировоззрения Философия и другие типы мировоззрения Структура философии Различные типы философствования Философия и другие типы мировоззрения Любое мировоззрение связано с осмыслением мира, выявлением смысла. В ми...
6397. История философии и ее связь с историческим процессом 99 KB
  История философии и ее связь с историческим процессом Происхождение философии Основные этапы развития европейской философии Особенности развития русской философии Происхождение философии. Философия возникла одновременно в древнейших...
6398. Материя как предмет философского осмысления 66.5 KB
  Материя как предмет философского осмысления Онтология и проблема бытия Проблема материи в истории философии Атрибуты материи Онтология и проблема бытия Одним из центральных разделов философии является онтология - уче...
6399. Сознание как проблема философии 58 KB
  Сознание как проблема философии Основные философские позиции по проблеме сознания Теория отражения. Основные философские позиции по проблеме сознания. Представители объективного идеализма (Платон, Гегель) трактуют сознание, дух как вечное п...
6400. Диалектика как теоретическая система и метод познания 98.5 KB
  Диалектика как теоретическая система и метод познания Исторические типы метафизики и диалектики Системность Детерминизм Развитие Исторические типы метафизики и диалектики Еще с древности люди заметили, что всем предметам и явлениям ми...
6401. Проблема человека в философии 71 KB
  Проблема человека в философии Проблема человека в истории философии Проблема антропосоциогенеза Природа человека Проблема человека является центральной для всей духовной культуры общества, т.к. только через себя мы понимаем окружающий мир, о...