Basic programming course: Lesson #5 Control structures. Part 2. Cycles.
Цикл - це повторення, Цикл дня і ночі. Цикл зміни пір року. Цикли в програмуванні дозволяють зекономити кількість команд, та автоматизувати повторювані операції.
Детально поясніть цикли. Що це таке і як вони використовуються? У чому різниця між циклами «While» і «Do-While»?
Наприклад що від 1 дійти до 100, слід виконати 100 раз команду a=a+1
- a=a+1;a=a+1;a=a+1;a=a+1;a=a+1;a=a+1;......a=a+1;
А можна сказати так - додавай 1 доки не буде 100.
Я завжди пояснював цикли через оператор for, а вже потім говорю що є ще цикли while
та do...while
. Та цього разу я якось сам не помітив як почав пояснювати цикли у порівнянні з умовним оператором.
Хід програми незворотній, принаймні був до того часу коли вивчали лінійні алгоритми. Поява умовного оператора дозволила пропускати певні ділянки коду - перестрибувати вперед. Тоді while
можна пояснити як такий же самий що й if - але стрибок здійснюється назад до моменту вказаного do
, тобто do
нічого не робить крім як вказує місце для стрибка. Але програма продовжує йти своїм законним шляхом, а тому команди повторюються - так виникає цикл.
do...while
Якщо ж той стрибок що здійснює if
повторити - то виникне просто цикл while
.
На схемі це ми зобразимо повернувши напрям руху стрілки назад, для повторного виконання - а коли умова не буде виконуватися то аналогічно до if
ми просто оминаємо деякі команди.
while
Отже цикли в будь якому випадку можуть змінювати хід програми на протилежний, ні - команди не починають виконуватися у зворотному порядку 1→2→3→4
не стане 1←2←3←4
. Просто програма після пункту 4
продовжить виконання з пункту 1
.
Відмінність
Так як в циклі do...while
спочатку йдуть команди, після розміщеного на початку циклу do
, а вже потім стоїть перевірка умови - то ми не можемо відмінити вже виконані команди, тобто вони безповоротно виконалися. Ми лиш можемо вирішити повторювати цикл далі, чи ні.
Так як в циклі while
спочатку стоїть перевірка умови, і якщо вона відразу хибна, то команди що розміщені в циклі будуть пропущені.
Отже, цикл do...while
- як мінімум виконається один раз, а вже потім може як завершитися так і повторитися.
а цикл while
може так ні разу і не виконатися/
Дослідіть, як використовується структура Switch-case, і наведіть приклад.
Дуже часто буває така конструкція вкладених умов на зразок таких: це число 1 - ні, то може це число 2 - ні, то може це число 3- і так далі. Тобто ми перебираємо різні варіанти. Чи наприклад у нас є певний шаблон - і ми обираємо щось за цим шаблоном.
То для такої конструкції придумало особливий запис оператора if - оператор вибору.
На багатьох мовах це switch.... case
правда на цьому малюнку if
вже зветься switch
У багатьох мовах switch.... case
перебирає лиш поодинокі дискретні цілочисельні значення.(C/C++/Java)
В деяких мовах можуть бути діапазони значень: case 15..25:
, в деяких мовах можуть бути рядкові величини - case "word"
.
Розглянемо класичний приклад вибору дня тижня за його номером.
#include <stdio.h>
int main()
{
int day;
printf("Enter the day number (1-7): ");
scanf("%d", &day);
if (day == 1)
printf("Monday\n");
else if (day == 2)
printf("Tuesday\n");
else if (day == 3)
printf("Wednesday\n");
else if (day == 4)
printf("Thursday\n");
else if (day == 5)
printf("Friday\n");
else if (day == 6)
printf("Saturday\n");
else if (day == 7)
printf("Sunday\n");
else printf("Invalid day number!\n");
return 0;
}
Або без зсуву тексту праворуч, так як у великому переборі зсув буде дуже великий.
#include <stdio.h>
int main()
{
int day;
printf("Enter the day number (1-7): ");
scanf("%d", &day);
if (day == 1)
printf("Monday\n");
else if (day == 2)
printf("Tuesday\n");
else if (day == 3)
printf("Wednesday\n");
else if (day == 4)
printf("Thursday\n");
else if (day == 5)
printf("Friday\n");
else if (day == 6)
printf("Saturday\n");
else if (day == 7)
printf("Sunday\n");
else
printf("Invalid day number!\n");
return 0;
}
Аналогічний код записаний через switch ..case
запишеться так:
#include <stdio.h>
int main()
{
int day;
printf("Enter the day number (1-7): ");
scanf("%d", &day);
switch (day)
{
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default: printf("Invalid day number!\n");
}
return 0;
}
На мові С/С++ та й на похідних від неї спрацювання одного case
слід переривати break;
так як після спрацювання аналізу вже не буде - і надрукуються всі інші дні тижня. Одного разу можливо можна буде цим скористатися - але в більшості випадків break;
використовують.
При цьому після case
часто пишуть константи, а не числові значення.
case FRIDAY: printf("Friday\n"); break;
звісно для цього десь на початку треба оголосити ці константи - const int FRIDAY=5;
Хоча числове значення тепер вже великої ролі не грає - і тут взагалі існує спеціальний тип перелічення enum
, але це інша історія.
Поясніть, що робить наступний код:
Скільки б ти мов не вчив - а нову вчити доведеться. Я хотів сказати, що читати доводиться часто різні мови, навіть ті якими не програмуєш і ніколи не програмуватимеш.
Algorithm switchcase
Define op, n, ns, a As Integer;
Define exit As Logic;
exit = False;
a=0;
Repeat
Print "Select an option:";
Print "1. Sum numbers.";
Print "2. Show results."
Print "3. End program.";
Read op;
Switch op Do
case 1:
Print "How much nums do you want to sum?";
Read n;
For i from 1 to n Do
Print "Enter a number: ";
Read ns;
a = a + ns;
EndFor
Print "Completed! Press any button to continue";
Wait Key;
Clear Screen;
case 2:
Print "This is the current result: " a;
Print "Press any button to continue.";
Wait Key;
Clear Screen;
caso 3:
Clear Screen;
Print "Bye =)";
exit = True;
Default:
Print "Invalid option.";
Print "Press any button to continue";
Wait Key;
Clear Screen;
EndSwitch
Until exit
EndAlgorithm
Спочатку тут створюється логічна змінна exit
аналізуючи яку програма буде приймати рішення завершити роботу чи ні. Repeat
починає головний цикл - Until exit
його завершує. Далі виводиться меню з трьох пунктів, користувач обирає 1-2-3, введене значення вноситься в змінну op
Далі оператор switch
буде аналізувати цю змінну, зіставляючи її значення з значеннями перерахованими в наступних 'case'. Якщо ж такого значення не буде - спрацює варіант описаний в default. як видно у цьому псевдокоді немає break
ймовірно кожен наступний 'case` відміняє попередній, що логічно. Та правда в С/С++ та інших мовах чомусь так не зробили.
Напишіть програму , яка запитує у користувача число, більше за 10 (Do-While), а потім додайте всі числа за допомогою накопичувача (While). Приклад: користувач вводить 15. Програма складає 1+2+ 3+4+5+6+7+8+9+10+11+12+13+14+15.
Так як маємо хоч один раз запитати - то дійсно краще використати do..while
і якщо користувач введе не те що слід - будемо повторювати док не введе число більше 10, як сказано в завданні. Це називається захист від дурня, або якщо політкоректно то валідація даних. А далі можна будь яким циклом обчислити суму.
#include <iostream>
using namespace std;
int main()
{
int number, sum = 0, i = 1;
do
{
cout << "Enter a number greater than 10: ";
cin >> number;
} while (number <= 10);
while (i <= number)
{
sum += i;
i++;
}
cout << "The sum of numbers from 1 to " << number << " is: " << sum << endl;
return 0;
}
Незважаючи на те що циклів існує кілька видів, тут три - for, while, do...while
абсолютно будь що можна зробити тим чи іншим видом циклу. Тут лиш власні вподобання.
Наприклад ця ж програма але зроблена лиш з допомогою for
for (;;)
{
cout << "Enter a number greater than 10: ";
cin >> number;
if (number > 10)
break;
}
for (int i = 1; i <= number; i++)
sum += i;
для короткості коду я навів лиш фрагмент з циклами.
Дякую що прочитали, і окрема дяка за залишений коментар))
Який гарний приклад :)
Думаю світ також створений за програмою 😅
безперечно..... і той анекдот що в нашому ДНК коді є коментарі, можливо стане реальністю. якщо в ДНК закласти що на певному етапі виростуть крила роги чи хвіст...це реально..... як і перетворитися на ельфа- чи гнома... і без всякої магії.....типу натяк на фентезі))))
Спочатку треба припинити війни. А то страшно буде 😆
@sergeyk this really got me thinking! How did you come up with this idea? Would love to dive deeper into your thought process