Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++_глинск.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
4.13 Mб
Скачать
  1. Ознаки. Ознаки слугують для зміни правил доступу до файлу. Розглянемо деякі з них:

Ознака

Призначення

ios::in

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

ios::out

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

ios::app

Відкриває файл для дописування інформації. Дані будуть записані у кінець файлу

ios::trunk

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

ios::nocreate

Забороняє створювати файл, який відкривають

ios::noreplace

Забороняє перезаписувати існуючий файл

Приклад 4. Після оголошення

ofstream Flags(“text1.dat”, ios::app, ios::noreplace);

можна дописати до кінця вже існуючого файлу text1.dat потрібну інформацію. Якщо ж оголосити потік Flags так:

ofstream Flags(“text1.dat”, ios::noreplace);

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

ofstream Flags(“text3.dat”, ios::noreplace);

то буде створено файл text3.dat, в який можна буде заносити дані.

Якщо потік оголосити так:

ofstream Flags(“text4.dat”, ios::nocreate);

то можливі два варіанти. Якщо файл text4.dat вже існує, то він може бути відкритий для записування даних. Якщо ж раніше такого файлу на диску не було, то в кращому випадку у файл нічого не запишеться, а в гіршому – програма зависне.

Задача 1 (про змагання спортсменів). Нехай необхідно занести у файл прізвища та результати трьох переможців змагань із фігурного катання. Вивести вміст файлу на екран для візуального контролю.

// Програма Спорт

#include <fstream.h>

void main()

{

// Відкриємо файл для записування

ofstream File1(“sport.txt”);

char name[15];

float bal;

cout << “Уведіть прізвище та результат першого спортсмена\n”;

cin >> name >> bal;

File1 << name << “\t” << bal << “\n”; // Записуємо дані у файл

cout << “Уведіть прізвище та результат другого спортсмена\n”;

cin >> name >> bal;

File1 << name << “\t” << bal << “\n”; // Записуємо дані у файл

cout << “Уведіть прізвище та результат третього спортсмена\n”;

cin >> name >> bal;

File1 << name << “\t” << bal << “\n”;

File1.close(); // Закриваємо файл

cout << “Виведемо вміст файлу\n”;

ifstream File2(“sport.txt”);

cout << “Перше місце\t”;

File2 >> name >> bal; // Зчитуємо дані з файла

cout << name << “\t” << bal << “\n”;

cout << “Друге місце \t”;

File2 >> name >> bal;

cout << name << “\t” << bal << “\n”;

cout << “Третє місце \t”;

File2 >> name >> bal;

cout << name << “\t” << bal << “\n”;

}

Розгалуження

  1. Складена команда. Під час написання програми може виникнути потреба трактувати декілька команд як одну. Така команда називається складеною. Складена команда – це конструкція такого вигляду:

{

<команда 1>;

<команда N>;

}

Перед закриваючою дужкою «;» ставиться обов’язково. Після дужки символ «;» записувати не обов’язково.

Зауваження 1. Запис ;; називається порожньою командою. Якщо у складній команді поставити символ «;» після закриваючої дужки, то компілятор це розглядатиме як порожню команду, що не впливає на результат виконання програми.

Надалі під командою будемо розуміти порожню, просту або складену команду.

  1. Кома як команда. Кому як команду використовують тоді, коли необхідно інтерпретувати декілька виразів або команд як одне ціле. Вона має вигляд

вираз 1, вираз 2

або

команда 1, команда 2

Дія команди. Послідовно обчислюються значення виразу 1 (виконується команда 1) та виразу 2 (команда 2).

Цю команду зручно використовувати у командах циклу, умовних командах тощо. Наприклад,

if (k += 2, k < 7) …

Тут спочатку значення змінної k буде збільшено на 2, а потім це значення порівнюватиметься із числом 7. Результат команди – true, якщо значення змінної k менше, ніж 7, у протилежному випадку – false.

  1. Логічні вирази та логічні операції. Логічний вираз – це засіб записування умов у задачах відшукання даних, що задовольняють деякий критерій. Логічний вираз може набувати значення true (істинність) або false (хибність). Логічні вирази бувають прості та складені. Простий – це два арифметичні вирази, з’єднані символом відношення, а складений – це прості логічні вирази, з’єднані логічними операціями:

  1. ! - не,

  2. && - і,

  3. || - або.

Логічні вирази обчислюються з урахуванням пріоритету логічних операцій (1 – найвищий). Однакові логічні операції виконуються послідовно зліва направо. Для зміни порядку виконання логічних операцій, як і для звичайних арифметичних, використовують круглі дужки.

У табл. 7 наведені означення логічних операцій.

Таблиця 7. Логічні операції

Вираз

Значення

Вираз

Значення

! true

false

! false

true

true && true

true

true || true

true

true && false

false

true || false

true

false && true

false

false || true

true

false && false

false

false || false

false

Логічним виразом може бути ціле число. Якщо воно не дорівнює нулю, то значення логічного виразу – true, якщо це число 0 – false.

Приклад 1. Розглянемо деякі логічні вирази та їхні значення. Нехай а = 1, b = 7, тоді:

Вираз

Значення

Вираз

Значення

a == b

a > -3 && a <=2

! (a == b)

a >= 0 && b <= 4

a >= b

b < 9 || b > 15

a != b

! (a < 1 || b >= 10)

a + 6 == b

a != b || a + 15 > b && b < 0

a < (b = 1)

(a != b || a + 15 < b) && b < 0

2

0

b

!b

  1. Побітові логічні операції та операції зсуву. Одиницею виміру пам’яті комп’ютера є байт. Кожний байт складається із восьми бітів. У кожному біті можна розмістити одне з двох чисел: 0 та 1. У одному байті можна зобразити ціле число з діапазону від 0 до 255. Щоб занести значення деякого даного у пам’ять комп’ютера, необхідно це дане перетворити у двійковий код. Зазвичай відповідні програми це роблять автоматично. Однак інколи на практиці, наприклад, під час створення графічних зображень чи в задачах архівування даних, виникає потреба порівнювати не значення двох даних, а їхні біти. Для цього у мові С++ є побітові логічні операції (див. табл. 8): & (І), | (АБО), ^ (виключне АБО), ~ (НЕ).

Таблиця 8. Побітові логічні операції

B1

B2

B1 & B2

B1 | B2

B1 ^ B2

~ B1

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Приклад 2. Нехай b1 = 00110011, b2 = 11110101. Тоді

b1 & b2 = 00110001, b1 | b2 = 11110111,

b1 ^ b2 = 11000110, ~ b1 = 11001100.

Кожний байт можна зобразити у вигляді послідовності з восьми нулів та одиниць. Для того, щоб зсунути біти послідовності вправо чи вліво на деяку фіксовану кількість, використовують спеціальні операції зсуву >> та <<. Під час зсуву на порожні місця дописують нулі. Наприклад, нехай b = 00100101, с = 10110010, тоді під час виконання команд

b = b << 2;

с = с >> 1;

змінна b набуде значення 10010100, а с – 01011001.

Зауваження 2. Під час зсуву цифр цілого числа на п позицій вліво відбувається множення цього числа на , а на п позицій вправо – ділення на .

Зауваження 3. Подібно до команд присвоєння з арифметичними операціями можна використовувати команди присвоєння з логічними побітовими операціями: &=, |=, ^= та команди присвоєння з побітовим зсувом: >>=, <<+.

  1. Команда розгалуження if (якщо). Команда розгалуження if має дві форми: повну та коротку. Повна така:

if (<логічний вираз>) <команда 1>; else <команда 2>;

Дія команди. Обчислюється значення логічного виразу. Якщо це значення істинне, то виконується команда 1, у протилежному випадку – команда 2. Команда 1 та команда 2 можуть бути порожніми, простими або складеними.

Приклад 3. Нехай х = 9. Унаслідок виконання команд

if (x > 7) y = pow(x, 2); else y = sgrt(x);

if (x <= 5) z = exp(x);

else z = ++x;

отримаємо у = 81, z = 10, х = 10.

Розглянемо команди

if (x) y = x – 10;

if (y) y += 2;

else y = 15;

Спочатку у дорівнюватиме 0 (оскільки х ≠ 0), а потім змінна у набуде значення 15.

Приклад 4. Проаналізуємо команди

if (0) cout << “Hello!”; - виведення на екран не буде

if (5) cout << “Hello!”; - буде виведене слово Hello!

if (!5) cout << “Hello!”; - виведення не буде

if (!0) cout << “Hello!”; - буде виведене слово Hello!

if (log(1)) cout << “Hello!”; - виведення не буде

Задача 1 (про обчислення складеної функції). Обчислити і вивести на екран значення складеної функції у у деякій заданій користувачем точці х, якщо

// Обчислення виразу

#include <iostream.h>

#include <math.h>

#include <conio.h>

void main()

{

3float x, y;

cout << “Vvedit x \n”;

cin >> x;

if (x < 0) y = tan(fabs(x));

else

if (0 <= x && x < 5) y = pow(x, 3);

else y = log(x) / log(5);

cout << “\n y =” << y;

getch();

}

Коротка команда розгалуження if має вигляд

іf (<логічний вираз>) <команда 1>;

Дія команди. Обчислюється значення логічного виразу. Якщо воно істинне, то виконується команда 1, інакше виконується команда, яка записана після команди if.

Приклад 5. Нехай а = 7. Розглянемо команди

if (a > 7)

{

y = a++;

z = a + 5;

}

if (a<= 9) z = ++a / 2; y = z +a;

Оскільки значення виразу a > 7 – false, то відразу виконуватиметься друга команда if. Значення виразу a<= 9 – true, тому z = (a + 1) / 2 = (7 + 1) / 2 = 4, а значення а = 7 + 1 = 8, отже, у = 4 + 8 = 12,

а = 8.

  1. Команда ?. Команда ? є аналогом команди розгалуження if. Загальний вигляд команди ? такий:

<логічний вираз> ? <команда або вираз 1> : <команда або вираз 2>

Дія команди. Обчислюється значення логічного виразу. Якщо воно істинне, то виконується команда 1 або обчислюється вираз 1, інакше – команда або вираз 2.

Задача 2 (про два числа). Ввести два цілі числа. Знайти більше з них.

// Визначення більшого числа

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

int x, y;

cout << “Vvedit x, y \n”;

cin >> x >> y;

cout << “Max =”;

x > y ? cout << x : cout << y;

getch();

}

Команда ? у разі потреби трактується компілятором як вираз, тому її зручно використовувати у директивах препроцесора, наприклад

#define abs(x) > 0 ? (x); -(x);

Приклад 6. Нехай с = 10. Тоді після виконання команди

х = (с == 3) ? 2 * с : с – 2;

отримаємо х = 8, оскільки с не дорівнює 3, і тому тут обчислюється значення виразу 2.

  1. Команда вибору (switch). Команда вибору має вигляд

switch (<>);

{

case <ознака 1> : <команда 1>; break;

case <ознака N> : <команда N>; break;

default : <команда N+1>;

}

Вираз та ознаки мають бути цілочисельні. Оскільки транслятор мови С++ може розглядати значення змінних типу char і enum як цілі дані, то на місці виразу та ознак можуть бути сталі цілого, символьного або перерахованого типів. На місці команд 1 – N може бути одна команда, декілька або не бути жодної команди. Команда break не є обов’язковою і записується у разі потреби. Вона слугує для виходу з команди switch.

Складова частина default : <команда N+1> також може бути відсутня – тоді матимемо коротку форму команди вибору switch.

Дія команди. Якщо значення виразу збігається зі значенням ознаки п, то виконується команда з номером п і розглядається наступний за нею рядок case і т. д. Для того, щоб припинити дію команди switch, наприклад, після виконання команди п (тобто щоб вийти з цієї команди), записують команду break;. Якщо значення виразу не збігається із жодною з ознак, то виконується команда N+1 або, у випадку короткої форми, наступна команда після команди switch.

Задача 3 (про квитки). Нехай населені пункти позначені номерами від 1 до 8. Вартість одного квитка до конкретного пункту k визначається так:

Скільки коштуватимуть т квитків до населеного пункту, номер k якого вводять з клавіатури?

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

int k, m;

float cina;

cout << “Уведіть номер k населеного пункту і кількість квитків m ”;

cin >> k >> m;

switch (k)

{

case 1: cina = 22; break;

case 2:

case 3:

case 4: cina = 25; break;

case 5:

case 6: cina = 30; break;

case 7:

case 8: cina = 35; break;

default :

cout << “Дані введено неправильно \n”;

cina = 0;

}

cout << m << “квитків до пункту” << k << “ коштують”;

cout << cina *m << “ грн”;

getch();

}

Якщо під час виконання програми дані ввести так: 3 5, то на екрані матимемо:

5 квитків до пункту 3 коштують 125 грн.