Завдання на лабораторну роботу
Теоретичні основи
Загальні положення
У більшості мов програмування оператор for називають оператором циклу з параметром, маючи на увазі те, що його використання рекомендується в тих випадках, коли тіло циклу необхідно виконувати для послідовних значень деякої змінної якого-небудь дискретного типу, що є параметром циклу. Цей варіант використання даного оператора типовий і для мови C++, хоча в C++ цикл for має значно більше можливостей і фактично є ще одним оператором циклу із передумовою, що може повністю замінювати оператор while.
Особливості оператора for
Формат циклу for у загальному випадку можна записати у такий спосіб:
for (ініціалізація_циклу; вираз_умова; список_виразів)
тіло_циклу
Тут ініціалізація_циклу – послідовність виразів, поділюваних комами, або опис декількох змінних одного типу з можливою їх ініціалізацією;
вираз_умова – скалярний вираз, що визначає умову продовження виконання тіла циклу (аналогічний тому, що записується в заголовку циклу while);
список_виразів – поділювані комами вирази, значення яких обчислюються на кожному кроці циклу після виконання операторів тіла_циклу і перед наступним обчисленням значення виразу_умови;
тіло_циклу – простий оператор (у тому числі порожній), складений оператор або блок.
У першій секції заголовка циклу for можна або записати один чи декілька виразів зі змінними, оголошеними раніше, або здійснити опис однієї чи декількох змінних. Таким чином, правильними є такі заголовки циклу for:
for (double x = 7.5; x <= 20; x += 0.5)
for (int i = 0, j, k = 7; i + k <= 15; i++)
Після операторів опису змінних
double h = 0.1, b = 20, x;
int i;
можливий такий заголовок циклу for:
for (i = 0, x = b / 2; x < b; x += h)
У той же час наступний заголовок циклу for компілюватиметься з помилками:
for (int i = 0, double x = 0.5; i < 10; i++)
Помилковим буде і такий фрагмент програми:
int i;
for (i = 0, double x = 0.5; i < 10; i++)
Особливості виконання циклу for:
Ø при вході в цикл у першу чергу обчислюються всі вирази, що входять у секцію ініціалізація_циклу, причому це робиться тільки один раз (найчастіше в цій секції заголовка циклу for установлюються початкові значення параметрів циклу та різних лічильників);
Ø далі обчислюється значення виразу_умови і у випадку його істинності виконується тіло_циклу, після чого обчислюються значення виразів з третьої секції заголовка циклу і здійснюється повернення до обробки його другої секції.
Усередині тіла циклу можуть бути присутнім оператори break та continue, дія яких аналогічна їхній дії в операторах while та do … while.
У різних версіях мови C++ сфера дії описів, записаних у першій секції заголовка оператора for, може бути різною. Так, у VC++ вона розповсюджується тільки на заголовок циклу і його тіло. Тому в VC++, наприклад, оператор
for (int s = 0, i = 1; i <= 10; i++)
s += i;
забезпечить правильне обчислення суми перших 10 натуральних чисел, але ця сума виявиться недоступною поза цим оператором, оскільки змінна s, використовувана для обчислення суми, у цій версії мови невідома поза циклом.
Будь-яка з секцій заголовка (у тому числі й всі три) може бути опущена, однак у випадку відсутності якої-небудь із них наступний за нею символ «крапка з комою» повинен бути збережений. Зокрема, відсутність виразу_умови позначає нескінченний цикл, з якого можливий тільки примусовий вихід. Отже, припустимим є навіть такий оператор:
for ( ; ;) ; // Нескінченний цикл
У кожному з наступних шести рядків програмного коду оператор for використовується для організації обчислення суми перших 10 натуральних чисел:
int s = 0; for (int i = 1; i <= 10; i++ ) s += i;
int s = 0; for (int i = 1; i <= 10; i++, s += i);
int s = 0; for (int i = 1; i <= 10; s += i++);
int s = 0; for (int i = 1; i <= 10; ) s += i++;
int s = 0, i = 1; for ( ; i <= 10; ) s += i++;
int s = 0, i = 0; for ( ; ++i <= 10; ) s += i;
Щоб цикл for не виявився нескінченним, необхідно забезпечити змінення значення хоча б однієї змінної, що присутня у виразі_умові. Це змінення може бути здійснено або при обчисленні безпосередньо виразу_умови (див. вище шостий приклад), або при виконанні операторів тіла_циклу (див. вище четвертий і п’ятий приклади), або при обчисленні виразів зі списку третьої секції заголовка (див. вище перші три приклади).
Якщо вираз_умова не змінює своє значення, то цикл буде нескінченним. Наприклад, задача підсумовування перших 10 натуральних чисел може бути розв’язана так:
int s = 0, i = 1;
for ( ; 1; )
{
s += i++;
if (i == 11)
break;
}
Як й інші оператори циклу, оператор for допускає довільну кількість рівнів вкладеності, причому дозволяється комбінування будь-яких операторів циклу. Типовою помилкою при використанні вкладених операторів for є використання однієї й тієї ж змінної для організації зовнішнього та внутрішнього циклів. Наприклад, фрагмент програми, аналогічний наведеному нижче фрагменту, будучи синтаксично правильним, практично завжди є помилковим:
int i;
for (i = 1; i <= 10; i++)
{
// ...
for (i = 0; i <= 25; i++)
{
// ...
}
// ...
}
Вкладені оператори for, в яких у секції ініціалізація_циклу описується та сама змінна, у багатьох випадках можуть бути виправдані, але вони в такому випадку погано сприймаються людиною. Мова йде про оператори наступного вигляду:
for (int i = 1; i <= 10; i++)
{
// ...
for (int i = 0; i <= 25; i++)
{
// ...
}
// ...
}
Конструкції подібного роду варто уникати в розроблюваних програмах.
Приклади програм
Приклад 1. Дано натуральне число n і послідовність дійсних чисел , , …, . Обчислити
.
Розв’язок.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
double a, Sum;
int i, n;
cout << "Enter the number of sequence members: n = ";
cin >> n;
Sum = 0; // Початкове значення суми
for (i = 1; i <= n; i++) // Цикл уведення чисел та їх
{ // підсумовування
cout << "Enter member " << i << ": ";
cin >> a;
Sum += a;
}
cout << "The output is " << cos(Sum)<< endl;
cout << "Press any key";
_getch();
return 0;
}
Приклад 2. Дано натуральні числа m, n. Обчислити
.
Розв’язок.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int m, n;
int i, j, k;
double Sum, Sum_j;
cout << "m = ";
cin >> m;
cout << "n = ";
cin >> n;
k = 1; // Нульовий степінь числа -1
Sum = 0; // Початкове значення суми
for (i = 1; i <= m; i++) // Цикл обчислення
{ // загальної суми
Sum_j = 0; // Початкове значення внутрішньої суми
for (j = 1; j <= n; j++) // Цикл для обчислення
Sum_j += double(i) / (i + j); // внутрішньої суми
Sum += k * (i + 1) * Sum_j;
k = -k; // Наступний степінь числа -1
}
cout << "The sum is " << Sum << endl;
cout << "Press any key";
_getch();
return 0;
}
Завдання на лабораторну роботу
За час, відведений для виконання лабораторної роботи (2 академічні години), студент повинен:
1. Розробити алгоритм розв’язання задачі, запропонованої для програмування.
2. Здійснити програмну реалізацію розробленого алгоритму.
3. Здійснити налаштування програми, виправивши синтаксичні та логічні помилки.
4. Підібрати тестові дані для перевірки програми, включаючи виняткові випадки.
5. Оформити звіт до лабораторної роботи.
6. Відповісти на контрольні запитання.
7. Здати викладачу працездатну програму з демонстрацією її роботи на декількох варіантах вихідних даних.
Варіанти задач
1. Дано натуральне число n. Обчислити
.
2. Дано дійсні числа x, a, натуральне число n. Обчислити значення наступного виразу:
.
3. Дано натуральне число n і дійсне число x. Обчислити значення виразу
.
4. Дано натуральне число n і дійсне число x. Обчислити значення такого виразу:
.
5. Дано натуральне число n і дійсне число x. Обчислити значення виразу
6. Послідовність чисел Фібоначчі утворюється за законом ; ; , Дано ціле невід’ємне число . Одержати .
7. Дано ціле невід’ємне число n. Одержати послідовність , , …, , утворену за законом
; ; , ,
де , , … – послідовність Фібоначчі: ; ; ,
8. Дано натуральне число n, . Обчислити
.
9. Дано натуральне число n і дійсне число x. Обчислити
.
10. Нехай ; ; ; , Дано дійсні числа r, s і натуральне число n. Знайти значення
.
11. Нехай ; , Дано натуральне число n ( ). Знайти значення
.
12. Дано натуральні числа m, n. Одержати всі їх натуральні спільні кратні, менші mn.
13. Дано дійсне число a і натуральне число n. Обчислити
.
14. Дано натуральне число n і дійсне число x. Обчислити значення такого виразу:
.
15. Дано натуральне число n і дійсне число x. Обчислити значення наступного виразу:
.
16. Дано натуральне число n. Обчислити добуток перших n співмножників:
17. Обчислити
,
де
18. Дано натуральне число n і дійсні числа , , …, . Визначити .
19. Дано натуральне число n і послідовність дійсних чисел , , …, . Знайти довжину найменшого відрізка числової осі, що містить всі числа цієї послідовності.
20. Дано натуральне число n. Одержати всі його натуральні дільники.
21. Дано натуральне число n і дійсні числа , , …, . Чи вірно, що від’ємних членів у послідовності , , …, менше, ніж додатних?
22. Дано натуральне число n і дійсні числа , , …, . У послідовності , , …, визначити кількість сусідства двох чисел різного знака.
23. Дано натуральне число n і дійсні числа , , …, . У послідовності , , …, визначити кількість сусідства двох чисел одного знака таких, що модуль першого числа менше модуля другого числа.
24. Дано натуральне число n, дійсні числа , , …, . Обчислити суму чисел , , …, , які перевищують за величиною всі числа , , …, .
25. Дано натуральне число n. Для виразу
обчислити добуток перших n співмножників з тих, знаменники яких не кратні трьом.
26. Нехай здійснюється оцінювання результатів виступу спортсменів. Система оцінювання така. Якщо є n оцінок, то виключається найбільша з них (якщо їх декілька, то виключається тільки одна). Аналогічно виключається найменша з оцінок. Як підсумкова оцінка береться середнє арифметичне оцінок, що залишилися після виключення.
Дано натуральні числа n, , , …, ( ). Вважаючи, що числа , , …, – це оцінки, виставлені суддями одному з учасників змагань, визначити його підсумкову оцінку.
27. Дано натуральне число n. Здійснити генерування n натуральних випадкових чисел з інтервалу [0, 99] і виконати перевірку того, що кількість непарних чисел при цьому становить ( ) % від їхньої загальної кількості. Відповіддю повинне бути одне з повідомлень Yes і No.
28. Дано натуральне число n. Обчислити
а) ; | б) ; |
в) ; | г) . |
29. Дано дійсне число x і натуральне число n. Обчислити
а) ; | б) ; |
в) ; | г) . |
30. Дано натуральне число p. Вивести в порядку зростання всі укладені між 0 і 1 прості нескоротні дроби, знаменники яких не перевищують p.
5. Контрольні запитання
1. Як у загальному випадку записується оператор for? Охарактеризуйте призначення основних його складових частин.
2. У чому особливості виконання оператора for?
3. Коли використання оператора for є доцільним?
4. Чи може в операторі for бути опущена секція ініціалізація_циклу? При позитивній відповіді на запитання, поясніть особливості роботи оператора в цьому випадку.
5. Чи може в операторі for бути опущена секція ініціалізація_циклу? При позитивній відповіді на запитання, поясніть особливості роботи оператора в цьому випадку.
6. Чи може в операторі for бути опущена секція список_виразів? При позитивній відповіді на запитання, поясніть особливості роботи оператора в цьому випадку.
7. Чи може в операторі for бути опущено тіло_циклу? При позитивній відповіді на запитання, поясніть особливості роботи оператора в цьому випадку.
8. Як в операторі for виконуються оператори break і continue?
9. Як організується нескінченний цикл за допомогою оператора for?
10. Чи можливе використання вкладених операторів for?
11. Знайдіть помилку в наведеному нижче фрагменті програми:
int s = 0, i = 0;
for ( ; ++i <= 10; );
s += i;
12. Знайдіть помилку в наведеному нижче фрагменті програми:
for (int sum = 0, c = 50; c < 10; c--)
sum += c;
13. Знайдіть помилку в наведеному нижче фрагменті програми:
for (int sum = 0, k = 11; k < 40; +k)
sum += k;
Список літератури
1. Страуструп, Б. Язык программирования Си++ : Второе издание / Б. Страуструп. – К. : ДиаСофт, 1993. – Ч. 1. – 264 с. ; Ч. 2. – 296 с.
2. Керниган, Б. Язык программирования Си / Б. Керниган, Д. Ритчи. – М. : Финансы и статистика, 1992. – 272 с.
3. Либерти, Джесс. Освой самостоятельно С++ за 21 день : учеб. пособ. / Джесс Либерти. – М. : Вильямс, 2001. – 816 с.
4. Подбельский, В. В. Программирование на языке Си / В. В. Подбельский, С. С. Фомин. – М. : Финансы и статистика, 1999. – 600 с.
5. Подбельский, В. В. Язык Си++ / В. В. Подбельский. – М. : Финансы и статистика, 1999. – 560 с.
6. Савитч, Уолтер. Язык C++. Курс объектно-ориентированного программирования / Уолтер Савитч. – М. : Вильямс, 2001. – 704 с.
Навчальне видання
Методичні вказівки
до лабораторної роботи
«Керування процесом обчислень за допомогою
оператора for у програмах мовою C++»
з курсу «Програмування» для студентів напряму 6.040302 – Інформатика
і курсу «Програмування та алгоритмічні мови» для студентів напряму
6.040303 – Системний аналіз
Укладачі: БЕЗМЕНОВ Микола Іванович,
БЕЗМЕНОВА Ольга Миколаївна
Відповідальний за випуск О. С. Куценко
Роботу до видання рекомендував О. В. Горелий
За авторською редакцією
План 2013 р., поз. 10/40–13
Підписано до друку __.__.2013 р. Формат 60´84 1/16. Папір офсетний.
Друк – ризографія. Гарнітура Таймс. Ум. друк. арк. _______.
Обл.-вид. арк. 0,8. Тираж 50 прим. Зам. №___ . Ціна договірна.
________________________________________________________
Видавничий центр НТУ «ХПІ».
Свідоцтво про державну реєстрацію ДК№ 116 від 10.07.2000 р.
61002, Харків, вул. Фрунзе, 21.
________________________________________________________
Друкарня НТУ «ХПІ»
61002, Харків, вул. Фрунзе, 21.