Глава 5. Цикл з наступною умовою. Оператор repeat. until.
1. Оператор циклу з наступною умовою (постусловіем) схожий на оператор циклу з передумовою, але умова обчислюється і перевіряється після виконання операторів, що складають тіло циклу.
Загальний вигляд оператора циклу з умовою поста такий:
де s1, s2, s3. - оператори тіла циклу; <условие> - логічний вираз.
Перекладається: repeat - повторювати, until - доти поки.
Як бачите, такий цикл починається з виконання операторів усередині циклу, а вже потім обчислюється вираз, записане в умові.
Якщо значення цього виразу істинно, тоді здійснюється вихід з циклу, якщо значення помилково, то цикл триває і знову виконуються оператори
Треба відразу зазначити, що на відміну від циклу while. do. в циклі repeat. until. операторні дужки begin. end можуть не використовуватися, хоча і використання їх шкоди не принесе. Можна сказати іншими словами, що оператор циклу repeat. unti l. не вимагає операторних дужок begin. end.
Розглянемо роботу цього оператора на прикладі.
Приклад 1. Знайти найменше натуральне число, що дає при діленні на 2, 3, 4, 5, 6 відповідно залишки 1, 2, 3, 4, 5.
Завдання будемо вирішувати так: береться найменше натуральне число - одиниця і знаходяться залишки від ділення його на 2, 3, 4, 5 і 6; якщо залишки будуть рівні 1, 2, 3, 4 і 5, тоді це число є шуканим, його треба видати на екран і закінчити програму, в іншому випадку, треба брати наступне натуральне число - 2 і перевіряти його, і так далі.
Програма. складена з цієї ідеї, дуже проста:
writeln ( 'Шукалося ціле число', n)
Ще один приклад, який демонструє роботу циклу з умовою поста.
Приклад 2. Числа, однаково читаються і зліва направо, і справа наліво, називаються паліндромами. Наприклад, числа 42324 або +1331 - паліндроми. Складіть програму, яка буде знаходити числа - паліндроми з заданого проміжку.
Логіка складання програми така.
Переставити цифри в числі і порівняти отримане число до заданого.
Раніше вже складалася програма перестановки цифр числа, яка була виконана за допомогою циклу з передумовою
Як буде побудована частина програми про перестановки цифр за допомогою циклу
Нехай заданий число a. тоді введемо ще одну змінну b. якої буде присвоєно значення змінної a (для чого це робиться ви дізнаєтеся пізніше): b: = a;
Заведемо ще одну змінну a1 для нового числа, в якому цифри вже будуть переставлені.
Первісне значення цієї змінної - нуль: a1: = 0;
Чому значення цієї змінної дорівнює нулю стане ясно з програми.
Далі організуємо цикл repeat. в якому буде відбуватися перестановка цифр числа b:
a1: = a1 * 10 + b mod 10;
Отже, в циклі, також як і в циклі while. do. відділяється остання цифра:
b mod 10; (Наприклад, 343 mod 10 = 3); змінної a1 присвоюється значення:
a1: = a1 * 10 + b mod 10; 0 * 10 + 3 = 3;
"Відкидається" остання цифра заданого числа за допомогою операції цілочисельного ділення:
b: = b div 10; 343 div 10 = 34;
перевіряється умова: b = 0, 34 = 0, умова не виконується, значить цикл триває.
Відділяється остання цифра вже нового числа:
b mod 10 = 34 mod 10;
нове число a1, вже дорівнює 3, множиться на 10 і до результату додається наступна цифра - 4:
a1: = a1 * 10 + b mod 10;
"Відкидається" остання цифра числа b:
b: = b div 10; 34 div 10 = 3;
перевіряється умова: b = 0, 3 = 0; умова не виконується, значить цикл триває.
Відділяється остання цифра числа:
b mod 10; 3 mod 10 = 3;
формується нове число:
a1: = a1 * 10 + b mod 10; 34 * 10 + 3 = 343;
"Відкидається" остання цифра числа і виходить нове число:
b: = b div 10; 3 div 10 = 0;
перевіряється умова: b = 0, 0 = 0; умова виконується, значить цикл закінчується.
Тепер стає ясно, чому введена інша змінна b для заданого числа, її значення в циклі змінюється від початкового до нуля і, щоб зберегти задане число у змінній a. і вводиться, так би мовити, "робоча" змінна - b.
Після закінчення циклу перестановки цифр числа, порівнюється початкове число, яке "збереглося" у змінній a і число, яке вийшло після перестановки цифр і "накопичилося" у змінній a1.
Якщо a = a1, тоді значення a видається на екран, так як це число є паліндромом.
Далі, значення a збільшується на 1, т. Е. Береться для розгляду наступне по порядку натуральне число і знову продовжується зовнішній цикл. Цифри числа переставляються, отримане нове число після перестановки цифр - a1. порівнюється з початковим a і так далі.
Зовнішній цикл закінчується, коли значення a стає рівним правій межі інтервалу - n.
m, n, a, b, a1. longint;
write ( 'Введіть ліву межу проміжку'); readln (m);
write ( 'Введіть праву межу проміжку'); readln (n);
writeln ( 'Числа паліндроми з [', m, ';', n, ']');
writeln ( 'Число після перестановки цифр', n1)
Схематично цикл repeat можна зобразити так (див. Рис. 21):
2. Відмінності між циклом - while і циклом - repeat
1. Оператор, що знаходиться в циклі while. повторюється до тих пір, поки умова задоволено (тобто істинно). Послідовність операторів, які перебувають в циклі repeat. повторюється до тих пір, поки умова не задоволено (т. е. ложно).
Отже, в циклі while використовується умова продовження циклу, а в циклі repeat - умова закінчення циклу.
2. У циклі while повторюється один оператор (кілька операторів треба об'єднувати в складовою оператор за допомогою операторних дужок begin. End), а в циклі repeat можна повторювати кілька операторів без операторних дужок.
3. У циклі while спочатку перевіряється умова, а після цього в залежності від значення умови виконується або невиконуюча оператор або група операторів після слова do.
У циклі repeat послідовність операторів виконується один раз, а після цього перевіряється умова, т. Е. Ця послідовність завжди виконується хоча б один раз, а в циклі while оператори, складові тіло циклу можуть взагалі не виконуватися жодного разу.
Знайти найменше натуральне число, кратне 131 з парною кількістю цифр. Скласти програму.
3. Програми з спільним використанням циклів repeat і while. do.
Приклад 3. Якщо ми складемо всі цифри якого-небудь числа, потім - все цифри знайденої суми і будемо повторювати це багато разів, ми нарешті отримаємо однозначне число (цифру), зване цифровим коренем даного числа. Наприклад, цифровий корінь числа 561 дорівнює 3 (5 + 6 + 1 = 12; 1 + 2 = 3).
Складіть програму для знаходження числового кореня числа.
Соображеніяпо складання програми
Ясно, що в програмі має бути цикл, який визначає суму цифр числа. У свою чергу, цей цикл повинен також виконуватися до тих пір, поки значення суми цифр не стане рівним одній цифрі, тобто стане менше 10, але залишається більше 0. Для цього треба організувати ще один цикл, який буде зовнішнім по відношенню до циклу, підраховує суму чисел.
Одна тонка особливість. Щоразу після виконання внутрішнього циклу підрахунку суми цифр, значення цієї суми треба привласнювати змінної, в якій міститься початкове число, т. Е. Замінювати число на його суму, перевіряти умова (чи не є сума менше десяти) і продовжувати цикл вже з новим числом - сумою, якщо умова не виконується. А ту змінну, в якій накопичувалася сума треба кожен раз не забувати обнуляти.
Отже, якщо введене число було присвоєно змінної n, а сума його цифр змінної s, то після підрахунку суми цифр, змінна повинна отримати значення s (n: = s), перевірити умова (n <10), если оно еще не выполняется, тогда обнулить переменную s (s:= 0) и продолжить цикл подсчета суммы цифр.
Зовнішній цикл з перевірки значення суми організуємо за допомогою операторів repeat. until n <10, а внутренний по подсчету суммы цифр с помощью операторов while. do.
write ( 'Введіть натуральне число'); readln (n);
s: = s + n mod 10; n: = n div 10
writeln ( 'Цифровий корінь числа', a, 'дорівнює', n)
1. Виконайте цю програму. Змініть її так, щоб вона знаходила цифрові коріння кожного з чисел від 10 до 100.
2. Знайти тризначне число, яке є точним квадратом натурального числа k, і таке, що твір його цифр дорівнює k - 1.
4. Різні завдання
Приклад 1. Скласти програму визначення всіх дільників числа n.
Коли ставиться таке завдання, то дуже часто учні пропонують такий спосіб вирішення.
Треба випробувати всі натуральні числа, починаючи від 1 до n і, якщо якийсь з них буде дільником числа n, тоді видавати його на екран. Наприклад, для числа 36, беремо для перевірки числа 1, 2, 3. 36 і вибираємо з них подільники 36. Подільники будуть наступними: 1, 2, 3, 4, 6, 9, 12, 18 і 36.
Такий спосіб можливий. Але, якщо ви уважно подивитеся на подільники числа 36, то виявите, що всі вони знаходяться в інтервалі від 1 до 18, тобто до половини числа 36 і лише останній дільник - це саме число.
Та й проста логіка міркувань переконує нас, що подільники будуть розташовуватися саме в цьому інтервалі: від 1 до.
Якщо припустити думку, що є дільник більше половини числа, тоді помноживши його тільки лише на 2, ми отримаємо число більше заданого.
Отже, стає зрозумілим, що всі подільники числа, крім самого, знаходяться в проміжку від 1 до, а значить треба перевіряти числа на можливі подільники саме з цього проміжку.
Звідси виникає такий план складання програми: організувати цикл від 1 до; якщо число n ділиться на число з цього проміжку, тоді вивести цей дільник на екран; продовжити цикл; видати на екран саме число.
write ( 'Введіть ціле число'); readln (n);
writeln ( 'Подільники числа', n);
until d> n div 2;
Але і при вирішенні цього завдання машині можна допомогти і полегшити її роботу. Тут на допомогу знову приходить математика.
Виявляється, для того щоб знайти подільники числа n, досить виявити подільники що не перевищують.
Всі інші подільники виходять в результаті ділення числа n на знайдені подільники.
Наприклад, якщо n = 30, то досить знайти подільники 1, 2, 3, 5 (натуральний квадратний корінь з 30 дорівнює 5), а всі інші подільники виходять розподілом на знайдені:
П ри складанні програми виникає проблема - немає вбудованої функції вилучення квадратного кореня в множині цілих чисел. Це перешкода легко обійти, якщо організувати цикл для вибору подільників d від 1 до тих пір поки d * d Чому треба зробити саме так. Це стає зрозумілим на прикладі для числа 36. = 6, цикл - поки d d <6; d = 1, d d = 1 1 = 1 <36 (истина ), знаходиться залишок від ділення 36 mod 1 = 0; видається 1 і частка від ділення 36 на 1, 36 div 1 = 36; d = 2, d d = 2 2 = 4 <36 (истина ), видається 2 і частка від ділення 36 на 2, 36 div 2 = 18; d = 3, d d = 3 3 = 9 <36 (истина ), видається 3 і частка від ділення 36 на 3, 36 div 3 = 12; d = 4, d d = 4 4 = 16 <36 (истина ), видається 4 і 36 div 4 = 9; d = 5, d d = 5 5 = 25 <36 (истина ), 36 mod 5 <>0, нічого не видається на екран, d = 6, d d = 6 6 = 36 <36 (ложь ), цикл заканчивается. Перевіряється d = 6 (d d = n), 6 6 = 36 (істина), видається 6. Якби цикл тривав, поки d d <= n, тогда при d = 6 на экран выдавалось бы - 6 и 36 div 6 = 6, т. е. две шестерки, что было бы ошибкой. write ( 'Введіть ціле число'); readln (n); writeln ( 'Подільники числа', n); if d * d = n then write (d); writeln Складіть програму, яка буде знаходити число дільників і їх суму для даного натурального числа. Приклад 2. Знайти найбільший спільний дільник (НСД) двох чисел a і b. Питання визначення найбільшого спільного дільника двох чисел настільки детально і ретельно викладено у всіх навчальних посібниках, що повідомити що-небудь нове в складанні алгоритмів знаходження НОД дуже важко. Однак, я помітив, що в більшості посібників викладається визначення НОД за допомогою алгоритму Евкліда, причому не найкращим способом. Ми оберемо інший підхід до цього питання, як мені здається, більш природний. Отже, припустимо, що ми не знаємо алгоритму Евкліда і пробуємо виходячи з елементарних знань математики і простої логіки міркувань знайти найбільший спільний дільник чисел, а потім і скласти програму. Перш чітко визначимо для себе, що таке НСД двох чисел. Так, для чисел 36 і 45 існують три загальних подільника: 1, 3, 9. Найбільший серед них 9. Він і є НОД чисел 36 і 45. Для 30 і 45 трохи більше спільних дільників: 1, 3, 5 і 15. Найбільшим є 15, значить НСД (30, 45) = 15. Найбільшим спільним дільником чисел a і b називається найбільше число серед усіх загальних дільників чисел a і b. Тоді, за логікою речей, виникає природна ідея знайти НСД наступним чином. По перше. треба перевірити чи не ділиться одна з чисел на інше, якщо ділиться, тогдато на яке розділилося і є найбільшим спільним дільником. Наприклад, для чисел 45 і 15 НСД буде число 15. Якщо жодна з них не ділиться на інше, тоді будемо брати по черзі всі натуральні числа від 1 до меншого з чисел a або b і перевіряти на які з них діляться обидва числа, останній з цих загальних дільників і буде найбільшим. Такий процес для чисел 36 і 45 буде виглядати так: перевіряємо розподіл a на b і b на a; знаходимо залишок від ділення на 1, 36 mod 1 = 0, 45 mod 1 = 0, значить 1 - загальний дільник; на 2, 36 mod 2 = 0, 45 mod 2 <>0, 2 не є загальним дільником; на 3, 36 mod 3 = 0, 45 mod 3 = 0, 3 - загальний дільник; на 4. і так далі до 36. Останній з цих загальних дільників буде 9, він і є НСД. Неважко скласти і програму по такому простому алгоритму. a, b, n, k, i. integer; чутливістю, майстерністю, мужністю, самовіддачею, позитивним програмуванням. з необхідним супроводом і підтримкою, яка. ізоляції та обмеженого простору, плаваючи в темряві і тиші. вільний від усіх подразнень, що надходили. дослідження, пов'язаних з програмуванням і організаційною ефективністю. Дивно. мови програмування. визначених способів проектування і програмування. загального. Гробова тиша. > Кілька разів парне програмування пройшло. дослідження, пов'язаних з програмуванням і організаційною ефективністю. Дивно. мови програмування. визначених способів проектування і програмування. загального. Гробова тиша. > Кілька разів парне програмування пройшло. буде називатися? "В результаті вийшло Нейролінгвістичне програмування - громіздке словосполучення, за яким ховаються. неговіркий, вокалу-ний, звучати, голос, каже, тиша. дисонанс, співзвучний, гармонійний, пронизливий, тіхні. ПСИХОТЕРАПЕВТИЧНИЙ ЦЕНТР "ЛАД" В.І.ЕЛЬМАНОВІЧ Нейролінгвістичне програмування (методичний посібник для початківців) Частина 1. Модальності (А). 1. Якщо гучність = 0, то «слухає тишу». якщо гучність максимальна, то «горить.Схожі статті