Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МЕТОДИЧКА_С++_Ч2

.pdf
Скачиваний:
49
Добавлен:
15.02.2015
Размер:
876 Кб
Скачать

наступні функції: функцію ініціалізація масиву структур; функцію вибора користувача; функцію введення інформації в базу даних; функцію пошуку вільних ділянок в пам'яті; функцію видалення елементу із списку: функцію виведення бази даних на екран (можна додавати свої функції).

Таблиця 10.1. Варіанти індивідуальних завдань.

Варіант завдання

Завдання

 

Побудувати базу даних "Людина": прізвище; ім’я; стать; дата народження

1(рік, місяць, число); номер телефона; домашня адреса.

Побудувати базу даних "Студент": прізвище; ім’я; по-батькові; група; стать;

2дата народження (рік, місяць, число); домашня адреса.

Побудувати базу даних "Покупець": прізвище; ім’я; по-батькові; місто;

3вулиця; номер будинку; номер квартири; номер кредитної картки або номер рахунку.

Побудувати базу даних "Спортивна команда": назва; з якого міста; скільки

4ігор зіграла; скільки набрала балів (програла, виграла, нічия); кількість гравців.

Побудувати базу даних "Пацієнт": прізвище; ім'я; рік народження; номер

5телефону; домашня адреса (поштовий індекс, країна, область, район, місто, вулиця, будинок, квартира).

Побудувати базу даних "Стадіон": назва; види спорту; рік споруди; адреса;

6місткість (глядачів); кількість арен, майданчиків.

7

Побудувати

базу

даних

"Власник автомобіля": ім'я; номер автомобіля;

номер техпаспорта; дата народження; телефон; відділення реєстрації ДАІ.

 

Побудувати

базу

даних

"Автомобіль": марка; колір; серійний номер;

8реєстраційний номер; кількість дверей; рік випуску; ціна.

Побудувати базу даних "Фільм": назва; режисер (прізвище, ім'я); країна; рік

9випуску; вартість (витрати на випуск); дохід.

Побудувати базу даних "Музичний товар": носій (аудіокасета, лазерний

10диск); порядковий номер в каталозі; назва; виконавець (прізвище, ім'я); час звучання; кількість творів; ціна по каталогу.

Побудувати базу даних "Альбом вокально-інструментальної групи": назва

11групи; назва альбому; кількість пісень на диску/касеті; рік випуску альбому; фірма-виробник.

Побудувати базу даних "Держава": назва країни; столиця; державна мова;

12населення (число жителів); площа території; грошова одиниця; курс валюти відносно гривни (долара).

41

Приклад виконання роботи:

Завдання: Написати програму, з використанням структур для побудови бази даних інвентаризації, що використовує масив структур для зберігання інвентарної інформації («Товар»: ім’я елементу, вартість, кількість товару).

Розробка текста програми

#include<iostream.h>

#include<stdlib.h>

#include<conio.h> #define MAX 100 struct inv {

char item[30];//ім’я елементу float cost; //вартість

int on_hand; //кількість товару

} inv_info[MAX];

void init_list(void),list(void),del(void); void enter(void);

int menu_select(void),find_free(void); int main(void) {

char choice;

init_list(); // inicializaciya massiva struktur for(;;) {

choice = menu_select() ; switch(choice) {

case 1: enter(); break; case 2: del(); break; case 3: list(); break;

case 4: getch(); return 0; } } }

// funkciya inicializacii masiva struktur void init_list(void){

int t;

for(t=0; t<MAX; ++t) inv_info[t].item[0] = '\0'; } //funkciya vvoda vibora polzovatelya

int menu_select(void){ char s[80];

int c; cout<<"\n";

cout<<"l. Enter an item\n"; cout<<"2. Remove an item\n"; cout<<"3. List the inventory\n"; cout<<"4. Quit\n";

do {

cout<<"\nEnter your choice: "; cin>>s ;

c = atoi(s); }

42

while(c<0 || c>4) ; return c; }

//funkciya vvoda inventarnoy informacii void enter(void){

int slot;

slot = find_free(); if(slot == -1) { cout<<"\nList Full"; return; } cout<<"Enter item: ";

cin>>inv_info[slot].item; cout<<"Enter cost: "; cin>>inv_info[slot].cost; cout<<"Enter number on hand: "; cin>>inv_info[slot].on_hand; }

//vozvrat indeksa pervogo neispolzuemogo uchastka massiva //ili -1 esli svobodnih uchstkov net

int find_free(void) { int t;

for(t=0; inv_info[t].item[0] && t<MAX; ++t) ; if(t == MAX) return -1; /* no slots free */

return t; }

//funkciya udaleniya elementa iz spiska void del(void){

int slot; char s[80];

cout<<"enter record #: "; cin>>s ;

slot = atoi (s) ;

if (slot >= 0 && slot < MAX) inv_info[slot].item[0] = '\0';

}

// funkciya vivoda spiska na ekran void list (void){

int t;

for(t=0; t<MAX; ++t) { if(inv_info[t].item[0]) {

cout<<"Item: "<<inv_info[t].item<<endl; cout<<"Cost: "<<inv_info[t].cost<<endl;

cout<<"On hand: "<<inv_info[t].on_hand<<"\n\n"; } } cout<<"\n";

}

43

Контрольні питання

1.Що таке структури і де використовуються?

2.Який формат опису структурного типу?

3.Яким чиною відбувається звернення до елементів (полів) структурної величини ?

4.Як ініціалізуються структури?

5.Що таке масиви структур і для яких цілей використовуються?

6.Що таке об’єднання і який формат оголошення?

44

Практична робота №11

Тема: Обробка файлових структур даних в мові С++.

Мета роботи: Оволодіння навичками алгоритмізації і програмування файлових структур даних; проектування структури файла,

виведення даних в файл, читання даних з файлу.

Теоретичні відомості

Потокове введення-виведення в стандарті С

Під введенням-виведенням в програмуванні розуміється процес обміну інформацією між оперативною пам'яттю і зовнішніми пристроями: клавіатурою,

дисплеєм, магнітними накопичувачами і т. п.

Введення — це занесення інформації із зовнішніх пристроїв в оперативну пам'ять, а виведення — винесення інформації з оперативної пам'яті на зовнішні пристрої. Такі пристрої, як дисплей і принтер, призначені тільки для виводу;

клавіатура — пристрій введення. Магнітні накопичувачі (диски, стрічки)

використовуються як для введення, так і для виведення.

Основним поняттям, пов'язаним з інформацією на зовнішніх пристроях ЕОМ, є

поняття файлу. Всяка операція введення-виведення трактується як операція обміну з файлами: введення — це читання з файлу в оперативну пам'ять; виведення — запис інформації з оперативної пам'яті у файл. Тому питання про організацію в мові програмування введення-виведення зводиться до питання про організацію роботи з файлами.

Пригадаємо, що в Паскалі ми використовували уявлення про внутрішній і зовнішній файл. Внутрішній файл — це змінна файлового типу, що є структурованою величиною. Елементи файлової змінної можуть мати різний тип і,

відповідно, різну довжину і форму внутрішнього уявлення. Внутрішній файл зв'язується із зовнішнім (фізичним) файлом за допомогою стандартної процедури

Assign.

Один елемент файлової змінної стає окремим записом в зовнішньому файлі і може бути прочитаний або записаний за допомогою однієї команди. Спроба

45

записати у файл або прочитати з нього величину, яка не співпадає за типом з типом елементів файлу, призводить до помилки.

Аналогом поняття внутрішнього файлу в мовах С/С++ є поняття потоку.

Відмінність від файлової змінної Паскаля полягає в тому, що потоку в С не ставиться у відповідність тип. Потік це байтова послідовність, яка передається в процесі введення-виведення.

Потік повинен бути пов'язаний з яким-небудь зовнішнім пристроєм або файлом на диску. У термінології С це звучить так: потік повинен бути направлений на якийсь пристрій або файл.

Основні відмінності файлів в С полягають в наступному: тут відсутнє поняття типу файлу і, отже, фіксованої структури запису файлу. Будь-який файл розглядається як байтова послідовність:

Байт 0 Байт 1 Байт 2 …

EOF

Стрілкою позначений вказівник файлу, що визначає поточний байт файлу. EOF

є стандартною константою — ознакою кінця файлу.

Існують стандартні потоки і потоки, що оголошуються в програмі. Останні зазвичай зв'язуються з файлами на диску, що створюються програмістом.

Стандартні потоки призначаються і відкриваються системою автоматично. З

початком роботи будь-якої програми відкриваються 5 стандартних потоків, з яких основними є наступні:

stdin — потік стандартного введення (зазвичай зв’язаний з клавіатурою);

stdout — потік стандартного виведення (зазвичай зв’язаний з дисплеєм);

stderr — виведення повідомлень про помилки (зв’язаний з дисплеєм).

Окрім цього, відкривається потік для стандартного друку і додатковий потік для послідовного порту.

Працюючи раніше з програмами на С, використовуючи функції введення з клавіатури і виведення на екран, ми вже неявно мали справу з першими двома потоками. А повідомлення про помилки, які система виводила на екран, відносилися до третього стандартного потоку. Потік для роботи з дисковим файлом повинен бути відкритий в програмі.

46

Робота з файлами на диску (відкриття та закриття файлів).

Робота з дисковим файлом починається з оголошення вказівника на потік.

Формат такого оголошення:

FILE *ім’я_вказівника;

Наприклад:

FILE *fp;

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

(індикатор) поточної позиції в потоці і т.д.

Наступний крок — відкриття потоку, яке проводиться за допомогою стандартної функції fopen(). Ця функція повертає конкретне значення для покажчика на потік і тому її значення привласнюється оголошеному раніше покажчику. Відповідний оператор має формат:

Ім’я_вказівника=fopen(ім’я_файлу, режим_відкриття);

Параметри функції fopen() є рядками, які можуть бути як константами, так і вказівниками на символьні масиви.

Наприклад:

fp=fopen("test.dat","r");

Тут test.dat — це ім'я фізичного файлу в поточному каталозі диска, з яким тепер буде зв'язаний потік з вказівником . Параметр режиму r означає, що файл відкритий для читання. Що стосується термінології, то допустимо вживати як вираз

«відкриття потоку», так і вираз «відкриття файлу».

Існують наступні режими відкриття потоку і відповідні їм параметри:

Параметр

Режим

r

відкрити для читання

w

створити для запису

авідкрити для додавання

r+

відкрити для читання і запису

w+

створити для читання і запису

а+

відкрити для додавання або створити для читання і

 

запису

47

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

Потік може бути відкритий або для текстового, або для двійкового (бінарного)

режиму обміну.

Текстовий файл - це послідовність символів, яка ділиться на рядки спеціальними кодами, — повернення каретки (код 13) і переведення рядка (код 10).

Якщо файл відкритий в текстовому режимі, то при читанні з такого файлу комбінація символів «повернення каретки — переведення рядка» перетвориться в один символ \n — перехід до нового рядка.

При записі у файл здійснюється зворотнє перетворення. При роботі з двійковим файлом ніяких перетворень символів не відбувається, тобто інформація переноситься без всяких змін.

Вказані вище параметри режимів відкривають текстові файли. Якщо потрібно вказати на двійковий файл, то до параметра додається буква b. Наприклад: rb, або wb, або r+b. У деяких компіляторах текстовий режим обміну позначається буквою t, тобто записується a+t або rt.

Якщо при відкритті потоку з якої-небудь причини виникла помилка, то функція fopen() повертає значення константи NULL. Ця константа також визначена у файлі stdio.h. Помилка може виникнути через відсутність файлу, що відкривається, на диску, забраком (нехватки) місця в динамічній пам'яті і т.п. Тому бажано контролювати правильність проходження процедури відкриття файлу.

Рекомендується наступний спосіб відкриття:

FILE *fp; if(fp=fopen("test.dat","r")==NULL { puts("He можу відкрити файл\n");

return;

}

У разі помилки програма завершить виконання із закриттям всіх раніше відкритих файлів.

48

Закриття потоку (файлу) здійснює функція fclose(), прототип якої має вигляд:

int fclose(FILE *fptr);

Тут fptr позначає формальне ім'я вказівника на потік, що закривається.

Функція повертає нуль, якщо операція закриття пройшла успішно. Інша величина означає помилку.

Запис та зчитування символів, цифр, блоків даних.

Запис символів в потік проводиться функцією putc() з прототипом

int putc(int ch, FILE *fptr);

Якщо операція пройшла успішно, то повертається записаний символ. У разі

помилки повертається константа EOF.

Зчитування символу з потоку, відкритого для читання, проводиться функцією

gets() з прототипом

int gets(FILE *fptr);

Функція повертає значення зчитаного з файлу символу. Якщо досягнутий кінець файлу, то повертається значення EOF. Відмітимо, що це відбувається лише в результаті читання коду EOF.

Історично склалося так, що gets() повертає значення типу int. Tе ж саме можна сказати і про аргумент ch в описі функції puts() . Використовується ж в обох випадках тільки молодший байт. Тому обмін при зверненні може відбуватися і із змінними типу char.

Приклад 11.1. Складемо програму запису у файл символьної послідовності, що вводиться з клавіатури. Хай ознакою завершення введення буде символ *.

//Запис символів в файл

#include <stdio.h> void main() { FILE *fp;

char c; if((fp=fopen("test.dat","w"))==NULL)

{

puts("He могу открыть файл!\n"); return; }

puts("Вводите символы. Признак конца - *"); while((c=getchar())!='*')

49

putc(c,fp); fclose(fp); }

В результаті на диску (у каталозі, який визначає система) буде створено файл з ім'ям test.dat, який заповниться символами, які вводяться. Символ * у файл не

запишеться.

Приклад 11.2. Файл, створений в результаті роботи попередньої програми, потрібно послідовно прочитати і вміст вивести на екран.

//Читання символів з файлу

#include <stdio.h> #include <conio.h> void main () { FILE *fp;

char c; clrscr () ;

if((fp=fopen("test.dat","r"))==NULL) {puts("He вдалося відкрити файл!\n"); return;}

while((c=getc(fp)) !=EOF) putchar(c) ;

getch(); fclose(fp); }

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

Запис і читання цілих чисел. Запис цілих чисел в потік без перетворення їх в символьну форму проводиться функцією putw() з прототипом

int putw(int,FILE *fptr);

Якщо операція пройшла успішно, то повертається записане число. У разі помилки повертається константа EOF.

Зчитування цілого числа з потоку, відкритого для читання, проводиться функцією getw() з прототипом

int getw(FILE *fptr);

Функція повертає значення зчитаного з файлу числа. Якщо прочитаний кінець файлу, то повертається значення EOF.

50