Решение задачи №21 из главы 13.1

Задача №21 из главы 13.1

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

Просьба подсказать как переносить одну, потом две строки, потом три строки?

var
i,n,j,m:integer;
begin
i:=1; // начальное значение счетчика
j:=0;// начальное значение для внутреннего счетчика
writeln('Vvedite chislo ogranichitel');
readln(m);
writeln('Vvedite chislo');
readln(n);
    while i<=n do
       begin
       m:=1;
       j:=j+1; // запускаем внутренний счетчик

       if(j < m) then
         begin
           writeln('  ');
           j:=0; //обнуляем внутренний счетчик
         end;

        if (m = 1) then
          begin
             writeln(i, ' ');
             i:=i+1; // изменяем значение счетчика
          end
       end;
    readln();
end.               
vedro-compota's picture

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

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

gani84's picture

Но немного не то
За длину строки отвечает переменная j

Вывод консоли
vvedite chislo N:
12
vvedite chislo M:
3

1
2 3
4 5
6 7
8 9
10 11
12
var n, i, j, m,k:integer;
begin
  writeln('vvedite chislo N:');
  readln(n);
  writeln('vvedite chislo M:');
  readln(m);
  k:=1;
  j:=0;
  writeln();
  for i:=1 to N do
  begin

    write(i, ' ');
    j := j + 1;

    if (j>=k) AND (m>=k)  then
     begin
       writeln();
       j:=0;
       k:=k+1;

     end
     else begin
         if (j<=m) AND (j<=k) then begin
      k:=k-1;
      j:=j-1;
     end;

  end;

end;

  readln();
end.
vedro-compota's picture

Решите предварительно задачи 14, 14 и 16 отсюда: http://fkn.ktu10.com/?q=node/7341

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

gani84's picture

Вывод консоли

Vvedite chislo N
25
Vvedite chislo M
3

1
23
456
78
9
1011
121314
1516
17
1819
202122
2324
25
var n,m,i,z,s:integer;
  f:boolean;
  begin
writeln('Vvedite chislo N');
  readln(n);
  writeln('Vvedite chislo M');
  readln(m);
  z:=0;
  s:=1;
  writeln();
  for i:=1 to n do
  begin
    write(i);
    z:=z+1;

    if (s = 1)then
        f:=false;

    if (s = m)then
        f:=true;

    if (z=s) and (f=false) then
      begin
        writeln();
        z:=0;
        s:=s+1;
      end;

     if (z=s) and (f=true) then
      begin
        writeln();
        z:=0;
        s:=s-1;
      end;

   end;
  readln();
end.

vedro-compota's picture

1)

if (f=true)

то же самое, что:

if (f)

2)

if (f=false) 

то же самое что:

if (not f) 

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

vedro-compota's picture

добавить комментарии на все блоки if

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

gani84's picture

var n,m,i,z,s:integer;
  f:boolean;
  begin
writeln('Vvedite chislo N');
  readln(n);
  writeln('Vvedite chislo M');
  readln(m);
  z:=0; //счетчик строк
  s:=1; //счетчик кол-ва строк
  writeln();
  for i:=1 to n do
  begin
    write(i);
    z:=z+1;// запускаем счетчик строк

    if (s = 1)then //счетчик строк
        f:=false; //флаг становиться = false

    if (s = m)then//
        f:=true; //флаг становиться = true

    if (z=s) and (f=false) then {если совпадают строка и ограничитель и флаг false}
      begin
        writeln();// делаем перенос строки
        z:=0;//и обнуляем строку
        s:=s+1;//но увеличиваем кол-во строк
      end;

     if (z=s) and (f=true) then {если совпадают строка и ограничитель и флаг true}
      begin
        writeln();// делаем перенос строки
        z:=0;//и обнуляем строку
        s:=s-1;//но уменьшаем кол-во строк
      end;

   end;
  readln();
end.
vedro-compota's picture

1)

 z:=0; //счетчик строк
  s:=1; //счетчик кол-ва строк

- уточнить

2)

 if (z=s) and (f=false) then
      begin
        writeln();
        z:=0;
        s:=s+1;
      end;
 
     if (z=s) and (f=true) then
      begin
        writeln();
        z:=0;
        s:=s-1;
      end;

-убрать дублирование if (z=s) (объединить блоки).

3)

if (s = 1)then
        f:=false;
 
    if (s = m)then
        f:=true;

- использовать else.

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

gani84's picture

var n,m,i,z,s:integer;
  f:boolean;
  begin
  writeln('Vvedite chislo N');
  readln(n);
  writeln('Vvedite chislo M');
  readln(m);
  z:=0; //счетчик кол-ва символов
  s:=1; //счетчик строк
  writeln();
  for i:=1 to n do
  begin
    write(i);
    z:=z+1;//счетчик кол-ва символов

    if (s <> m)then //если счетчик строк равен m
        f:=false //флаг выключается
    else
        f:=true; //флаг включается



  if (z=s) and (f=false) then {если совпадают строка и ограничитель }
      begin
        writeln();// делаем перенос строки
        z:=0;//счетчик строки
        s:=s+1;//но увеличиваем кол-во строк
      end;

  if (z=s) and (f=true) then {если совпадают строка и ограничитель }
      begin
        writeln();// делаем перенос строки
        z:=0;////счетчик строки
        s:=s-1;//но уменьшаем кол-во строк
      end;

end;
  readln();
end.
vedro-compota's picture

сейчас работает так:

Vvedite chislo N
50
Vvedite chislo M
3

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 

И ещё проблема:

Vvedite chislo N
12
Vvedite chislo M
1

1
23456789101112

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

vedro-compota's picture

Дополнительно решите:

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

gani84's picture

var n,m,i,z,s:integer;
    f:boolean;
begin
  writeln('Vvedite chislo N');
  readln(n);
  writeln('Vvedite chislo M');
  readln(m);
  z:=0; //счетчик
  s:=1; //счетчик кол-ва символов
  writeln();
  for i:=1 to n do
  begin
    write(i,' ');
    z:=z+1;//счетчик кол-ва строк
    if (s = 1) then //если кол-во символов равно 1
       f:=false //флаг выключается
    else if (s = m) then
       f:=true; //флаг включается

    if (z=s) then
    begin
       writeln();// делаем перенос строки
       z:=0;
       if (f=true) then //условие для флага включенного
           s:=s-1
       else
           s:=s+1  //условие для флага выключенного
    end;
  end;
  readln();
end. 
vedro-compota's picture

уже лучше, но осталась одна проблема в записи:

if (f=true)

Для понимания решите:

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

vedro-compota's picture

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

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

gani84's picture

var n,m,i,z,s:integer;
    f:boolean;
begin
  writeln('Vvedite chislo N');
  readln(n);
  writeln('Vvedite chislo M');
  readln(m);
  z:=0; //счетчик
  s:=1; //счетчик кол-ва символов
  writeln();
  for i:=1 to n do
  begin
    write(i,' ');
    z:=z+1;//счетчик кол-ва строк
    if (s = 1) then //если кол-во символов равно 1
       f:=false //флаг выключается
    else if (s = m) then
       f:=true; //флаг включается

    if (z=s) then
    begin
       writeln();// делаем перенос строки
       z:=0;
       if (f) then //условие для флага включенного
           s:=s-1
       else
           s:=s+1  //условие для флага выключенного
    end;
  end;
  readln();
end.