ТОП 10:

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



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

 

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.h>

#include <stdio.h>

#include <ctype.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 //введення даних

{

gets(kn[total].title);

gets(kn[total].pub);

gets(kn[total].avt);

cin >> kn[total].cena;

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

ans = getch();

ans = toupper(ans);

if(ans == ’Y’)

{

total++;

continue;

}

}

while(ans != ’N’);

}

 

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

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

 

#include <iostream.h>

#include <stdio.h>

#include <ctype.h>

 

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));

return;

}

 

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

 

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

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

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

2. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:

..................................................................................................

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

..................................................................................................

Спочатку встановлюється вказівка у кінець файлу, а потім ділимо поточну позицію файлу (функція tellg()) на кількість байтів нашої структури inf_d. Таким чином отримуємо кількість структур на диску (змінна kol_st).

Після переведення вказівки на кінець файлу (функція eof()) виникає біт помилки ios::eofbit, що дорівнює 1. Для того щоб продовжити роботу з файлом потоку, необхідно скинути цей біт. Робиться це за допомогою функції clear(), яка скидує всі біти помилок файлового потоку.

Приведемо текст програми роботи зі структурами з використанням інформації по дискам.

 

//Програма роботи зі структурами

//з використанням диску

 

# include <iostream.h>

# include <stdio.h>

# include <stdlib.h>

# include <conio.h>

# include <fstream.h>

# include <iomanip.h>

# include <string.h>

 

 

fstream pp;

 

struct inf_d //Визначення структури

{

long int ob; //число оборотів

int vr; //час доступу до диску

long int kod;//код виробу

double cena; //ціна виробу

char firma[20]; //назва фірми

};

 

int menu(void); //Оголошення функцій: меню,

void v_dan(void); //перегляду,

void readst(int nom = 0); //читання структури

int vib_struct(void); // вибір елемента структури

// переведення символів із кодировки Windows у кодировку DOS

char* recode(char *TXT);

// перевірка символів на числа

bool IsNumeric(char *str, bool dr);

 

// Головна функція програми

Void main ()

{

 

int nom_menu;

pp.open("Ot.txt",(ios::in)|(ios::out)

|(ios::app));

 

While(1)

{

clrscr();

nom_menu = menu();

if (nom_menu == 1) v_dan();

if (nom_menu == 2) readst();

if (nom_menu == 3) readst(vib_struct());

if (nom_menu == 4) break;

}

 

pp.close(); //Закриття файла

}

//**************МЕНЮ*********************

 

//Визначення функції меню

Int menu()

{

char s[50];

int nom_menu;

long kol_st;

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

 

while(1)

{

nom_menu = 0;

 

clrscr();

gotoxy(27,4);

cout<<recode("Всего структур ")<<kol_st;

gotoxy(20,6);

cout<< "====================================";

gotoxy(20,7);

cout<<recode("| 1 - Ввод данных по дисководу |");

gotoxy(20,8);

cout<<recode("| 2 - Отображение всех данных |");

gotoxy(20,9);

cout<<recode("| 3 - Просмотр заданной структуры |");

gotoxy(20,10);

cout<<recode("| 4 - Выход |");

gotoxy(20,11);

cout<< "====================================\n";

 

 

gotoxy (27,13);

cout << recode("Введите пункт меню ");

gets(s);

 

if (IsNumeric(s, 0))nom_menu = atoi(s);

if ((nom_menu < 1 )||(nom_menu > 4))

{

gotoxy(18,18);

cout<< "----------------------------------------";

gotoxy(18,19);

cout<<recode("| Ошибка! Пункт меню должен быть 1 - 4 |");

gotoxy(18,20);

cout<<recode("| Нажмите любую клавишу |");

gotoxy(18,21);

cout<< "----------------------------------------";

getch();

gotoxy (44,13);

cout << " ";

continue;

}

return nom_menu;

}

}

 

 

// Функція вибору номера структури

int vib_struct()

{

char s[50];

int nom_st;

long kol_st;

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

 

if(!kol_st)return 0;

 

while(1)

{

nom_st = 0;

clrscr();

 

gotoxy(1,2);

cout<<recode("Введите номер структуры -> ");

gets(s);

if(IsNumeric(s, 0))nom_st=atoi(s);

if(nom_st<1) continue;

if(nom_st<=kol_st)break;

 

gotoxy(18,10);

cout<< "------------------------------------------";

gotoxy(18,11);

cout<<recode("| Внимание!!! |");

 

gotoxy(18,12);

cout<< recode("| В файле нет")<<setw(3)<<nom_st;

cout<<recode("-й структуры |");

 

gotoxy(18,13);

cout<< recode("| Файл содержит только")<<setw(3)<<kol_st;

cout<<recode(" структур(ы) |");

 

gotoxy(18,14);

cout<<recode("| Нажмите любую клавишу |");

gotoxy(18,15);

cout<< "------------------------------------------";

 

getch();

}

 

return nom_st;

}

 

//*****************ВВЕДЕННЯ**********************

 

// Визначення функції введення даних

void v_dan()

{

 

inf_d dis;

int i;

char s[50];

clrscr();

 

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

while(1)

{

gotoxy(1,2+2*i);

if(i==0)cout<<recode("Введите число оборотов диска ->");

if(i==1)cout<<recode("Введите время доступа к диску ->");

if(i==2)cout<<recode("Введите код товара ->");

if(i==3)cout<<recode("Введите цену дисковода ->");

 

gotoxy(35,2+2*i);

gets(s);

if(IsNumeric(s,(i==3)?1:0))

{

if(i==0)dis.ob=atoi(s);

if(i==1)dis.vr=atoi(s);

if(i==2)dis.kod=atoi(s);

if(i==3)dis.cena=atof(s);

break;

}

 

gotoxy(35,2+2*i);

cout<<" ";

}

 

gotoxy(1,10);

cout << recode("Введите название фирмы ->");

 

gotoxy(35,10);

gets(dis.firma);

 

//переведення курсору на кінець файла

pp.seekg(0L,ios::end);

pp.write((char*)&dis,sizeof(dis));//Запис на диск

}

 

//****************ЧИТАННЯ*********************

//Функція читання даних з диску

void readst(int nom_st)

{

inf_d od;

long kol_st, ch_b = 0;

clrscr();

 

pp.seekg(ch_b,ios::end);

 

kol_st = pp.tellg()/sizeof(inf_d);

 

if(!kol_st)

{

gotoxy(18,10);

cout<< "-----------------------------------------";

gotoxy(18,11);

cout<<recode("| Внимание! В файле нет информации |");

gotoxy(18,12);

cout<<recode("| Для ввода используйте пункт 1 меню |");

gotoxy(18,13);

cout<<recode("| Нажмите любую клавишу |");

gotoxy(18,14);

cout<< "-----------------------------------------";

getch();

return;

}

 

 

if(nom_st > 0)ch_b = sizeof(od)*(nom_st-1);

pp.seekg(ch_b,ios::beg);//Відкриття файла

//Читання файла з диска

 

cout<<recode("\n Данные по дискам:\n");

 

while(1)

{

pp.read((char *)&od, sizeof(od));

// Очистка біту помилки (clear()) та вихід з циклу

if(pp.eof()){pp.clear();break;}

cout<<"\n";

cout<<recode(" обороты-")<<setw(3)<<od.ob;

cout<<recode(" время-")<< setw(5)<<od.vr;

cout<<recode(" код-") << setw(3)<<od.kod;

cout<<recode(" цена-")<< setw(7)<<od.cena;

cout<<recode(" фирма- ")<< od.firma;

if(nom_st)break;

}

getch();

}

 

 

// Функція переведення кодировки із Windows у DOS

char* recode(char *TXT)

{

 

static char buf[257];

strcpy(buf,TXT);

 

for(int i=0;i<strlen(buf);i++)

{

if (buf[i]>='А'&&buf[i]<='п')buf[i]-=64;

if (buf[i]>='р'&&buf[i]<='я')buf[i]-=16;

}

 

return buf;

}

 

// Функція перевірки символів на числа

// Вхід:

// str - строка символів;

// dr = false (0) - перевірка на ціле число;

// dr = true (1) - перевірка на дробове число;

// Повертання:

// true - перевірка пройшла успішно

// false - введено не числове значення, або число не задовільняє умовам.

 

Bool

IsNumeric(char *str, bool dr)

{

int i;

if (!strlen(str) || str[0] == '.')return false ;

for (i = 0; i < (int)strlen(str); i++ )

{

if (i == 0 && (str[0] == '+' || str[0] == '-')) continue;

if ((str[i] >= '0' && str[i] <='9') ||

str[i]=='.') continue;

return false;

}

int pos = 0;

for (i = 0; i < (int)strlen(str);i++)

if (str[i]=='.')pos++;

if ( (!dr && pos) || (pos > 1)) return false ;

return true;

}

 

СПИСОК ЛІТЕРАТУРИ

1. Том Сван. Программирование для Windows на Borland C++. - М: Біном, 1996 р. - 480 с.

2. Стивен Поттс, Тиноти С. Монк. Borland C++. (Минск, Попурри, 1996г. - 741 с.

3. Р. Уинер. Язык Турбо С. — М.: Мир, 1991г. - 384 с.

4. Грегори К. Использование Visual C++ 6. Учебное пособие – СПб: К.: Издательский дом "Вильямс", 1999. – 864 с.

5. Секунов Н.Ю. Самоучитель Visual C++ 6. – СПб.: БХВ – Санкт-Петербург, 1999. – 960 с.

 

 







Последнее изменение этой страницы: 2017-02-10; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.231.220.225 (0.021 с.)