1 Востаннє редагувалося koala (02.05.2020 21:41:35)

Тема: Як працює оператор continue?

Добрий день, люди! Нещодавно почав вивчати С++ , і у мене виникло питання, як працює оператор continue.
       Покажу на прикладі з уривка коду програми:

 for (int k=0; k < 9; k++) {
        for (int j = 1;j < 10;j++) {
            if(arr[k] != arr[j]) {
                if (k == 0) {
                    continue; // Який цикл перезапускає continue цей цикл for (int j=0; j < 9; j++),  чи цей вищий for (int k=0; k < 9; k++)

                }
                else {
                    if (arr[k] == arr[j]) {
                        arr[k] = rand() % 20;

                    }
                    else {
                        continue; // Так само й тут
                    }
                }
                
            }
                else {
                arr[k] = rand() % 20;
            }
        
        }
        

    }

         У мене питання:" Який цикл воно перезапускає? І якщо перезапускає цей for (int j = 1;j < 10;j++) {, то як перезапустити вищий?" Тобто це цикл в циклі, в якому за допомогою оператора continue я хочу перезапустити вищий. Мені треба перезапустити вищий за допомогою continue for (int k=0; k < 9; k++). Дайте відповідь, будь ласка, якщо вам не складно. Поспішно дякую.

2 Востаннє редагувалося koala (02.05.2020 21:45:00)

Re: Як працює оператор continue?

Я вам тег code додав (кнопка <>), наступного разу самі.

continue переходить на початок найближчого (тобто найглибшого) циклу, інакше було б складно ним користатися. Конкретно у вашому питанні - цикл по j.
Оператори continue та break - не структурні. Це не означає, що ним не можна користуватися, але це краще робити обережно. Зараз спробую розібрати, що тут відбувається.

Подякували: SideShowBoBGOT1

3 Востаннє редагувалося koala (02.05.2020 21:49:30)

Re: Як працює оператор continue?

В принципі, коректніше казати, що continue переходить не на початок, а на кінець ітерації, а вже звідти відбувається перехід на початок наступної:

for(...)
{
  /*тіло*/

CONTINUE_LABEL:
}
BREAK_LABEL:

continue - еквівалент goto CONTINUE_LABEL, а break - goto BREAK_LABEL. Відтак, щоб перейти на початок наступної ітерації зовнішнього циклу, вам треба повністю завершити поточну ітерацію. А оскільки вона містить лише внутрішній цикл, це можна зробити, перервавши його за допомогою break. Вам треба замінити той continue на break.

Подякували: SideShowBoBGOT, Betterthanyou, leofun013

4

Re: Як працює оператор continue?

Взагалі не дуже правильно аналізувати код без завдання, яке цей код має виконувати, але дещо можна і так сказати.

           if(arr[k] != arr[j]) { //сюди ми потрапимо лише якщо arr[k]!=arr[j]
                if (k == 0) {
                    break; // вам же так треба?
                }
                else {
                    if (arr[k] == arr[j]) {//але arr[k]!=arr[j] - отже, ця умова гарантовано не буде виконана
                        arr[k] = rand() % 20;
                    }
                    else {
                        break; // Так само - то так само
                    }
                }
            }

Ага, у нас завжди хибна умова. Тобто виконуватиметься завжди else. Дивимося:

           if(arr[k] != arr[j]) {
                if (k == 0) {
                    break;
                 }
                else {
                    break; 
                }
            }

Обидві гілки роблять одне й те саме - значить, перевірка не потрібна, цей код еквівалентний

           if(arr[k] != arr[j]) {
                    break;
            }

5

Re: Як працює оператор continue?

Тепер дивимося на код навколо:

 for (int k=0; k < 9; k++) {
        for (int j = 1;j < 10;j++) {
            if(arr[k] != arr[j]) {
                break;
            }
            //else можна прибрати, бо якщо буде виконано break, то тут нічого не буде виконано
            arr[k] = rand() % 20;
        }
    }

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

6

Re: Як працює оператор continue?

Так щось пішло не так

7

Re: Як працює оператор continue?

Просто візьміть масив від 0 до 19 і елементи з 0-го по 9-й поміняйте з випадковими з тих, що йдуть далі.

8

Re: Як працює оператор continue?

#include<iostream>
#include<ctime>
using namespace std;
int main() {
    srand(time(NULL));
    int const SIZE = 10;
    int arr[SIZE];
    for (int i = 0; i < SIZE;i++) {
        arr[i] = rand() % 20;
    } // на даному етапі я згенерував 10 чисел в масиві, елементи якого можуть повторюватися. Далі я починаю перебирати значення з 1 по 10 в масиві і робити їх різними
for (int k = 0; k < 10;k++) {
        for (int j = 1;j < 10;j++) { // нижній цикл порівнює  1 елемент з 2 по 10, а далі 2 - з 3 по 10 і так далі 
            if(arr[k] != arr[j]) { // якщо 1 і 2 елементи різні то починаємо заново вищій цикл
                if (k == 0) { // ця перевірка існує виключно для 1 елемента, щоб перейти до другого і тд для їхньої перевірки
                    break;

                }
                else {// якщо ж це не перший елемент масиву ,то
                    if (arr[k] == arr[j]) {// якщо ж,наприклад, 2 і 3 рівні то починаємо нижній цикл ще раз
                        arr[k] = rand() % 20;

                    }
                    else { // відповідно не рівні, то 
                        break;
                    }
                }
                
            }
                else { // якщо ж із самого початку 1 і 2 рівні, то змінюємо значення 
                arr[k] = rand() % 20;
            }
        
        }
        

    }
    for (int g = 0; g < SIZE;g++) {//тут я просто вивожу отриману групу різних значень 10 елементів масиву 
        cout << arr[g] << endl;
    }
    return 0;
}

9 Востаннє редагувалося wander (03.05.2020 23:51:20)

Re: Як працює оператор continue?

SideShowBoBGOT, ви схоже трохи неправильно зрозуміли роль циклів. Ви от біля операторів if та continue всередині циклу постійно пишете, що вони нібито перезапускають або починають заново цикл, проте це не так. Уявіть собі цикл, як автомобільний аеродром де спорткари нарізають круги. А ітерації циклу, як той самий спорткар, що нарізає круги. Цикл крутитиметься «вічно» наче наше авто, що проїжджатиме круг за кругом. Щоб наш болід їздив не вічність задають умову, наприклад, завершити гонку, коли авто проїде 100 кругів - це і є ті умови, які ви задаєте у ваших циклах, вона може бути одна або декілька. Крім умови обмеження на круги, може бути ще умова, щоб авто кожних 20 кіл заїжджало на пітстоп та йому міняли шини, інакше вони можуть стертися та лопнути. Так от, після кожного кола, ми будемо дивитися, а чи проїхали ми вже 20 кіл, якщо так, то їдемо на пітстоп, міняємо шини і продовжуємо гонку, якщо ні, то просто продовжуємо гонку, але не починаємо її заново. Здавалося б, ми ж робимо одні і тіж речі, монотонно їздимо по колу, від лінії до лінії і вже кожне таке коло неначе починається спочатку, знову і знову, але це не так, час плине далі, а ми на жаль чи на щастя не у фільмі «День бабака».

Подякували: SideShowBoBGOT, Droid 772