Решение задачи №2 из главы 10

Решение задачи №2 из главы 10

Пользователь вводит целое число, если оно больше единицы, то выведите на экран все целые числа от этого числа до единицы (в обратном порядке), которые делятся на 5 без остатка. Иначе (если введённое пользователем число не больше единицы) сообщите об ошибке.

var a,i:integer; //объявляем переменную счетчика
begin
  writeln('vvedite chislo');
  readln(a);

      if ((a mod 5) = 0) and  (a > 1) then
        for i:=a downto 1 do  // i пройдёт значения от i до 64
          write(i, ' ')//выводим в одну строку через пробел
   else
     write('Ochibka');
  readln(); // удерживаем консоль
end.  

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

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

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

vedro-compota's picture

if ((a mod 5) = 0) and (a > 1) then

это неверно, точнее не все на своих местах.

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

gani84's picture

var i, a: integer;
begin
  writeln('vvedite celoe chislo');
  readln(a); //вводим число
  if (a > 1) then //проверяем условие
    for i:=a downto 1 do
       if ((a mod 5) = 0) then
        write(a, ' ')
  else
     writeln('oshibka!');

  readln();
end. 
vedro-compota's picture

но результат не совсем тот

почему не тот? Решение теперь в приципе верное. Теперь делимость проверяется уже внутри цикла -- что соответствует условию.

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

vedro-compota's picture

Переделал но результат не совсем тот

почему вы считаете что результат не тот?

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

gani84's picture

например я ввожу число 10
тогда он мне выводит:
vvedite celoe chislo
10
10 10 10 10 10 10 10 10 10 10

Хотя логика и алгоритм все правильно!!!

vedro-compota's picture

да вы правы, решение неверное. У вас выводится не то что надо .Какая переменная изменяется в цикле по вашему?

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

gani84's picture

Теперь все решил но не выполняется условие if ((a mod 5) = 0) then не могу понять почему??

var i, a: integer;
begin
  writeln('vvedite celoe chislo');
  readln(a); //вводим число
  if (a > 1) then //проверяем условие
    for i:=a downto 1 do
       if ((a mod 5) = 0) then
        write(i, ' ')
  else
     writeln('oshibka!');
  readln();
end. 

ИЛИ

var i, a: integer;
begin
  writeln('vvedite celoe chislo');
  readln(a); //вводим число
  if (a > 1) and ((a mod 5) = 0) then //проверяем условие
    for i:=a downto 1 do
      write(i, ' ')
  else
     writeln('oshibka!');
  readln();
end. 
vedro-compota's picture

ответьте на вопрос выше - -вы не ответили:

.Какая переменная изменяется в цикле по вашему?

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

gani84's picture

var i, a: integer;
begin
  writeln('vvedite celoe chislo < 1');
  readln(a); //вводим число
  if (a < 1)then // первая ветка если A меньше 1
      writeln('oshibka!'); // то выводим ошибку
  if (a > 1) then  //проверяем условие
    for i:=a downto 1 do
       if ((i mod 5) = 0) then
           write(i, ' ');
  readln();
end.  
gani84's picture

var i, a: integer;
begin
  writeln('vvedite celoe chislo');
  readln(a);
  if (a > 1) then  begin
     for i:=a downto 5 do 
       if ((i mod 5) = 0) then
        write(i, ' ')
  end
  else
     writeln('oshibka! vashe chislo ne > 1.');
  readln();
end. 
vedro-compota's picture

Ваши два последние решения делают не совсем одно и то же почему? в чем отличие?

1)

var i, a: integer;
begin
  writeln('vvedite celoe chislo < 1');
  readln(a); //вводим число
  if (a < 1)then // первая ветка если A меньше 1
      writeln('oshibka!'); // то выводим ошибку
  if (a > 1) then  //проверяем условие
    for i:=a downto 1 do
       if ((i mod 5) = 0) then
           write(i, ' ');
  readln();
end.

2)

var i, a: integer;
begin
  writeln('vvedite celoe chislo');
  readln(a);
  if (a > 1) then  begin
     for i:=a downto 5 do
       if ((i mod 5) = 0) then
        write(i, ' ')
  end
  else
     writeln('oshibka! vashe chislo ne > 1.');
  readln();
end.

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

gani84's picture

В первой задаче: Есть первая отдельная ветка if которая проверяет больше ли число 1. Если оно меньше то оно прерываться в первой ветке. Если нет то она продолжает делать только уже во второй if.

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

vedro-compota's picture

Если оно меньше то оно прерываться в первой ветке. Если нет то она продолжает делать только уже во второй if.

не совсем так.

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

gani84's picture

Если оно меньше то выполняется условие
if (a writeln('oshibka!');
и программа выводит ошибка и ждет нажатия клавишы. Так как переходит в readln();

Но если введенное число больше 1 то выполняется вторая ветка if.

vedro-compota's picture

разница не в этом, я переформулирую вопрос, чтобы вам было понятнее, вот есть код:

var i, a: integer;
begin
  writeln('vvedite celoe chislo < 1');
  readln(a); //вводим число
  if (a < 1)then // первая ветка если A меньше 1
      writeln('oshibka!'); // то выводим ошибку
  if (a > 1) then  //проверяем условие
    for i:=a downto 1 do
       if ((i mod 5) = 0) then
           write(i, ' ');
  readln();
end.

тут не все правильно, если значение, когда на экране не появится вообще ничего. Какое оно?
(второе решение избавлено от этого недостатка)

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