Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Відповіді на питання по мові С++по лекціям.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
265.22 Кб
Скачать
  1. Файловий ввід.

Треба включати заголовочний файл fstream. Заголовочний файл fstream визначає клас ifstream для обробки вводe. Повинні оголосити один або більш змінних типу ifstream, котрі можно іменувати за своїм смаком, поки враховуєте прийняті для цього угоди. Повинні враховувати простір імен std; наприклад, можна використовувати директиву using або префікс std:: для таких елементів, як ifstream. Повинні асоціювати конкретний об’єкт ifstream з визначеним файлом; одним із способів зробити це є застосування методу open (). По закінченню роботи з файлом треба використати метод close () для закриття файлу.

Можна використовувати ifstream з методом get () для читання окремих символів і з методом getline () – для читання цілих рядків.

Можна використовувати об’єкт ifstream з такими методами, як eof (0 і fail (), щоб відслідковувати успішність спроб вводу.

Сам об’єкт ifstream, коли присутній у перевірочних умовах, перетворюється у бульове значення true, коли остання спроба читання була успішною, і false – у протилежному випадку.

Слід зазначити, що хоча заголовочний файл iostream представляє визначений об'єкт istream по імені cin, то ви повинні оголосити свій власний об’єкт ifstream, вибираючи для нього ім’я і асоціюючи з файлом.

  1. Спосіб перевірки відкриття файлу.

Важливий момент є у тому, що коли оголошується об’єкт ifstream і асоціювали його з визначеним файлом, то після того можна використовувати його точнісінько як застосовуєте cin. Всі операції і методи, що доступні cin, також доступні об’єктам ifstream, як це демонструють inFile і fin із попередніх прикладів.

Спосіб перевірки того, удалось відкрити файл чи ні, полягає у застосувані методу is_open (0). Для цього можна застосувати такий код:

inFile.open (“bowling.txt”);

if (!inFile.is_open());

{

exit (EXIT_FAILURE);

}

Правильній формат текстових файлів вимагає наявності символів переводу рядка у кінець кожного рядка файлу. Деякі текстові редактори не додають автоматично символ переводи рядка до останнього рядка файлу. Тому, коли ви користуєтеся таким текстовим редактором, то повинні натискувати на клавішу <Enter> після введення останнього рядка тексту і перед виходом із файлу.

ЛЕКЦІЯ 20.

  1. Огляд функцій.

Для того, щоб застосовувати функції в С++, ви повинні виконати наступні кроки:

Представити визначення функції.

Представити прототип функції.

Викликати функцію.

Коли ви створюєте власну функцію, то повинні самостійно обробити всі три аспекти – визначення, прототипи і виклик.

  1. Визначення функції.

Усі функції можна розбити на дві категорії: ті, що не повертають значення, і ті, що їх повертають. Функції, що не повертають значення, називаються функціями типу void. Зазвичай функцію void використовують для виконання якісь дій.

Функції, що повертає значення, віддає генеріруємо їм значення функції, котра її викликала. Іншими словами, коли функція повертає квадратній корінь із 9.0 (sqrt (9.0)), то викликаючи її функція отримує значення 3.0. Так функція оголошується, як тип, якій відповідає значенню, котре повертається. Функція, що повертає значення, потребує використання оператора return, таким чином, щоб функції, яка викликається, було повернення відповідне значення. Саме значення може бути константою, змінною або більш загальним виразом. Єдина вимога – щоб вираз по типу співпадав або міг бути перетворений у відповідній тип. І викликаємо, і повертаємо функції повинні підкорятися загальної угоди відносно типу даних, які зберігаються у цьому місці.

Функція завершує свою роботу після виконання оператора return.

  1. Прототип функції.

Прототип функції – це оператор. Прототип функції не вимагає надання змінних-параметрів; достатньо списку типів. Імена змінних у прототипі слугують просто зазначенням місця аргументу, тому коли вони задані, то не обов’язково повинні збігатися з іменами у визначенні функції. Прототипирування здійснюється у час компіляції і називається статичним контролем типів.

  1. Формальний аргумент.

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

  1. Локальні змінні.

Коли функція викликається, комп’ютер виділяє пам’ять, яка потрібна для цих змінних. Коли функція завершується, то комп’ютер звільняє пам’ять, котра була використовувана цими змінними. Такі змінні називаються локальними змінними, тому що вони локалізовані у межах функції.

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

  1. Коли функція має два аргументи.

Заголовок функції встановлює, що функція n_chars () приймає один аргумент типу char і один типу int. Параметрам c і n присвоюються значення, які передані функції. Коли функція має два аргументи одного й того ж типу, то треба задавати типи окремо для кожного параметру. Неможливо це робити, як це робиться для звичайних змінних. Наприклад

void n_chars (char c, char n); //об’ява кожної змінної окремо

Як і з єдиним аргументом, не обов’язково використовувати однакові імена змінних у прототипі і оголошені, і також можна пропускати імена змінних у прототипі:

void n_chars (char, int); //прототип

  1. Функція дозволяє вгадувати 6 номерів у лотереї з 51.

Розглянемо функцію, котра буде вгадувати 6 номерів у лотереї з 51, на основі наступної формули:

Для виконання цієї формули треба скористатися циклом for:

long double result = 1.0;

for ( n = nubers, p = hicks; p > 0; n--, p--)

result = result * n/p;

Замість того, щоб відразу перемножити всі складові чисельника, цикл починається з множення 1.0 на першу складову чисельника і потім ділить його на першу складову знаменника. На наступному кроці цикл множить і ділить результат на наступні складові чисельника і знаменника. Це дозволяє зберегти результат множення меншім, чим коли б спочатку виконали усі множення. Наприклад, порівняйте (10 * 9) / (2 * 1) з (10 / 2) / (9 / 1). Перший вираз обчислює 90/2, а у той час як друге обчислення робить 5*9, отримуючи 45. Результат однаковий, але у першому випадку отримуємо більший проміжний результат (90) ніж у другому. Чим більш у вас множників, тим суттєва різниця. Для великих чисел ця стратегія може оберегти процес обчислення від переповнення максимальне можливого значення з плаваючою точкою.

ЛЕКЦІЯ 21.

  1. Функції і масиви.

Для додавання елементів масиву треба застосовувати цикл. Є сенс спроектувати функцію для такої задачі. Подивимося, як повинний виглядати інтерфейс функції. Оскільки функція обчислює суму, то вона повинна повертати відповідь. Щоб функція знала, який масив потрібно підсумовувати, то треба їй передати в якості аргументу ім’я масиву. Щоб не обмежувати її масивами визначеного розміру, потрібно буде також передати їй розмір масиви. Нове в цьому випадку – це ім’я масиву в якості одного із формальних аргументів. Поглянемо, що ми отримали:

int sum_arr (int arr [], int n) //arr = ім’я масиву, n = розмір

Квадратні дужки вказують на те, що можна застосувати цю функцію з масивами будь-якого розміру. Але arr – на самому ділі не масив, а показник! Однак, можна писати так, як би arr був масивом.

  1. Який у програмі prog056.cpp присутній виклик функції?

int sum_arr (cookies, ArSize);

Тут cookies – ім’я масиву, тому він являє собою адресу першого елемента цього масиву. Тобто функція передає адресу. Тому що масив має тип int, то cookies повинний мати тип показника на int або на int *. Таким чином, коректний заголовок функції повинний бути таким:

int sum_arr (int * arr, int n) // arr = ім’я масиву, n = розмір

Тут int * arr замінює int arr []. Обидва варіанти можна застосовувати, тому що вони коректні, але не є синонімами ні в будь якому контексті.

Проектні рішення не повинні обмежуватися тим, як дані зберігаються. Вони повинні враховувати, як вони використаються. Розглянемо прототип:

int fill_array (double ar [], int limit);

Функція приймає аргумент – ім’я масиву і аргумент, який вказує максимальну кількість елементів для читання, а повертає кількість дійсно введених елементів. Наприклад, коли використовується функція з масивом із п’яті елементів, то передається у другий аргумент 5. Коли потім вводиться тільки три елемента, то функція повертає 3.

  1. Використання циклу для читання у масиві послідовних значень.

Можна використовувати цикл для читання у масиві послідовних значень. Оскільки значення додатні. Тоді в якості вказівки кінця значень можна використати від’ємне значення. Враховуючи все це, напишемо цю функцію таким чином:

int fill_array (double ar [], int limit)

{

using namespace std;

double temp;

int i;

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

{

cout << “Ввести значення #” << (I + 1) << “:”;

cin >> temp;

if (!cin) //невірний ввід

{

cin.clear ();

while (cin.get () != ‘\n’)

continue;

cout << “Невірний ввід: процес введення зупиненийю\n”;

break;

}

else if (temp < 0) //сигнал завершення

break;

ar [i] = temp;

}

return 0;

}

  1. Операції з масивами.

Коли користувач вводить додатні значення, то вони записуються у масив до читання limit значення. У протилежному випадку цикл закінчується, коли число не додатне. Останнє, що робить цикл, це збільшує і на 1, тому значення і дорівнює числу введених елементів.

Щоб предотворіть випадкову зміну масива-аргументу, можна використовувати ключове слово const, об’являючи формальний аргумент:

void show_array (const double ar [], int n);

Ця об’ява установлює, що показник ar вказує на константні дані. Це визначає, що не можна застосовувати ar для зміни даних. Таким чином, show_array () трактує масив як дані, які доступні тільки для читання.

Третя операція з масивом – це множення кожного елемента на один і той же коефіцієнт.

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

void show_array (const double ar [], int n);

{

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

ar [i] *= r;

}

Оскільки ця функція призначена для зміні елементів масиву, то не треба вказувати слово const в оголошені ar.

ЛЕКЦІЯ 22.

  1. Процеси програмування в ООП.

Перший приклад виводу ілюструє досягнення межі по кількості елементів, а другий – припиняє прийом значень по вводу із-за від’ємного значення.

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