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

Задача 23 Урок 13.1:

Пользователь передает целое положительное число 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
program task23;
var a,b,n,m,c,i: integer;
begin
  writeln('vvedite chislo N');
  readln(n);
  c:=1;
  m:=1;
  while (n>0) do
  begin
    if (a<=b) then
    begin
      write (c,' ');
      a:=a+1;
      c:=c+1;
      n:=n-1;
    end
    else
    begin
      writeln();
      if (b=(m)) then
      begin
        i:=1;
        m:=m+1;
      end
      else if (b=0) then
        i:=0;
      if (b<(m)) and (i=0) then
      begin
        b:=b+1;
        a:=0;
      end
      else
      begin
        b:=b-1;
        a:=0;
      end;
    end;
  end;
  readln();
end.      
vedro-compota's picture

убрать лишние скобки, прокомментировать назначение переменных

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

program task23;
var a,b,n,m,c,i: integer;
begin
  writeln('vvedite chislo N');
  readln(n);
  c:=1;
  m:=1;
  while (n>=c) do
  begin
    if (a<=b) then
    begin
      write (c,' ');
      a:=a+1;          //a-кол-во символов которое вывелось в строке
      c:=c+1;          //b-кол-во символов которое нужно вывести в строке и
    end                //определение четности строки
    else
    begin
      writeln();
      if (b=m) then
      begin
        i:=1;
        m:=m+1;
      end
      else if (b=0) then
        i:=0;
      if (b<m) and (i=0) then
      begin
        b:=b+1;
        a:=0;
      end
      else
      begin
        b:=b-1;
        a:=0;
      end;
    end;
  end;
  readln();
end.        
vedro-compota's picture

  1. //определение четности строки

    зачем определять четность?

  2. блок:
    write (c,' ');
    a:=a+1;  

    -- можно вынести за все условия, на первый уровень вложности

  3. Использовать цикл for вместо while

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

program task23v2;
var a,b,n,m,c,i,j: integer;      //a-кол-во символов которое вывелось в строке
begin                           //b-кол-во символов которое нужно вывести в строке
  writeln('vvedite chislo N'); //c-число которое нужно выводить
  readln(n);                  //n-число которое вводит пользователь
  c:=1;                      //m-для определения нужно ли строку увеличивать или уменьшать
  m:=1;
  for j:= 1 to n do
  begin
    write (c,' ');
    a:=a+1;
    c:=c+1;
    if (a>b) then
    begin
      writeln();
      if (b=m) then
      begin
        i:=1;
        m:=m+1;
      end
      else if (b=0) then
        i:=0;
      if (b<m) and (i=0) then
      begin
        b:=b+1;
        a:=0;
      end
      else
      begin
        b:=b-1;
        a:=0;
      end;
    end;
  end;
  readln();
end.
            
vedro-compota's picture

1)

//c-число которое нужно выводить

-- можно сразу использовать счетчик цикла

2)

if (a>b) then

-- лучше переделать на равенство

3) что такое:

i:=1;

-- за что отвечает переменная?

4)

      if (b<m) and (i=0) then
      begin
        b:=b+1;
        a:=0;
      end
      else
      begin
        b:=b-1;
        a:=0;

-- дублирование кода относительно переменной а

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

program task23v2;
var
  a,    //a-кол-во символов которое вывелось в строке
  b,    //b-кол-во символов которое нужно вывести в строке
  n,    //n-число которое вводит пользователь
  m,    //m-считает максимальное кол-во символов
  i,    //для определения увеличения или уменьшения строки
  j: integer; //счетчик цикла
begin
  writeln('vvedite chislo N');
  readln(n);
  m:=1;
  for j:= 1 to n do
  begin
    write (j,' ');
    if (a=b) then
    begin
      writeln();
      a:=0;
      if (i=0) then    //увеличиваем или уменьшаем кол-во чисел встроке
        b:=b+1
      else
        b:=b-1;
    end
    else
      a:=a+1;
    if (b=m) and (i=0) then
    begin
      m:=m+1;                  //увеличиваем макс кол-во чисел для вывода
      i:=1;                    //для уменьшения("b") числа в строке
    end
    else if (b=0) and (i=1) then
      i:=0;                    //для увеличения("b") числа в строке
    end;
  readln();
end.    
vedro-compota's picture

1) a:=a+1; -- должно отрабатывать всегда, как и write (j,' ');

2)

i, //для определения увеличения или уменьшения строки

-- надо использовать boolean, изначально = true (признак роста)

3) b -- изначально не должно быть нулем, мы ожидаем не ноль символов

4) По-идее все переключения значений и рассчет счетчиков можно поместить в ветку:

 if (a=b) then

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

program task23v3;
var
  a,    //кол-во символов которое вывелось в строке
  b,    //кол-во символов которое нужно вывести в строке
  m,    //считает максимальное кол-во символов
  n,    //число которое вводит пользователь
  j: integer; //счетчик цикла
  i:boolean;  //для определения увеличения или уменьшения строки
begin
  writeln('vvedite chislo N');
  readln(n);
  m:=2;
  b:=1;
  i:=true;
  for j:= 1 to n do
  begin
    a:=a+1;
    write (j,' ');
    if (a=b) then  //увеличиваем или уменьшаем элементы
    begin
      writeln();
      a:=0;
      if i then
        b:=b+1
      else
        b:=b-1;
    end;
    if (b=m) then   //увеличение максимального(вершины) кол-ва чисел в строке
       i:=false
    else if (b=1) then
    begin
      i:=true;
      m:=m+1;
    end;
  end;
  readln();
end.    
vedro-compota's picture

попробовать реализовать 4ый пункт из предыдущего комментария

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

program task23v4;
var
  a,    //кол-во символов которое вывелось в строке
  b,    //кол-во символов которое нужно вывести в строке
  m,    //считает максимальное кол-во символов
  n,    //число которое вводит пользователь
  j: integer; //счетчик цикла
  i:boolean;  //для определения увеличения или уменьшения строки
begin
  writeln('vvedite chislo N');
  readln(n);
  m:=2;
  b:=1;
  i:=true;
  for j:= 1 to n do
  begin
    a:=a+1;
    write (j,' ');
    if (a=b) then  //увеличиваем или уменьшаем элементы
    begin
      writeln();
      a:=0;
      if (b=m) then   //увеличение максимального(вершины) кол-ва чисел в строке
        i:=false
      else if (b=1) then
      begin
        i:=true;
        m:=m+1;
      end;
      if i then
        b:=b+1
      else
        b:=b-1;
    end;
  end;
  readln();
end.     
vedro-compota's picture

засчитано

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