Что произошло, когда мы использовали cin для условия цикла? - PullRequest
3 голосов
/ 25 октября 2019

Это код модельного решения следующей задачи:

"Вход состоит из тестовых случаев T. Первая строка входных данных имеет значение T. Каждый тестовый пример состоит из трех строк, разделенных целыми числамина один пробел, каждая из которых состоит из трех случайных точек с координатами x и y. Координаты верхнего левого пикселя в окне просмотра браузера равны (1, 1), а координаты нижнего правого пикселя - (1000, 1000). Всекоординаты расположены в области просмотра, и позиции каждой точки различны. "

А вот пример ввода.

2
5 5
5 7
7 5
30 20
10 10
10 20
7 7
30 10

Последние две строки являются ответами на задачу.

И вот мои три вопроса. 1) Что произошло, когда мы используем оператор cin при инициализации ?? Он получает, сколько действий он выполнит от пользователя при инициализации цикла for. Я понимаю, что это утверждение cin работает правильно. Я не могу понять, как этот код знает, сколько раз этот цикл должен повторяться. Это связано с тем, что после инициализации со значением T от пользователя не происходит никаких действий. Также нет актриона в 'приращении / уменьшении'.

2) После поиска в Google, я понимаю, когда в условии есть cin, цикл заканчивается, когда больше нет входов или тип входов не соответствуеттип переменных. Но в этом коде цикл for заканчивается, когда повторяется время (T). Как это могло произойти ???

3) Наконец, результаты должны быть представлены после того, как все входные данные завершены, а не по одному. Тогда как это можно сделать для запоминания цикла каждого набора (3 входа) ??

Я не являюсь носителем английского языка TT Спасибо за чтение моего вопроса.

#include<iostream>

int main()
{
int T,a,b,c,A,B,C;
for(std::cin>>T; std::cin>>a>>A>>b>>B>>c>>C; printf("%d %d\n",a^b^c,A^B^C));

}

Ответы [ 2 ]

1 голос
/ 25 октября 2019
  1. Что произошло, когда мы используем cin оператор в инициализации ??

    Эта часть цикла for() может содержать любой простой оператор , а не просто оператор инициализации. Это утверждение делается только один раз. Для цикла

    for ( init condition ; iteration ) 
       statement
    

    фактически эквивалентен этому коду:

    {
       init
       while ( condition ) 
       {
          statement
          iteration;
       }
    }
    
  2. Но в этом коде цикл for заканчивается, когда повторяется время (Т) окончен. Как это могло произойти ???

    Перегруженный поток operator >> для потока, в котором он действовал. Класс ios_base, который является общим родителем всех потоков, содержит этот оператор

    std :: ios_base :: operator bool ()

    Этот оператор эквивалентен good() метод. Когда >> не удается прочитать и проанализировать значения из входного потока, good () возвращает false, разрывы цикла. T не используется в предоставленном коде.

  3. Тогда как это можно сделать для цикла запоминания результата каждого набора (3 входа) ??

    Это не так. Он печатает результат после прочтения каждого набора.

PS. Люди, которые читают проверочный код после программиста, склонны иметь убийственные намерения по отношению к тем, кто пишет циклы for().

0 голосов
/ 25 октября 2019
  1. Если мы используем оператор cin в качестве нашей инициализации, мы выполняем это один раз. Он получит ввод и поместит значение в переменную T. Вы совершенно правы;после инициализации T не предпринимается никаких действий, таких как увеличение или уменьшение его значения.

  2. Это не так. Код не заканчивается, когда он повторяется T раз. Пока задан (действительный) ввод, этот цикл for будет продолжаться. Это потому, что условная часть вашего цикла for состоит из оператора cin. То есть, пока ваш оператор cin успешно выполняется, цикл for будет продолжаться.

  3. Не может. При каждом запуске цикла вы перезаписываете переменные a, A, b, B, c и C. Следовательно, старые значения теряются.

...