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

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

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

Автор: Олег 27.10.2003 17:36

Привет.
Вот попалась мне такая програмка.

Дано 5ть матриц!!! При этом все они разной размерности (5*1, 1*5 или 5*5). И все их надо забивать, ну если я сделаю пять циклов для ввода, меня повесят smile.gif

Вот я и решил сделать процедурку, но столкнулся с проблемой: как указать, какой из пяти массивов заполнять?

Автор: 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

Народ, принципиального ничего нет, но вот суть задачи:
Есть пять массивов (двумерных), у всех разная размерность, и мне нужно все их заводить. Я никогда не поверю что мой препод проглотит пять циклов... Как бы вы сделали это безобразие?
А в моем коде как раз таки и есть пять циклов sad.gif

Автор: Camel_Toe 28.10.2003 15:46

напиши ОДНУ процедуру, в которую передаешь ссылку на конкретный массив (первый или пятый по счету не важно) и размерность матрицы. И все. Если надо массив заполнять с клавы - то это понятно, если случайными числами - то есть такая функция random. посмотри в справке ;). А с пятью циклами ты чот загнула...............=)

Автор: Олег 28.10.2003 16:59

Вот с этой процедурой то у меня и проблема, как в нее передать ссылку на масив? У меня не получается. Напишите  пример кода, плиз sad.gif

Автор: 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

Цитата
Народ, принципиального ничего нет, но вот суть задачи:
Есть пять массивов (двумерных), у всех разная размерность, и мне нужно все их заводить. Я никогда не поверю что мой препод проглотит пять циклов... Как бы вы сделали это безобразие?
А в моем коде как раз таки и есть пять циклов sad.gif


Насчет принципиальности - это ты к чему;?
принципиальности действия, понятия или что-то ишшо?!
До кучи есть ишшо один вариант (без объявления типа):

Код
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.



Мне тоже не нравится.... Это "подходит" только для ввода массивов, а как тогда будет выглядеть процедура умножения двух произвольных матриц? Т.е. мне нужно задать размерность первой, второй, имена первой, второй и третей (получающейся в результате умнажения) матриц... Как это сделать??? И пожалуйста, напишите код... smile.gif
Заранее благодарствую.

Автор: Camel_Toe 30.10.2003 17:24

Попробуй так smile.gif

Код
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.


Если что не получится - спроси, сам я прогу не набирал, правил твою:-)