• Главная
  • Карта сайта
Не найдено

§8 Інструкції циклів. Інструкції while, do while, break і continue. вкладені цикли

  1. інструкції циклів Цикли призначені для періодичного виконання одних і тих же інструкцій по умові....
  2. Інструкція do while
  3. Інструкції break і continue
  4. вкладені цикли
  5. питання
  6. Домашня робота
  7. Презентація до уроку

інструкції циклів

Цикли призначені для періодичного виконання одних і тих же інструкцій по умові. У C ++ є кілька різновидів інструкцій циклів:

  • Цикл з передумовою while
  • Цикл з умовою поста do while
  • Цикл з параметром for

Один вид циклу цілком можна замінити іншим видом. Тобто інструкції циклів взаємозамінні і вибираються розробником виходячи з типу вирішуваних завдань. Одна або більше (складова) інструкція, яка входить в блок циклу, називається "тілом циклу". Одноразове виконання інструкцій циклу (крок) називається итерацией.

Інструкція while

Алгоритмічну структуру "цикл з передумовою" в мові програмування C ++ реалізує інструкція while. Блок-схема:
Алгоритмічну структуру цикл з передумовою в мові програмування C ++ реалізує інструкція while
синтаксис

while (умова) {Інструкції тіла циклу}

  • Умова виходу з циклу має бути скалярним виразом. Поки умова має значення, відмінне від нуля або true виконується тіло циклу;
  • Якщо перевіряється умова помилкова спочатку, то інструкції, що входять в тіло циклу, не виконуються, а виконуються інструкції, що знаходяться за блоком;
  • Якщо в тілі циклу тільки одна інструкція, то {} можна опустити;
  • "Нескінченний цикл" можна організувати наступними умовами: while (true) {} або while (1) {}

Цикл while є універсальним циклом. Однак, від програміста потрібно так формулювати умова виходу з циклу, щоб завершення його роботи відбувається за певну кількість ітерацій. Домогтися цього можна, якщо в тілі циклу запрограмувати зміну значень змінних впливають на умову. Найчастіше, в якості такої змінної виступає лічильник. Якщо лічильник на кожному кроці циклу збільшується (або зменшується) на одиницю, то застосовується операція префіксного або Постфіксний инкремента (або декремента). Розглянемо приклад.
Програма 8.1 Вивести на екран всі цілі ступеня числа 2 від 0 до n.

#include <iostream> #include <iomanip> using namespace std; int main () {int n, p = 1, i = 0; cout << "Введіть число> 0 і <31" << endl; cout << "n ="; cin >> n; cout.setf (ios :: left); while (i <n) {++ i; p * = 2; cout << "2 ^" << setw (2) << i << "=" << p << endl; } Return 0; } Введіть число> 0 і
Цю програму можна переписати з використанням операції побітового зсуву вліво на 1 (кількість зрушень буде рівносильно зведенню в відповідну ступінь числа 2). Тоді інструкцію в рядку 12 потрібно переписати так: p = p
Дана операція низкоуровневая і, отже, виконується набагато швидше. При побітового зсуві відбувається зсув бітів вихідного числа (вліво на 1, для даного прикладу).
Той факт, що в якості умови може бути будь-який вираз скалярного типу широко використовується для того, щоб зробити код програми більш компактним. Наприклад: while ((ch = cin.get ())! = '#'), Або while (cin >> str), або while (n--). Такий підхід дуже зручний, але при цьому не слід забувати, що код програми повинен бути зрозумілий. До того ж складні умови таять "підводні камені". Невірно складений програмний код може привести до "зациклення" (неможливості виходу з циклу). Розглянемо приклад.
Програма 8.2 Дано ціле число N і набір з N дійсних чисел (вводяться з клавіатури). Вивести суму і твір чисел з даного набору. #include <iostream> using namespace std; int main () {int n, s = 0, p = 1, d; cout << "n ="; cin >> n; while (n--) {cin >> d; s + = d; p * = d; } Cout << "s =" << s << endl << "p =" << p << endl; return 0; } N = 10 1 2 3 4 5 6 7 8 9 2 s = 47 p = 725760

Інструкція do while


Алгоритмічну структуру "цикл з умовою поста" в мові програмування C ++ реалізує інструкція do while. Блок-схема:
Алгоритмічну структуру цикл з умовою поста в мові програмування C ++ реалізує інструкція do while
Синтаксис do {Інструкції тіла циклу} while (умова)

  • Тіло циклу (одна або більше інструкцій) буде виконано хоча б один раз;
  • Поки умова має значення, відмінне від нуля або true - виконується тіло циклу;
  • Якщо перевіряється умова помилкова спочатку, то інструкції, що входять в тіло циклу, будуть виконані один раз, потім відбудеться вихід з циклу.

Цей різновид циклу зручно використовувати, коли необхідно аналізувати вхідні дані.
У складеній нами раніше програмі 8.1 є явний недолік: ми просимо користувача не вводити число більше певного значення, але сам ввід не контролюємо. Виправити ситуацію допоможе цикл do while:
Програма 8.3 Див. Ін. 8.1

#include <iostream> #include <iomanip> using namespace std; int main () {int n, p = 1, i = 0; do {cout << "n ="; cin >> n; if (n> 30 || n <= 0) cout << "Введіть число менше 30" "але більше 0" << endl; } While (n> 30 || n <= 0); cout.setf (ios :: left); while (i <n) {++ i; p * = 2; cout << "2 ^" << setw (2) << i << "=" << p << endl; } Return 0; }

Тепер програма НЕ продовжить свою роботу до тих пір, поки користувач не виконає обов'язкові вимоги. Ще один приклад.
Програма 8.4 Вводиться послідовність чисел, 0 - кінець послідовності. Визначити, чи містить послідовність хоча б два рівних сусідніх числа. У послідовності має бути більше 2-х чисел.

#include <iostream> using namespace std; int main () {int a, b, i = 0; bool f = false; cout << "Введіть числа послідовності:" << endl; cout << "[" << ++ i << "] =>"; cin >> a; cout << "[" << ++ i << "] =>"; cin >> b; do {if (a == b) f = true; a = b; cout << "[" << ++ i << "] =>"; cin >> b; } While (b! = 0); if (f) cout << "Знайдено рівні сусіди."; else cout << "Рівних сусідів немає."; return 0; } Введіть числа послідовності: [1] => 3 [2] => 4 [3] => 7 [4] => 2 [5] => 2 [6] => 9 [7] => 5 [8] => 0 Знайдено рівні сусіди.

Розробимо за допомогою циклу do while і функції random () невелику ігрову програму "Вгадай число!". Суть гри в тому, щоб за n-е число спроб користувач зміг вгадати, яке число (випадкове число генерується random ()) загадав комп'ютер. Якщо гравець не вкладеться в необхідне число спроб, то виграв комп'ютер, інакше переміг гравець.
програма 8.5

#include <iostream> #include <random> #include <ctime> using namespace std; int main () {int n = 10, k, a; default_random_engine rnd (time (0)); uniform_int_distribution <unsigned> d (1, 100); k = d (rnd); cout << "У вас" << n << "спроб" << endl; do {cout << "Спроба" << 11 - n << ". Яке число загадав комп'ютер? \ n ->"; cin >> a; if (a> k) cout << "багато" << endl; else if (a <k) cout << "мало" << endl; else cout << "Ви виграли!" << endl; --n; if (! n) {cout << "Ви програли!"; break;}} while (a! = k); return 0; } У вас 10 спроб Спроба 1. Яке число загадав комп'ютер? -> 50 мало Спроба 2. Яке число загадав комп'ютер? -> 60 мало Спроба 3. Яке число загадав комп'ютер? -> 70 Ви виграли!

Інструкції break і continue

У програмі 8.5 для того щоб перервати гру, якщо перевищено число спроб, використовується інструкція break. Інструкція break перериває виконання циклів while, do while і for, а також інструкцію вибору switch і передає управління програмою інструкції, наступної за блоком, в якому вона знаходиться.
Програма 8.6 Дано натуральне число n. Визначити, чи є воно простим.

#include <iostream> using namespace std; int main () {int n, i = 2; bool k = true; cout << "n ="; cin >> n; while (i <= n / 2) {if (! (n% i)) {k = false; break; } I ++; } Cout << "Кількість" << n << (k? "Просте": "не є простим"); return 0; } N = 15 Число 15 не є простим

Якщо знайдений дільник числа, то немає необхідності переглядати всі можливі подільники числа, досягнувши граничного умови. Потрібно негайно перервати виконання циклу.
На відміну від break - continue перериває виконання тільки поточної ітерації і передає виконання на обчислення умови. При цьому інструкції, наступні за continue до кінця блоку, ігноруються. Дана інструкція застосовується не часто, але може бути використана для контролю допустимості значень в виразах тіла циклу.
Потрібно вивести значення функції f (x) = 1 / x з кроком 1 на відрізку від -20 до 20. Значення x == 0, в якому функція невизначена, має бути пропущено.
програма 8.7

#include <iostream> using namespace std; int main () {int i = -20; while (i <= 20) {if (! i) {i ++; continue; } Cout << showpos << scientific << 1 / double (i) << endl; i ++; } Return 0; } -5.000000e-02 -5.263158e-02 ... -1.000000e +00 + 1.000000e +00 ... + 5.263158e-02 + 5.000000e-02

Слід сказати, що багато розробників намагаються не використовувати в циклах інструкції break і continue, так як цілком можна обійтися і без них. Однак, останні підвищують читаність програми.

вкладені цикли

Коли на кожному кроці циклу потрібно виконувати деякі інші циклічні операції застосовується структура вкладених циклів, тобто один цикл знаходиться всередині іншого циклу. Постановка завдання: Вивести таблицю множення в шістнадцятковій системі числення.
програма 8.8

#include <iostream> #include <iomanip> using namespace std; int main () {int i = 1; while (i <17) {i ++; int j = 1; while (j <17) {j ++; cout << hex << uppercase << setw (4) << i * j; } Cout << '\ n'; } Return 0; } 1 2 3 4 5 6 7 8 9 ABCDEF 10 2 4 6 8 ACE 10 12 14 16 18 1A 1C 1E 20 3 6 9 CF 12 15 18 1B 1E 21 24 27 2A 2D 30 4 8 C 10 14 18 1C 20 24 28 2C 30 34 38 3C 40 5 AF 14 19 1E 23 28 2D 32 37 3C 41 46 4B 50 6 C 12 18 1E 24 2A 30 36 3C 42 48 4E 54 5A 60 7 E 15 1C 23 2A 31 38 3F 46 4D 54 5B 62 69 70 8 10 18 20 28 30 38 40 48 50 58 60 68 70 78 80 9 12 1B 24 2D 36 3F 48 51 5A 63 6C 75 7E 87 90 A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 B0 C 18 24 30 3C 48 54 60 6C 78 84 90 9C A8 B4 C0 D 1A 27 34 41 4E 5B 68 75 82 8F 9C A9 B6 C3 D0 E 1C 2A 38 46 54 62 70 7E 8C 9A A8 B6 C4 D2 E0 F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1 F0 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0 100

Один вид циклу може бути вкладений в цикл іншого виду. Розглянемо класичну задачу розкладання на прості множники.
Програма 8.9 Дано ціле число. Розкласти число на прості множники.

#include <iostream> using namespace std; int main () {int n; cout << "n ="; cin >> n; int k = n; for (int i = 2; i <= n / 2; i ++) {while (k% i == 0) {k / = i; cout << i << ""; }} Return 0; }

У зовнішньому циклі перебираємо всі можливі подільники числа n, виключаючи одиницю. У вкладеному циклі ділимо число n, поки дозволяє умова, і виводимо поточний дільник.

питання

1. Назвіть відмінності циклів while та do while. Чи можна замінити цикл while на do while? А навпаки?
2. Чи можна замінити інструкції break і continue на інші конструкції мови?
3. Коли застосовується структура вкладених циклів?
4. Що таке ітерація?

Домашня робота
  1. Зад. 9 підручника. Напишіть програму, яка виводить всі п'ятизначні числа, які при діленні на 133 дають в залишку 125, а при діленні на 134 дають в залишку 111.
  2. Зад. 13. Напишіть програму, яка вважає кількість парних цифр введеного цілого числа N, 0
  3. Дано цілі додатні числа N і K. Знайти суму 1K + 2K + ... + NK. (Використовувати структуру вкладених циклів). Щоб уникнути цілочисельного переповнення, обчислювати складові цієї суми з допомогою дійсної змінної і виводити результат як дійсне число.
Підручник

§58

Презентація до уроку

lesson-8

література
  1. Лафоре Р. Об'єктно-орієнтоване програмування в C ++ (4-е изд.). Пітер: 2004
  2. Прата, Стівен. Мова програмування C ++. Лекції і вправи, 6-е изд .: Пер. з англ. - М .: ТОВ «І.Д. Вільямс », 2012
  3. Ліппман Б. Стенлі, Жози Лажойе, Барбара Е. Му. Мова програмування С ++. Базовий курс. Вид. 5-е. М: ТОВ "І. Д. Вільямс", 2014
  4. Еллайн А. C ++. Від ламера до програміста. СПб .: Пітер, 2015
  5. Шілдт Г. С ++: Базовий курс, 3-вид. М .: Вільямс 2010
Яке число загадав комп'ютер?
K?
Чи можна замінити цикл while на do while?
А навпаки?
2. Чи можна замінити інструкції break і continue на інші конструкції мови?
3. Коли застосовується структура вкладених циклів?
4. Що таке ітерація?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью