Урок 13.1. Задача 21.

Урок 13.1. Задача 21.

Пользователь передает целое положительное число N, выведете на экран последовательность от 1 до N, так чтобы ширина "ёлочки" росла волнами. Например, для N=49 получим:
1
23--сначала до двух
4
56
789--потом до трёх
1011
12--возвращаемся к одному
1314
151617
18192021--тут уже четыре
222324
2526--снова убывает
27
2829
303132
33343536
3738394041
42434445
464748
49

var N, M, a, b, i : integer;
    fl : boolean;
begin
  a := 0;
  b := 1;
  M := 2;
  fl := true;
  write('Enter an integer : ');
  readln(N);
  for i := 1 to N do
  begin
    a := a + 1;
    write(i, ' ');
    if a = b then
    begin
      a := 0;
      writeln();
      if fl then
        b := b + 1
      else
        b := b - 1;
    end;
    if b = M then
      fl := false;
    if b = 1 then
    begin
      fl := true;
      M := M + 1;
    end;
  end;
  readln();
end. 
Enter an integer : 49
1
2 3
4
5 6
7 8 9
10 11
12
13 14
15 16 17
18 19 20 21
22 23 24
25 26
27
28 29
30 31 32
33 34 35 36
37 38 39 40 41
42 43 44 45
46 47 48
49
vedro-compota's picture

if b = M then
      fl := false;
    if b = 1 then
    begin
      fl := true;
      M := M + 1;
    end;

-- могут ли оба условия выполниться в одном витке? если нет - то нужно сцеплять их через else

2) Почему M=2?

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

Оба условия в одном витке выполниться не могут.
М = 2 потому что в первой пирамиде количество элементов в средней и самой длиной строки равно двум.

var N, M, a, b, i : integer;
    fl : boolean;
begin
  a := 0; // для подсчета количества элементов в строке 
  b := 1; // для увеличения или уменьшения количества элементов в строке.
  M := 2; // величина средней и самой длинной строки в своей пирамиде.
  fl := true; // флаг переключатель, увеличения или уменьшения.
  write('Enter an integer : ');
  readln(N);
  for i := 1 to N do
  begin
    a := a + 1; 
    write(i, ' ');
    if a = b then // условие  увеличения или уменьшения количества элементов в строке.
    begin
      a := 0;
      writeln();
      if fl then
        b := b + 1
      else
        b := b - 1;
    end;
    if (b = M) then // блок переключения флага и увеличения вершины пирамиды.
      fl := false
    else
      if b = 1 then
      begin
        fl := true;
        M := M + 1;
      end;
  end;
  readln();
end.
vedro-compota's picture

засчитано

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