Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ Процедуры + матрицы :(
Автор: Олег 27.10.2003 17:36
Привет.
Вот попалась мне такая програмка.
Дано 5ть матриц!!! При этом все они разной размерности (5*1, 1*5 или 5*5). И все их надо забивать, ну если я сделаю пять циклов для ввода, меня повесят
Вот я и решил сделать процедурку, но столкнулся с проблемой: как указать, какой из пяти массивов заполнять?
Автор: GLuk 27.10.2003 23:01
Кому указать? Компилеру или юзеру?
Приведи код что-ли...
Автор: zx1024 28.10.2003 2:04
В процедурку передавать указатель на массив или сам массив и его размеры.
Автор: Олег 28.10.2003 4:39
В процедуру надо передовать сам массив и его размерность.
Например у меня описанно пять массивов: a,b,c... и мне нужно создать процедуру в которую бы вводились размерность и имя массива (???), вот с этим и проблема. Может можно это реализовать как-то по другому?
Автор: GLuk 28.10.2003 10:42
А нафига в процедуру передавать весь массив?
Или тебе жизненно необходимо реализовать это через стек?
zx1024 все правильно сказал, на практике это выглядит так:
Procedure ReadAhead(ArrayPnt:Pointer; X,Y:Word);
И все-таки приведи код...
Автор: Олег 28.10.2003 14:04
Народ, принципиального ничего нет, но вот суть задачи:
Есть пять массивов (двумерных), у всех разная размерность, и мне нужно все их заводить. Я никогда не поверю что мой препод проглотит пять циклов... Как бы вы сделали это безобразие?
А в моем коде как раз таки и есть пять циклов
Автор: Camel_Toe 28.10.2003 15:46
напиши ОДНУ процедуру, в которую передаешь ссылку на конкретный массив (первый или пятый по счету не важно) и размерность матрицы. И все. Если надо массив заполнять с клавы - то это понятно, если случайными числами - то есть такая функция random. посмотри в справке ;). А с пятью циклами ты чот загнула...............=)
Автор: Олег 28.10.2003 16:59
Вот с этой процедурой то у меня и проблема, как в нее передать ссылку на масив? У меня не получается. Напишите пример кода, плиз
Автор: Camel_Toe 28.10.2003 19:56
объяви тип массива
Код
const
m=100;
n=100;
type array1=array[1..m,1..n] of integer;
А когда надо вызывать процедуру, пиши например следующее:
Код
procedure FillMatrix (var Matr: array1; var q: integer);
{q-размерность матрицы}. Попробуй.
Автор: GLuk 29.10.2003 0:42
Цитата
Народ, принципиального ничего нет, но вот суть задачи:
Есть пять массивов (двумерных), у всех разная размерность, и мне нужно все их заводить. Я никогда не поверю что мой препод проглотит пять циклов... Как бы вы сделали это безобразие?
А в моем коде как раз таки и есть пять циклов
Насчет принципиальности - это ты к чему;?
принципиальности действия, понятия или что-то ишшо?!
До кучи есть ишшо один вариант (без объявления типа):
Код
Var
P:Pointer;
a1:array[1..5] of LongInt;
Begin
P:=Addr(a1);
End.
Автор: Олег 30.10.2003 11:06
"Принципиально" - это я насчет процедур, но без них никак. Из того что вы предложили я ничего не смог реализовать. Вот мое извращение на тему "Ввод массивов через процедуру..." :
Код
program no_name;
uses crt;
const
n=5;
m=1;
l=3;
type
mas=array[1..n,1..n] of integer;
var
i,j:integer;
x,y,a,b:mas;
procedure vvod(n,m,k:integer);
begin
for i:=1 to n do
begin
for j:=1 to m do
begin
writeln('Vvedite ',i,'[',j,']');
case k of
1: readln(x[i,j]);
2: readln(y[i,j]);
3: readln(a[i,j]);
4: readln(b[i,j]);
end;
end;
end;
end;
begin
clrscr;
writeln('vvedite X:');
vvod(2,2,1);
readkey;
end.
Мне тоже не нравится.... Это "подходит" только для ввода массивов, а как тогда будет выглядеть процедура умножения двух произвольных матриц? Т.е. мне нужно задать размерность первой, второй, имена первой, второй и третей (получающейся в результате умнажения) матриц... Как это сделать??? И пожалуйста, напишите код...
Заранее благодарствую.
Автор: Camel_Toe 30.10.2003 17:24
Попробуй так
Код
program no_name;
Uses crt;
const
m=20;
n=20;
type
mas=array[1..m,1..n] of integer;
procedure vvod(n,m:integer; var Matr: mas);
begin
for i:=1 to m do
begin
for j:=1 to n do
begin
writeln('Vvedite ',i,'[',j,']');
readln (matr[i,j]);
end;
end;
end;
var
i:integer;
a,b,c,d,e:mas;
begin
clrscr;
for i:=1 to 5 do begin
write ('введите размер матрицы: <m на n>: m и n не больше 20: ');
readln (m,n);
case i of
1: vvod (m,n,a);
2: vvod (m,n,b);
3: vvod (m,n,c);
4: vvod (m,n,d);
5: vvod (m,n,e);
end;
end;
readkey;
end.
Если что не получится - спроси, сам я прогу не набирал, правил твою:-)