
- •§ 2. Типи даних
- •§ 3. Присвоєння
- •§ 5. Потоки. Введення - виведення даних
- •§ 6. Адреси даних. Вказівники. Динамічна пам'ять
- •§ 7. Файли
- •§ 8. Розгалуження
- •§ 9. Цикли
- •§ 10. Функції (1)
- •§ 11. Функції (2)
- •§ 12. Масиви
- •§ 13. Рядки
- •§ 14. Структури, списки, стеки, черги, об'єднання
- •§ 15. Графіка
- •§ 16. Вступ до об'єктно-орієнтованого програмування
- •§ 1. Вступ до візуального програмування
- •§ 2. Задача про анкету
- •§ 3. Задача про обмін валюти
- •§ 4. Задача табулювання функції
- •§ 5. Створення навчальної програми
§ 8. Розгалуження
1. Складена команда. Під час написання програми може виникнути потреба трактувати декілька команд як одну. Така команда називається складеною. Складена команда - це конструкція такого вигляду:
{
<команда 1>;
. . .
<команда N>;
}
Перед закриваючою дужкою ";" ставити обов'язково. Після дужки символ ";" записувати не обов'язково.
Зауваження 1. Запис ;; називається порожньою командою. Якщо у складеній команді поставити символ ";" після закриваючої дужки, то компілятор це розглядатиме як порожню команду, що не впливає на результат виконання програми.
Надалі під командою будемо розуміти порожню, просту або складену команду.
2. Кома як команда. Кому як команду використовують тоді, коли необхідно інтерпретувати декілька виразів або команд як одне ціле. Вона має вигляд
вираз 1, вираз 2
або
команда 1,команда 2
Дія команди. Послідовно обчислюються значення виразу 1 (виконується команда 1) та виразу 2 (команда 2).
Цю команду зручно використовувати у командах циклу, умовних командах тощо. Наприклад, if (k+=2, k<7)...
Тут спочатку значення змінної k буде збільшено на 2, а потім це значення порівнюватиметься із числом 7. Результат команди - True, якщо значення змінної k менше, ніж 7, у протилежному випадку - false.
3. Логічні вирази та логічні операції. Логічний вираз -
це засіб записування умов у задачах відшукання даних, що задовольняють деякий критерій. Логічний вираз може набувати значення Іше (істинність) або їаїзе (хибність). Логічні вирази бувають прості та складені. Простий - це два арифметичні вирази, з'єднані символом відношення, а складений -це прості логічні вирази, з'єднані логічними операціями:
! - не,
&& - і,
|| - або.
Логічні вирази обчислюються з урахуванням пріоритету логічних операцій (1 - найвищий). Однакові логічні операції виконуються послідовно зліва направо. Для зміни порядку виконання логічних операцій, як і для звичайних арифметичних, використовують круглі дужки.
У табл.
7 наведені означення логічних операцій.
Логічним виразом може бути ціле число. Якщо воно не дорівнює нулю, то значення логічного виразу – True, якщо це число 0 — false.
Приклад 1. Розглянемо деякі логічні вирази та їхні значення. Нехай а = 1, b = 7, тоді:
4. Побітові логічні операції та операції зсуву. Одиницею виміру пам'яті комп'ютера є байт. Кожний байт складається із восьми бітів. У кожному біті можна розмістити одне з двох чисел: 0 та 1. У одному байті можна зобразити ціле число з діапазону від 0 до 255. Щоб занести значення деякого даного у пам'ять комп'ютера, необхідно це дане перетворити у двійковий код. Зазвичай відповідні програми це роблять автоматично. Однак інколи на практиці, наприклад, під час створення графічних зображень чи в задачах архівування даних, виникає потреба порівнювати не значення двох даних, а їхні біти. Для цього у мові С++ є побітові логічні операції (див. табл. 8): & (І), | (АБО), ^ (виключне АБО), ~ (НЕ).
Приклад 2. Нехай b1 =00110011, b2 = 11110101. Тоді
B1 & b2 = 00110001, b1 І b2 = 11110111, b1 ^ b2 =11000110, ~b1 = 11001100.
Кожний байт можна зобразити у вигляді послідовності з восьми нулів та одиниць. Для того, щоб зсунути біти послідовності вправо чи вліво на деяку фіксовану кількість, використовують спеціальні операції зсуву >> та <<. Під час зсуву па порожні місця дописують нулі. Наприклад, нехай b = 00100101, c — 10110010, тоді під час виконання команд
b = b << 2; с = с >> 1;
змінна b набуде значення 10010100, аc- 01011001.
Зауваження 2. Під час зсуву цифр цілого числа на п позицій вліво відбувається множення цього числа на 2n, а на п позицій вправо - ділення на 2n.
Зауваження 3. Подібно до команд присвоєння з арифметичними операціями можна використовувати команди присвоєння з логічними побітовими операціями: &=, |=, ~= та команди присвоєння з побітовим зсувом: >>=, <<+.
5. Команда розгалуження if (якщо). Команда розгалуження if має дві форми: повну та коротку. Повна така:
if (< логічний вираз>) <команда 1>; else <команда 2>;
Дія команди. Обчислюється значення логічного виразу. Якщо це значення істинне, то виконується команда 1, у протилежному випадку - команда 2. Команда 1 та команда 2 можуть бути порожніми, простими або складеними.
Приклад 3. Нехай х = 9. Унаслідок виконання команд
іf (х > 7) у = роw(х, 2); else у = sqrt(х);
іi (х <= 5) z = ехр(х);
else z = ++х;
отримаємо у = 81, z = 10, х = 10. Розглянемо команди
іf (х) у = х - 10;
іf (у) у += 2;
else y = 15;
Спочатку у дорівнюватиме 0 (оскільки х ≠ 0), а потім змінна у набуде значення 15.
Приклад 4. Проаналізуємо команди
Задача 1 (про обчислення складеної функції). Обчислити і вивести на екран значення складеної функції у у деякій жданій користувачем точці х, якщо
Коротка команда розгалуження if має вигляд
if (<логічний вираз>) <команда 1>;
Дія команди. Обчислюється значення логічного виразу. Якщо воно істинне, то виконується команда 1, інакше виконується команда, яка записана після команди if.
Приклад
5. Нехай а = 7. Розглянемо команди
Оскільки значення виразу а > 7 - false, то відразу виконуватиметься друга команда if. Значення виразу а <= 9 - True, тому z = (а + 1) / 2 = (7 + 1) / 2 = 4, а значення а = 7 + 1 = 8, отже, у = 4 + 8 = 12, а = 8.
6. Команда ?. Команда ? є аналогом команди розгалуженим 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 > у ? cout«x : cout«y;
getch();
Команда ? у разі потреби трактується компілятором як вираз, тому її зручно використовувати у директивах препро-цесора, наприклад
#define abs(х) > 0 ? (х); - (х);
Приклад 6. Нехай с = 10. Тоді після виконання команди х = (с == 3) ? 2 * с : с - 2;
отримаємо х = 8, оскільки с не дорівнює 3, і тому тут обчислюється значення виразу 2.
7. Команда вибору (switch). Команда вибору має вигляд
switch (<вираз>);
{
саsе <ознака 1> : <команда 1>; bгеак;
саsе <ознака N> : <команда N> bгеак;
default: <команда N+1>;
}
Вираз та ознаки мають бути цілочисельні. Оскільки транслятор мови С++ може розглядати значення змінних типу char і enum як цілі дані, то на місці виразу та ознак можуть бути сталі цілого, символьного або перераховного типів. На місці ко-
манд 1 - N може бути одна команда, декілька або не бути кодної команди. Команда bгеак не є обов'язковою і записується у разі потреби. Вона слугує для виходу з команди switch.
Складова частина default: <команда N+1> також може бути відсутня - тоді матимемо коротку форму команди вибору switch
Дія команди. Якщо значення виразу збігається зі значенням ознаки п, то виконується команда з номером п і розглядається наступний за нею рядок саsе і т.д. Для того, щоб припинити дію команди switch, наприклад, після виконання команди п (тобто щоб вийти з цієї команди), записують команду bгеак;. Якщо значення виразу не збігається із жодною з ознак, то виконується команда N+1 або, у випадку короткої форми, наступна команда після команди switch.
Задача 3 (про квитки). Нехай населені пункти позначені номерами від 1 до 8. Вартість одного квитка до конкретного пункту к визначається так:
Скільки коштуватимуть m квитків до населеного пункту, номер k якого вводять з клавіатури?
#include <iostream.h> #include <conio.h> void main() {
clrscr();
int k, m; float cina;
cout « "Уведіть номер к населеного пункту i кількість квитків 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 « "Дані введено неправильно \п";
cina = 0;
}
cout << m << “ квитків до пункту“ << k << “коштують”;
cout << cina*m << “грн”;
getc();
}
Якщо під час виконання програми дані ввести так: 3 5, то на екрані матимемо:
5 квитків до пункту 3 коштують 125 грн.
8. Команда безумовного переходу goto. Ця команда змінює послідовність виконання інших команд шляхом переходу до виконання команди, що має позначку (мітку). Команда переходу має вигляд
goto <позначка>;
Позначка може розміщуватись перед довільною командою у програмі. Вона відокремлюється від команди двокрапкою (:), а саме:
<позначка> : <команда>;
Позначкою може бути лише ідентифікатор, тобто набір допустимих символів, який починається з букви або символу підкреслення (_).
Задача 4 (про квадратне рівняння). Ввести декілька наборів коефіцієнтів квадратного рівняння ах2 + Ьх + с = 0 і вивести повідомлення: матиме рівняння дійсні корені чи ні?
// Програма Квадратне рівняння
#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{
clrscr();
float a, b, c, d;
vvid : cout « "\n Уведіть коефіцієнти рівняння \n";
сіn » a » b » c;
if (a = = 0) goto finish; //Якщо a=0, то перейти до позначки finish
d = pow(b, 2) - 4 * a * c; // Інакше обчислити дискримінант
if (d >= 0) cout « "Це рівняння має корені";
else // Якщо дискримінант від'ємний, то
{
cout « "Дані введено неправильно \n"; // виводимо відповідні
cout«"Рівняння дійсних розв'язків не має"; // повідомлення
goto vvid; // Перейти до позначки vvid
}
finish : getch();
}
Зауваження 4. Використовувати команду goto варто лише у виняткових випадках, оскільки вона змінює природну послідовність виконання команд і робить програму важкозрозумілою.
9. Перерахований тип утворюють із перерахування іменованих сталих цілого типу так:
enum <назва типу> = {<стала 1> = <значення 1>, … , <стала N> = <значення N >};
або так:
enum <назва типу> = {<стала 1>, ..., <стала N>}:
В останньому випадку сталій 1 автоматично буде присвоєно значення 0, сталій 2 — значення 1 и т. д.
Деякі сталі у списку можна ініціалізувати. Неініціалізо-паним сталим автоматично буде присвоєно значення на одиницю більше від значення попередньої сталої зі списку.
Приклад 7. Опишемо два перераховані типи (дні тижня та кольори):
enum week = {mon, tue, wed, the, fri, sat, sun};
enum colors = {red = 1, green, yellow = 6, white};
У списку week стала mon дорівнюватиме 0, tue = 1, ..., sun = 6. У списку colors стала red дорівнює 1, green відповідно 2, yellow - 6, а стала white - 7 (на одиницю більше від yellow).
Задача 5 (про розклад на день). Скласти програму, яка б виводила на екран розклад роботи на тиждень.
#include <iostream.h> // Програма Розклад на день
#include <conio.h>
void main()
{
clrscr();
enum svet {mon, tue, wed, the, fri, sat, sun}; int day;
cout « "Розклад занять на тиждень\n \n";
for (day = mon; day <= sun; day++)
switch (day)
{
case mon : cout « "Понеділок\t Зустріч акціонерів. \n"; break;
case tue: cout « "Вівторок\t Відрядження\n"; break;
case wed : cout« "Середа\t Відрядження\n"; break;
case the: cout « "Четвер\t Відрядження\n"; break;
case fri: cout« "П'ятниця\t Здати звіт. Зайти в банк\n"; break;
case sat: cout « "Субота\t їдемо на рибалку\n"; break;
case sun : cout « "Неділя\t Відвідати батьків. Ввечері йдемо у театр\n";
}
getch();
}
Вправи
1. Чи істиннийі складений логічний вираз х <= 8 && х > 3, якщо:
а) х = 0 (відповідь: ні); б) х = 2;
в)х- 10; г)х = 5; д) х = 15?
2. Якого значення (true чи false) набуде вираз х <= 2 || х > 5, якщо:
а) х = 0 (відповідь: true); б) х = 2;
в) х = 10; г) х = 5; д) х = 15?
3. Запишіть логічний вираз для визначення, чи деяка точка х належить відрізку:
а) [0; 3) (відповідь: х >= 0 && х < 3); б) (-6; б]; в) [10; 20];
г)[2;14] або [20;25]; д) [4;10] і [8; 12].
Запишіть умову того, що число а: а) парне; б) ділиться без остачі на 3; в) не ділиться без остачі на 3; г) ділиться на 3 і на 5; д) ділиться на 3 або на 5.
Складіть логічні вирази для перевірки, чи є точка (ас; у): а) у другій чверті (відповідь: х < 0 && у > 0 ); б) на координатних осях; в) у другій або третій чверті; г) у квадраті зі стороною, що дорівнює 1, побудованому на координатних осях у першій чверті; д) у крузі одиничного радіуса з центром у початку координат (підказка: умови належності точки кругу така: х2 + у2 < 1).
Модифікуйте програму Обчислення виразу так, щоб вивести результати у файл.
Модифікуйте програму Обчислення виразу так, щоб користувач міг вибирати, куди виводити результати: на екран чи у файл.
Вказівка. Використайте, наприклад, команди
cout « "Виведення результатів: 1 - на екран, 2-у файл";
сіn »n;
if (n == 1) <виводимо результати на екран>;
else <виводимо результати у файл>;
Складіть логічний вираз для пошуку у бібліотеці деякої книжки за трьома параметрами: видавництво - «Деол», рік видання - 2003, автор - Новосад.
Модифікуйте програму Квадратне рівняння так, щоб можна було розв'язати декілька рівнянь. Наприклад, вводити коефіцієнти доти, доки значення коефіцієнта а не дорівнюватиме нулю.
Складіть програму для розв'язування рівняння ах + Ь = 0. Передбачте випадки а) а — 0 і b = 0; б) а = 0, b ≠ 0; в) а ≠ 0.
Розв'яжіть задачу № 3 з розділу "Задачі" вашого варіанта. Передбачте виведення результатів на екран і у файл.
Розв'яжіть задачу № 4 вашого варіанта. Передбачте виведення результатів а) на екран; б) у файл.
Розв'яжіть задачу № 4 наступного варіанта. Виведіть результати виконання програми у файл.
Розв'яжіть задачу № 5 свого варіанта. Виведіть результати виконання програми на екран.