Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Креневич А.П.,Обвінцев О.В.C в задачах і прикладах

..pdf
Скачиваний:
86
Добавлен:
07.03.2016
Размер:
1.37 Mб
Скачать

Розділ 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

n1

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)!!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]