Basic programming course: Lesson #5 Control structures. Part 2. Cycles.steemCreated with Sketch.

in Ukraine on Steem2 months ago

Цикл - це повторення, Цикл дня і ночі. Цикл зміни пір року. Цикли в програмуванні дозволяють зекономити кількість команд, та автоматизувати повторювані операції.

Детально поясніть цикли. Що це таке і як вони використовуються? У чому різниця між циклами «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.

image.png

Я завжди пояснював цикли через оператор for, а вже потім говорю що є ще цикли while та do...while. Та цього разу я якось сам не помітив як почав пояснювати цикли у порівнянні з умовним оператором.
Хід програми незворотній, принаймні був до того часу коли вивчали лінійні алгоритми. Поява умовного оператора дозволила пропускати певні ділянки коду - перестрибувати вперед. Тоді while можна пояснити як такий же самий що й if - але стрибок здійснюється назад до моменту вказаного do, тобто do нічого не робить крім як вказує місце для стрибка. Але програма продовжує йти своїм законним шляхом, а тому команди повторюються - так виникає цикл.

do...while

image.png

Якщо ж той стрибок що здійснює if повторити - то виникне просто цикл while.
На схемі це ми зобразимо повернувши напрям руху стрілки назад, для повторного виконання - а коли умова не буде виконуватися то аналогічно до if ми просто оминаємо деякі команди.

while

image.png

Отже цикли в будь якому випадку можуть змінювати хід програми на протилежний, ні - команди не починають виконуватися у зворотному порядку 1→2→3→4 не стане 1←2←3←4 . Просто програма після пункту 4 продовжить виконання з пункту 1 .

Відмінність
Так як в циклі do...while спочатку йдуть команди, після розміщеного на початку циклу do, а вже потім стоїть перевірка умови - то ми не можемо відмінити вже виконані команди, тобто вони безповоротно виконалися. Ми лиш можемо вирішити повторювати цикл далі, чи ні.
Так як в циклі while спочатку стоїть перевірка умови, і якщо вона відразу хибна, то команди що розміщені в циклі будуть пропущені.
Отже, цикл do...while - як мінімум виконається один раз, а вже потім може як завершитися так і повторитися.
а цикл while може так ні разу і не виконатися/


Дослідіть, як використовується структура Switch-case, і наведіть приклад.

Дуже часто буває така конструкція вкладених умов на зразок таких: це число 1 - ні, то може це число 2 - ні, то може це число 3- і так далі. Тобто ми перебираємо різні варіанти. Чи наприклад у нас є певний шаблон - і ми обираємо щось за цим шаблоном.

image.png

То для такої конструкції придумало особливий запис оператора if - оператор вибору.
На багатьох мовах це switch.... case
image.png
правда на цьому малюнку 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;

для короткості коду я навів лиш фрагмент з циклами.

image.png

Дякую що прочитали, і окрема дяка за залишений коментар))

About me

Posted using SteemPro

Sort:  
 2 months ago 

Цикл - це повторення, Цикл дня і ночі. Цикл зміни пір року. Цикли в програмуванні дозволяють зекономити кількість команд, та автоматизувати повторювані операції.

Який гарний приклад :)
Думаю світ також створений за програмою 😅

 2 months ago 

безперечно..... і той анекдот що в нашому ДНК коді є коментарі, можливо стане реальністю. якщо в ДНК закласти що на певному етапі виростуть крила роги чи хвіст...це реально..... як і перетворитися на ельфа- чи гнома... і без всякої магії.....типу натяк на фентезі))))

 2 months ago 

Спочатку треба припинити війни. А то страшно буде 😆

Loading...
Loading...

@sergeyk this really got me thinking! How did you come up with this idea? Would love to dive deeper into your thought process

Coin Marketplace

STEEM 0.22
TRX 0.27
JST 0.041
BTC 104060.88
ETH 3871.70
SBD 3.28