Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на динамическую матрицу.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
hardest
Здравствуйте!
Имеется задача:
Цитата
С помощью динамических переменных реализуйте вещественную матрицу размером n x m максимального размера на всю динамическую память. Каждому элементу матрицы присвойте случайное значение из заданного диапазона. Отсортируйте элементы масссива по сквозному порядку их размещения в матрице как в одномерном массиве. Выдайте на экран первую под-матрицу размером 20 x 10. . Для сортировки используйте метод обменной сортировки.

Я ее почти решил, вот только сделал с вводом количества строк и столбцов, а по условию, нужно реализовать на всю динамическую память. Вот не могу понять как это можно сделать wacko.gif . Наверное, используя MemAvail.
Помогите пожалуйста! rolleyes.gif
Заранее огромное Вам спасибо! smile.gif

Программа:
Program lab12_2;
Uses Crt;
Type
Ttype=Real;
PVector=^Tvector;
TVector=array[1..1] of Ttype;
PDynMatrix=^TDynMatrix;
TDynMatrix=array[1..1] of PVector;

Var
mxDynamic: PDynMatrix;
i,j:Integer;
n,m:Integer;

procedure create_matrix(x,y:Integer);
begin
GetMem(mxDynamic, x * Sizeof(PVector));

for i:=1 to x do
GetMem(mxDynamic^[i], y * Sizeof(Ttype));
Randomize;
for i:=1 to x do {Строки}
for j:=1 to y do {Столбцы}
mxDynamic^[i]^[j]:=10*random(50);
end;

procedure sort_matrix(mxDynamic:PdynMatrix; x,y:Integer);
var
tmp:Real;
begin
for i:=1 to x do
for j:=1 to y do
if (mxDynamic^[i]^[j] > mxDynamic^[i]^[j+1]) then begin
tmp:=mxDynamic^[i]^[j];
mxDynamic^[i]^[j]:= mxDynamic^[i]^[j+1];
mxDynamic^[i]^[j+1]:=tmp;
end;
end;

procedure show_matrix(mxDynamic:PDynMatrix; x,y:integer);
begin
for i:=1 to x do begin
Writeln;
for j:=1 to y do
Write(mxDynamic^[i]^[j]:7:2);
end;
end;

procedure matrix_clear(mxDynamic:PdynMatrix; x,y:Integer);
begin
for i:=1 to x do
FreeMem(mxDynamic^[i], y * Sizeof(Ttype));
FreeMem(mxDynamic, x * Sizeof(PVector));
end;

Begin
ClrScr;
Write('Количество строк, n=');
Readln(n);
Write('Количество столбцов, m=');
Readln(m);

create_matrix(n,m);{Создаем динамическую матрицу}
{show_matrix(mxDynamic,n,m);{Выводим ее на экран}

sort_matrix(mxDynamic,n,m);{Сортируем матрицу}
Writeln;
Writeln('Сортированная матрица:');
show_matrix(mxDynamic,20,10);{Выводим подматрицу 20x10}

matrix_clear(mxDynamic,n,m);{Освобождаем дин. память}
Writeln;
Write('Нажмите клавишу Enter...');
Readln;
End.

За основу брал в FAQ данного форума.
volvo
Ну, например,
Цитата
Write('Количество строк, n=');
Readln(n);
Write('Количество столбцов, m=');
Readln(m);
поменяй на
  n := trunc(sqrt(memavail div sizeof(ttype)));
m := ((memavail div n) div sizeof(ttype)) - 1;
, тогда будет выделена матрица максимально возможного размера...

Добавлено через 1 мин.
Цитата
За основу брал в FAQ данного форума.
Плохо брал... Добавляй {$R-} в начале исходника, нельзя делать программу зависимой от настроек компилятора.
hardest
Цитата(volvo @ 11.01.2009 1:32) *

Ну, например,
поменяй на
  n := trunc(sqrt(memavail div sizeof(ttype)));
m := ((memavail div n) div sizeof(ttype)) - 1;
, тогда будет выделена матрица максимально возможного размера...

Добавлено через 1 мин.
Плохо брал... Добавляй {$R-} в начале исходника, нельзя делать программу зависимой от настроек компилятора.

Спасибо Вам огромное!
По поводу {$R-} тоже спасибо.
Всего Вам доброго!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.