ПРОГРАМУВАННЯ РОЗГАЛУЖЕНИХ АЛГОРИТМІВ
(Мова С/С++)
Мета:
• навчитись використовувати умовні оператори мови С/С++ при
розв'язанні різних класів задач;
• отримати навички програмної реалізації найпростіших розгалужених алгоритмів.
Теоретичні відомості 1. Керуючі структури мови С/С++. Організація розгалужень.
За замовчуванням рядки програми виконуються у тій послідовності, в якій вони записані. Однак, в мовах програмування існують оператори, які дозволяють вказувати, що наступним повинен виконуватись не черговий рядок, деякий інший. Це називається передачею управління. Мова програмування С/С++ включає три види керуючих структур операторів), які працюють на основі вибору альтернатив: оператор if конструкція if – else), тернарний оператор (?:) і оператор switch (конструкція witch – case).
Конструкція з одиночним оператором if призначена для виконання оманди або блоку команд залежно від того, істинним або хибним є заданий логічний вираз – “умова”. Загальний формат такої конструкції має наступний игляд:
if (логічний вираз)
{ перелік дій 1;
}
Else
{ перелік дій 2; }
Якщо логічний вираз є істинним, виконуватимуться дії з переліку дій 1, якщо хибним – з переліку дій 2, тобто записані в блоці оператора else. Така конструкція відповідає схемі алгоритму, представленій на рисунку.
Схема алгоритму, якій відповідає загальна конструкція if – else
Приклад:
printf (“Введіть свій вік: ”); scanf (“%i”, &Age); if (Age >= 18)
{
printf (“Ви – повнолітня людина\n”);
} else
{
printf (“Ви – неповнолітня людина\n”);
}
Якщо немає необхідності вказувати перелік дій, які треба виконати в разі хибності умови, то оператор else на записується:
if (логічний вираз) { перелік дій; }
Така конструкція відповідає схемі алгоритму, представленій на рисунку.
Схема алгоритму з одиночним оператором if
Логічний вираз, який обробляється оператором if, може набувати двох значень: “істина” і “похибка”, однак взагалі, з точки зору компілятора істинним є будь-яке ненульове значення, а хибним – нульове. Це означає, що перевірку виду: if (x<> 0) ... (“якщо x не дорівнює нулю”) можна замінити на більш стислу, хоча й менш наочну: if (x) .... В цьому випадку, якщо змінна x містить довільне число, яке відрізняється від нуля, воно буде вважатись таким, що дорівнює значенню “істина” з відповідними наслідками.
Аналогічно, умова виду if (x == 0) ... може бути замінена на if (!x) ...
(читається “якщо не-ікс”). Тоді нульове значення змінної x, яке символізує “неправду”, операцією логічного заперечення – “!” – буде перетворене в “істину” і навпаки.
Приклад:
printf (“Введіть стартовий капітал фірми, грн: ”); scanf (“%i”, &StartMoney);
if (!StartMoney)
{
printf (“Якщо капіталу немає, неможливо працювати далі\n”);
} else
{
... }
3. Тернарний оператор (?:).Тернарний оператор дозволяє замінити конструкцію if – else більш компактним записом. Формат тернарного оператора має наступний вигляд:
(логічний вираз) ? дія 1 : дія 2;
Після перевірки значення логічного виразу в разі його істинності виконується дія 1, а в разі хибності – дія 2. Приклад:
(Age>= 18) ?printf (“Повнолітній”) : printf (“Неповнолітній”);
4. Умовний оператор swicth (конструкція switch – case)
В деяких задачах виникає необхідність перевірки цілочисельної змінної або виразу на рівність ряду сталих (константних) значень. Таку перевірку можна здійснити за допомогою структури з декількох конструкцій if – else, наприклад:
if (DayNumber == 1) printf (“Понеділок”); else if (DayNumber == 2) printf (“Вівторок”); else if (DayNumber == 3) printf (“Середа”); else if (DayNumber == 4) printf (“Четвер”); else if (DayNumber == 5) printf (“П‟ятниця”); else if (DayNumber == 6) printf (“Субота”); elseprintf (“Неділя”);
Однак, таку стркутуру можна реалізувати більш компактно і наочно за допомогою оператора switch, який має наступний формат:
switch (цілочисельний вираз)
{
case константне значення 1: дія 1; break; case константне значення 2: дія 2; break;
...
case константне значення N: дія N; break;
default: дія N+1;
}
Конструкція switch – case працює наступним чином. Цілочисельний вираз послідовно порівнюється із константним значенням 1, 2 і т. д. Якщо деяке значення k співпадає із значенням виразу, то виконується відповідна дія k, після чого оператор break передає управління за межі блоку switch.
Якщо серед констант не знайшлось рівної виразу, то управління передається на мітку default. За відсутності цієї мітки управління передається за межі блоку switch.
Таким чином, реалізація перевірки з прикладу про дні тижня на основі оператора switch матиме наступний вигляд:
swicth (DayNumber)
{
case 1: printf (“Понеділок”); break; case 2: printf (“Вівторок”); break; case 3: printf (“Середа”); break; case 4: printf (“Четвер”); break; case 5: printf (“П‟ятниця”); break; case 6: printf (“Субота”); break; default: printf (“Неділя”);
}
Завданням є створення, компіляція, відладка та виконання програми за розгалуженим алгоритмом.
Результатом виконання завдання має бути демонстрація правильного функціонування програми.
Приклад
Знайти найменше з трьох заданих чисел a, b і c.
Розв’язання:
Алгоритм розв’язання даної задачі представлений на рисунку
Схема алгоритму розв’язання задачі про найменше з трьох чисел
Лістинг програми мовою С/С++
#include <conio.h> #include <stdio.h>
int a, b, c;
void main ()
{ clrscr ();
printf (“Програма знаходження найменшого числа\n”);
printf (“Введіть три цілих числа: ”);
scanf (“%i%i%i”, &a, &b, &c); if (a < b)
{
if (a < c) printf (“Найменше число a = %i”, a);
else printf (“Найменше число c = %i”, c);
} else { if (b < c) printf (“Найменше число b = %i”, b); else printf (“Найменше число c = %i”, c);
} getch ();
}
Завдання
1) вивчити методичні вказівки до роботи;
2) реалізувати програму за розгалуженим алгоритмом за варіантом завдання;
3) відкомпілювати та відладити програму;
4) розробити набір тестів і перевірити роботу програми на них; 5) відповісти на контрольні запитання; 6) зробити висновки.
Варіанти завдань 1. Задані три числа: a, b і c. Визначити, чи можуть вони бути сторонами трикутника і, якщо так, визначити його тип: рівнобічний, рівнобедрений, довільний.
2. Визначити, чи пролізе цегла зі сторонами a, b і c через прямокутний отвір зі сторонами r і s, якщо сторони отвору повинні бути паралельні до граней цегли.
3. Можна їхати на таксі зі швидкістю v1 км/год і оплатою p1 грн/км або йти зі швидкістю v2 км/год безкоштовно. Як з найменшими витратами подолати шлях s за час t, якщо це можливо? Визначити витрати.
4. Перевірити, чи лежить точка M(xm,ym) всередині трикутника, заданного координатами своїх вершин A (xa, ya), B (xb, yb), C (xc, yc) на площині.
5.Серед заданих чисел k, l і m знайти всі пари кратних.
6. Банк пропонує три види термінових вкладів: на 3 місяці під p1процентів, на 6 місяців під p2 процентів і на рік під p3 процентів. Визначити, який з внесків найбільш прибутковий для вкладника.
7. Задані координати вершин трикутника ABC на площині. Вивести їх в порядку обходу вершин за годинниковою стрілкою.
8. Перевірити, чи можна посилку розміром a×b×c запакувати в коробку розміром r×s×t, якщо кутом пакувати не можна.
9. Раціон корови на добу складає a кг сіна b кг силосу і c кг комбікорму. У господарстві, яке має стадо з n корів, залишилось p центнерів сіна, q тонн силосу і r мішків по 50 кг комбікорму. Скільки днів господарство може годувати корів за повним раціоном? Який з кормів закінчиться першим?
10.Перевірити, чи може куля з радіусом r пролізти через ромбовидний отвір з діагоналями p і q.
11. Перевірити, чи можна з круглої заготовки радіусом r вирізати прямокутну пластину розміром a×b.
12. Мандрівник рухався t1 годин зі швидкістю v1 км/год, потім t2 годин зі швидкістю v2 км/год і t3 годин зі швидкістю v3 км/год. Визначити, за який час він подолав першуполовину шляху.
13. Визначити, чи лежить трикутник ABC, заданий координатами своїх вершин на площині, в області перетину двох кіл:
14. Задані дійсні числа a,b і c. Піднести до квадрату кожне з них, якщо a>b>c і залишити без змін в іншому випадку.
15.На шаховій дошці стоять три ферзі. Знайти ті пари з них, які загрожують одне одному.
16. Порівняти площу кола і площу квадрата, які задані відповідно радіусом r та довжиною сторони a.
17. Перевірити, чи належить колоцілком колу
або навпаки.
18. З пункту A в пункт B виїхав велосипедист зі швидкістю v0 км/год. Водночас на зустріч йому з пункту B в пункт A виїхав автостопом його друг. s1км він рухався зі швидкістю v1 км/год, s2 км – зі швидкістю v2 км/год, s3 км – зі швидкістю v3 км/год. Визначити, через скільки годин після старту вони зустрілись.
19. Визначити, чи можна на прямокутній ділянці забудови розміром a×b метрів розмістити дві будівлі розмірами p×q та r×s метрів? Будівлі можна розташовувати лише паралельно сторонам ділянки.
20. Задані дійсні числа x1, y1, x2, y2, x3, y3. Перевірити, чи належить початок координат трикутнику з вершинами (x1, y1), (x2, y2), (x3, y3).
21. Відомо, що число ділиться на три тоді і лише тоді, коли сума його цифр ділиться на три. Перевірити цю ознаку для заданого трьохзначного числа x.
22. Розв‟язати квадратне рівняння
23.Визначити, чи поміститься квадрат в коло, якщо задані їх площі.
24.На шаховій дошці стоять чорний король і три білі тури. Перевірити, чи не знаходиться король під биттям, а якщо є загроза, то від кого саме.
25.Визначити, чи є трикутник, заданий координатами своїх вершин(x1,y1), (x2,y2), (x3, y3) рівнобедреним.
26.Визначити, чи поміститься куля в куб, якщо задані їх об‟єми.
27. В інструкції до вітамінного препарату сказано, що вживати його слід за наступною схемою: діти до 15 років – з розрахунку p грам на кілограм ваги тіла один раз на день, дорослим від 15 до 60 років–q грам на кілограм ваги тіла двічі на день, людям похилого віку (старше 60 років) – r грам на кілограм ваги тіла тричі на день. Флакон препарату містить n капсул вагою m грамів кожна. Визначити, скільки днів зможе приймати препарат сім‟я, що складається з дідуся (70 років, a кг), мами (40 років, b кг) та доньки (12 років, c кг).
28. Визначити номер чверті площини, в якій розташована точка M (x, y).
29. Розв‟язати лінійне рівняння виду ax = b.
30. Електричний ланцюг складають три опори: R1, R2 і R3, увімкнені послідовно та підключені до джерела з напругою U. Визначити опори, на яких розсіюється найбільша і найменша кількість теплоти в одиницю часу.
1) опишіть формат умовного оператора if;
2) опишіть формат тернарного оператора; 3) опишіть формат умовного оператора switch.