помогите сделать процедуру

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
spell
Сообщения: 1
Зарегистрирован: 26 ноя 2007, 18:58

26 ноя 2007, 19:05

К данной программе надо написать процедуру которая будет заменять отрицательные элементы массива на положительные (К примеру -5 на 5, -6 на 6 и т.д. ) и выведет матрицу уже с измененными элементами на экран.

Заранее всем СПАСИБО!

Программа:
Program prog4;
Uses Crt;
Type TArray=Array[1..10,1..10] of Real;
Var A, B, C, D : TArray; n,m,k,l : Byte; h : Char; Ar : Real;
Procedure InMatr1(Var x:TArray; row,col:Byte);
Var i,j:Byte;
Begin
Randomize;
For i:=1 to row do Begin
For j:=1 to col do Begin
X[i,j]:=sin((i+j)/2);
Write(x[i,j]:7:2,' ');
End;
Writeln;
End;
End; {--------------------------------------------}
Procedure InMatr2(Var x:TArray; row,col:Byte);
Var i,j:Byte;
Begin
Randomize;
For i:=1 to row do Begin
For j:=1 to col do Begin
X[i,j]:=cos((5*i)-(2*j));
Write(x[i,j]:7:2,' ');
End;
Writeln;
End;
End; {--------------------------------------------}
Function Sum(x:TArray; row,col:Byte):Real;
Var S :Real; i,j:Byte;
Begin
S:=0;

For i:=1 to row do
For j:=1 to col do
If x[i,j]>0 Then S:=S+X[i,j];
Sum:=S;
End; {--------------------------------------------}
Procedure NewMatr(x:TArray; row,col:Byte; Var y:TArray);

Var i,j:Byte; MMax:real;
Function Max(x:TArray; row,col:Byte):Real;
Var M :Real; i,j:Byte;
Begin
M:=x[1,1];
For i:=1 to row do
For j:=1 to col do IF x[i,j] > M Then M:=X[i,j];
Max:=M;
End;
Begin
MMax:=Max(x,row,col);
For i:=1 to row do For j:=1 to col do y[i,j]:=x[i,j]/MMax;
End; {--------------------------------------------}
Procedure Print(x:TArray; row,col:Byte);
Var i,j:Byte;
Begin
For i:=1 to row do Begin
For j:=1 to col do Begin
Write(x[i,j]:7:2,' ');
End;
Writeln;
End;
End;
BEGIN
Write('vvedite chislo strok mattricy А ne bolee 10 ');
Readln(n,m);
Writeln('vybirite sposob formirovaniya matrizy A');
Write('1 -> sinus; 2 or other -> cosinus : ');
Readln(h);
IF h='1' Then InMatr1(A,n,m) Else InMatr2(A,n,m);
Write('vvedite chislo strok mattricy B ne bolee 10 '); Readln(k,l);
Writeln('vybirite sposob formirovaniya matrizy B');
Write('1 -> sinus; 2 or other->cosinus : ');

Readln(h);
IF h='1' Then InMatr1(B,k,l) Else InMatr2(B,k,l);
Ar:=(Sum(A,n,m)+Sum(B,k,l))/2;
Writeln('srednee arifmetich = ',Ar:8:3);
Writeln('******* vyvod matr С ******');
Print(C,n,m);
NewMatr(B,k,l,D);
Writeln('******* the end ******');
Print(D,k,l);
Readkey;
End.
Аватара пользователя
annihilator
Сообщения: 30
Зарегистрирован: 27 ноя 2007, 00:22

27 ноя 2007, 00:52

есть в паскале такая функция как abs(), которая вычисляет модуль числа. Так как массив двухмерный, то напиши вложенный цикл:

Код: Выделить всё

for var1:=1 to 10 do
for var2:=1 to 10 do
TArray[var1,var2]:=abs(TArray[var1,var2]);
var1 и var2 целые.
Такой цикл заменит тебе все отрицательные элементы в массиве на их модуль.
Если надо сохранить исходные значения - создавай второй массив 10х10 и пиши модули в него. А если просто на экран, то вместо присваивания пиши вывод на экран. Думаю, знаешь как.
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

27 ноя 2007, 06:26

если речь идёт о том, чтобы написать процедуру, то, сохраняя стиль исходной программы это будет приблизительно так:

Код: Выделить всё

procedure ChangeNegative(x:TArray; row,col:Byte);
Var i,j:Byte;
Begin
  For i:=1 to row do
    For j:=1 to col do
      If x[i,j]<0 Then x[i,j] := abs(x[i,j]);
End; {--------------------------------------------}
кстати, проверка на то, что число меньше нуля присутствует, но, я не удивлюсь, если данная процедура будет работать быстрее без этой проверки (т.о. заменяя ВСЕ значения на их модуль - разумеется для положительных чисел модуль совпадает с самим числом), т.е. так, как это написал annihilator. ;-)
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

27 ноя 2007, 06:39

Добавлю, не спама/флейма ради, а справедливости для...
annihilator
&quot писал(а):TArray[var1,var2]:=...
это неверно. Так нельзя!! Нельзя присваивать значения ТИПУ данных!! А TArray - это именно тип...
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

27 ноя 2007, 09:02

&quot писал(а):это неверно. Так нельзя!! Нельзя присваивать значения ТИПУ данных!! А TArray - это именно тип...
&quot писал(а):for var1:=1 to 10 do
for var2:=1 to 10 do
TArray[var1,var2]:=abs(TArray[var1,var2]);
А тут нигде и не написано, что это тип - судя по синтаксису это переменная. То, что впереди "Т" еще ни о чем не говорит.
It's a long way to the top if you wanna rock'n'roll
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

27 ноя 2007, 09:47

&quot писал(а):А тут нигде и не написано, что это тип - судя по синтаксису это переменная. То, что впереди "Т" еще ни о чем не говорит.
а... тогда да... ;-)) я то думал это относится к той программе, которая приведена в исходном вопросе (просто так совпало, что там есть тип с таким именем! ;-))))
а если TArray : array[1..10,1..10]... - тогда это безусловно правильный код.
Вы правы! ;-)
Аватара пользователя
annihilator
Сообщения: 30
Зарегистрирован: 27 ноя 2007, 00:22

27 ноя 2007, 11:23

Serge_Bliznykov, извини, но в начале первого ночи уже не было сил разбираться в исходнике, да и свою прогу при этом обдумывал. На будущее учту =)
бесспорно, производительность от исключения лишней проверки условия вырастет, но мне кажется что это будет заметно разве что на том, что я вчера выменял на бутылку водки - процессор 75 мегагерц, 8192к оперативки =)
spell, а можно текст задачи в студию? Мы вроде тоже что-то такое писали... правда учусь на физмате, поэтому у меня информатика автоматом...
Ответить