Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ процедуры с параметрами

Автор: Анечка 24.03.2009 1:36

Есть программа, нужно прописать 3 процедуры, каждая с 3 параметрами. Первая процедура - изменение размерности матрицы, т.е. спрашивать пользователя сколько строк и сколько столбцов, изменение имени первой и второй матрицы; вторая - пользователь выбирает что делать с матрицей( находить среднее арифм, сумму или произведение элементов); третья - формула, по которой считается результатная матрица.
Вот сама задача: Дана матрица А(6,6). Определить среднее арифметическое матрицы А - SRA. Создать новую матрицу В(6,6), где В(i,j)= A(i,j)*0,1*SRA.Вывести исходную и результатную матрицы на экран.
Прикрепленный файл  4progadfbdff.PAS ( 2.31 килобайт ) Кол-во скачиваний: 293

Автор: Lapp 24.03.2009 9:51

Цитата(Анечка @ 23.03.2009 21:36) *
Есть программа, нужно прописать 3 процедуры, каждая с 3 параметрами.
А в чем, собственно, затруднение?
Я не вполне понимаю, чего ты хочешь. Сделать это за тебя?..
А программа твоя или нет?

Автор: Анечка 24.03.2009 13:49

Цитата(Lapp @ 24.03.2009 5:51) *

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


Программа моя, писала сама, но как делать процедуры я не понимаю!(

Автор: Lapp 24.03.2009 16:53

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

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

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

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

Автор: Анечка 25.03.2009 0:29

Цитата(Lapp @ 24.03.2009 12:53) *

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

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

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

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



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

Автор: Lapp 25.03.2009 11:20

Цитата(Анечка @ 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) *
Вот что мне препод сказал...
Ох.. Одно из двух: либо вы с ним плохо поняли друг друга, либо - мне жаль МГУ, с такими преподами у него нет шансов..

Автор: Анечка 26.03.2009 1:35

Цитата(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]10.gif1);
writeln;
{ writeln;}
end;
writeln;
writeln(' "МАТРИЦА Б"');
writeln;
for i:=1 to 6 do

begin
for j:=1 to 6 do write(b[i,j]10.gif1);
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 26.03.2009 20:27

Цитата(Анечка @ 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
При ответе, пожалуйста, не копируй весь предыдущий мессадж. Оставляй только то, что тебе нужно.