
- •§ 2. Типи даних
- •§ 3. Присвоєння
- •§ 5. Потоки. Введення - виведення даних
- •§ 6. Адреси даних. Вказівники. Динамічна пам'ять
- •§ 7. Файли
- •§ 8. Розгалуження
- •§ 9. Цикли
- •§ 10. Функції (1)
- •§ 11. Функції (2)
- •§ 12. Масиви
- •§ 13. Рядки
- •§ 14. Структури, списки, стеки, черги, об'єднання
- •§ 15. Графіка
- •§ 16. Вступ до об'єктно-орієнтованого програмування
- •§ 1. Вступ до візуального програмування
- •§ 2. Задача про анкету
- •§ 3. Задача про обмін валюти
- •§ 4. Задача табулювання функції
- •§ 5. Створення навчальної програми
§ 9. Цикли
Цикл (повторення) - це процес виконання певного набору і команд деяку кількість разів. У мові С++ є три команди і for, while та do-while.
Команда циклу з лічильником for. Команда for має вигляд
for (<вираз 1>; <логічний вираз 2>; <вираз 3>) <команда 1>;
Вираз 1 призначений для підготовки циклу і виконується один раз. Переважно тут задають початкові значення змінних циклу (підготовляють цикл). У виразі 2 записують умову виходу із циклу. У виразі 3 - команди зміни параметрів циклу. Якщо за допомогою одного із виразів необхідно виконати декіль-іси дій, то використовують команду "кома". Вирази 1 і 3 або один із них у команді for можуть бути відсутні. У цьому випадку опускати символ ";" не можна. Наприклад, for (; і<10 ;) і++;.
Дія команди.
Обчислюються значення виразів 1 і 2.
Якщо значення виразу 2 істине - виконується команда 1. Якщо хибне - виконавець програми переходить до наступної після for команди.
Обчислюються значення виразів 3 та 2 і перевіряється пункт 2).
Приклад 1. Суму цілих чисел з проміжку від 1 до 15 можна обчислити одним із способів:
1) int n = 1, S = 0;
for (; n < 16; n++) S += n;
2) for (int n = 1, S = 0; n< 16; n++)S+=n;
3) for (int n = 1, S = 0; n< 16; S+= n++);
4) for (int n = 1, S = 0; n < 16; S += n, n++);
У результаті виконання команд змінній 5 буде присвоєно значення 120. Зауважимо, що у способі 2) for (int n = 1, S = 0; n< 16; n++)S+=n; змінні 5 і п ініціалізовано (оголошено) безпосередньо у команді циклу for.
Приклад 2. Кількість і добуток усіх парних цілих чисел із проміжку від 4 до 11 можна обчислити так:
int n, D, kil;
for(D = 1, kil = O, n = 4; n<=11;n+=2)
{
D*=n; kil++;
}
У результаті винконання програми одержимо D = 1920, кіі = 4.Враховуючи приклад 1, наведіть інші можливі способи написння команди for.
Зауваження 1. Часто у циклах корисно застосовувати команди break і continue. Команда break достроково припиняє роботу циклу і забезпечує перехід до наступної після циклу команди. Команда continue припиняє виконання поточної ітерації та починає виконувати наступну ітерацію (повторення) циклу. Зазвичай ці команди належать до деякої умовної команди. Наприклад, якщо виконуєватиметься певна умова, то буде вихід з циклу, або, якщо умова не виконуватиметься, то буде перехід до наступної ітерації тощо.
Приклад 3. Визначити, чи число а просте, можна так:
for (int n = 2, р = 1; n<= (int)sqrt((double)a); n ++)
if (!(p = a%n)) break;
p ? cout « "просте": cout « "складне";
Задача 1 (про таблицю мір). Побудувати таблицю відповідності між унціями та грамами, якщо 1 унція = 28,353495 г. Початкове значення кількості унцій (uncia), крок зміни (krok) цього значення та кількість рядків (kil) у таблиці задати самостійно у режимі діалогу.
// Програма відповідності мір
#include <iostream.h>
#include <conio.h>
void main()
{
clrscr();
float uncia, gram, krok;
int kil, n;
cout « "Введіть початкове значення унцій, \n"« " крок зміни та кількість рядків у таблиці\n";
сіп » uncia » krok » kil;
cout « "_____________" « "\n";
cout « "Унції Грами " « "\n";
cout « "_____________" « "\n";
for (n = 1; n <= kil; n++)
{
gram = 28.353495 * uncia;
cout« uncia « "\t" « gram « endl;
uncia += krok;
} cout<< "_______________" << ";
getch();
}
Задача 2 (про випадкову величину). Нехай випадкова величина X отримує значення з деякими ймовірностями
Обчислити
математичне сподівання ди
спесію
і середнє квадратичне відхилення
випадкової величини X.
// Математична статистика
#include <iostream.h>
#include <conio.h>
#include <math.h>
#define N 4
void main()
{
clrscr();
float x, p, M = 0, M2 = 0, D, S;
for (int k = 1; k <= N; k++)
{
cout << "Введіть x " <<k << "-те та р" << k << "-те\п"; сіп >> x >> p;
M += x * p; M2 += pow(x, 2) * p;
} cout << "\n M=" << M;
D = M2 - pow(M, 2); S = sqrt(D);
cout.precision(3); // Для заокруглення до трьох знаків після коми
cout << "\п D=" << D << "\п Sigma=" << S;
getch();
}
У результаті виконання програми одержимо М = 1,8; D = 0,21; Sigma = 0,458.
Задача З (про табулювання функції і пошук даних). Протабулювати функцію у = 2sinx на проміжку [0; 2,5] з кроком h = 0,1 та обчислити середнє арифметичне (si) значень функції більших ніж 0,5, і менших ніж 1,5.
// Табулювання функції'
#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{
clrscr(); // Очищаємо екран
float x, h = 0.1,y, s1 =0;
float a = 0, b = 2.5 + h / 2; int n = 0;
cout << " X Y \n";
for(x = a; x <= b; x += h)
{
у = 2*sin(x); // Обчислюємо у
cout << x << "\t" << у << "\n";
if (y > 0.5 && у < 1.5) // Обчислюємо суму та
{ // кількість значень функції у,
n++; s1 += у; // які задовольняють задану умову
}
}
If (n) // Якщо п не дорівнює 0, то
{ II обчислюємо та виводимо
s1 /= n; // на екран середнє арифметичне
cout << "S = " << s1; // шуканих значень функції
} else // Якщо шукані дані відсутні, буде подано звуковий сигнал та
cout << "\а Таких значень немає"; // виведено відповідне повідомлення getch(); }
Зауваження 2. Ураховуючи специфіку комп'ютерної арифмети-ки, щоб не втратити останнього значення функції, у будові циклу while до останнього значення (х — 2,6) додаємо деяке зміщення, у цьому випадку h / 2.
Команда циклу з передумовою (while) має вигляд
while (<вираз>) <команда
Дія команди.
1) Обчислюється значення виразу. Якщо ноно істинне, то переходимо до пункту 2), якщо хибне до пункту 3).
2) Виконується команда 1 і відбувається перехід до пун-кту 1).
3) Відбувається перехід до наступної після while команди. Виразом може бути довільний логічний вираз, стала або змінна цілого типу. Якщо треба перевірити декілька умов, то застосовують команду "кома". Команда 1 може бути порожньою, простою або складеною.
Команда while може бути виконана один раз, декілька разів або не бути виконана жодного разу.
Приклад 4. Нехай х = 4, s = 0, d = 1. Після виконання команд
while (х <= 8) {s += х; х++;}
while (x> 10) d *=x;
s = 0 + 4 + 5 + 6 + 7 + 8 = 30, х = 9, а змінна d свого значення (1) не змінить, оскільки значення виразу х > 10 хибне, і тому команда d *= x у циклі while виконуватись не буде.
Приклад 5. Визначити обсяг вільної у певний момент оперативної пам'яті можна так:
int n = 0;
while (new char) n++;
або так:
for (int n = 0; new char; n++);.
Задача 4 (про суму цифр натурального числа). Для заданого натурального числа п підрахувати суму його цифр
#include <iostream.h>
void main()
{
int S = 0, n, m;
cout << "Введіть число"; сіп >> n;
m = n;
while (m > 0)
{
S+=m% 10;
m/=10;
} cout << "Сума цифр числа " << n << " дорівнює " << S;
}
Задача 5 (про суму елементів знакозмінного ряду, послідовності). Нехай х - деяке число, яке необхідно ввести з клавіатури під час виконання програми, є = 0,001 - точність
обчислень. Обчислити суму елементів знакозмінного ряду
Визначити кількість доданків. Вивести на екран результати обчислень.
// Програма Сума 1
#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{
clrscr();
const float e = 0.001;
float x,a, S = 0;
int n = 0, fact = 1;
cout << "Введіть x \n";
cin >> x;
a = -2 * x;
while (fabs(a) > e) // Умова закінчення обчислень
{
S += a; n++; fact *= n;
a = pow(-1, n) * pow(2 * x, n) / fact;
}
cout.precision(2);
cout << "S = " << S << "\n";
cout << "Кількість доданків = " << n;
getch();
}
Зауваження З. Розглянемо ще один спосіб (більш економний) розв'язування задачі 4. Для обчислення значень послідовності ап побудуємо рекурентну формулу, тобто виразимо ап через аn-1. Отже,
3. Команда циклу з післяумовою do-while має вигляд
do <команда 1>; while (<вираз>);
Дія команди.
1) Виконується команда 1 і обчислюється значення виразу.
2) Якщо значення виразу істинне, то див. пункт 1), якщо значення виразу хибне - відбувається перехід до наступної після do-while команди.
Команда 1 у циклі do-while, на відміну від циклу while, буде виконуватись хоча б один раз завжди.
Приклад 6. Нехай цілі змінні х, у мають значення х = 5, у = 0. У результаті виконання команд
do
{
у += х; z = 2 * х; х -= 2;
}
while (x>1);
змінні х, у, z набудуть таких значень: у — 0 + 5 + 3 =8, z = 6, х = 1.
Задача 6 (про розклад числа на прості множники). Розкласти на прості множники задане натуральне число. Кількість виведень кожного множника дорівнює його кратності у розкладі.
#include <iostream.h>
void main()
{
int і, п;
cout << "Введіть число"; сіп >> n;
cout << "\n n = 1";
for(i = 2; і <= n; i++)
{
if (n % i) continue;
do
{
cout << " *" << i;
n/=i;
}
while(!(n%i));
}
}
Задача 7 (про максимальне значення функції). Протабу-лювати функцію у = 2cosx на проміжку [-π; π ] з кроком h = π /4. Результати обчислень вивести на екран або у файл за вибором виконавця у вигляді таблиці. Визначити найбільше значення функції (max) на цьому проміжку, а також з'ясувати, для якого х (хтах) воно досягається.
Максимальне чи мінімальне значення функції, або зна-чення, які задовольняють деяку умову пошуку, визначають методом сканування (перегляду) всіх значень функції та порівняння їх з деяким еталоном.
// Табулювання функції
#include <fstream.h>
#include <conio.h>
#include <math.h>
void main()
{
clrscr();
ofstream tabfile("tabul.txt", ios::out);
const float pi = 3.1415926;
float x = -pi, h = pi / 4, y, max, xmax;
max = 2 * cos (x);
xmax = x;
cout.precision(2);
cout << " X Y" << "\n";
tabfile << " X Y" << "\n";
do
{
у = 2 * cos (x) + 1.75;
cout << x << "\t" << у << "\n";
tabfile << x << "\t" << у << "\n";
if (y > max)
{
max = y;
xmax = x;
} x+= h;
}
while (x <= pi + h / 2);
cout << "\n Max = " << max << "\n";
cout << "xmax = " << xmax << "\n";
tabfile << "\n Max = " << max << "\n";
tabfile << "xmax = " << xmax << "\n";
tabfile.
close();
getch();
}
Порівняйте результати, виведені на екран і у файл.
Зауваження 4. У попередній програмі замість оголошення сталої const float pi = 3.1415926 можна було використати стандартну сталу М_РІ, яка описана у модулі math.h.
Для чисел від 1 до 10 обчисліть квадратні короні, кубічні корені та корені четвертого степеня. Результати наведіть у нигляді таблиці.
Виведіть на екран у вигляді таблиці номери і значення перших десяти елементів числової послідовності, загальний елемент якої має такий вигляд: 7 – 5sini2.
Серед перших 20 елементів числової послідовності 3 - Ззіпі2 виведіть на екран номери і значення лише від'ємних елементів, і = 1, 2,..., 20.
Розгляньте елементи числової послідовності б - Зссв2і від 10-го до 20-го і виберіть серед них (виведіть їхні номери на екран) більші, ніж 4.
Модифікуйте програму Табулювання функції і визначте її мінімальне значення на заданому проміжку.
Нехай дискретна випадкова величина має розподіл
Обчисліть математичне сподівання, дисперсію та середнє квадратичне відхилення.
9. Відомо статистичний ряд (вибірка) випадкової величини X
1 * Обчисліть середнє вибіркове значення , вибіркову дисперсію
та середнє квадратичне відхилення
10. Модифікуйте програму Сума 1, використовуючи рекурентну формулу.
І 1. Напишіть програму, яка у всю вільну доступну в поточний момент оперативну пам'ять комп'ютера записує деяке число.
Складіть програму, яка виводить на екран усі прості натуральні числа до певного заданого числа п.
Розв'яжіть задачу № 6 з розділу "Задачі" вашого варіанта. Результати програми виведіть на екран і у файл.
Розв'язжіть задачу № 7 з розділу "Задачі" вашого варіанта. Результати виведіть на екран і у файл.
16. Розв'яжіть задачу № 8 з розділу "Задачі" двома способами: а) використовуючи програму-зразок Сума 1; б) модифікувавши програму, враховуючи зауваження 1. Результати обчислень виведіть на екран і у файл. Порівняйте отримані результати.
16. Розв'яжіть задачу № 9 вашого варіанта з розділу "Задачі". Результати обчислень виведіть на екран і у файл у вигляді таблиці пар чисел х, у.