Решение задачи №5 из главы 12.1

Задача №5 из главы 12.1

Решите с помощью цикла repeat/until:
Выведите на экран, все четные числа от 35 до 117 и нечетные числа, делящиеся на 7 и 3 нацело и при этом лежащие в диапазоне от 45 до 99.
Указание: сначала можно решить задачу двумя циклами, но потом перепишите с использованием одного цикла, в теле которого составьте логическое выражение, описывающее подходящие числа (используйте логические операции).

Первый способ:

var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if ((i mod 3)=0) and ((i mod 7)=0) then // проверяем условия
      write(i, ' ');
        i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end.  

Решение вторым способом:

var i, n: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if ((i mod 3)=0) and ((i mod 7)=0) then // проверяем условия
      write(i, ' ');
        i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  writeln();
  n := 45;
  repeat    // начало тела цикла
    if ((n mod 3)=0) and ((n mod 7)=0) then // проверяем условия
      write(n, ' ');
        n := n + 1; // увеличиваем счетчик на 1
  until (n > 99);
  readln();
end.

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

vedro-compota's picture

в первом решение должно быть два цикла, а во втором один общий с логическим условием.
Невнимательно вы условие задачи читали. Исправляйте.

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

gani84's picture

Решение №1

var i, n: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if ((i mod 3)=0) and ((i mod 7)=0) then // проверяем условия
      write(i, ' ');
        i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  writeln();
  n := 45;
  repeat    // начало тела цикла
    if ((n mod 3)=0) and ((n mod 7)=0) then // проверяем условия
      write(n, ' ');
        n := n + 1; // увеличиваем счетчик на 1
  until (n > 99);
  readln();
end.
Решение №2
var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if ((i mod 3)=0) and ((i mod 7)=0) then // проверяем условия
      write(i, ' ');
        i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end.
vedro-compota's picture

  1. i := 35;
      repeat    // начало тела цикла
        if ((i mod 3)=0) and ((i mod 7)=0) then // проверяем условия
          write(i, ' ');
            i := i + 1; // увеличиваем счетчик на 1
      until (i > 117);
    

    И где тут условие для четных чисел?
    Вам нужно в первом диапазоне вывести какие числа?
    (прочитайте условие внимательно)

  2. Из-за первого замечание второе решение тоже неправильно,
    там как раз вяся суть и словность в том что диапазоны пересекаются,
    а условия разные.
    Сначала исправьте первое решение, а потом думайте над вторым.

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

gani84's picture

Решение№1

var i, n: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if ((i mod 2)=0) then // проверяем условия
      write(i, ' ');
        i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  writeln();
  writeln(); 
  n := 45;
  repeat    // начало тела цикла
    if ((n mod 3)=0) and ((n mod 7)=0) then // проверяем условия
      write(n, ' ');
        n := n + 1; // увеличиваем счетчик на 1
  until (n > 99);
  readln();
end.  
Решение№2
var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if ((i mod 3)=0) and ((i mod 7)=0) and ((i mod 2)=0) then // проверяем условия
      write(i, ' ');
        i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end.
        
vedro-compota's picture

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

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

gani84's picture

var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
       AND ((i mod 2) = 0)) then // и если четное
           write(i, ' ')
    else
        if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
            AND ((i mod 7) = 0)) AND ((i mod 3) = 0) then // и если четное
                write(i, ' ');

    i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end. 
vedro-compota's picture

не ясны комментарии, везде "если четное"

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

gani84's picture

var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
       AND ((i mod 2) = 0)) then // и если четное
           write(i, ' ') // тогда выводим значения
    else
        if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
            AND ((i mod 7) = 0)) AND ((i mod 3) = 0) then // и делится 3 и 7 нацело
                write(i, ' '); // тогда выводим значения

    i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end. 
vedro-compota's picture

проверьте условие.

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

gani84's picture

var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if  ((i >= 35) AND (i <= 117) // если принадлежит отрезку [35..117]
       AND ((i mod 2) = 0)) then // и если четное
           write(i, ' ') // тогда выводим значения
    else
        if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
            AND ((i mod 7) = 0)) AND ((i mod 3) = 0) AND ((i mod 2) = 1) then // и делится 3 и 7 нацело и нечетные числа
                write(i, ' '); // тогда выводим значения

    i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end.
vedro-compota's picture

if  ((i >= 35) AND (i <= 117) // если принадлежит отрезку [35..117]

лишнее условие

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

gani84's picture

var i: integer;
begin
  i := 35;
  repeat    // начало тела цикла
    if (i mod 2) = 0 then // и если четное
           write(i, ' ') // тогда выводим значения
    else
        if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
            AND ((i mod 7) = 0)) AND ((i mod 3) = 0) AND ((i mod 2) = 1) then // и делится 3 и 7 нацело и нечетные числа
                write(i, ' '); // тогда выводим значения

    i := i + 1; // увеличиваем счетчик на 1
  until (i > 117); // выход из цикла только если счетчик станет больше n
  readln();
end.                 

Если не выполнено (i mod 2) = 0, то (i mod 2) = 1.

И если (((i mod 7) = 0) AND ((i mod 3) = 0)), то будет ((i mod 21) = 0)).

Можно сократить программу

(((i mod 2) = 0) OR ((i >= 45) AND (i <= 99) AND ((i mod 21) = 0)))
vedro-compota's picture

   if  ((i >= 45) AND (i <= 99) // если принадлежит отрезку [45..99]
            AND ((i mod 7) = 0)) AND ((i mod 3) = 0) AND ((i mod 2) = 1)

есть лишние условия

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