Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы.doc
Скачиваний:
60
Добавлен:
07.03.2016
Размер:
3.6 Mб
Скачать

12.2. Масиви структур

Припустимо, що ви працюєте в компанії замовлення поштою, яка продає дисководи. Перед вами стоїть задача написати програму для обліку 25 видів пристроїв. По дисководу є наступна інформація:

  • місткість пристрою;

  • час доступу в мілісекундах;

  • код постачальника;

  • ціна.

Дані зручно розмістити в масиві структур

struct inf_d

{

long int ob;

int vr;

int kod;

double cena;

} drive[25];

або окремим рядком:

inf_d drive[25];

Структури зручно записувати на диск

Приклад:

#include <iostream>

using namespace std;

#include <conio.h>

struct inf_d //Глобальне визначення

{

long int ob;

int vr;

int kod;

double cena;

};

inf_d v_dan()

{

inf_d disk;

cin >> disk.ob;

cin >> disk.vr;

cin >> disk.kod;

cin >> disk.cena;

return disk;

}

void menu()

{

system("cls"); // Очищення екрану

cout << "1. введення даних про дисковод\n";

cout << "2. Відображення даних\n";

cout << "3. Вихід\n";

}

void pros(inf_d disk[25], int num)

{

for(int ctr = 0; ctr < num; ctr++)

{

cout <<"\n" << disk[ctr].ob ;

cout <<"\n" << disk[ctr].vr;

cout <<"\n" << disk[ctr].kod;

cout <<"\n" << disk[ctr].cena<<"\n";

}

getch();

}

void main ()

{

inf_d disk[25];

int ans;

int num = 0;

do

{

do

{

menu();

cin >> ans;

} while ((ans < 1) || (ans>3));

switch(ans)

{

case 1:

disk[num] = v_dan();

num++;

break;

case 2:

pros(disk,num);

break;

default:

break;

}

}

while(ans!=3);

}

У даному прикладі для очищення екрану використовується системна функція system з параметром "cls" (system("cls")). Для очікування введення клавіші <Enter> у режимі перегляду даних використовується функція getch. Ця функція знаходиться у заголовному файлі <conio.h>.

12.3. Використання масивів, як елементів структур

Дано структури платіжних відомостей:

struct pl

{

char name[25]; //ім’я службовця

char otd[10]; //назва відділу

double zar; //зарплата

} mas_pl[100];

Припустимо необхідно записати в символьну змінну ініціал ім’я 25-го службовця:

char iniz;

iniz = pl[24].name[0];

Якщо необхідно змінити ім’я службовця, тоді:

strcpy(pl[24].name, "Іван Петрович");

Приклад. Книгарня створює каталог книг.

#include <iostream>

using namespace std;

#include <conio.h>

struct inven

{

char title[25]; //заголовок

char pub[19]; //Дата публікації

char avt[20]; //Ім’я автора

float cena;

};

void main()

{

inven kn[100];

int total = 0;

char ans;

do //введення даних

{

cin>>kn[total].title;

cin>>kn[total].pub;

cin>>kn[total].avt;

cin >> kn[total].cena;

cout << "\nБудете вводити? (Y/N) ";

ans = getch();

ans = toupper(ans);

if(ans == 'Y')

{

total++;

cout<<"Y\n";

continue;

}

}

while(ans != 'N');

}

Приклад запису на диск масиву структур:

Така функція може бути частиною великої програми, що одержує дані досліджень у масив структур від користувача. Дана функція приймає ім’я масиву та число елементів. Функція write записує масив на диск.

#include <iostream>

using namespace std;

ofstream fp;

struct inv

{

char title[25]; //заголовок

char pub[19]; //Дата публікації

char avt[20]; //Ім’я автора

float cena;

};

void write (struct inv m[], int kol)

{

fp.write(m, kol*sizeof(struct inv));

}

Якщо масив із даними досліджень має 1000 елементів, дана функція буде все одно записувати їх за один раз. Крім того, можна використовувати функцію read(), щоб зчитувати вміст масиву за один виклик функції.

Слід сказати, що при роботі в консольному режимі виникають проблеми з кодуванням символів. З цією метою у приведеному прикладі запропоновано функцію recode(), яка переводить символьні данні з таблиці кодування Windows у DOS. Крім того, за допомогою функції IsNumeric() передбачено контроль введення числових даних ( false(0) – контроль цілих значень, true(1)–дробових). Якщо введено число – функція повертає значення true, якщо ні – false.

УВАГА!!! Необхідно звернути увагу на наступні моменти програми:

1. У програму додані дві функції, які стосуються виведення даних: функція очищення екрану cls та функція переходу на будь-який рядок GotoXY. Для роботи з консольними функціями необхідно включити хайдер <windows.h> до програми. Приведемо текст цих двох функцій:

void cls()

{

system("cls");

}

void GotoXY(int X, int Y)

{

COORD coord = { X, Y };

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

}

2. З метою коректного введення та контролю даних використовується функція gets. Функцію потокового введення cin використовувати недоцільно, так як немає контролю натискання клавіші <Enter>.