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


 

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

73415. Пространство и время в литературе 47 KB
  Пространство и время в литературе. Реальное время -– это время за которое читается книга. Изображаемое время – время в произведении. Были попытки сблизить время изображаемое и реальное.
73417. Повествование и его композиция (композиционно-речевые формы) 31 KB
  Организация повествования возникла давно на Западе. Она включает в себя: структуру повествовательного текста фигуру которая является источником повествования Повествование – весь текст повествовательного произведения; весь текст за вычетом прямых речей.
73418. Образ повествователя и его историческая трансформация 41.5 KB
  Образ автора -– автор создает повествователя который похож на автора. Повествователь Находится за пределами изображаемого мира Близок к автору По речевому строю По восприятию Близок к образу автора Главный признак повествователя: Вне изображаемого мира в отличие от рассказчика...
73419. Образ рассказчика 35.5 KB
  Образ автора – автор создает повествователя, который похож на автора. Рассказ, который ведется от 3-его лица, называется безличным. Повествователь находится вне изображаемого мира, а рассказчик – внутри него. Автор ближе к повествователю, а рассказчик – к герою.
73420. Художественная речь. Поэтический язык 38.5 KB
  На такие вопросы как чем вызывается эстетический эффект чем обусловлена художественность речи пытаются ответить теоретики начиная с античности. Русская литературная теория занимается вопросом художественной речи чем обусловлена эта художественность.
73421. Традиционная теория художественной речи. Стилистика 36.5 KB
  Стилистика Занимается изучением художественной речи (поэтического языка). Рассматривает архаизмы, неологизмы, варваризмы и т.д. Но потом начинаются значительные изменения, связанные с тем, что менялась литература. Литература 19 в. оказывалась очень далекой от Античных схем.
73422. Дорожні огорожі 462 KB
  На небезпечних ділянках доріг з метою запобігання виїзду автомобілів за межі земляного полотна встановлюють спеціальні дорожні огородження мал. Розташування однобічних і двосторонніх утримуючих огороджень бічних і фронтальних для автомобілів: 1 узбіччя; 2 бічне однобічне огородження...
73423. Дорожні знаки як технічні засоби організації дорожнього руху 36 KB
  Дорожні знаки ставляться до технічних засобів організації дорожнього руху і є обов’язковою приналежністю всіх доріг і вулиць населених пунктів. Усі дорожні знаки діляться на вісім груп: попереджуючі знаки; знаки пріоритету; заборонні знаки; знаки що пропонують...