Задача 22 Урок 13.1

Задача 22 Урок 13.1

Пользователь передает целое положительное число N, выведете на экран последовательность от 1 до N, так чтобы ширина "ёлочки" росла волнами. Например, для N=49 получим:

var N, M, i ,c ,k :integer;
    f: boolean;

begin
  writeln('vvedi massu elki N ');
  readln(N);
  M := 2;
  i := 1;    // начало отсчета последовательности
  k := 1;    // динамический построчный ограничитель ширины елки от одного до N c шагом +1 и -1
  while(i <= N) do
    begin
      if((k <= M) and (not f) )then   // увеличение елки. (not f) чтобы не вернуться в это условие при уменьшении елки
        begin
          c := 0; //внутриусловный посимвольный счетчик ширины елки
          repeat
            if(i <= N) then // когда достигнут максимум по массе елки закончить
              begin
                write(i, ' ');
                i := i + 1;    // увеличиваем последовательность чисел
                c := c + 1;    // увеличиваем ширину ветки елки на 1 (не мах)
              end;
          until (c = k);   // условие выхода по отресовке ветки
          writeln();
          k := k + 1;      //увеличиваем ограничительную ширину строки на 1

        end
      else  // уменьшение елки
        begin
          c := 0;  //внутриусловный посимвольный счетчик ширины елки
          repeat
            if(i <= N) then  // когда достигнут максимум по массе елки закончить
              begin
                write(i, ' ');
                i := i + 1;  // увеличиваем последовательность чисел
                c := c + 1;  // увеличиваем ширину ветки елки на 1 (не мах)
              end;
          until (c = (k-2));  // (к-2) из за особеностей кода.  условие выхода по отресовке ветки
          writeln();
          k := k - 1;   //уменьшаем ограничительную ширину строки на 1
          f := true;     // флаг чтобы не вернуться в условие по увеличению елки
          if(k=2) then  // условие чтобы начать снова ёлку увеличивать(выйдя из уменьшения)
            begin
              f := false;
              M := M + 1; // увеличение елки на 1 после спуска
            end;
        end;
    end;
  readln();
end. 

var N, M, i ,L ,k :integer;
begin
  writeln('vvedi massu elki N ');
  readln(N);
  M := 2;
  l := 2;  // ограничитель символов в строке     (начать с 2х и закончить 1)
  k := 0; //  посимвольный счетчик на строке
  i := 2;
  writeln(1);
  while (i <= N) do
    begin

      if(k <= L) then // условие входа для увеличения   елки
        if(k = L) then  //увеличиваем длину строки на 1
          begin
            i := i - 1;
            L := L + 1;
            if(L > M) then //в последней итерации на увеличение меняем зайдет сюда и переключит на уменьшение
              begin
                L := M - 1;   // создается разница в 2 раза между L и k
                k := L * 2;
              end
            else
              k := 0;
            writeln();
          end
        else
          begin
            write(i, ' ');
            k := k + 1;
          end
        else if(k > L) then  //условие для уменьшения
          begin
            write(i, ' ');
            k := k - 1;
            if((k = L) and ((k <= 1) or (L <= 1))) then //условие на выход из уменьшения, далее елка увеличивается
              begin
                l := 2;  // создаем стартовые условия для увеличения
                k := 0;
                M := M + 1; // елка увеличивается на 1 сама
                writeln();
              end
            else if(k = L) then //уменьшаем длину строки на 1 и переход на строку 34
              begin
                L := L - 1;  // создается разница в 2 раза между L и k
                k := L * 2;
                writeln();
              end;
          end;
      i := i + 1;
    end;
  readln();
end.   
vedro-compota's picture

ждем решения задачки 21: http://fkn.ktu10.com/?q=node/12709#comme...

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

var N, M, i ,c ,k :integer;
    f: boolean;

begin
  writeln('vvedi massu elki N ');
  readln(N);
  M := 1;
  k := 0;
  c := 1;
  f := true;
  for i := 1 to N do
    begin
      write(i, ' ');
      k := k + 1;
      if((k = c) and (f = true)) then
        begin
          k := 0;
          c := c + 1;
          writeln();
        end
      else if((k = c) and (f = false)) then
        begin
          k := 0;
          c := c - 1;
          writeln();
        end;

      if((c > M) and (f = true)) then
        begin
          M := M+1;
          f := false;
          c := c - 2;
        end
      else if((c = 1) and (f = false)) then
          f := true
      else if((c < 1) and (f = false)) then   // на случай если высота елки 2
        begin
          c := 2;
          M := M+1;
        end;
    end;
  readln();
end.
       

vvedi massu elki N
77
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 50
51
52 53
54 55 56
57 58 59 60
61 62 63 64 65
66 67 68 69 70 71
72 73 74 75 76
77
vedro-compota's picture

     if((k = c) and (f = true)) then
        begin
          k := 0;
          c := c + 1;
          writeln();
        end
      else if((k = c) and (f = false)) then
        begin
          k := 0;
          c := c - 1;
          writeln();
        end;

-- избежать дублирования, см. урок 9 задача 11 http://fkn.ktu10.com/?q=node/8539

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

var N, M, i ,c ,k :integer;
    f: boolean;

begin
  writeln('vvedi massu elki N ');
  readln(N);
  writeln('vvedi shiriny M ');
  readln(M);
  k := 0;
  c := 1;
  f := true;
  for i := 1 to N do
    begin
      write(i, ' ');
      k := k + 1;
      if(k = c) then
        begin
          k := 0;
          writeln();
          if(f = true) then
            c := c + 1
          else
            c := c - 1;
        end;

      if((c > M) and (f = true)) then
        begin
          f := false;
          c := c - 2;
        end
      else if((c = 1) and (f = false)) then
        f := true
      else if((c < 1) and (f = false)) then   // на случай если высота елки 2
        c := 2;
    end;
  readln();
end.        
vedro-compota's picture

if((c > M) and (f = true)) then

-- нет зависимости от флага, перепроверить блок весь:

  if((c > M) and (f = true)) then
        begin
          f := false;
          c := c - 2;
        end
      else if((c = 1) and (f = false)) then
        f := true
      else if((c < 1) and (f = false)) then   // на случай если высота елки 2
        c := 2;

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

var N, M, i ,c ,k :integer;
    f: boolean;

begin
  writeln('vvedi massu elki N ');
  readln(N);
  writeln('vvedi shiriny M ');
  readln(M);
  k := 0;
  c := 1;
  f := true;
  for i := 1 to N do
    begin
      write(i, ' ');
      k := k + 1;
      if(k = c) then
        begin
          k := 0;
          writeln();
          if(f) then
            c := c + 1
          else
            c := c - 1;
        end;

      if(c > M) then
        begin
          f := false;
          c := c - 2;
        end
      else if(c = 1)  then
        f := true
      else if(c < 1) then   // на случай если высота елки 2
        c := 2;
    end;
  readln();
end. 
vedro-compota's picture

попытать переписать блок:

if(c > M) then
        begin
          f := false;
          c := c - 2;
        end
      else if(c = 1)  then
        f := true
      else if(c < 1) then   // на случай если высота елки 2
        c := 2;

перенеся его внутрь блока:

if(k = c) then
        begin

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

var N, M, i ,c ,k :integer;
    f: boolean;

begin
  writeln('vvedi massu elki N ');
  readln(N);
  writeln('vvedi shiriny M ');
  readln(M);
  k := 0;
  c := 1;
  f := true;
  for i := 1 to N do
    begin
      write(i, ' ');
      k := k + 1;
      if(k = c) then
        begin
          k := 0;
          writeln();
          if(c = M) then
            f := false
          else if (c = 1) then
            f := true ;
          if(f) then
            c := c + 1
          else
            c := c - 1;
        end;
    end;
  readln();
end.      
vedro-compota's picture

решение засчитано

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