﻿/*
    A do-while ciklus (ismételd... ameddig)

    Szerkezete (C++):

        do {
            utasítás1
            utasítás2
            ...
        } while (feltétel);

    Működése:
        Végre lesznek hajtva a {} közötti utasítások, majd ellenőrizve lesz
        a feltétel. Amíg a feltétel igaz, addig ismét végre lesznek hajtva
        az utasítások és ismét ellenőrizve lesz a feltétel és így tovább.

        Amint a feltétel hamissá válik, nem ismétlődnek többet az utasítások.
*/

// Pl.

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    cout << "eleje" << endl;

    do {
        cout << n << endl;
        n--;
    } while (n >= 10);

    /*while (n >= 10) {
        cout << n << endl;
        n--;
    }*/
    // n < 10 érték esetén a do-while
    // egyszer lefut, a while viszont
    // egyszer sem

    cout << "vege" << endl;

    return 0;
}

// Pszeudokódban (ismételd...ameddig - hátultesztelő ciklus)
/*
    ismételd
    |    utasítás1
    |    utasítás2
    |    ...
    |ameddig feltétel
    []

    Viselkedése:
        Először végrehajt, majd addig ismétel, amíg a feltétel HAMIS.
        Amint a feltétel igazzá válik, megáll.

    Az előbbi példa átírva:

    beolvas n
    kiír "eleje"

    ismételd
    |   kiír n
    |   n <- n - 1
    |ameddig n < 10
    []
*/


/* Ciklusátírások:

    1. FOR -> WHILE

        for (kezdőérték;feltétel;léptetés) {
            utasítás1
            utasítás2
            ...
        }

        --->

        kezdőérték;
        while (feltétel) {
            utasítás1
            utasítás2
            ...

            léptetés;
        }

     2. WHILE -> DO-WHILE

        while (feltétel) {
           utasítás1
           utasítás2
           ...
        }

        --->

        if (feltétel) {
            do {
               utasítás1
               utasítás2
               ...
            } while (feltétel);
        }


    3. DO-WHILE -> WHILE

        do {
           utasítás1
           utasítás2
           ...
        } while (feltétel);

        --->

        utasítás1
        utasítás2
        ...
        while (feltétel) {
           utasítás1
           utasítás2
           ...
        }

*/

/*
    HF:
        1. for -> while -> do-while
            for (int i = 1; i <= n; i++)
                cout << i << endl;

            Megoldás:

            int i = 1;
            while (i <=n) {
                cout << i << endl;
                i++
            }


        2. do-while -> while
            do {
                cout << n%2 << endl;
                n = n / 2;
            } while (n > 0);


            Megoldás:

            cout << n%2 << endl;
            n = n / 2;
            while (n > 0)
            {
                cout << n%2 << endl;
                n = n / 2;
            }




        3. do-while -> ismételd ameddig
            do {
                cout << n%2 << endl;
                n = n / 2;
            } while (n > 0);


            Megoldás:

            ismételd
            |    kiír n%2
            |    n <- n / 2;
            |ameddig n <= 0     // VAGY: nem (n > 0)
            []
*/


/* Gyakorlatok:

    1. while -> do-while

        while (n > 0)
        {
            cout << n%2 << endl;
            n = n / 2;
        }

        --->

        if (n > 0) {
            do {
                cout << n%2 << endl;
                n = n / 2;
            } while (n > 0);
        }
*/
