Другие языки программирования и технологии

Вопрос по трассировке цикла со вложенностью. C++

С какими значениями можно оттрассировать приведенный ниже цикл? Уже долгое время не могу понять до конца логику его работы. Все мои результаты не совпадают с результатами отладочного кода с выводом значений на каждом шаге (я привожу лишь отрывок кода, в самом коде таких конструкций несколько, однако там достаточно понять принцип работы одной вложенности, чтобы правильно понять и весь остальной код).

Важное уточнение: я не прошу решить за меня данное задание, я прошу объяснить порядок выполнения, желательно расписать один его прогон.
Сам код:

#include "iostream" (там должны быть <>, но "Ответы" почему-то не отображает их)

int main()
{
int A = 9;
int B = -1;
int C = 20;
int D = -12;
int i, j;
for(i = 8; i <= 10; ++i) // вполне ясно, присвоение i=8, условие, преинкременция
{
C = D / B; // здесь понятно
for(j = i; i <= 10; ++i) // вложенный цикл. по логике j=i=8, условие и действие те же
{
D = i - j; // вычитание, при котором, по моей логике, D всегда будет равняться 0
A = A + 1; // здесь понятно (A в конце всего цикла вернет значение 12)
}
D = D / B; // здесь понятно
}
std::cout << "\nA=" << A << std::endl; // стандартный вывод всех данных (да, можно было
std::cout << " B=" << B << std::endl; // использовать namespace)
std::cout << " C=" << C << std::endl;
std::cout << " D=" << D << std::endl;
std::cout << " i=" << i << std::endl;
std::cout << " j=" << j << std::endl;
return 0;
}
а ты перед окончанием каждого цикла впиши отладочный код с выводом всех значений переменных и останови программу до нажатия клавиши и смотри второй-десятый проход
Дмитрий Дудин
Дмитрий Дудин
21 700
Лучший ответ
Дмитрий Дудин весь блок std::cout вставь внутрь вложенного цикла и отслеживай до нажатия клавиши на продолжение вычислений
На первой итерации внешнего цикла i == 8 и внутренний цикл инициализирует j значением 8 (i == 8) и дальше значение j никак не меняется.

После чего внутренний цикл начинает увеличивать счётчик i внешнего цикла, так что внутренний цикл производит 3 итерации: при j == 8 (всегда) и i = 8, 9, 10.

При этом в 2 итерациях внутреннего цикла ((i == 9, j == 8), (i == 10, j == 8)) i != j и D != 0.

Но т. к. после окончания внутреннего цикла i == 11, то внешний циклю ещё увеличивает i: i == 12 и внешний цикл завершается.
Закир _ Ты учитываешь путаницу с буквами i j ?
Закир _ Внутренний цикл
for(j = i; i <= 10; ++i)
вместо
for(j = i; j <= 10; ++j)
Роман Антропов Я рассматривал этот вариант и изначально выполнял трассировку именно по такому сценарию, ибо это является наиболее логичным. Однако конечный результат все так же не совпал с результатом "трассы". Грубо говоря, консоль думает иначе.
Андрей написал все верно. На всякий случай перефразирую, если не поняли
int main()
{
int A = 9;
int B = -1;
int C = 20;
int D = -12;
int i, j;
for(i = 8; i <= 10; ++i) // вполне ясно, присвоение i=8, условие, преинкременция
{
C = D / B; // C в дальнейшем и не поменяется так как внешний цикл пройдет только одну итерацию
for(j = i; i <= 10; ++i) // при выходе из этого цикла i станет равной 11 так как именно это число является условием выхода из цикла.
{
D = i - j; // В конечном итоге j останется 8, а i на последней итерации внутреннего цикла станет равной 10 то есть D станет равной 2
A = A + 1; // здесь понятно (A в конце всего цикла вернет значение 12) ну впринципе логично что 3 итерации значит A равна 12(9+3). Непонятно почему не ++A или на крайняк A+=1;
}
D = D / B; // D было равно 2 разделить на минус один равно минус два.
//где то тут сработает ++i внешнего цикла и i станет равна 12. Приращение переменной в цикле for происходит в конце цикла а проверка на условие происходит в начале именно поэтому выйдет только после инкремента переменной.
}

все логично все норм
Максим Литвин
Максим Литвин
15 408