"Динамические" двумерные массивы в Паскале.

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

Ответить
R41f
Сообщения: 9
Зарегистрирован: 28 фев 2008, 10:37

Имеется простенькое задание:
Ввести количество строк и столбцов матрицы. Ввести значение элементов матрицы. Вычислить новый массив, каждый элемент которого равен среднему значению элементов соответствующего столбца. Вывести на экран значения заданной матрицы и вычисленного массива.
В принципе пишется за пару минут. Только вот Паскаль я видел давно и издалека. У меня получилось следующее:

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

program matrix;
type
  atype = array[0..0,0..0] of real;
  btype = array[0..0] of real;
var
  row,col,i,j: integer;
  cur: real;
  p: ^atype;
  q: ^btype;
begin
  writeln('Enter number of rows');
  readln(row);
  writeln('Enter number of columns');
  readln(col);
  getmem(p, col*row*sizeof(real));
  getmem(q, col*sizeof(real));
  for j := 0 to col-1 do
    begin
      cur := 0;
      for i := 0 to row-1 do
        begin
          writeln('Element [',i,'][',j,'] = ');
          readln(p^[i,j]);
          cur := cur + p^[i,j];
        end;
        q^[j] := cur / row;
    end;
  for i := 0 to row-1 do
    begin
      for j := 0 to col-1 do
        begin
          write(p^[i,j]:10:2,' ');
        end;
      writeln;
    end;
  writeln;
  for j := 0 to col-1 do
    begin
      write(q^[j]:10:2,' ');
    end;
  readln(cur);
end.
Собственно косяк в том, что при выводе исходной матрицы выводится не понять что. К примеру ввел матрицу 2x3 [1 2 3; 4 5 6]. При выводе получил [1 4 5; 4 5 6]. Причем если вводить матрицу из 1 строки и n столбцов или 1 столбца и n строк, тогда все отлично. Что я делаю не так?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Как это будет сказать по-русски.... бОян :)

Два месяца назад обсуждалось (и даже в этом же разделе) тут:
Динамические массивы(2d)

(Вы прям как в тот исходник смотрели - настолько идея похожа :lol: )
R41f
Сообщения: 9
Зарегистрирован: 28 фев 2008, 10:37

Н-да, действительно похожи, хотя той темы я не видел ;) . Зря пренебрегаю поиском. Сразу бы и сделал ;) . Подлатал прогу, все стало работать верно, но она превратилась в одномерный массив с иммитацией двумерного.

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

program matrix;
type
  atype = array[0..0,0..0] of real;
  btype = array[0..0] of real;
var
  row,col,i,j,k: integer;
  cur: real;
  p: ^atype;
  q: ^btype;
begin
  writeln('Enter number of rows');
  readln(row);
  writeln('Enter number of columns');
  readln(col);
  getmem(p, col*row*sizeof(real));
  getmem(q, col*sizeof(real));
  k := 0;
  for i := 0 to row-1 do
    begin
      for j := 0 to col-1 do
        begin
          writeln('Element [',i,'][',j,'] = ');
          readln(p^[j,k]);
        end;
        k := k + j + 1;
    end;
  for j := 0 to col-1 do
    begin
      cur := 0;
      k := 0;
      for i := 0 to row-1 do
        begin
          cur := cur + p^[j,k];
          k := k + col;
        end;
      q^[j] := cur / row;
    end;
  k := 0;
  for i := 0 to row*col-1 do
    begin
      inc(k);
      write(p^[0,i]:10:2,' ');
      if k = col then
        begin
          writeln;
          k := 0;
        end;
    end;
  writeln;
  for j := 0 to col-1 do
    begin
      write(q^[j]:10:2,' ');
    end;
  readln(cur);
end.
По-другому никак нельзя? Исходя из той темы, видимо нельзя. Неужели Паскаль такое редкостное зло?
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

А вообще, зачем здесь динамические массивы?
[syntax='Delphi']
program matrix_pas;

const
MaxN=100;

var
i,j:integer;
A:array[1..MaxN]of array[1..MaxN]of integer;
A2:array[1..MaxN]of real;
CCount,RCount:integer;
SR:integer;

procedure display;
begin
for i:=1 to RCount do
begin
for j:=1 to CCount do
write(a[i,j]:3,' ');
writeln;
end;


end;

begin
writeln('Введите число строк');
readln(RCount);
writeln('Введите число столбцов');
readln(CCount);
writeln('Введите элементы массива');

for i:=1 to RCount do
begin
for j:=1 to CCount do
read(A[i,j]);
readln;
end;

writeln;
display;

for i:=1 to CCount do
begin
SR:=0;
for j:=1 to RCount do
inc(SR,A[j,i]);
A2:=SR/RCount;
end;

writeln;
for i:=1 to CCount do
write(A2:0:3,' ');

readln;

end.

[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
Ответить