Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка С++.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
1 Мб
Скачать
☆

Передача і повернення структур

Припустимо, що вимагається описати положення точки на екрані або конкретного об'єкту на карті відносно деякої початкової точки. Координати точки x і y є декартові (або прямокутні) координати. Можна визначити структуру, що складається з двох координат, які задають позицію точки:

struct rect

{

double x; // відстань від початкової точки по горизонталі

double y; // відстань від початкової точки по вертикалі

};

Другий спосіб описання місцеположення точки за допомогою полярних координат. Це відстань від початку відліку до точки і кут, що задає напрям. Можна оголосити другу структуру, що є таким методом визначення місцеположення точок:

struct polar

{

double distance; // відстань від початкової крапки

double angle; // напрям щодо початкової крапки

};

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

Щоб визначити відстані по горизонтальних і вертикальних координатах, можна скористатися теоремою Піфагора:

distance = sqrt(x*x+y*y);

Функція atan2() з бібліотеки математичних функцій обчислює значення кута по значеннях x і y:

angle = atan2(y, x);

Маючи в розпорядженні ці формули, можна представити шукану функцію в наступному вигляді:

// перетворення прямокутних координат в полярні

polar rect_to_polar(rect xypos) // тип polar

{

polar answer;

answer.distance = sqrt( xypos.x * xypos.x + xypos.y * xypos.y);

answer.angle = atan2(xypos.y, xypos.x);

return answer; // повертає структуру polar

}

Робоче завдання

Завдання 1. Є наступний зразок структури:

struct box

{

float height;

float width;

float length;

float volume;

};

Створіть функцію, яка передає структуру box по значенню і відображає значення кожного елементу.

Завдання 2. Створіть масив структур для зберігання результатів сесії академічної групи. Структура повинна містити наступні поля: прізвище, ім'я, предмети.

Напишіть програму, яка запрошує введення даних про результати сесії для 5 студентів, виводить відповідні дані, а також використовує функції:

1) розрахунку середнього бала з кожної дисципліни;

2)  видачі списку студентів, що одержали позитивні оцінки (4 і 5) з кожної дисципліни;

3)  видачі списку студентів, що не здали екзамен з кожної з дисциплін.

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

Доступ до полів структури, яка є елементом масиву, вимагає нового синтаксису. Наприклад: aks11[i].ball1 посилається на поле ball1 структури, яка є i-тим елементом масиву aks11.

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

  1. Як поводяться структури по відношенню до функцій?

  2. Які особливості передачі структури по значенню?

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

  4. Як здійснюється доступ до полів структур, що є елементами масиву?

  5. Як забезпечити цілісність даних структури, переданої у функцію за посиланням?

Лабораторна робота №13

РОЗРОБКА І ДОСЛІДЖЕННЯ ПРОГРАМ ФАЙЛОВОГО ВВОДУ-ВИВОДУ

Мета роботи: одержати практичні навички в розробці і дослідженні програм з використанням функцій вводу-виводу у мові С (С++).

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

При роботі з файлами необхідно виконати ряд процедур:

- створити файл;

- відкрити файл;

- читати дані з файлу;

- записувати дані у файл;

- позиціонувати файли;

- закрити файл.

Операція відкриття файлу пов'язує потік з певним файлом. Операція закриття – розриває цей зв'язок.

Доступ до файлу, де бережуться дані, здійснюється за допомогою спеціальної файлової змінної. Через цю змінну і ведеться вся робота з файлом в програмі.

Зв'язуючою ланкою між файлом і потоком в системі введення-виведення є покажчик на файл. Покажчик на файл – це покажчик на структуру типа FILE, яка визначена в заголовному файлі stdio.h.

Щоб оголосити покажчик на файл, використовується оператор:

FILE*fptr;

Наприклад:

FILE*F1; де F1 – файлова змінна.

Для роботи з файлами визначені наступні функції (Таблиця 13.1).

Таблиця 13.1 – Функції для роботи з файлами

Функція

Дія функції

fopen()

Відкрити файл

fclose()

Закрити файл

fseek()

Встановити покажчик файлу на вказане місце

feof()

Повертає значення true, якщо досягнутий кінець файлу

ferror()

Повертає значення false, якщо знайдена помилка

fread()

Читає блок даних з файлу

fwrite()

Записує блок даних у файл

rewind()

Встановлює покажчик позиції на початок файлу

remove()

Знищує файл

Функції визначені в заголовному файлі stdlib.h.

Функція fopen() відкриває потік і зв'язує файл на диску з ним.

Прототип функції: FILE*F1;

F1=fopen(char*filename, char*mode);

де:

char*filename – рядок, що містить повне ім'я файлу;

char*mode – рядок, що містить режим файлу, що відкривається.

Можливі режими відкриття файлу:

“r” – відкрити для читання;

“w” – відкрити для запису;

“a” – відкрити для додавання в існуючий файл;

“r+” – відкрити файл для читання і запису;

“w+” – відкрити файл для читання і запису;

“a+” – відкрити для додавання і створити файл для читання і запису;

“rb” – відкрити двійковий файл для читання;

“wb” – відкрити двійковий файл для запису;

“ab” – відкрити двійковий файл для додавання;

“r+b” – відкрити двійковий файл для читання і запису;

“w+b” – відкрити двійковий файл для читання і запису;

“a+b” – відкрити двійковий файл для додавання створити файл для читання і запису;

“rt” – відкрити текстовий файл для читання;

“wt” – відкрити текстовий файл для запису;

“at” – відкрити текстовий файл для додавання;

“r+t” – відкрити текстовий файл для читання і запису;

“w+t” – відкрити текстовий файл для читання і запису;

“a+t” – відкрити текстовий файл для додавання створити файл для читання і запису;

Для відкриття файлу з ім'ям D:\\BOOK.DAT необхідно записати:

FILE*F1;

F1=fopen(“D:\\BOOK.DAT “, “w”);

При відкритті файлу рекомендується провести перевірку відкриття файлу. Тоді відкриття файлу матиме наступний вигляд.

FILE*F1;

іf((F1=fopen(“D:\\BOOK.DAT “, “w”)) = = NULL)

{

cout<<”Не можу відкрити файл F1”<<endl;

exit(1);

}

Запис даних у файл проводиться функцією fwrite(), а читання – функцією fread(). Ці функції мають наступні прототипи:

fwrite(void*buf, int bytes, int c, FILE*fptr);

fread(void*buf, int bytes, int c, FILE*fptr);

де:

*buf – покажчик на буфер пам'яті, звідки проводитиметься обмін з файлом;

bytes – довжина кожної одиниці запису (читання) в байтах;

c – кількість одиниць запису (читання) при одному обміні;

*fptr – файлова змінна.

Приклад. Ввести з клавіатури в пам'ять ПК масив з 6 цілих чисел. Записати цей масив у файл D:\\BOOK.DAT, а потім прочитати його з файлу в інший масив і видати його на екран дисплея.

#include <stdio.h>

#include <stdlib.h>

#include <iostream.h>

void main()

{

const int N=30; //Максиальний розмір масиву

int Mas[N]; //Масив Mas[N]

int i,l; //Параметр циклу і реальний розмір масиву

int S; // Буфер обміну

int *pS; //Указівка на буфер обміну

pS=&S; //Присвоєння адреси S покажчику pS

cout<<"Vvedite razmer l:"<<endl;

cin>>l; //Введення реального розміру масиву

cout<<"Vvedite Mas:"<<endl;

for(i=0;i<l;i++) cin>>Mas[i]; // Введення масиву Mas

FILE*F1; //Відкриття файлу

if((F1=fopen("D:\\BOOK.DAT", "w"))==NULL)

{

cout<<"Ne mogu otkrit F1"<<endl;

exit(1);

}

for(i=0;i<l;i++) //Цикл по і від 0 до 5

{

S=Mas[i]; //Запис елемента масиву в буфер

fwrite(pS,4,1,F1); // Запис з буфера у файл

}

fclose(F1); //Закриття файлу

float Mas1[N]; // Новий масив Mas1

FILE*F2; //Відкриття файлу для читання

if((F2=fopen("D:\\BOOK.DAT","r"))==NULL)

{

cout<<"Ne mogu otkrit F2"<<endl;

exit(1);

}

i=0;

while(!feof(F2)) //Цикл на перевірку кінця файлу

{

fread(pS,4,1,F2); //Читання одиниці даних в буфер

Mas1[i]=S; // Запис з буфера в масив Mas1

i=i+1;

}

l=i-1; // Обчислення кількості прочитаних чисел

fclose(F2); // Закриття файлу

for(i=0;i<l;i++) cout<<Mas1[i]<<" "; // Видача на екран

cout<<endl;

}

Результат виконання програми

Vvedite razmer l:

6

Vvedite Mas:

1 2 3 4 5 6

1 2 3 4 5 6

Press any key to continue

Функція rewind() встановлює покажчик позиції файлу на початок файлу. Наприклад: rewind(F2).

Функція fseek() встановлює покажчик позиції файлу в потрібне місце. Прототип цієї функції має наступний вигляд:

int fseek(FILE*fptr, long num, int mode):

де:

FILE*fptr – покажчик на відповідний файл;

num – кількість байт від точки відліку для установки поточної позиції покажчика файлу;

mode – визначає точку відліку:

- початок файлу – 0;

- поточна позиція – 1;

- кінець файлу – 2;

Приклад. У файлі D:\\BOOK.DAT записано 6 чисел. Прочитати дані з цього файлу, починаючи з третього числа. Прочитаний масив видати на екран. Підрахувати суму елементів цього масиву. Суму видати на екран і записати в кінець файлу D:\\BOOK.DAT.

#include <stdio.h>

#include <stdlib.h>

#include <iostream.h>

void main()

{

const int N=30; //Максимальний розмір масиву

int Mas1[N]; //Масив Mas[N]

int i,l; //Параметр циклу і реальний розмір масиву

int S; // Буфер обміну

int *pS; //Указівка на буфер обміну

pS=&S; //Присвоєння адреси S покажчику pS

FILE*F2; //Відкриття файлу

if((F2=fopen("D:\\BOOK.DAT", "r"))==NULL)

{

cout<<"Ne mogu otkrit F1"<<endl;

exit(1);

}

i=0;

fseek(F2,8,0); //Установка покажчика файлу на 3-те число

while(!feof(F2)) //Цикл на перевірку кінця файлу

{

fread(pS,4,1,F2); //Читання одиниці даних з файлу в буфер

Mas1[i]=S; // Запис з буфера в масив Mas1

i=i+1;

}

fclose(F2); // Закриття файлу

l=i-1; // Обчислення кількості прочитаних чисел

for(i=0;i<l;i++) cout<<Mas1[i]<<" ";

cout<<endl;

int Sum=0;

for(i=0;i<l;i++) Sum=Sum+Mas1[i]; //Обчислення суми

cout<<"SUMMA= "<<Sum<<endl;

FILE*F3; //Відкриття файлу для додавання у його кінець

if((F3=fopen("D:\\BOOK.DAT", "a"))==NULL)

{

cout<<"Ne mogu otkrit F1"<<endl;

exit(1);

}

S=Sum; //Запис суми в буфер

fwrite(pS,4,1,F3); // Додавання суми у кінець файлу

fclose(F3);// Закриття файлу

}

Вид екрану після виконання програми.

3 4 5 6

SUMMA= 18

Press any key to continue