Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Вкладені структури.

Інколи необхідно створити структури, яка містить іншу (вкладену) структуру. Складемо програму-“облік друзів”.

#include <iostream.h>

#define l 20

struct names{ /*перший шаблон*/

char im[l];

char prizv[l];

};

struct harakter { /*другий шаблон*/

struct names druzi; /*вкладена структура*/

char bludo[l];

char robota[l];

float zarob;

};

main()

{

struct harakter x1{ /*ініціалізація змінної*/

{“Іван” ,“Петренко”}, “вареники”, “інженер”,30250.00

};

сout<<x1.druzi.im;

сout<< x1.druzi.prizv;

сout<< x1.robota;

сout<< x1.bludo;

сout<< x1.zarob;

return 0;

}

 

Доступ до елементів вкладених структур здійснюється так: спочатку записується назва зовнішньої структури, потім внутрішньої, а тоді вказуємо поле.


3. Вказівники на структури.

Існує, принаймні, три причини використання вказівників на структури:

- вказівниками легче керувати;

- структура не може передаватись функції в якості аргумента, але це можливо для вказівника;

- в деяких оголошеннях даних використовуються структури, які містять вказівники на інші структури.

Оголошення вказівника на структуру:

struct book *dn;

Спочатку йде службове слово struct ,потім назва структури book , зірочка і ім’я вказівника. Це оголошення не створює нову структуру, але дозволяє використовувати вказівник dn для позначення будь-якої існуючої структури типу book.

Вказівник ініціалізується таким чином, що вказує на структуру.

dn=&x1;

 

Розглянемо приклад:

#include <iostream.h>

#define l 20

 

struct names{ /*перший шаблон*/

char im[l];

char prizv[l];

};

struct harakter { /*другий шаблон*/

struct names druzi; /*вкладена структура*/

char bludo[l];

char robota[l];

float zarob;

};

main()

{

struct harakter x1[2]{{ /*ініціалізація змінної*/

{“Іван” ,“Петренко”}, “вареники”, “інженер”,30250.00},

{“Петро”,”Іващенко”},”борщ”,”лікар”,40325.00}};

struct harakter *x2;

x2=&x1[0]; /*вказує на структуру*/

cout<<“заробіток:\n”<<x2->zarob);

x2++; /*вказує на наступну структуру*/

cout<<“заробіток:\n”<<(*x2).zarob);

cout<<“улюблена страва n”<<x2->druzi.prizv<<x2->bludo);

return 0;}

 

Вказівник х2 вказує на елемент х1[0].Можна використати цей вказівник для отримання значення елемента х1[0].

1.за допомогою нової операції ->.Ця операція ск ладається з дефіса(-) і символа “більше”(>). Іншими словами, вказівник структури з операцією -> має такий самий зміст, які ім’я структури, після якого застосовується операція “крапка”.

2.якщо х2= =&x1[0],то і *x2= =x1[0], оскільки & і * є еквівалентними операціями. Тому можлива заміна

х1[0].zarob= =(*x2).zarob

Дужки необхідні, оскільки приоритет операції “крапка” вище, ніж приоритет операції “зірочка”.

Приклад. Створити та вивести на екран базу даних з 5 студентів. Полями кожного студента є: прізвище; ім’я; день, місяць та рік народження, адреса (дані вводяться з клавіатури)

#include<iostream.h>

#include<conio.h>

struct person

{

char fam[15],name[15];

int day,month,year;

char address[50];

};

//-----------------------------------------

void input(person *stud, int n)

{

for (int i=0;i<n;i++)

{

cout<<"\tЗапис "<<i+1<<":\n";

cout<<"Прiзвище - ";cin>>stud[i].fam;

cout<<"Iм'я - "; cin>>stud[i].name;

cout<<"День народж. - "; cin>>stud[i].day;

cout<<"Мiсяць - "; cin>>stud[i].month;

cout<<"Рiк - "; cin>>stud[i].year;

cout<<"Адреса - "; cin>>stud[i].address;

}

}

//-----------------------------------------

void output(person *stud, int n)

{

for (int i=0;i<n;i++)

{

cout<<"\tЗапис "<<i+1<<":\n";

cout<<stud[i].fam<<" "

<<stud[i].name<<"\t"

<<stud[i].day<<"."

<<stud[i].month<<"."

<<stud[i].year<<"\t"

<<stud[i].address<<endl;

}

}

//-----------------------------------------

void main()

{

clrscr();

person *student = new person[5];

input(student,5);

output(student,5);

delete [ ]student;

getch();

}

 


Тема. Об’єднання. Робота з елементами об’єднань.

План.

1. Об’єднання.

2. Робота з елементами об’єднань.

 

Опис об'єднань у мові C++ нагадує опис структур, але їхнє призначення інше. Об'єднання слугу­ють для зберігання (послідовного, не одночасного) в деякій ділянці оперативної пам'яті комп'ютера даних різних типів. Потреба в цьому виникає, наприклад, під час створення таб­лиці з даними різних типів. Об'єднання можна описати так:

union <назва типу об'єднання>

{

<тип поля 1> <назва поля 1>;

<тип поля п> <назва поля п>;

}

Усі правила, які розглядалися для опису та використання структур, діють і для об'єднань.

Іншими словами, об'єднання - це змінна, яка може містити (в різні моменти часу) об'єкти різних типів і розмірів. Всі вимоги щодо розмірів і вирівнювання виконує компілятор. Об'єднання дозволяють берегти різнорідні дані в одній і тій же області пам'яті без включення в програму машинно-залежної інформації. Ці засоби аналогічні варіантним записам в Паскалі. Прикладом використовування об'єднань міг би послужити сам компілятор, завідуючий таблицею символів, якщо припустити, що константа може мати тип int, float або бути покажчиком на символ і мати тип char *. Значення кожної конкретної константи повинне зберігатися в змінній відповідного цій константі типу. Працювати з таблицею символів завжди зручніше, якщо значення займають однакову за об'ємом пам'ять і запам'ятовуються в одному і тому ж місці незалежно від свого типу. Мета введення в програму об'єднання - мати змінну, яка б на законних підставах берегла в собі значення декількох типів. Наведемо приклад об'єднання.

union u_tag {

int ival;

float fval;

char *sval;

} u;

Змінна u буде достатньо великої, щоб в ній помістилася будь-яка змінна з вказаних трьох типів: точний її розмір залежить від реалізації. Значення одного з цих трьох типів може бути присвоєно змінній u і далі використано у виразах, якщо це правомірно, тобто якщо тип узятого нею значення співпадає з типом останнього присвоєного їй значення. В тому випадку, якщо щось запам'ятало як значення одного типу, а витягується як значення іншого типу, результат залежить від реалізації.

Об'єднання можуть входити в структури і масиви, і навпаки. Запис доступу до елемента об'єднання, що знаходиться в структурі

(як і структури, що знаходиться в об'єднанні), така ж, як і для вкладених структур. Наприклад, в масиві структур

struct {

char *name;

int flags;

int utype;

union {

int ival;

float fval;

char *sval;

} u;

} symtab[NSYM];

до ival звертаються таким чином: symtab[i].u.ival

а до першого символу рядка sval можна звернутися будь-яким з наступних двох способів:

*symtab[i].u.sval

або symtab[i].u.sval[0]

Фактично об'єднання - це структура, всі елементи якої мають нульовий зсув щодо її базової адреси і розмір якої дозволяє поміститися в ній найбільшому її елементу а вирівнювання цієї структури задовольняє всім типам об'єднання. Операції, застосовні до структур, годяться і для об'єднань, тобто законні присвоєння об'єднання і копіювання його як єдиного цілого узяття адреси від об'єднання і доступ до окремих його елементів.

 

2. Робота з елементами об’єднань.

Розглянемо приклад.Для участі у конференції потрібно заповнити заявку: прізвище, ім'я, адресу, а також зазначати, чи треба бронювати номер у готелі. Якщо житло непотрібне, то записати свій контактний телефон, інакше -зазначити назву готелю. Створити програму, яка б давала змогу ввести отримані дані у базу даних конференції.

// Конференція

#include <iostream.h>

#include <conio.h>

union gotel_tel

{

char gotel[20];

char tel[7];

};

struct konfer

{

char name[15], surname[15], adres[15];

int br; // 1 - треба бронювати номер, 2 - ні

gotel_tel bron;

};

void main()

{

intn = 1;

konfer z;

while (n== 1)

{

cout<<"\n Введіть прізвище, ім'я та адресу\n";

сіn>>z.name >>>z.surname >> z.adres;

cout<<"\n Треба житло? 1 - так, 0 - ні";

сіn>>z.br;

if (z.br)

{

cout << "\n Уведіть назву готелю\п";

сіп>> z.bron.gotel;

}

else

{

cout<<"\n Уведіть номер телефону\n";

сіn>> z.bron.tel;

}

cout<<"\n Наступна заявка? 1 - так, 0 - ні";

сіn >>n;

}

}


Тема. Списки , стеки та черги в мові С++.

План.

1. Поняття про список.

2. Стек.

3. Черги.

 

1. Поняття про список.

Розглянемо структуру даних - однонаправлений (однозв'язаний) список. Список - це скінче­ний набір даних одного типу, між якими налагоджено зв'язок. Елемент однонаправленого списку складається з двох частин: самого даного (часто складеного) та вказівника на наступний елемент списку. Для опису списку використовують тип даних структура і вказівник, а саме:

struct <назва типу списку?

{

<тип поля 1> <назва поля 1>;

<тип поля п> <назва поля п>;

<тип вказівника> *<назва типу списку>;

};

<назва типу списку> *<назва вказівника 1>

*<назва вказівника п>;

 

Приклад. Створимо структуру про річку (rika), яка міс­тить поля: назва, довжина річки у кілометрах та площа ба­сейну у квадратних кілометрах, і поставимо їй у відповідність елементи списку:

struct rika // Створюємо тип rika

(

char nazva[12];

int dov;

long int pi;

rika *dali; // Створюємо поле вказівник на тип rika

}; rika 'element, 'pershij, *poperednij, *novyj;

Тут element - вказівник (тип структура rika) на поточний еле­мент списку, element -> dov - динамічна змінна цілого типу (int),

яка містить значення довжини річки, a element -> dali - вказівник на наступний елемент списку. Звідси випливає, що element-> dali -> dov - це довжина наступної річки, a element -> dali -> dali -вказівник на ще наступну річку і т.д.

Приклад.Створити список, який містить ін­формацію про річки. Вивести цей список на екран. Додати на початок списку новий запис. Вивести список зі змінами.

Щоб увести дані про всі річки, можна використати тип даних - масив структур. Вважатимемо, що кількість річок, про які необхідно ввести інформацію, невідома, тому звичай­ний масив використати не можна. Навіть якщо кількість да­них відома, то працювати з таким масивом не раціонально. Адже щоб вставити в середину масиву новий елемент, потріб­но зміщувати "хвіст масиву" праворуч. Щоб уникнути цього, застосовують список.

Програма Список рік розв'язує поставлену задачу і демонст­рує основні прийоми опрацювання списку. Елементи списку опрацьовують один за одним за допомогою команд циклу. Спочатку створюють список і вводять із клавіатури в нього дані. Щоб завершити введення даних, домовимося ввести нулі для значень назви, довжини та площі басейну річки. Після завершення введення буде створено зайвий (останній) елемент списку (з нулями). Його слід пізніше ліквідувати, заздалегідь оголосивши ще один вказівник (на попередній елемент спис­ку) і прийнявши poperednij -> dali = NULL. Суттєва перевага спис­ків у тому, що вилучити зафіксований (тобто вибраний відпо­відно до деякої умови) елемент можна за допомогою одної ко­манди переадресації вигляду poperednij -> dali = zafix -> dali.

Виводимо список на екран. Створюємо новий елемент спис­ку і вводимо в його поля дані. Новий елемент зробимо першим у списку. Суттєва перевага списку над масивом і в цьому разі: щоб вставити новий елемент після зафіксованого, потрібно лише дві команди переадресації і жодної "брудної роботи з хвостом". Вказівник нового елемента переадресовуємо туди, куди вказував вказівник зафіксовано елемента, а вказівник зафіксованого елемента "втикаємо" в новий елемент:

novyj->dali = zafix->dali; zafix->dali = novyj;

// Список рік

#include <iostream.h>

#include <conio.h>

struct rika // Створюємо тип rika

{

char nazva[12];

int dov;

longintpl;

rika *dali; // Створюємо поле вказівник типу rika

};

rika *element, *pershij, *poperednij, *novyj;

void StvorytySpysok(void); // Функція створення списку

void VyvestyNaEkran(void); // Функція виведення списку на екран

void StvorytyNjvyjElement(void); // Функція створення нового елемента void main() {

cout<<"Створення списку\п"

cout << "Для закінчення введіть усі нулі\п";

StvorytySpysok();

VyvestyNaEkran();

StvorytyNjvyjElement();

// Додаємо до початку списку новий елемент

element = pershij;

novyj -> dali = element;

pershij = novyj;

cout « "Новий список \п";

VyvestyNaEkran();

}

//--------------------------------------------------------------------------------------

void StvorytySpysok(void)

{

element = new (rika);

pershij = element;

do

{

poperednij = element;

cout<<"Уведіть назву, довжину та площу річки\п"; сіп » element -> nazva;

сіn>>element -> dov;

сіn>>element-> pi;

element-> dali = new (rika); :

element = element-> dali; .

}

while (poperednij-> dov != 0 II poperednij-> pi != 0); poperednij-> dali = NULL;

}

//------------------------------------------------------------------------------------------

void VyvestyNaEkran(void)

{

cout<<"Створено такий список:\n";

element = pershij;

while (element != NULL)

{

сout<<element -> nazva<<"\t"<<

element -> dov<<"\t" <<element -> pi<<"\n";

element = element -> dali;

//----------------------------------------------------------------------------------------

void StvorytyNjvyjElement(vold)

{

novyj = new (rika);

cout<<"Уведіть назву, довжину та площу нової річки\п";

сіn>>novyj -> nazva >>novyj -> dov>>novyj -> pi;

}

 

Cтек.

Стек - це структура даних, у якій еле­мент, записаний останнім, зчитують (він доступний для опра­цювання) першим. Принцип "останній прийшов - перший пі­шов" використовується в багатьох технічних пристроях і в побуті: ріжок від автомата; посадка пасажирів у вагон, який має лише одні двері тощо. Стек використовують у програму­ванні, зокрема, для реалізації рекурсії. Рекурсія виконується так: спочатку всі виклики нагромаджуються (аналогія така: пружина стискається), а потім виконуються вкладені функції (пружина розпрямляється).

Стек описують і створюють у пам'яті за допомогою типу даних структура. Над елементами стека визначені лише дві операції: занесення елемента у стек та вилучення елемента зі стека. У стеку завжди доступний є лише верхній елемент, який називають вершиною стека. Розглянемо типову задачу роботи зі стеком.

Приклад. Ввести послідовність символів, де крапка (".") є ознакою закінчення введення. Вивести введе­ні символи на екран у зворотному порядку.

Розв'яжемо цю задачу із застосуванням стека (stack), який містить такі поля: символ (ch), вказівник на наступний еле­мент стека (dali).

#include <iostream.h> // Програма Стек

#include <conio.h>

struct stack // Оголошення типу stack

(

char ch;

stack *dali;

};

stack *st, 'element;

void StvorytyStek(stack *st);

void VyluchenniaZiSteku(stack *st);

void main()

{

st = NULL;

StvorytyStek(st);

VyluchenniaZiSteku(st);

}

//--------------------------------------------------------------------------------------------

void StvorytyStek(stack *st)

{

char a;

do // Bводимо дані у стек

{ // Зчитуємо символ, введений з клавіатури

а = getch();

element = new (stack); // Виділяємо місце для нового елемента

element -> dali = st; // Перенаправляємо вказівники

st = element;

element -> ch = a;

}

while (a != '.'); // Поки не введена крапка

//--------------------------------------------------------------------------------------------

void VyluchenniaZiSteku(stack *st)

{ // Вилучення елементів зі стека та

do // виведення їх на екран

{

st = element -> dali;

element = st;

cout<< st -> ch;

}

while (st-> dali != NULL);

}


Читайте також:

  1. Вкладені запити.
  2. Вкладені цикли
  3. Вкладені цикли.
  4. ВНУТРІШНЬОКЛІТИННІ СТРУКТУРИ.
  5. Господарський комплекс національної економіки: основи формування та особливості структури.
  6. Загальні засади теорії портфеля цінних паперів та оптимізація його структури.
  7. Заголовок – назва словесного твору, яка відображає його основну ідею і є важливим елементом його структури.
  8. Закономірності, які розкривають характеристику функціонування і розвит­ку управлінської підструктури.
  9. Залежно від підрозділу, діяльність якого покладена в основу виробничої структури, розрізняють цехову, безцехову, корпусну та комбінатську виробничі структури.
  10. Мережева модель організовує дані у вигляді мережевої структури. Структура називається мережевою, якщо у відносинах між даними породжений елемент має більш одного початкового.
  11. Мистецтво як феномен культури. Генезис мистецтва, формування його видової структури. Поняття про актуальний вид мистецтва




Переглядів: 3427

<== попередня сторінка | наступна сторінка ==>
Масиви структур | Приклад .

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.036 сек.