pascal Урок 13.1 задание 10 Вопрос по решению

При решении задания 10 из урока 13.1:

Модифицируйте предыдущую задачу так, чтобы в каждой чётной (той, у которой номер чётный) строке выводилось N символов, а в каждой нечетной N/2 символов (сделайте проверку того, что N/2 больше нуля)

возникла проблема, а именно -- Не могу вывести правильно нечетную строку.

  var  a, i,j,m,n:integer;
begin
   writeln('vvedite chislo m:');
       readln(m);
   writeln('vvedite chislo n:');
       readln(n);
       a := n mod 2;
   for i:=1 to m do
       begin   //  начало тела внешнего цикл
           for j:=1 to n do // (вложенный цикл) выводим все числа до n
               if  ((i mod 2) = 1) then
                   write(j, ' ');
               if ((i mod 2) = 0) then
                   write(a, ' ');
               if (n/2 < 0) then
                   write(' oshibka');
    writeln(); // перенос строки
        end;
   readln();
end.

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

  1. Что именно у вас не работает?
  2. Добавьте ссылку на урок (и уточните его номер в заголовке 13.1 или 13.2), с которым возник вопрос
  3. Цитату условия пожалуйста

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

vedro-compota's picture

Начнем того, что неправильно отформатирован блок:

   for i:=1 to m do
       begin   //  начало тела внешнего цикл
           for j:=1 to n do // (вложенный цикл) выводим все числа до n
               if  ((i mod 2) = 1) then
                   write(j, ' ');
               if ((i mod 2) = 0) then
                   write(a, ' ');
               if (n/2 < 0) then
                   write(' oshibka');
      writeln(); // перенос строки
   end;

- begin должен быть под end,
также неправильно отформатирован блок:

        for j:=1 to n do // (вложенный цикл) выводим все числа до n
            if  ((i mod 2) = 1) then
                write(j, ' ');
            if ((i mod 2) = 0) then
                write(a, ' ');
            if (n/2 < 0) then
                write(' oshibka');

-- почему if-ы идут один по одним? Вы считаете, что они относятся к внутреннему циклу?
Если вы хотите чтобы они относились к внутреннему циклу, ставьте

begin end;

. В данный момент не все из них относятся к внутреннему,
а значит форматирование должно быть другим.

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

Переделал скрипт, не получается нечетную строку уменьшить в 2-а раза.

var  a, i,j,m,n:integer;
begin
  writeln('vvedite chislo m:');
      readln(m);
  writeln('vvedite chislo n:');
      readln(n);
  for i:=1 to m do // цилк выводим числа до m
      begin   //   начало тела внешнего цикл
          for j:=1 to n do // (вложенный цикл) выводим все числа до n
              begin //   начало тела внутреннего цикл
                  a := j mod 2;  // задаем переменную а
                  if ((j mod 2) <  0) then  // действие проверки что n/2 больше 0
                    write( 'oshibka ');  // вывод сообщения об ошибке
                  if ((i mod 2) = 1) then  // действие которое выводит нечетные строки
                    write(j, ' '); // вывод переменной j
                  if ((i mod 2) = 0) then   // действие которое выводит четные строки
                    write(a, ' ') ;  // выводим переменную а
              end;
         writeln(); // перенос строки
       end;
   readln();
end.                           
vedro-compota's picture

напишите за что отвечает внутренний цикл, за что внешний?
Зачем почему вообще вы пытаетесь решить вложенными циклами?

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

Внешний цикл отвечает за m повторений в столбик, внутренний отвечает за n повторений в строку. Используя первое действие if я определяю нечетные строки во внутреннем цикле и вывожу их. Используя второе действие if я определяю четные строки во внутреннем цикле и вывожу их.
Пытаюсь вывести в четной строке n/2. Но что-то не работает.

vedro-compota's picture

Внешний цикл отвечает за m повторений в столбик, внутренний отвечает за n повторений в строку.

предположим, хотя и не очень точно сформулировано.

Используя первое действие if я определяю нечетные строки во внутреннем цикле и вывожу их.

это не точно, вы можете вывести после проверки лишь очередной элемент строки, а не всю строку

Используя второе действие if я определяю четные строки во внутреннем цикле и вывожу их.

аналогично, строку так не выведешь, только очередной символ

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

vedro-compota's picture

Посмотрим на код:

a := j mod 2;  // задаем переменную а
   //write(j, ' ') ;
if ((i mod 2) = 1) then  // цикл который выводит нечетные строки
   write(j, ' ')
else if(n/2 < 0)then
   write( 'oshibka ');
if ((i mod 2) = 0) then   // цикл который выводит четные строки
   write(a, ' ')
else if(n/2 < 0)then
   write(' oshibka');

Что тут не так, как минум:

  • a := j mod 2;  // задаем переменную а

    -- это итак понятно, скорее надо написать ДЛЯ ЧЕГО эта переменная

  • if ((i mod 2) = 1) then  // цикл который выводит нечетные строки

    -- комментарий не корректен, это не цикл

  • else if(n/2 < 0)then
       write(' oshibka');
    

    -- что за сообщения об ошибках? Как они вообще связаны с условием?
    Если n надо проверить почему это не сделано заранее, до начала цикла, там где значение уже известно?

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

Исправил проверку

var  a, i,j,m,n:integer;
begin
  writeln('vvedite chislo m:');
      readln(m);
  writeln('vvedite chislo n:');
      readln(n);
  for i:=1 to m do // цилк будет выполняться до m 
      begin   //   начало тела внешнего цикл
          for j:=1 to n do // (вложенный цикл) выполняется до n
              begin //   начало тела внутреннего цикл
                  a := j mod 2;  // задаем переменную а
                  if ((j mod 2) <  0) then  // действие проверки что n/2 больше 0
                    write( 'oshibka ');  // вывод сообщения об ошибке
                  if ((i mod 2) = 1) then  // действие которое проверяет нечетные строки
                    write(j, ' '); // вывод переменной j
                  if ((i mod 2) = 0) then   // действие которое проверяет четные строки
                    write(a, ' ') ;  // выводим переменную а
              end;
         writeln(); // перенос строки
       end;
   readln();
end.        
vedro-compota's picture

Объясните назначение проверки:

if ((j mod 2) <  0) then  // действие проверки что n/2 больше 0
         write( 'oshibka ');  // вывод сообщения об ошибке

когда этот код вообще выполнится?

for i:=1 to m do // цилк выводим числа до m

-- это неверный комментарий, этот цикл вообще ничего сам не выводит, что он делает?

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

Проверка должна проверить число которое получилось при делении, и что оно больше "0", выполниться код когда j/2 меньше "0"

var  a, i,j,m,n:integer;
begin
  writeln('vvedite chislo m:');
      readln(m);
  writeln('vvedite chislo n:');
      readln(n);
  for i:=1 to m do // цилк выводим числа до m
      begin   //   начало тела внешнего цикл
          for j:=1 to n  do // (вложенный цикл) выводим все числа до n
              begin //   начало тела внутреннего цикл
                  if ((j mod 2) <  0) then  // действие проверки что n/2 больше 0
                    write( 'oshibka ');  // вывод сообщения об ошибке
                  if ((i mod 2) = 1) then  // действие которое проверяет нечетные строки
                    write(j, ' '); // вывод переменной j
                  if ((i mod 2) = 0) then   // действие которое проверяет четные строки
                    write(j -  n / 2, ' ') ;  // выводим решение в четной строке
               end;
         writeln(); // перенос строки
       end;
   readln();
end.     
vedro-compota's picture

(j mod 2) <  0

ответьте на вопросы:

  • при каком значении j в теории это выражение может дать TRUE?
  • может ли это стать TRUE при ваших значениях J (так чтобы и этот код вообще выполнился и условие сработало )

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

При отрицательном значении. Нет не может.