Креневич А.П.,Обвінцев О.В.C в задачах і прикладах
..pdfРозділ 2. Розгалужені програми |
21 |
|
2.21.Створити програму, яка перевіряє, чи належить початок координат трикутнику з вершинами A(x1 , y1 ), B(x2 , y2 ), C(x3 , y3 ).
2.22.Точка площини задана декартовими координатами (x, y). Перевірити, чи належить вона:
а) трикутнику з вершинами A(x1 , y1 ), B(x2 , y2 ), C(x3 , y3 ); б) багатокутнику з вершинами A(x1 , y1 ), …, An (xn , yn ).
2.23.Точка простору задана декартовими координатами (x, y, z). Перевірити, чи належить вона кулі з радіусом R i центром у початку координат.
2.24.Точка простору задана декартовими координатами (x, y, z). Пе-
ревірити, чи належить вона циліндру, вісь якого збігається з віссю Oz, висота дорівнює h, а нижня основа лежить у площині Oxy та має радіус r.
2.25. Точка простору задана декартовими координатами (x, y, z). Перевірити, чи належить вона зрізаному конусу, вісь якого збігається з віссю Oz, висота дорівнює h, нижня основа лежить у площині Oxy та має радіус R, а верхня основа – радіус r.
2.26. Точка простору задана декартовими координатами (x, y, z). Перевірити, чи належить вона внутрішності тора, що утворюється в результаті обертання круга (x − (a + r))2 + z2 ≤ r 2 навколо осі Oz.
2.27. Точка простору задана декартовими координатами (x, y, z). Перевірити, чи належить вона тетраедру з вершинами у точках
A(x1 , y1 , z1 ), B(x2 , y2 , z2 ), C(x3 , y3 , z3 ), D(x4 , y4 , z4 ).
2.3. Розгалуження
Означення 2.4. Структура керування, що виконує певну дію (перелік дій), залежно від істинності деякої умови F, називається розгалуженням.
Для програмування розгалужень у С реалізовано умовний оператор, що має такий синтаксис
if (F) {P}
else {Q}
де F – умова, P – інструкція (або набір інструкцій), що виконується у випадку істинності умови F, Q – інструкція (або набір інструкцій), що виконується у випадку хибності умови F. У випадку, якщо P або Q складається тільки з однієї інструкції, то операторні дужки {} можна опустити.
Зауваження. Блок розгалуження else є необов'язковим, його можна опускати, якщо у випадку хибності умови F програма не має виконувати жодних дій.
22 |
С у задачах і прикладах |
|
Приклади розв'язання задач
Приклад 2.7. Знайти більше з двох значень, введених із клавіатури.
Розв'язок Спосіб 1. Використаємо умовний вираз. Дійсно, легко бачити, що
max (x, y) = IF (x ³ y, x, y).
Тоді програма матиме вигляд:
#include <iostream.h> void main(){
float x, y, max; cin >> x >> y;
max = (x >= y) ? x : y; cout << max;
}
Спосіб 2. За означенням
max (x,y) =
Тоді програма матиме вигляд:
#include <iostream.h> void main(){
float x, y, max; cin >> x >> y; if (x >= y)
max = x; else max = y; cout << max;
}
x, |
x ³ y, |
|
x < y. |
y, |
Приклад 2.8. Скласти програму для знаходження найбільшого з трьох значень, введених з клавіатури.
Розв'язок. Нехай max(… ) визначає найбільше серед чисел, що стоять у дужках. Тоді легко бачити, що max(x,y,z) = max(max(x, y), z). Тому у програмі спочатку визначимо більше зі значень x та y, а вже потім – найбільше серед трьох чисел. Ураховуючи попередній приклад, отримаємо програму:
#include <iostream.h> void main(){
float x, y, z, max; cin >> x >> y >> x; if (x >= y)
max = x; else
max = y;
Розділ 2. Розгалужені програми |
23 |
|
if (z >= max) max = z;
cout << max;
}
Задачі для самостійної роботи
2.28.Визначити більше та менше з двох чисел, введених з клавіатури.
2.29.Дано три дійсних числа. Скласти програму для знаходження числа:
a) найбільшого за модулем; б) найменшого за модулем.
2.30. Дано три дійсних числа x, y і z. Скласти програму для обчислення:
а) max(x + y + z, xy − xz + yz, xyz); б) max(xy, xz, yz).
2.31. Дано три дійсних числа x, y і z. Визначити кількість:
а) різних серед них; б) однакових серед них; в) чисел, що є більшими за їхнє середнє арифметичне значення; г) чисел, що є більшими за введене з клавіатури число a .
2.32. Обчислити значення функцій:
а) |
f (x) = |
x |
; |
в) |
f (x) =sign(x); |
− x2 + 1, |
x ≤ −1, |
||
|
|
|
| x |≤ 1, |
ґ) f (x) = 0, |
|
||
|
2 |
−1, |
x > 1; |
x |
|
б) f (x) = x −1 −1;
г) f (x) = sin x ;
0, x ≤ 0, |
|||
|
2 |
, 0 |
< x ≤ 1, |
д) f (x) = x |
|
||
|
4 |
, x |
> 1. |
x |
|
2.33. Обчислити значення функцій (рис. 2.2.).
|
|
|
|
|
|
2 |
|
|
1 |
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
0 |
1 |
|
|
– 1 |
0 |
1 |
||
|
|
|
|
|
Рис. 2.2 |
|
|
|
2.34. Обчислити значення виразу: |
|
|
|
|||||
|
|
|
|
|
max(x, y + 5), |
x > y, |
|
|
|
|
|
|
z = |
|
|
|
|
|
|
|
|
|
min(x + 1, y,3), x ≤ y. |
|
|
2.35. Обчислити значення x = f ( y) − 6.3 , де y = z + 2 та
24 |
С у задачах і прикладах |
|
y2 |
− 0.3, |
y < 0, |
|
|
|
|
0 ≤ y ≤ 1, |
f ( y) = 0, |
|
||
|
2 |
+ y, |
y > 1. |
y |
|
2.36. Перевірити, чи існує трикутник із заданими сторонами a,b,c. Якщо так, то визначити, який він:
а) гострокутний; б) прямокутний; в) тупокутний. 2.37. Визначити, скільки розв'язків має рівняння та розв'язати його:
а) ax2 + bx + c = 0; |
б) ax4 + bx2 + c = 0. |
2.38. Визначити, скільки розв'язків має система рівнянь і розв'язати її:
a1 x + b1 y + c1 = 0, а) a2 x + b2 y + c2 = 0;
| x | + | y |= 1, б) + + =
ax by c 0.
2.39.Задано два квадрати, сторони яких паралельні координатним осям. З'ясувати, чи перетинаються вони. Якщо так, то знайти координати лівого нижнього та правого верхнього кутів прямокутника, що є їхнім перетином.
2.40.Дано два прямокутники, сторони яких паралельні координатним осям. Відомо координати лівого нижнього та правого верхнього кутів кожного з прямокутників. Знайти координати лівого нижнього та правого верхнього кутів мінімального прямокутника, що містить задані прямокутники.
2.41.Дано два прямокутники, сторони яких паралельні координатним осям. Відомо координати лівого нижнього кута кожного з прямокутників і довжини їхніх сторін. Знайти координати лівого нижнього та правого верхнього кутів мінімального прямокутника, що містить задані прямокутники.
Розділ 3 ЦИКЛІЧНІ ПРОГРАМИ
Означення 3.1. Структура керування, що здійснює повторення певної послідовності команд, називається циклом.
Цикли поділяють на два типи: цикли з лічильником і цикли за
умовою.
3.1. Цикли з лічильником
Як правило, цикли з лічильником використовують для повторення певної послідовності команд наперед задану кількість разів.
Суттєвою відмінністю циклів із лічильником від циклів за умовою є наявність змінної, яка називається лічильником.
Синтаксис циклу з лічильником такий: for (P; F; S){
Q;
}
де Р – ініціалізація змінної-лічильника, F – умова продовження циклу; S
– операція зміни лічильника, що виконується після кожного проходження циклу; Q – тіло циклу.
Правило виконання циклу з лічильником:
1)виконується початкова ініціалізація змінної-лічильника P;
2)перевіряється істинність умови F.
Умова F хибна:
–відбувається перехід на наступний оператор після циклу. Умова F істинна:
–виконується тіло циклу Q;
–виконується операція зміни лічильника S;
–правило повторюється, починаючи з пункту 2).
Наприклад, для виведення на екран усіх натуральних чисел від 1 до 5 у зворотному порядку можна використати такий цикл:
for (i = 5; i > 0; i--){ cout << i;
}
Зауваження. Тіло циклу Q може використовувати змінну-лічильник i як параметр так, як показано на попередньому прикладі. Проте, не ре-
26 |
С у задачах і прикладах |
|
комендується у тілі циклу змінювати лічильник, оскільки це інколи призводить до неочікуваних результатів. Наприклад, цикл
for (i = 5; i > 0 ; i--){ i++;
}
є нескінченним.
Приклади розв'язання задач
Приклад 3.1. Скласти програму для обчислення добутку двох натуральних чисел m і n, використовуючи тільки операцію додавання.
Розв'язок. Легко помітити, що
m × n = n + ... + n .
m разів
Таким чином, програма має вигляд
#include |
<iostream.h> |
void main(){ |
|
int m, |
n, i, s = 0; |
cin >> |
m >> n; |
for (i |
= 1; i <= m; i++){ |
s = |
s + n; |
}
cout << s;
}
Приклад 3.2. Дано натуральне число n. Написати програму для обчис-
лення значень многочлена
xn + xn−1 + ... + x2 + x + 1
при заданому значенні х.
Розв'язок. Розглянемо два способи розв'язання. Спосіб 1. Позначимо zk = xk , k ³ 0 . Тоді цикл
z = 1;
for (i = 1; i <= k; i++){ z = z * x;
}
забезпечить послідовне обчислення у змінній z значень z0 , z1,..., zn .
Таким чином, отримаємо програму
#include |
<iostream.h> |
|
||
void main(){ |
|
|
||
float x, |
y |
= 1, z = |
1; |
|
int n, |
i; |
|
|
|
cin >> |
n |
>> x; |
|
|
for (i |
= |
1; i <= n; |
i++){ |
|
z = |
z |
* |
x; |
|
y = |
y |
+ |
z; |
|
Розділ 3. Циклічні програми |
27 |
|
}
cout << y;
}
Спосіб 2. Скористаємось схемою Горнера. Розставимо дужки так: y = xn + xn–1 +...+ x2 + x + 1 = (...(x + 1) x + 1) x +...+ 1) x + 1.
Отримаємо програму
#include <iostream.h> void main(){
float x, y = 1; int n, i;
cin >> n >> x;
for (i = 1; i <= n; i++){ y = y * x + 1;
}
cout << y;
}
Приклад 3.3. Задано натуральне число n і дійсні числа а1,а2, ... аn.
Знайти max(а1,а2, ... аn).
Розв'язок. Очевидно, що
max(a1 , a2 ,..., an ) = max(...(max(max(a1 , a2 ), a3 ),...), an ).
Нехай у змінній a міститься чергове число послідовності аn, що вводиться з клавіатури. Оскільки кількість членів послідовності аn відома, то для їхнього зчитування використаємо цикл з лічильником. Для визначення максимального числа використаємо змінну max. Таким чином, програма матиме вигляд:
#include |
<iostream.h> |
void main(){ |
|
int n, |
k, a, max; |
cout << "n = "; |
|
cin >> |
n; |
cout << "a(" << 1 << ")= " ; |
|
cin >> |
max; |
for (k |
= 2; k <=n; k++) { |
cout |
<< "a(" << k << ")= " ; |
cin >> a;
if (a > max) max = a;
}
cout << "max(a(1),...,a(" << n << "))= "; cout << max <<'\n';
}
Приклад 3.4. Дано натуральне число n і цілі числа а1, а2,…, аn. Знайти max(а1, а1а2,…, а1а2… аn).
28 |
С у задачах і прикладах |
|
Розвязок. Використаємо змінну a для зчитування чергового члена послідовності. У змінній р обчислюватимемо добуток введених чисел а1, а2,…, що передують a, включаючи саме це число. Використаємо змінну max для визначення максимуму.
#include <iostream.h> void main(){
int n, k, a, p, max; cout << "n = ";
cin >> n;
cout << "a(" << 1 << ")= " ; cin >> max;
p = max;
for (k = 2; k <=n; k++) {
cout << "a(" << k << ")= " ; cin >> a;
p = p * a;
if (p > max) max = p;
}
cout << "max(a(1), ..., a(1)*...*a("; cout << n << "))= ";
cout << max <<'\n';
}
Приклад 3.5. Написати програму для обчислення подвійного факторі-
ала натурального числа n: y = n!! |
|
Розв'язок. За означенням |
|
1× 3 × 5 ×...× n , |
n - непарне, |
n!!= |
|
2 × 4 × 6 ×...× n , |
n - парне. |
В обох випадках маємо як співмножники всі члени спадної арифметичної прогресії із різницею –2 , які містяться між n та 1. Звідси програма
#include <iostream.h> void main(){
int n, k, p;
cout << "n = "; cin >> n; p = 1;
for (k = n; k >= 1; k = k - 2) p = p * k;
// printf("%i!! = %i\n", n, p); cout << n << "!! = " << p << "\n";
}
розв'язує задачу. Зауважимо, що за непарного n останнім значенням k буде 1, а за парного – 2.
Розділ 3. Циклічні програми |
29 |
|
Приклад 3.6. Задано натуральне число n та дійсні числа y1, y2, ... yn. Визначити z1 + z2 + … + zn, де
yi , 0 < yi < 10, zi =
1 , в інших випадках.
Розв'язок. У змінній S обчислюватимемо шукану суму, а у змінній y – значення чергового введеного числа. Подамо програму для розв'язку задачі в такому вигляді:
#include <iostream.h> void main(){
int n;
float y, i, S = 0; cout << "n = "; cin >> n;
for (i = 1; i <= n; i++) { cin >> y;
if (y >= 10 || y <= 0) y = 1; S = S + y;
}
cout << S << "\n";
}
Задачі для самостійної роботи
3.1. Вивести на екран такий рядок: n! = 1*2*3*4*5*...*n
де n – введене з клавіатури число.
3.2.Вивести на екран таблицю множення на 5:
1 x 5 = 5
2 x 5 = 10
...
9 x 5 = 45
3.3.Вивести на екран таблицю:
1 | |
2 | |
3 |... |
| |
n-1 | |
n |
-----------------... |
-------------- |
||||
a+1 | |
a+2 | |
a+3 |... |
| |
a+n-1 | |
a+n |
де a, n – вводяться з клавіатури.
3.4.Написати програму обчислення добутку двох натуральних чисел, використовуючи лише операцію додавання.
3.5.Написати програму обчислення факторіала натурального числа.
3.6.Написати програму обчислення натурального степеня n від дійс-
ного числа а.
30 |
С у задачах і прикладах |
|
3.7. Дано натуральне число n. Написати програми обчислення значень виразів:
а) 2 + 2 + …+ 2 (n коренів); б) 3 + 6 + …+ 3(n −1)+ 3n ;
в) cos π + cos π + cos π + ... + cos π . 2 4 2n
3.8. Дано натуральне число n. Написати програми обчислення значень виразів при заданому значенні х:
а) 1 + (x −1) + (x −1)2 + ... + (x −1)n ;
1 |
|
1 |
|
1 |
|
|
б) 1 + |
|
+ |
|
+ ... + |
|
; |
x2 + 1 |
(x2 + 1)2 |
(x2 + 1)n |
в) 1+sin x +...+sinn x.
3.9. Дано натуральне число n. Написати програму обчислення значень вказаних многочленів при заданому значенні х:
а) |
xn + xn−1 + ... + x2 + x + 1; |
б) nxn + (n −1)xn −1 + ... + 2x2 + x; |
в) |
(nx)n + ((n −1)x)n−1 + ... + (2x)2 + x. |
3.10. Задано натуральне число n і дійсні числа а1, а2,…, аn. Написати
програми знаходження: |
|
а) min(a1, a2 ,..., an ); |
б) max(| a1 |, .. ,| an |); |
в) max(a2 , a4 ,...); |
г) |
min(a1 , a3 ,...); |
ґ) min(a2 , a4 ,...) + max(a1 , a3 ,...); |
д) |
max(a1, a2 , a4 , a8 ,...); |
е) max(−a , a |
2 |
,−a ,..., (−1)n a |
n |
); |
є) max(a , 2a |
2 |
,..., na |
n |
); |
|
||||
1 |
|
3 |
|
|
|
1 |
|
|
|
|
||||
ж) (min(a ,...,a ))2 − min(a2 |
,...,a2 ); |
з) max(a +a ,..., a |
|
+a |
). |
|||||||||
1 |
n |
|
1 |
n |
|
|
1 |
2 |
n−1 |
n |
|
|||
3.11. Дано натуральне число n, цілі числа а1, а2,…, |
|
|
аn. Написати про- |
|||||||||||
грами знаходження кількості: |
|
|
|
|
|
|
|
|
|
|
|
|||
а) парних серед а1, а2,…, |
аn; |
|
|
|
|
|
|
|
|
|
||||
б) повних квадратів серед а1, а2,…, |
аn; |
|
|
|
|
|
|
в) квадратів непарних чисел серед а1, а2,…, аn.
3.12. Дано натуральне число n. Написати програму обчислення факторіала y = n!, використовуючи цикл із лічильником:
а) суцільний зростаючий; б) суцільний спадний.
3.13.Написати програму обчислення подвійного факторіала натурального числа n: y = n!!
3.14.Написати програми обчислення факторіалів:
а) y = (2n)!! |
б) y = (2n + 1)!! |
в) y = n!n!!(n +1)!! |