Помощь - Поиск - Пользователи - Календарь
Полная версия: процедуры с параметрами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Анечка
Есть программа, нужно прописать 3 процедуры, каждая с 3 параметрами. Первая процедура - изменение размерности матрицы, т.е. спрашивать пользователя сколько строк и сколько столбцов, изменение имени первой и второй матрицы; вторая - пользователь выбирает что делать с матрицей( находить среднее арифм, сумму или произведение элементов); третья - формула, по которой считается результатная матрица.
Вот сама задача: Дана матрица А(6,6). Определить среднее арифметическое матрицы А - SRA. Создать новую матрицу В(6,6), где В(i,j)= A(i,j)*0,1*SRA.Вывести исходную и результатную матрицы на экран.
Нажмите для просмотра прикрепленного файла
Lapp
Цитата(Анечка @ 23.03.2009 21:36) *
Есть программа, нужно прописать 3 процедуры, каждая с 3 параметрами.
А в чем, собственно, затруднение?
Я не вполне понимаю, чего ты хочешь. Сделать это за тебя?..
А программа твоя или нет?
Анечка
Цитата(Lapp @ 24.03.2009 5:51) *

А в чем, собственно, затруднение?
Я не вполне понимаю, чего ты хочешь. Сделать это за тебя?..
А программа твоя или нет?


Программа моя, писала сама, но как делать процедуры я не понимаю!(
Lapp
Цитата(Анечка @ 24.03.2009 9:49) *
Программа моя, писала сама, но как делать процедуры я не понимаю!(
Хорошо, поможем обязательно.
Только нужно кое-что уточнить. Например - параметров у каждой процедуры должно быть ровно три? Это требование выглядит несколько странным.. Вообще, в данном случае разбиение на процедуры кажется мне надуманным - но это еще ладно, раз требуют, можно три сделать. Но насчет параметров - в высшей степени странно. Если уж с тебя требуют определенное число параметров, то пусть скажут, какие именно. Пожалуйста, уточни этот вопрос.

Так, из общих соображений целесообразности, я могу, например, предложить выделить в процедуру, например, печать заголовка. Это будет вполне осмысленно. Текст (шапку) при этом можно держать в отдельном файле. Если тебе это подходит, могу помочь.

Дальше.. Выбор дествия. которое нужно произвести с матрицей, можно оформить либо в виде меню, либо в виде парсера строки. Первое (меню) намного легче второго (парсера). Меню тоже можно выделить в отдельную (и даже не одну) процедуру.

Так что выбирай. Проясни детали, которые я спрашивал (например, у препа). Скажи, что именно ты хочешь сделать. А я постараюсь помочь.
Анечка
Цитата(Lapp @ 24.03.2009 12:53) *

Хорошо, поможем обязательно.
Только нужно кое-что уточнить. Например - параметров у каждой процедуры должно быть ровно три? Это требование выглядит несколько странным.. Вообще, в данном случае разбиение на процедуры кажется мне надуманным - но это еще ладно, раз требуют, можно три сделать. Но насчет параметров - в высшей степени странно. Если уж с тебя требуют определенное число параметров, то пусть скажут, какие именно. Пожалуйста, уточни этот вопрос.

Так, из общих соображений целесообразности, я могу, например, предложить выделить в процедуру, например, печать заголовка. Это будет вполне осмысленно. Текст (шапку) при этом можно держать в отдельном файле. Если тебе это подходит, могу помочь.

Дальше.. Выбор дествия. которое нужно произвести с матрицей, можно оформить либо в виде меню, либо в виде парсера строки. Первое (меню) намного легче второго (парсера). Меню тоже можно выделить в отдельную (и даже не одну) процедуру.

Так что выбирай. Проясни детали, которые я спрашивал (например, у препа). Скажи, что именно ты хочешь сделать. А я постараюсь помочь.



Параметров не обязательно, но желательно три. Не, заголовок( как я поняла ты имеешь ввиду титульный лист) выделять в процедуру нельзя... надо запрашивать пользователя о размерности матрицы, через процедуры спросить в форме меню под 1,2,3 что делать с матрицей, далее через процедуру высчитать создать формулу на основе данной, спросить пользователя так же через меню как расположить исходный и результатный массив: рядом, друг под другом или по диагонали(тоже через процедуры сделать).Вот что мне препод сказал...
Lapp
Цитата(Анечка @ 24.03.2009 20:29) *
Параметров не обязательно, но желательно три.
Отлично. Желательность постараемся учесть по мере возможности (но не будем горевать, если ее не будет)))

Цитата(Анечка @ 24.03.2009 20:29) *
заголовок( как я поняла ты имеешь ввиду титульный лист) выделять в процедуру нельзя...
Терпеть не могу слова "нельзя".
Вот, смотри, я сделал процедуру для выводв строки, которая может центрировать строку, нормировать на левый/правый край, а также выводить в указанной позиции. Ты увидишь сама, насколько это удобнее - никаких явных указаний, где печатать, вычислений позиции.. Я, конечно, понимаю, что тебе может показаться жалко своей работы - но это именно то, что должен делать компьютер, ибо он делает это гораздо лучше людей smile.gif.
program zadanie_4;
uses crt;
type
  tMatrix=array[1..6,1..6] of real;

var
  a,b: tMatrix;
  i,j,z: integer;
  byk: string [5] ;
  SRA,s,x: real;
  ch:char;

label
  L1,L2;

procedure OutLn(s: string; Pos,Col: integer);
begin
  TextColor(Col);
  case Pos of
    -2: GoToXY(1,WhereY);
    0: GoToXY((Lo(WindMin)+Lo(WindMax)-Length(s))div 2,WhereY);
    -1: GoToXY(Lo(WindMin)+Lo(WindMax)-Length(s)+2,WhereY);
    else GoToXY(Pos,WhereY)
  end;
  WriteLn(s)
end;


begin
  clrscr;
  GoToXY(1,6);
  OutLn('Вашему вниманию представленна программа',-1,LightGray);
  OutLn('по нахождению среднего арифметического',0,LightGray);
  OutLn('в квадратной матрице.',0,LightGray);
  WriteLn;
  OutLn('ЗАДАЧА ПРОГРАММЫ:',0,Red);
  OutLn('ПОСТРОИТЬ КВАДРАТНУЮ МАТРИЦУ "А"',0,White);
  OutLn('НАЙТИ СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ В МАТРИЦЕ "А"',0,White);
  OutLn('ПОСТРОИТЬ МАТРИЦУ "Б"*0.1*SRA',0,Red);
  OutLn('ВЫВЕСТИ ИСХОДНУЮ МАТРИЦУ И ПОЛУЧЕННУЮ РЯДОМ',0,Red);
  WriteLn;
  OutLn('Программу составила',42,Green);
  OutLn('студентка МГУ ПС группы ЭИЭ - 112',42,Green);
  OutLn('ИВАНОВА АННА',42,Green);
  WriteLn;
  WriteLn;
  OutLn('Москва 1.12.2009',0,Yellow);
  WriteLn;
  OutLn('Нажмите любую клавишу для продолжения!',0,LightGray);
  ch:=readkey;

  L1:
  begin
   clrscr;
   writeln('ВВЕДИТЕ ЭЛЕМЕНТЫ МАТРИЦЫ!!!');
  writeln;
   SRA:=0;
    for i:=1 to 6 do
       for j:=1 to 6 do
       begin
    repeat
       write('a[',i,',',j,']>');
          readln(byk);
	  val(byk,a[i,j],z);
          textcolor(12);
		  If z<>0 then
	  writeln('Неверно задан элемент матрицы! Повторите ввод элемента');
          textcolor(white);
    Until z=0;

   SRA:=SRA+a[i,j];
      end;
   SRA:=SRA/36;
	 for i:=1 to 6 do
   for j:=1 to 6 do
   b[i,j]:=a[i,j]*0.1*SRA;
  clrscr;
   writeln('Среднее арифметическое =',sra:10:2);
   writeln;
   writeln('                           "МАТРИЦА А"');
   writeln;
   for i:=1 to 6 do
begin
      for j:=1 to 6 do
       write(a[i,j]:10 :1);
      writeln;
    {  writeln;}
  end;
      writeln;
   writeln('                           "МАТРИЦА Б"');
       writeln;
    for i:=1 to 6 do

    begin
      for j:=1 to 6 do write(b[i,j]:10 :1);
      writeln;
  end;

 gotoxy(20,24);
 writeln('Хотите ли продолжить? Y-да, N-нет');
 l2:
  case readkey of
   #89: goto l1;
    #121: goto l1;
     #78: exit;
      #110:exit;
  end;
   goto l2;
 end;
 end.

Остальную часть программы я пока оставил без изменения. Это было непросто - скрепя зубы я оставил твои метки и GoTo.. Если хочешь, чтоб я и дальше помогал тебе - избавься от них (я могу помочь smile.gif).

Цитата(Анечка @ 24.03.2009 20:29) *
надо запрашивать пользователя о размерности матрицы, через процедуры спросить
У меня сложилось впечатление, что ты как-то извращенно понимаешь процедуры.. Они у тебя почему-то всегд для ввода чего-нибудь. Это в корне неверное понимание. Процедура (или функция) используется для обособленной (и, как правило, неоднократно использующейся) части кода, выполняющей любую задачу - совсем не только ввод. Даже, как правило не ввод smile.gif).

Цитата(Анечка @ 24.03.2009 20:29) *
в форме меню под 1,2,3
Опять магическое число 3!.. Боюсь, я буду просыпаться по ночам и кричать: "Три параметра!!" (почти по Пушкину smile.gif)

Цитата(Анечка @ 24.03.2009 20:29) *
далее через процедуру высчитать создать формулу на основе данной,
А это я просто не понял)). "Через процедуру высчитать.. создать формулу на основе данной..." ?? Что это значит?? Кто понял, объясните, плз.. blink.gif


Цитата(Анечка @ 24.03.2009 20:29) *
Вот что мне препод сказал...
Ох.. Одно из двух: либо вы с ним плохо поняли друг друга, либо - мне жаль МГУ, с такими преподами у него нет шансов..
Анечка
Цитата(Lapp @ 25.03.2009 7:20) *

Отлично. Желательность постараемся учесть по мере возможности (но не будем горевать, если ее не будет)))

Терпеть не могу слова "нельзя".
Вот, смотри, я сделал процедуру для выводв строки, которая может центрировать строку, нормировать на левый/правый край, а также выводить в указанной позиции. Ты увидишь сама, насколько это удобнее - никаких явных указаний, где печатать, вычислений позиции.. Я, конечно, понимаю, что тебе может показаться жалко своей работы - но это именно то, что должен делать компьютер, ибо он делает это гораздо лучше людей smile.gif.
program zadanie_4;
uses crt;
type
  tMatrix=array[1..6,1..6] of real;

var
  a,b: tMatrix;
  i,j,z: integer;
  byk: string [5] ;
  SRA,s,x: real;
  ch:char;

label
  L1,L2;

procedure OutLn(s: string; Pos,Col: integer);
begin
  TextColor(Col);
  case Pos of
    -2: GoToXY(1,WhereY);
    0: GoToXY((Lo(WindMin)+Lo(WindMax)-Length(s))div 2,WhereY);
    -1: GoToXY(Lo(WindMin)+Lo(WindMax)-Length(s)+2,WhereY);
    else GoToXY(Pos,WhereY)
  end;
  WriteLn(s)
end;
begin
  clrscr;
  GoToXY(1,6);
  OutLn('Вашему вниманию представленна программа',-1,LightGray);
  OutLn('по нахождению среднего арифметического',0,LightGray);
  OutLn('в квадратной матрице.',0,LightGray);
  WriteLn;
  OutLn('ЗАДАЧА ПРОГРАММЫ:',0,Red);
  OutLn('ПОСТРОИТЬ КВАДРАТНУЮ МАТРИЦУ "А"',0,White);
  OutLn('НАЙТИ СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ В МАТРИЦЕ "А"',0,White);
  OutLn('ПОСТРОИТЬ МАТРИЦУ "Б"*0.1*SRA',0,Red);
  OutLn('ВЫВЕСТИ ИСХОДНУЮ МАТРИЦУ И ПОЛУЧЕННУЮ РЯДОМ',0,Red);
  WriteLn;
  OutLn('Программу составила',42,Green);
  OutLn('студентка МГУ ПС группы ЭИЭ - 112',42,Green);
  OutLn('ИВАНОВА АННА',42,Green);
  WriteLn;
  WriteLn;
  OutLn('Москва 1.12.2009',0,Yellow);
  WriteLn;
  OutLn('Нажмите любую клавишу для продолжения!',0,LightGray);
  ch:=readkey;

  L1:
  begin
   clrscr;
   writeln('ВВЕДИТЕ ЭЛЕМЕНТЫ МАТРИЦЫ!!!');
  writeln;
   SRA:=0;
    for i:=1 to 6 do
       for j:=1 to 6 do
       begin
    repeat
       write('a[',i,',',j,']>');
          readln(byk);
	  val(byk,a[i,j],z);
          textcolor(12);
		  If z<>0 then
	  writeln('Неверно задан элемент матрицы! Повторите ввод элемента');
          textcolor(white);
    Until z=0;

   SRA:=SRA+a[i,j];
      end;
   SRA:=SRA/36;
	 for i:=1 to 6 do
   for j:=1 to 6 do
   b[i,j]:=a[i,j]*0.1*SRA;
  clrscr;
   writeln('Среднее арифметическое =',sra:10:2);
   writeln;
   writeln('                           "МАТРИЦА А"');
   writeln;
   for i:=1 to 6 do
begin
      for j:=1 to 6 do
       write(a[i,j]
1);
      writeln;
    {  writeln;}
  end;
      writeln;
   writeln('                           "МАТРИЦА Б"');
       writeln;
    for i:=1 to 6 do

    begin
      for j:=1 to 6 do write(b[i,j]
1);
      writeln;
  end;

 gotoxy(20,24);
 writeln('Хотите ли продолжить? Y-да, N-нет');
 l2:
  case readkey of
   #89: goto l1;
    #121: goto l1;
     #78: exit;
      #110:exit;
  end;
   goto l2;
 end;
 end.

Остальную часть программы я пока оставил без изменения. Это было непросто - скрепя зубы я оставил твои метки и GoTo.. Если хочешь, чтоб я и дальше помогал тебе - избавься от них (я могу помочь smile.gif).

У меня сложилось впечатление, что ты как-то извращенно понимаешь процедуры.. Они у тебя почему-то всегд для ввода чего-нибудь. Это в корне неверное понимание. Процедура (или функция) используется для обособленной (и, как правило, неоднократно использующейся) части кода, выполняющей любую задачу - совсем не только ввод. Даже, как правило не ввод smile.gif).

Опять магическое число 3!.. Боюсь, я буду просыпаться по ночам и кричать: "Три параметра!!" (почти по Пушкину smile.gif)

А это я просто не понял)). "Через процедуру высчитать.. создать формулу на основе данной..." ?? Что это значит?? Кто понял, объясните, плз.. blink.gif
Ох.. Одно из двух: либо вы с ним плохо поняли друг друга, либо - мне жаль МГУ, с такими преподами у него нет шансов..


программу посмотрела, впринципе интересно, но я боюсь, что препод этого не оценит((
на счет Go to...если поможешь, то я буду только рада )))
ммм...про процедуры поняла, но просто на моём примере они должны быть видны пользователь, т.е. на экран обязательно должно выводиться меню выбора дальнейших действий! Процедуры я сказала примерно, препод сказал типо сама думай...так что если у тя будут ещё какие то варианты - то я опять же за!)но они обязательно должны отоброжаться в работе программы, т.е. при работе пользователя с программой...вот...а препод у нас действительно не совсем вминяемый..ну а куда деваться?!если не получить автомат,сдавши 4 программы за семестр, то хрен сдашь экзамен, а он берёт по 200 евро...а откуда ж у бедного студента такие деньги?))
Так, что то меня на лирику потянуло)))Вообщем, жду ответа!;)
Lapp
Цитата(Анечка @ 25.03.2009 21:35) *
программу посмотрела, впринципе интересно, но я боюсь, что препод этого не оценит((
Ты не бойся, ты пробуй.

Цитата(Анечка @ 25.03.2009 21:35) *
на счет Go to...если поможешь, то я буду только рада
Это несложно. Вот твоя прога без меток и GoTo. Наслаждайся.

program zadanie_4;
uses crt;
type
  tMatrix=array[1..6,1..6] of real;

var
  a,b: tMatrix;
  i,j,z: integer;
  byk: string [5] ;
  SRA,s,x: real;
  ch:char;

procedure OutLn(s: string; Pos,Col: integer);
begin
  TextColor(Col);
  case Pos of
    -2: GoToXY(1,WhereY);
    0: GoToXY((Lo(WindMin)+Lo(WindMax)-Length(s))div 2,WhereY);
    -1: GoToXY(Lo(WindMin)+Lo(WindMax)-Length(s)+2,WhereY);
    else GoToXY(Pos,WhereY)
  end;
  WriteLn(s)
end;

procedure DoIt;
begin
  clrscr;
  writeln('ВВЕДИТЕ ЭЛЕМЕНТЫ МАТРИЦЫ:');
  writeln;
  SRA:=0;
  for i:=1 to 6 do for j:=1 to 6 do begin
    repeat
      write('a[',i,',',j,']>');
      readln(byk);
	val(byk,a[i,j],z);
      textcolor(12);
      If z<>0 then writeln('Неверно задан элемент матрицы! Повторите ввод элемента');
      textcolor(white);
    Until z=0;
    SRA:=SRA+a[i,j];
  end;
  SRA:=SRA/36;
  for i:=1 to 6 do for j:=1 to 6 do b[i,j]:=a[i,j]*0.1*SRA;
  clrscr;
  writeln('Среднее арифметическое =',sra:10:2);
  writeln;
  writeln('                           "МАТРИЦА А"');
  writeln;
  for i:=1 to 6 do begin
    for j:=1 to 6 do write(a[i,j]:10 :1);
    writeln;
   {  writeln;}
  end;
  writeln;
  writeln('                           "МАТРИЦА Б"');
  writeln;
  for i:=1 to 6 do begin
    for j:=1 to 6 do write(b[i,j]:10 :1);
    writeln;
  end
end;

begin
  clrscr;
  GoToXY(1,6);
  OutLn('Вашему вниманию представленна программа',0,LightGray);
  OutLn('по нахождению среднего арифметического',0,LightGray);
  OutLn('в квадратной матрице.',0,LightGray);
  WriteLn;
  OutLn('ЗАДАЧА ПРОГРАММЫ:',0,Red);
  OutLn('ПОСТРОИТЬ КВАДРАТНУЮ МАТРИЦУ "А"',0,White);
  OutLn('НАЙТИ СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ В МАТРИЦЕ "А"',0,White);
  OutLn('ПОСТРОИТЬ МАТРИЦУ "Б"*0.1*SRA',0,Red);
  OutLn('ВЫВЕСТИ ИСХОДНУЮ МАТРИЦУ И ПОЛУЧЕННУЮ РЯДОМ',0,Red);
  WriteLn;
  OutLn('Программу составила',42,Green);
  OutLn('студентка МГУ ПС группы ЭИЭ - 112',42,Green);
  OutLn('ИВАНОВА АННА',42,Green);
  WriteLn;
  WriteLn;
  OutLn('Москва 1.12.2009',0,Yellow);
  WriteLn;
  OutLn('Нажмите любую клавишу для продолжения!',0,LightGray);
  ch:=readkey;
  repeat
    gotoxy(20,24);
    writeln('Хотите ли продолжить? Y-да, N-нет');
    case readkey of
      #89,#121: DoIt;
      #78,#110: exit;
    end
  until false
end.


Цитата(Анечка @ 25.03.2009 21:35) *
ммм...про процедуры поняла, но просто на моём примере они должны быть видны пользователь, т.е. на экран обязательно должно выводиться меню выбора дальнейших действий! Процедуры я сказала примерно, препод сказал типо сама думай...так что если у тя будут ещё какие то варианты - то я опять же за!)но они обязательно должны отоброжаться в работе программы, т.е. при работе пользователя с программой...
У меня боооооольшие сомнения, что ты поняла, что такое процедуры и зачем они нужны. Я вот сделал процедуру DoIt сейчас (вообще без параметров, кстати), чтобы избавиться от GoTo - и это действительно достойная цель. Твои слова о том, чтобы пользователь видел работу процедуры вызывают откровенное недоумение. Типа как если бы пассажир автомобиля потребовал бы увидеть работу поршня двигателя. Нет и не может быть ему до этого дела. Организация программы целиком определяется программистом и никто ее не должен знать. Прошу тебя, перечитай раздел в учебнике про процедуры..

Цитата(Анечка @ 25.03.2009 21:35) *
вот...а препод у нас действительно не совсем вминяемый..ну а куда деваться?!если не получить автомат,сдавши 4 программы за семестр, то хрен сдашь экзамен, а он берёт по 200 евро...а откуда ж у бедного студента такие деньги?))
Знаешь, эту информацию оставь для прокурора..

Еще замечу, что у тебя плоховато с форматированием программы. Я подправил в последнем варианте - обрати внимание, как нужно. Это важно.

Добавлено через 7 мин.
PS
При ответе, пожалуйста, не копируй весь предыдущий мессадж. Оставляй только то, что тебе нужно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.