Помогите мне пожалуйста найти ошибку.
У меня такая задача.
Даны матрицы А[1:5,1:6] и В[1:5,1:6]. Из произведений нечетных элементов строк матрицы В сформировать вектор D. Если минимальный элемент 1-ой строки матрицы А больше минимального элемента 2-ой строки матрицы А, то в матрицу А добавить 3-ий столбец, являющийся значениями вектора D, иначе в матрице В поменять местами 1 и 5 столбцы. В п/п (подпрограмме) формирования вектора D использовать п/п нахождения произведений элементов вектора.
Модуль типов MyType
Unit MyType;
Interface
Uses Wincrt;
Type
mas1=array[1..50] of integer;
mas2=array[1..10,1..10] of integer;
func=function(Aa:Mas1;na:Byte):integer;
Var
f:text;
priz,priz1,priz2:Byte;
A:Mas2;B:Mas2; C,D:Mas1;
Implementation
End.
Unit Vvod1;
Interface
Uses Mytype;
Procedure FormMatr(na,ma:Byte;Pa,Qa:Integer;Var Aa:mas2);
Implementation
Procedure FormMatr;
Var i,j:Byte;
Begin
For i:=1 to na do For j:=1 to ma do
Begin Aa[i,j]:=Random(Qa-Pa)+Pa; End;
End;
End.
Unit Vyvod;
Interface
Uses MyType,WinCrt;
Procedure VyvodVek(na:Byte;Var Aa:mas1);
Procedure VyvodMatr(na,ma:Byte;Var Ba:mas2);
Implementation
Procedure VyvodVek;
Var i:Byte;
Begin
For i:=1 to na do
Write(f,Aa[i]:10,' ');
writeLn(f,'');
End;
Procedure VyvodMatr;
Var i,j:Byte;
Begin
For i:=1 to na do
begin
For j:=1 to ma do
Write(f,Ba[i,j]:3,' '); writeLn(f,'');
end;
End;
End.
A, собственно, почему Proiz - это процедурный тип? У тебя это просто название конкретной функция. К тому же ты пытаешься вызвать её без входных параметров
Входные параметры у меня в модуле MyType
func=function(Aa:Mas1;na:Byte):integer;
Вообще не понял. Причём здесь func, если мы говорим о Proiz?
Selena,
Function Proiz(na,ma:Byte; Aa:mas1):integer;Far;
Function Proiz;
Var i:Byte; Pr:integer;
Begin
Pr:=1;
For i:=1 to na do
If i mod 2=0
Then Pr:=Pr*Aa[i];
Proiz:=Pr;
End;
М | Atos, опередил klem4 |
А как ее записать в процедурном типе? Я тут разбиралась и еще больше запуталась. Объясните пожалуйста.
Ну помогите кто-нибудь! Очень надо!
Selena, вот начало той программы, которая тебе нужна (формирование матриц A и B, и вектора D и вывода их на монитор... Если нужен вывод в файл - просто открой его и передавай вместо Output)... Процедурный тип присутствует. Все рабочее, проверено. Если что-то непонятно, спрашивай...
P.S. К сожалению, все в одном файле, но главное - алгоритм...
const
size_vector = 6; { n_cols }
size_matrix = 5; { n_rows }
type
tvector = array[1 .. size_vector] of integer;
tmatrix = array[1 .. size_matrix] of tvector;
my_func = function(v: tvector; n_cols: integer): integer;
procedure CreateMatrix(n_rows, n_cols: integer;
start, finish: Integer; var mx: tmatrix);
var i, j: integer;
begin
for i := 1 to n_rows do
for j := 1 to n_cols do
mx[i][j] := integer(random(finish - start)) + start;
end;
procedure PrintVector(var f: text; var v: tvector;
n_cols: integer);
var i: integer;
begin
for i := 1 to n_cols do
write(f, v[i]:10);
writeln(f);
end;
procedure PrintMatrix(var f: text; var mx: tmatrix;
n_rows, n_cols: integer);
var j: integer;
begin
for j := 1 to n_rows do
PrintVector(f, mx[j], n_cols);
end;
function mult_odds(v: tvector; n_cols: integer): integer; far;
var
i: integer;
p: integer;
begin
p := 1;
for i := 1 to n_cols do
if odd(v[i]) then p := p * v[i];
mult_odds := p
end;
procedure FormVector(from: tmatrix; n_rows, n_cols: integer;
func: my_func; var v: tvector);
var
i: integer;
begin
for i := 1 to n_rows do
v[i] := func(from[i], n_cols);
end;
var
A, B: tmatrix;
D: tvector;
begin
Randomize;
CreateMatrix(size_matrix, size_vector, 0, 30, A);
WriteLn('A matrix:');
PrintMatrix(output, A, size_matrix, size_vector);
CreateMatrix(size_matrix, size_vector, 0, 20, B);
WriteLn('B matrix:');
PrintMatrix(output, B, size_matrix, size_vector);
FormVector(B, size_matrix, size_vector, mult_odds, D);
WriteLn('D matrix:');
PrintVector(output, D, size_matrix);
end.
For Volvo.
Огромное спасибо. Именно то что мне было не понятно.
Я переделала задачу по твоему алгоритму, он мне выдает ошибку при компиляции(в том месте, где выжелено жирным шрифтом). Да, еще. Объясни что такое from: tmatrix, какую функчию выполняет в пвоем примере.
Вот что у меня получилось:
Program l1;
Uses Wincrt;
Type
mas1=array[1..50] of integer;
mas2=array[1..10,1..10] of integer;
my_func=function(Aa:Mas1;ma:Byte):integer;
Var
A:Mas2;B:Mas2; C,D:Mas1;
Procedure FormMatr(na,ma:Byte;Pa,Qa:Integer;Var Aa:mas2);
Var i,j:Byte;
Begin
For i:=1 to na do For j:=1 to ma do
Begin Aa[i,j]:=Random(Qa-Pa)+Pa; End;
End;
Procedure VyvodMatr(na,ma:Byte;Var Ba:mas2);
Var i,j:Byte;
Begin
For i:=1 to na do
begin
For j:=1 to ma do
Write(Ba[i,j]:3,' '); writeLn('');
end;
End;
Procedure VyvodVek(na:Byte;Var Aa:mas1);
Var i:Byte;
Begin
For i:=1 to na do
Write(Aa[i]:3,' ');
writeLn('');
End;
Function Proiz(Aa:mas1;na:Byte):integer;Far;
Var i:Byte; p:integer;
Begin
p:=1;
For i:=1 to na do
If i mod 2<>0
Then p:=p*Aa[i];
Proiz:=p;
End;
Procedure FormD(from:mas2;na,ma:Byte;Func: my_func;Var Da:mas1);
Var i:Byte;
Begin
For i:=1 to na do
Da[i]:=Func(from[i],ma); { <-- Здесь !!! }
End;
Begin
Randomize;
FormMatr(5,6,0,30,A);
WriteLn('Matrix A');
VyvodMatr(5,6,A);Writeln;
FormMatr(5,6,0,20,B);
WriteLn('Matrix B');
VyvodMatr(5,6,B);WriteLn;
FormD(B,5,6,Proiz,D);
WriteLn('Vektor B');
VyvodVek(5,D);
End.
Selena, обрати внимание, как у тебя описана функция Proiz:
Function Proiz(na,ma:Byte; Aa:mas1):integer;Far;
Da[i]:=Func(from[i],ma);
Последний вопрос. Я нашла ошибку. Программа работает. Но почему-то она считае вектор D не из нечетных элементов, а вообще непонятно из каких элементов.
Вот переделанная.
Program l1;
Uses Wincrt;
Type
mas1=array[1..50] of integer;
mas2=array[1..10,1..10] of integer;
my_func=function(Aa:Mas1;ma:Byte):integer;
Var
A:Mas2;B:Mas2; C,D:Mas1;
Procedure FormMatr(na,ma:Byte;Pa,Qa:Integer;Var Aa:mas2);
Var i,j:Byte;
Begin
For i:=1 to na do For j:=1 to ma do
Begin Aa[i,j]:=Random(Qa-Pa)+Pa; End;
End;
Procedure VyvodMatr(na,ma:Byte;Var Ba:mas2);
Var i,j:Byte;
Begin
For i:=1 to na do
begin
For j:=1 to ma do
Write(Ba[i,j]:3,' '); writeLn('');
end;
End;
Procedure VyvodVek(na:Byte;Var Aa:mas1);
Var i:Byte;
Begin
For i:=1 to na do
Write(Aa[i]:3,' ');
writeLn('');
End;
Function Proiz(Aa:mas1;na:Byte):integer;Far;
Var i:Byte; p:integer;
Begin
p:=1;
For i:=1 to na do
If i mod 2<>0
Then p:=p*Aa[i];
Proiz:=p;
End;
Procedure FormD(Aa:mas2;na,ma:Byte;Func: my_func;Var Da:mas1);
Var i,j:Byte; C:mas1;
Begin
For i:=1 to na do
begin
For j:=1 to ma do
C[j]:=Aa[i,j];
Da[i]:=Func(C,ma);
end;
End;
Begin
Randomize;
FormMatr(5,6,0,30,A);
WriteLn('Matrix A');
VyvodMatr(5,6,A);Writeln;
FormMatr(5,6,0,20,B);
WriteLn('Matrix B');
VyvodMatr(5,6,B);WriteLn;
FormD(B,5,6,Proiz,D);
WriteLn('Vektor B');
VyvodVek(5,D);
End.
To: Selena
Function Proiz(Aa:mas1;na:Byte):integer; Far;
Var i:Byte; p:integer;
Begin
p:=1;
For i:=1 to na do
If Aa[i] mod 2<>0 { <--- Внимательно !!! }
Then p:=p*Aa[i];
Proiz:=p;
End;
Спасибо.
Не подскажете что здесь не так? Замена стобца вектором D не происходит, а выдает одни нули вместо матрицы А1
..
Procedure Vstavka(Aa:mas2;from:mas1;na,ma,nstl:Byte;Var Ba:mas2);
Var i,j:Byte;
begin
for i:=1 to na do
for j:=1 to ma do
Aa[i,nstl]:=Da[i]; {Da это должен быть вектор D, nstl=3}
end;
.......
Begin
Vstavka(A,D,5,6,3,A1);
WriteLn('Матрица с измененым 3 столбцом');
VyvodMatr(5,6,A1);
А зачем вложенные циклы? Вот этого достаточно:
...Это во-первых. А во вторых, ты же меняешь матрицу Aa, а хочешь, чтобы изменилась Ba Не пойдет...
for i:=1 to na do
Aa[i, nstl]:=Da[i];
...
Procedure Vstavka(Aa:mas2;from:mas1;na,ma,nstl:Byte;Var Ba:mas2);
Var i: Byte;
begin
Move(Aa, Ba, sizeof(Aa));
for i:=1 to na do
Ba[i, nstl] := Da[i];
end;
В матрицу В добавить 3-ью строку, являющуюся суммой элементов с одинаковыми индексами 1,4 и 5 строк.
Не подскажите как сделать? Это к это же задачи
Selena, что значит "Добавить"? У тебя есть матрица из 5 строк. Что будет с 3, 4 и 5 из них, когда ты добавишь новую 3-ю строку?