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

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

Форум «Всё о Паскале» _ Делфи _ Создание Матрицы

Автор: Atreides 1.05.2007 23:03

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

Автор: volvo 1.05.2007 23:07

Вроде, динамические массивы в Дельфях никто не отменял:

Var
mx: array of array of integer;

...
SetLength(mx, 2, 3); // <--- Получаешь матрицу 2 x 3

Автор: Atreides 2.05.2007 0:01

А я пробовал так. Сделал матрицу, но она 10х10 и задается заранее, заполняется случайным образом, а как сделать, чтобы я мог сам выбрать кол-во строк и столбцов? Пробовал задавать m и n как:
Writeln(‘m’,m);
Read(m);
Writeln(‘n’,n);
Read(n);
Но консоль после этого вылетает. В чем косяк?

Код

Type TMatrix=array[1..100,1..100] of integer;
  var x:TMatrix;
    y:integer;
  procedure inputmatrix(var a:TMatrix; m,n:cardinal);
  var i,j:cardinal;
  begin
  writeln;
  i:=1; repeat
  j:=1; repeat
  a[i,j]:=random(999);
  j:=j+1;
  until
  j>m;
  i:=i+1;
  until
  i>n; end;
  procedure outputmatrix(a:TMatrix; m,n:cardinal);
  var i,j:cardinal;
  begin
  i:=1; repeat
  j:=1; repeat
  write(a[i,j]:6);
  j:=j+1; until
  j>m;
  i:=i+1; writeln;
  until i>n; end;

  begin
  randomize;
  inputmatrix(x,10,10);
  outputmatrix(x,10,10);
  readln;
  end.

Цитата
Вроде, динамические массивы в Дельфях никто не отменял:

Это как? Я могу их заменить переменными и задавать вручную?

Автор: volvo 2.05.2007 0:03

Цитата
я могу их заменить переменными и задавать вручную?
Легко...

Var
mx: array of array of integer;
m, n: integer;

begin
Write('n = '); Readln(n);
Write('m = '); Readln(m);
SetLength(mx, n, m);

... // <- Работаешь с матрицей

SetLength(mx, 0, 0); // <- Освобождаешь память
end.


Автор: Atreides 5.05.2007 22:17

Сделал по примеру матрицу, задаю значения i,j, а на выходе получаю матрицу из одной строки и одного значения. В чем проблема? Как сделать так, чтобы после того как задан размер матрицы, я смог задавать значения этой матрицы построчно? Random соответственно надо убрать.

Код

program Matrix;

{$APPTYPE CONSOLE}
uses
  SysUtils;

  var
     mx: array of array of integer;
     i, j: integer;
      m,n:cardinal;

  procedure inputmatrix;
  var i,j:cardinal;
     begin
  Write('i = '); Readln(i);
  Write('j = '); Readln(j);
  SetLength(mx, i, j);

  writeln;
  i:=1; repeat
  j:=1; repeat
  mx[i,j]:=random(999);
  j:=j+1;
  until
  j>m;
  i:=i+1;
  until
  i>n;
   end;

  procedure outputmatrix;
  var i,j:cardinal;
  begin
  i:=1; repeat
  j:=1; repeat
  write(mx[i,j]:6);
  j:=j+1; until
  j>m;
  i:=i+1; writeln;
  until i>n; end;

  begin
  randomize;
  inputmatrix;
  outputmatrix;
  readln;
  SetLength(mx, 0, 0);
  end.

Автор: volvo 5.05.2007 22:24

Ты сам себя запутываешь этим Repeat/Until, а зачем?

Вот так:

program Matrix;

{$APPTYPE CONSOLE}
uses
SysUtils;

var
mx: array of array of integer;
i, j: integer;
m,n:cardinal;

procedure inputmatrix;
var i,j:cardinal;
begin
Write('i = '); Readln(n);
Write('j = '); Readln(m);
SetLength(mx, n, m);

writeln;
for i := 0 to n - 1 do
for j := 0 to m - 1 do
mx[i,j]:=random(999);
end;

procedure outputmatrix;
var i,j:cardinal;
begin
for i := 0 to n - 1 do begin
for j := 0 to m - 1 do
write(mx[i,j]:6);
writeln;
end;
end;

begin
randomize;
inputmatrix;
outputmatrix;
readln;
SetLength(mx, 0, 0);
end.

Обрати внимание на индексацию - она начинается с 0...

Автор: Atreides 6.05.2007 19:22

Сделал матрицу с возможностью выборки её размера и ввода элементов вручную, а как посчитать среднее значение каждой строки и вывести его в отдельный вектор, после сравнить значения строк вектора и вывести максимальное значение. Я там уже начал считать сумму, но чета Никам правильно в вектор выдать не могу.

Код
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
matrica=array[1..15,1..15] of real;
var
max:real;
nmax:byte;
p:array [1..15] of byte;
a:matrica;
i,j,n,m:integer;
s:real;

begin
writeln;
write('Vvedi kol-vo strok n & stolbchov m ');
readln(n,m);
for i:=1 to n do
for j:=1 to m do
begin
write ('a[',i,',',j,']=');
readln (a[i,j]);
end;
writeln;
writeln ('Base matrix');
for i:=1 to n do
begin
for j:=1 to m do
write (a[i,j]:8:1,' ');
writeln;
readln;
end;

//Ñóììà ýëåìåíòîâ ñòðîêè
begin
s:=0;
for j:=1 to m do
s:=s+a[i,j];  //ñóììà ýë-òîâ ñòðîêè
end;
readln;
end;


end.