Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2022, 23:05   #1
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию Цикл for и управляющая переменная

Код:
using System;
class forDemo { 
    static void Main() { 
        int i, j;
        bool done = false;
        for(i=0, j=100; !done; i++, j--) { 
            if(i*i >= j) done = true;
                Console.WriteLine("i, j: " + i + " " + j);
        } 
    }
}
Ниже приведен результат выполнения этой программы.
i, j: 0 100
i, j: 1 99
i, j: 2 98
i, j: 3 97
i, j: 4 96
i, j: 5 95
i, j: 6 94
i, j: 7 93
i, j: 8 92
i, j: 9 91
i, j: 10 90

Подскажите пожалуйста как работает в данном примере if и for в связке, а именно условие оператора if и for.
Я не понимаю почему выводится результат если условие оператора if является false.

Последний раз редактировалось bITA666; 26.08.2022 в 23:09.
bITA666 вне форума Ответить с цитированием
Старый 26.08.2022, 23:08   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так if и не работает. В теле if только строчка done = true;
А
Код:
Console.WriteLine("i, j: " + i + " " + j);
выполняется для всех итераций цикла
От того, что вы добавили отступ, эта строка не стала принадлежать телу if
Код:
using System;
class forDemo { 
    static void Main() { 
        int i, j;
        bool done = false;
        for(i=0, j=100; !done; i++, j--) { 
            if(i*i >= j) {
                done = true;
                Console.WriteLine("i, j: " + i + " " + j);
            }
        } 
    }
}
Вот так в теле if будет оба оператора и done = true и Console.WriteLine

Последний раз редактировалось macomics; 26.08.2022 в 23:10.
macomics вне форума Ответить с цитированием
Старый 26.08.2022, 23:08   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от bITA666 Посмотреть сообщение
почему выводится результат если условие оператора if является false.
У вас неверное форматирование кода. Тело оператора if это только "done = true;", а вывод находится уже после оператора if.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 26.08.2022, 23:45   #4
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

BDA, как было в книги так и я вам скопировал
Изображения
Тип файла: jpg Screenshot_2022-08-27-00-42-54-526_org.readera.jpg (72.8 Кб, 3 просмотров)
bITA666 вне форума Ответить с цитированием
Старый 26.08.2022, 23:50   #5
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
От того, что вы добавили отступ, эта строка не стала принадлежать телу if
Так отступ был в книге. Я может только лишний пробел добавил и то случайно. Суть дела не меняет.
Зачем if и условие которое не работает? Вот кстати скрин книги , можете сравнить что я ничего от себя не добавил.
Изображения
Тип файла: jpg Screenshot_2022-08-27-00-42-54-526_org.readera.jpg (72.8 Кб, 1 просмотров)
bITA666 вне форума Ответить с цитированием
Старый 26.08.2022, 23:58   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так условие if как раз сработало. Цикл же остановился на i, j: 10 90 // (10 * 10 = 100 > 90)

С тем же успехом можно написать так
Код:
using System;
class forDemo { 
    static void Main() { 
        for(int i=0; i * i < 100 - i; ++i) Console.WriteLine("i, j: " + i + " " + (100 - i));
    }
}

Последний раз редактировалось macomics; 27.08.2022 в 00:02.
macomics вне форума Ответить с цитированием
Старый 27.08.2022, 00:32   #7
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
От того, что вы добавили отступ, эта строка не стала принадлежать телу if
Так отступ был в книге. Я может только лишний пробел добавил и то случайно. Суть дела не меняет.
Зачем if и условие которое не работает? Вот кстати скрин книги , можете сравнить что я ничего от себя не добавил.
Цитата:
Сообщение от macomics Посмотреть сообщение
Так условие if как раз сработало. Цикл же остановился на i, j: 10 90
Хорошо. Постараюсь объяснить простыми словами что мне непонятно. Надеюсь вы сможете понять и объяснить.
Метод срабатывает тогда, когда условие оператора if истинно.
После первой итерации if(i*i >= j) done = true;
Разве значение переменной done = true? При первой итерации i < j так как может изменяться значение в переменной i и j если done = false?
bITA666 вне форума Ответить с цитированием
Старый 27.08.2022, 01:12   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от bITA666 Посмотреть сообщение
Так отступ был в книге.
При переводе книг листинги очень страдают. В оригинале там так:
Код:
using System;

class forDemo {
  static void Main() {
    int i, j;
    bool done = false;

    for(i=0, j=100; !done; i++, j--) {

      if(i*i >= j) done = true;

      Console.WriteLine("i, j: " + i + " " + j);
    }
  }
}
С таким форматированием не возникает ложного ощущения, что WriteLine относится к телу if.
Изначально done имеет значение ложь, но условное выражение цикла !done, то есть отрицание значения done. Поэтому это выражение будет истинно, и будет выполнено тело цикла (if и WriteLine), а затем выражение, отвечающее за итерацию (i++, j--).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 27.08.2022, 01:26   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от bITA666 Посмотреть сообщение
Цитата:
Сообщение от macomics Посмотреть сообщение
От того, что вы добавили отступ, эта строка не стала принадлежать телу if
Так отступ был в книге. Я может только лишний пробел добавил и то случайно. Суть дела не меняет.
Зачем if и условие которое не работает? Вот кстати скрин книги , можете сравнить что я ничего от себя не добавил.
Я с первого раза могу прочитать сообщение. Дублировать не нужно.


Цитата:
Сообщение от bITA666 Посмотреть сообщение
После первой итерации if(i*i >= j) done = true;
Разве значение переменной done = true? При первой итерации i < j так как может изменяться значение в переменной i и j если done = false?
Вы не правильно поняли написанное.
  1. установить done = false;
  2. вход в цикл for
    • установить i = 0 и j = 100
    • первая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 0*0 >= 100 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 0 100
      4. увеличить i и уменьшить j на 1 --> i = 1, j = 99
    • вторая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 1*1 >= 99 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 1 99
      4. увеличить i и уменьшить j на 1 --> i = 2, j = 98
    • третья итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 2*2 >= 98 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 2 98
      4. увеличить i и уменьшить j на 1 --> i = 3, j = 97
    • четвертая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 3*3 >= 97 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 3 97
      4. увеличить i и уменьшить j на 1 --> i = 4, j = 96
    • пятая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 4*4 >= 96 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 4 96
      4. увеличить i и уменьшить j на 1 --> i = 5, j = 95
    • шестая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 5*5 >= 95 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 5 95
      4. увеличить i и уменьшить j на 1 --> i = 6, j = 94
    • седьмая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 6*6 >= 94 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 6 94
      4. увеличить i и уменьшить j на 1 --> i = 7, j = 93
    • восьмая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 7*7 >= 93 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 7 93
      4. увеличить i и уменьшить j на 1 --> i = 8, j = 92
    • девятая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 8*8 >= 92 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 8 92
      4. увеличить i и уменьшить j на 1 --> i = 9, j = 91
    • десятая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 9*9 >= 91 --> false, тело if пропускается
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 9 91
      4. увеличить i и уменьшить j на 1 --> i = 10, j = 90
    • одиннадцатая итерация
      1. проверить !done --> !false --> true --> цикл продолжается
      2. проверить i*i >= j --> 10*10 >= 90 --> true, тело if выполняется --> done = true
      3. Console.WriteLine("i, j: " + i + " " + j); выводит i, j: 1 90
      4. увеличить i и уменьшить j на 1 --> i = 11, j = 89
    • конец цикла
      1. проверить !done --> !true --> false --> выход из цикла
Заметьте, что i и j после проверки условия еще раз изменяются. Это важно, если будете использовать их значения после выхода из цикла. Можете убедиться в состоянии этих переменных добавив еще одну строчку Console.WriteLine после цикла for.

Последний раз редактировалось macomics; 27.08.2022 в 01:42. Причина: исправил скопированные очепятки
macomics вне форума Ответить с цитированием
Старый 27.08.2022, 01:31   #10
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
При переводе книг листинги очень страдают. В оригинале там так:
Код:
using System;

class forDemo {
  static void Main() {
    int i, j;
    bool done = false;

    for(i=0, j=100; !done; i++, j--) {

      if(i*i >= j) done = true;

      Console.WriteLine("i, j: " + i + " " + j);
    }
  }
}
С таким форматированием не возникает ложного ощущения, что WriteLine относится к телу if.
Изначально done имеет значение ложь, но условное выражение цикла !done, то есть отрицание значения done. Поэтому это выражение будет истинно, и будет выполнено тело цикла (if и WriteLine), а затем выражение, отвечающе
Цитата:
Сообщение от BDA Посмотреть сообщение
Изначально done имеет значение ложь, но условное выражение цикла !done, то есть отрицание значения done. Поэтому это выражение будет истинно, и будет выполнено тело цикла (if и WriteLine), а затем выражение, отвечающее за итерацию (i++, j--).

Так я не понимаю, если условное значение for истинно и цикл выполняется, условие оператора if будет false потому что значение i меньше j а значит метод не должен выводиться.
bITA666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО][Pascal ABC] Ошибка: переменная цикла for должна описываться в том же блоке что и цикл for sudar Помощь студентам 1 17.05.2019 16:49
Управляющая кнопка в цикле Tpy_BoJIK Помощь студентам 4 17.02.2013 09:24
Необходимо написать программу на C#, управляющая LPT и 3 COM портами. На COM висят АЦП и ЦАП CopperRU Фриланс 2 15.04.2012 10:19
Управляющая инструкция If.... Trimbl Microsoft Office Excel 5 02.05.2011 02:37
Нераспознная управляющая последовательность _-Re@l-_ Общие вопросы .NET 1 25.11.2010 20:37