Урок 13.1 (Решенные задачи)

Урок 13.1 (Решешенные задачи)

1)Выведите на экран таблицу умножения используя только циклы вида repeat/until.

var a, b: integer;

begin
  a := 1;
  repeat
     b := 1;
    repeat
     write(a, '*', b, '=',a * b, ' ');
     b := b + 1;
    until (b > 9);

    a := a + 1;
  until (a > 9);
end.
2) Выведите на экран таблицу умножения используя только циклы вида while.
end.
var a,b: integer;

begin
b := 1;
  while(a < 9) do
    begin
      a := a + 1;
      b := 1;
     while (b <= 9) do
       begin;
         write(a, '*', b, '=', a*b, ' ');
         write();
         b := b + 1;
       end;
    end;
end.
3)Выведите на экран таблицу умножения используя один цикл while и один repeat-until.
var a, b: integer;

begin
  a := 1;
  b := 1;
  repeat
    while (b <= 9) do
    begin
      write(a, '*', b, '=', a*b, ' ');
      b := b + 1;
    end;
      a := a + 1;
      b := 1;
  until (a > 9);

end.
5) Пользователь вводит первое целое число-ограничитель m. А затем начинает вводить целые числа по одному, пока не введёт число большее числа-ограничителя.
Если очередное целое число больше 1, то в ответ на каждое такое число программа должна выводить все целые числа от единицы до этого числа.

Примечание: это задача на вложенные циклы, в качестве внешнего надо использовать while, а в качестве внутреннего можно использовать или for или while.

var m,i: integer;

begin
  writeln('vvedite cislo m');
  readln(m);
  writeln('vvedite cislo i');
  readln(i);
  while (i <> m) do
       begin
        while (i >= 1) do
         begin
           writeln(i, ' ');
           i := i - 1;
         end;
        writeln('vvedite cislo');
        readln(i);
       end;
end.
6) Пользователь вводит целое положительное число, если оно не соответствует критериям (то есть не является положительным), выведете сообщение об ошибке, в противном случае выведете на экран все числа от 1 до введённого пользователем.
var i: integer;

begin
  writeln('vvedite cislo');
  readln(i);
  while (i > 1) do
    begin
      writeln('vvedite cislo');
      readln(i);
      for i := 1 to i do
       writeln(i, ' ');
    end;
  writeln('osibka');
end.
7) Модифицируйте предыдущую задачу так, чтобы в случае, если число удовлетворяет требованиям (целое, положительное), то на экран выводились четные числа.
var i: integer;

begin
  writeln('vvedite cislo');
  readln(i);
  while(i > 1) do
    begin
      writeln ('vvedite cislo');
      readln(i);
      for i:= 1 to i do
        if ((i mod 2)=0) then
          writeln(i, ' ');
    end;
  writeln('osibka');
end. 
8) Выведете на экран числа от 1 до 5 два раза с помощью вложенных циклов. Так чтобы в консоли было:
?
1
2

1 2 3 4 5
1 2 3 4 5

var i, a: integer;

begin
  i := 1;
  a := 1;
  repeat
      while (i <= 5) do
        begin
          write(i, ' ');
          i := i + 1;
        end;
      writeln();
      i := 1;
      a := a + 1;
    until (a > 2);
end.
9) M раз выведете на экран числа от 1 до N с помощью вложенных циклов. Так чтобы в консоли было:
1......N}M раз
var M,N: integer;

begin
  writeln('vvedite cislo M');
  readln(M);
  writeln('vvedite cislo N');
  readln(N);
  while (M <> 0) do
   begin
      for N := 1 to N do
         write(N, ' ');
   M := M - 1;
   writeln();
   end;
end.
10) Модифицируйте предыдущую задачу так, чтобы в каждой чётной (той, у которой номер чётный) строке выводилось N символов, а в каждой нечетной N/2 символов (сделайте проверку того, что N/2 больше нуля)
var M, N, a: integer;

begin
  writeln('vvedite M');
  readln(M);
  writeln('vedite N');
  readln(N);
  while (M <> 0) do
  begin
  if ((M mod 2) = 1) then
  begin
      a := N;
      for a:= 1 to a div 2 do
      write(N, ' ');
  M := M - 1;
  writeln();
  end
  else
  begin
      for N:= 1 to N do
      write(N, ' ');
  M := M - 1;
  writeln();
  end;
  end;
end.
11) Пользователь вводит числа до тех пор пока им не будет передан ноль. В ответ на каждое число программа должна сообщать чётное оно или нет.
var a: integer;

begin
  writeln('vveidte cislo');
  readln(a);
  while (a <> 0) do
  if ((a mod 2) = 0) then
     begin
       writeln('cislo - hetnoe');
       writeln('vvedite cislo');
       readln(a);
     end
  else
     begin
       writeln('cislo ne hetnoe');
       writeln('vvedite cislo');
       readln(a);
     end;
  writeln('programma zavrhena');
end.
12) Пользователь вводит четное целое число (если нечетное сообщите об ошибке). Делите это число в цикле на 2 до тех пор пока оно делится, выводя каждый промежуточный результат, например для 12 в консоли получим:
6
3

А для 8:
4
2
1
var a: integer;

begin
  writeln('vvedite cislo');
  readln(a);
  if (a mod 2) = 0 then
    while ((a mod 2) <> 1) do
      begin
        a := a div 2;
        writeln(a);
      end
  else
    writeln('osibka');
end.
13) Пользователь вводит два целых числа M и N, если M четное, делайте то же, что и в предыдущей задаче, а если нечётное, то умножайте M в цикле на 3 до тех пор пока результат не станет больше N (и выводите каждый из промежуточных результатов умножения на экран), например для:
1
2
	
M := 3;
N := 15;
var M,N: integer;

begin
   writeln('vvedite cislo M');
   readln(M);
   writeln('vvedite cislo N');
   readln(N);
   if ((M mod 2) = 0) then
      while (M > 1) do
       begin
         M := M div 2;
         writeln(M);
       end
   else
     while (M < N) do
      begin
        M := M * 3;
        writeln(M);
      end;
end. 
14)С помощью вложенных циклов выведите на экран таблицу умножения числе от 1 до 9, начнётся она как-то так:
1x1 = 1
1x2 = 2
......
var a, b: integer;

begin
  a := 1;
  b := 1;
  repeat
    while (b <= 9) do
    begin
      writeln(a, 'x', b, '=', a*b, ' ');
      b := b + 1;
    end;
      a := a + 1;
      b := 1;
  until (a > 9);

end.
15) С помощью вложенных циклов выведите на экран таблицу деления чисел от 1 до 9.
var a, b: integer;

begin
  a := 1;
  b := 1;
  repeat
    while (b <= 9) do
    begin
      writeln(a, ':', b, '=', a div b, ' ');
      b := b + 1;
    end;
      a := a + 1;
      b := 1;
  until (a > 9);

end.

16)Пользователь вводит целое положительное число N, если оно не соответствует критериям (то есть не является положительным), выведете сообщение об ошибке, в противном случае выведите на экран все числа последовательности, не большие N, сформированной следующим образом:

8 10 3 12 14 3 16 18 3 20 22 3 и т.д.
var N,a: integer;

begin
  writeln('vvedite cislo N');
  readln(N);
  if (N > 0) then
    while (a < N) do
     begin
       a := a + 2;
       writeln(a);
       a := a + 2;
       writeln(a);
       writeln(3);
     end
  else
    writeln('osibka');
end.
17) Модифицируйте решение предыдущей задачи. так чтобы пользователь вводил второе число M, которое отвечало бы за длину возрастающего фрагмента.
var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvdeite cislo N');
  readln(N);
  if (N > 0) then
    begin
      writeln('vvedite M');
      readln(M);
      b := M;
      while (a < N) do
       begin
        a := a + 2;
        write(a, ' ');
        M := M - 1;
        if (M = 0) then
         begin
          write(3, ' ');
          M := b;
         end;
       end;
    end
  else
  writeln('osibka');
end.

18) Модифицируйте решение предыдущей задачи, так, чтобы длина возрастающего фрагмента каждый раз увеличивалась на единицу (начиная с двух):
ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно), при этом решение одним циклом можно сделать, как используя делимость нацело (для определения момента вывода тройки), так и не используя.
Решите всеми тремя способами.

Первый способ (без вложенных циклов и без деления нацело).

var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvedite cislo N');
  readln(N);
  if (N > 0) then
      begin
        writeln('vvedite cislo M');
        readln(M);
        b := M;
        while (a < N) do
         begin
           a := a + 2;
           write(a, ' ');
           M := M - 1;
           if (M = 0) then
            begin
              write(3, ' ');
              M := b + 1;
              b := M;
            end;
         end;
      end
  else
    writeln('osibka');
end.

Второй способ (без вложенных циклов с использованием проверки деления нацело).

var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvedite cislo N');
  readln(N);
  if (N > 0) then
      begin
        writeln('vvedite cislo M');
        readln(M);
        b := M;
        while (a < N) do
         begin
           a := a + 2;
           write(a, ' ');
           M := M - 1;
           if ((M div 1) = 0 ) then
            begin
              write(3, ' ');
              M := b + 1;
              b := M;
            end;
         end;
      end
  else
    writeln('osibka');
end.

Третий способ (С двумя вложенными циклами)

var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvedite cislo N');
  readln(N);
  writeln('vvedite cislo M');
  readln(M);
  while (N > 0) do
      begin
        b := M;
        while (a < N) do
         begin
           a := a + 2;
           write(a, ' ');
           M := M - 1;
           if ((M div 1) = 0 ) then
            begin
              write(3, ' ');
              M := b + 1;
              b := M;
            end;
         end;
      end;
    writeln('osibka');
end.
19)Пользователь передает целое положительное число N, выведете на экран последовательность от 1 до N "ёлочкой", например для N=17:
1
2 3
4 5 6
7 8 9 10
11 12 13 14
15 16 17
ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно), при этом решение одним циклом можно сделать, как используя делимость нацело, так и не используя.
Решите всеми тремя способами.

Превый способ (с использованием деления нацело)

var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvedite cislo N');
  readln(N);
  M := 1;
  while (N > 0) do
      begin
        b := M;
        while (a < N) do
         begin
           a := a + 2;
           write(a, ' ');
           M := M - 1;
           if ((M div 1) = 0 ) then
            begin
              writeln();
              M := b + 1;
              b := M;
            end;
         end;
      end;
    writeln('osibka');
end.

Второй способ (без использования деления нацело)

var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvedite cislo N');
  readln(N);
  M := 1;
  while (N > 0) do
      begin
        b := M;
        while (a < N) do
         begin
           a := a + 2;
           write(a, ' ');
           M := M - 1;
           if (M = 0) then
            begin
              writeln();
              M := b + 1;
              b := M;
            end;
         end;
      end;
    writeln('osibka');
end. 

Третий способ (с использованием двух цилов)

var N,M,a,b: integer;

begin
  a := 0;
  b := 1;
  writeln('vvedite cislo N');
  readln(N);
  M := 1;
  while (N > 0) do
      begin
        while (a < N) do
         begin
           a := a + 2;
           write(a, ' ');
           M := M - 1;
           if ((M div 1) = 0 ) then
            begin
              writeln();
              M := b + 1;
              b := M;
            end;
         end;
      end;
    writeln('osibka');
end.
20)Модифицируйте предыдущий вывод "ёлочкой" так, чтобы в каждой нечетной строке выводились только четные числа, а в каждой четной только нечетные.
var N,M,a,b: integer;

begin
  a := 0;
  writeln('vvedite cislo N');
  readln(N);
  M := 1;
  while (N > 0) do
      begin
        b := M;
        while (a < N) do
         begin
           while ((M mod 2) = 1) do
           begin
           a := a + 1;
           write(a, ' ');
           M := M - 1;
           end;
             while (M <> 0) do
           begin
             a := a + 2;
             write(a, ' ');
             M := M - 1;
           end;
           if (M = 0) then
            begin
              writeln();
              M := b + 1;
              b := M;
            end;
         end;
      end;
    writeln('osibka');
end.
21) Пользователь передает целые положительные число N и M, выведете на экран последовательность от 1 до N, так чтобы ширина "ёлочки" увеличивалась до M чисел, то уменьшалась до 1.

(Не получилось сделать плавный переход, чтобы числа шли по убыванию, и лесенка уменьшалась. У меня она доходит до числа M и стартует с единицы снова до M.)

var M,N, a,b,c: integer;

begin
  b := 1;
  writeln('vvedite cislo N');
  readln(N);
  writeln('vvedite cislo M');
  readln(M);
  c := M;
    while (a < N) do
     begin
       a := a + 1;
       write(a, ' ');
       M := M - 1;
       if (M = 0 ) then
       begin
         writeln();
         M := b + 1;
         b := M;
         if (b > c) then
           begin
             M := 1;
             b := 1;
           end;
       end;
     end;
end.
22) Пользователь передает целые положительные число N, выведете на экран последовательность от 1 до N, так чтобы ширина "ёлочки" росла волнами.

(Возникла та же проблема, что и в предыдущей задаче)

var M,N,a,b,v: integer;

begin
  a := 0;
  writeln('vedite cislo N');
  readln(N);
  M := 1;
  b := 1;
  v := 2;
    while (a < N) do
      begin
        a := a + 1;
        write(a, ' ');
        M := M - 1;
        if (M = 0) then
        begin
          writeln();
          M := b + 1;
          b := M;
          if(b = v) then
             begin
               b := 0;
               v := v + 1;
             end;
        end;
      end;
end.