Задача №7 из главы 11: Циклический ввод данных пользователем и выходи из цикла по условию - Обсуждение решения

Решение задачи №7 из главы 11

Пользователь вводит целые числа, в ответ выводите символ #. Если введенное пользователем число равно 22, то завершите цикл не выводя ничего в ответ. Решите эту задачу 2-мя способами:
С использованием if()
С использованием break;

var a: integer;
begin
    a:=1; //инициализация переменной

    while (a < 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      if  (a=22) then  //если равно 22
         break; //то прерываем программу
      writeln('#'); //Выводим #
    end;
    readln(); //Удерживаем консоль
end.           
vedro-compota's picture

у вас только один способ?

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    a:=1; //инициализация переменной

    while (a < 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      if  (a=22) then  //если равно 22
         writeln('poka') //то прерываем программу
      else
         writeln('#'); //Выводим #
    end;
    readln(); //Удерживаем консоль
end.
vedro-compota's picture

почти правильно, но по условию:

завершите цикл не выводя ничего в ответ

доработайте.

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    a:=1; //инициализация переменной

    while (a < 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      if  (a=22) then  //если равно 22
      else
          writeln('#'); //Выводим #
    end;
    readln(); //Удерживаем консоль
end.

vedro-compota's picture

if  (a=22) then  //если равно 22
      else
          writeln('#'); //Выводим #

переделайте теперь на вариант без else -- чтобы не было пустой ветки как сейчас.

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    a:=1; //инициализация переменной

    while (a < 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      if  (a=22) then  //если равно 22
        writeln('') //Выводим пустую
      else
        writeln('#');
    end;
    readln(); //Удерживаем консоль
end.    
vedro-compota's picture

if  (a=22) then  //если равно 22
        writeln('') //Выводим пустую
      else
        writeln('#');

нет, в вашем случае достаточно оператора if в неполной форме -- только с веткой then. Подумайте как это сделать

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

while (a < 22) 

-- это условие тоже не верно, если пользователь введет число 56 цикл должен продолжать работать.

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    a:=1; //инициализация переменной

    while (a <> 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      if  (a = 22) then  //если равно 22
           writeln(' '); //Выводим пустую
      if (a <> 22) then
           writeln('#');//Выводим #
    end;
    readln(); //Удерживаем консоль
end.   
vedro-compota's picture

      if  (a = 22) then  //если равно 22
           writeln(' '); //Выводим пустую
      if (a <> 22) then
           writeln('#');//Выводим #

неправильно. внимательно почитайте условие задачи. Там написано что-то выводе пустой строки?
нет. Здесь достаточно одного оператора if не неполной форме.

_____________
матфак вгу и остальная классика =)

gani84's picture

Ну там же в ответ надо выводить #

vedro-compota's picture

Ну там же в ответ надо выводить #

да, а зачем второй if?

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    a:=1; //инициализация переменной
    while (a <> 22) do

begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      writeln('#');
      if  (a = 22) then  //если равно 22
           writeln(''); //Выводим пустую
      readln(); //Удерживаем консоль
end;
end.    
vedro-compota's picture

if (a = 22) then //если равно 22
writeln(''); //Выводим пустую

зачем в этом случае выводить пустую строку?

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    a:=1; //инициализация переменной
    while (a <> 22) do

begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      writeln('#');
      if  (a = 22) then  //если равно 22
           writeln( ); //Выводим пустую
      readln(); //Удерживаем консоль
end;
end.        
vedro-compota's picture

Вы предлагали вариант:

var a: integer;
begin
    a:=1; //инициализация переменной
 
    while (a <> 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); //вводим первое число
      if  (a=22) then  //если равно 22
        writeln('') //Выводим пустую
      else
        writeln('#');
    end;
    readln(); //Удерживаем консоль
end.

на это вам было сказано, что:

в вашем случае достаточно оператора if в неполной форме -- только с веткой then. Подумайте как это сделать

Но вы пока что ничего не придумали. Поэтому изучите это решение и постарайтесь понять в чем разница:

var a: integer;
begin
    while (a <> 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); // считываем очередное число
      if  (a <> 22) then  // НЕ если равно 22
        writeln('#');
    end;
    readln(); //Удерживаем консоль
end. 

-- т.е. нужно было просто убрать ветку else, а внутреннее условие заменить на обратное.

_____________
матфак вгу и остальная классика =)

gani84's picture

var a: integer;
begin
    while (a <> 22) do
    begin
      writeln('Vvedite cheloe cislo A:');
      readln(a); // считываем очередное число
      if  (a <> 22) then  // НЕ если равно 22
        writeln('#');
    end;
    readln(); //Удерживаем консоль
end. 

Постараюсь запомнить.

Если введенное пользователем число равно 22, то завершите цикл не выводя ничего в ответ

поэтому я писал

 if  (a = 22) then  
        writeln('#');

а это не неминуемо выводит знак #

vedro-compota's picture

Постараюсь запомнить.

тут не запоминать надо, а понимать что происходит.

if  (a = 22) then 
       writeln('#');

-- как вы писали конечно не блокирует вывод, а наоборот выводит значение, что противоречит условию задачу.

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

 if  (условие) then  
        // ничего не надо делать 
      else
      // что-то надо делать

тогда нужно переписать на оператор в неполной форме:

 if  (Not условие) then  
     // что-то надо делать   

_____________
матфак вгу и остальная классика =)

gani84's picture

Получается что при при полной форме

if  (условие) then 
       // ничего не надо делать (есть отрицательная ветка)
     else
     // что-то надо делать (положительная ветка)

есть отрицательная ветка и положительная ветка

if  (Not условие) then 
    // что-то надо делать

То при не полной форме должна остаться только отрицательная ветка
Я правильно понял?

vedro-compota's picture

То при не полной форме должна остаться только отрицательная ветка

в неполной форме есть только положительная ветка (then), но тут нужна инверсия условия.

_____________
матфак вгу и остальная классика =)