Помощь - Поиск - Пользователи - Календарь
Полная версия: переставление столбцов местами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Tribunal
характеристикой столбца матрицы называется сумма его отрицательных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик.

делов том,что я пыталась решить эту задачу по образу и подобию упорядочения элементов в одномерном массиве.но цели этой задачи так и не достигла=(

не могли бы вы помочь мне с этой задачей? unsure.gif
volvo
Как задать матрицу, чтобы быстро поменять местами ее столбцы и работаешь со столбцами так же просто, как, например, с целыми числами...

Кстати, тогда именно и будет
Цитата
по образу и подобию упорядочения элементов в одномерном массиве
Tribunal
эээ....а поподробнее можно...?
volvo
Что именно не понятно? Там же приведен пример использования...

Вот, например, приведи промер, КАК ты пыталась решить это по подобию одномерных массивов, я покажу как это перенести на двумерные...
Tribunal
ну примерно так:

Код

program swap;

const
row=4;
col=4;
r=10;

var
a:array [1..col,1..row];
s:array [1..row];
i,j,k,t,min:integer;

begin

{ввод матрицы}
randomize;
   for i:=1 to col do
   begin
      for j:=1 to row do
      begin
      a[i,j]:=random( r )+1;
      write(a[i,j]:4);
      end;
      writeln;

for j:=1 to row do
begin
   s[j]:=0;
   for i:=1 to col do
   if a[i,j]<0 then s[j]:=s[j]+a[i,j];
end;

for i:=1 to col do
for j:=1 to row-1 do
begin
min:=j;
for k:=j+1 to row do
if a[k]>a[min] then min:=k;
t:=a[k];
a[j]:=a[min];
a[min]:=t;;
end;

for i:=1 to col do
begin
for j:=1 to row do
write(a[i,j]:4);
writeln;
end;

end.
volvo
Ну, а я говорил про что-то в этом духе:
const
size_row = 10;
size_col = 10;

type
trow = array[1 .. size_row] of integer;
tmatrix = array[1 .. size_col] of trow;

function f(r: trow): integer;
var i, s: integer;
begin
s := 0;
for i := 1 to size_row do
s := s + r[i];
f := s;
end;

procedure swap_cols(var mx: tmatrix;
const i, j: integer);
var T: trow;
begin
T := mx[i]; mx[i] := mx[j]; mx[j] := T
end;

procedure print(var mx: tmatrix);
var i, j: integer;
begin
for i := 1 to size_row do
begin
for j := 1 to size_col do
write(mx[j][i]:4);
writeln
end;
end;

var
mx: tmatrix;
i, j: integer;

begin
{ инициализация матрицы }
for i := 1 to size_row do
for j := 1 to size_col do
mx[i][j] := random(50)-25;

writeln('before:'); print(mx);
for i := 1 to size_col do
for j := size_col downto i+1 do
if f(mx[j - 1]) > f(mx[j]) then
swap_cols(mx, j - 1, j);

writeln('after:'); print(mx);
end.
Tribunal
а почему вот здесь:

Цитата
mx[i][j] := random(50)-25;


ошибка range check error?
volvo
Не знаю... Если я выложил код, значит у меня он отработал... Никаких Range Check Error не было замечено... Да и нечему там давать такую ошибку, если только ты не меняла здесь:
trow = array[1 .. size_row] of integer;

integer на какой-нибудь беззнаковый тип, например, Byte или Word...
Tribunal
я ничего не меняла.ошибка выводится.=(
volvo
А присоедини-ка свой PAS-файл в аттаче... Я понимаю, что ты ничего не меняла, но там просто физически не может быть этой ошибки... (не надо копировать текст программы, мне нужен ИМЕННО PAS-файл!!!)

И заодно - напиши, какой компилятор у тебя...
Tribunal
прости ламака...а где компилятор пишется? unsure.gif
volvo
Меню Help -> About
Tribunal
там написано только то,что паскаль версии 7.0
volvo
Все, можешь не писАть... Все ясно... Делай так:
     mx[i][j] := Integer(random(50))-25;
Tribunal
а объясни,пожалуйста,философский смысл выражения mx[i][j]...
я такое впервые вижу.что это означает?
volvo
mx[i, j] тебе ближе? Используй это... Я по привычке из C++ так пишу (благо, Паскаль позволяет оба варианта записи)...
Tribunal
спасибо=)
volvo
Хотя здесь есть еще один момент: фактически матрица описана, как массив столбцов, поэтому крайне рекомендуется запись именно mx[i][j], где mx[i] - столбец №I , а [j] - уже обращение к j-му элементу этого столбца...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.