Другие языки программирования и технологии

Помогите пожалуйста подправить процедуру Pascal

Условие задачи: В каждой из матриц A(5;4) И B(4;3) помеенять местами два столбца:В матрице A - столбцы 2 и 4; в матрице B - столбцы 2 и 3.Для обмена в матрице столбцов с произвольными номерами использовать процедуру.Вот код всей программы: Program Z_4_2_6_17;uses CRT;const N=5; M=4; P=3;type matr=array[1..N,1..M] of integer;var A,B:matr; i,j:integer;procedure Obmenstolbcov(A:matr; var L1,L2,L3:integer);var buf:integer;beginfor i:=1 to L3 do {L3-число строк в произвольной матрице)buf:=A[i,L1];A[i,L1]:=A[i,L2];{l1-произвольный столбец, L2 - второй произвольный столбец}A[i,L2]:=buf;end;beginfor I:=1 to N dofor J:=1 to M doreadln(A[i,j]);Obmenstolbcov(A,2,4,5);for I:=1 to M dofor J:=1 to P doreadln(B[i,j]);Obmenstolbcov(B,2,3,4);for I:=1 to N dobeginfor J:=1 to M dowrite(A[i,j],' ');writeln;end;for I:=1 to M dobeginfor J:=1 to P dowrite(B[i,j],' ');writeln;end;end.
Ерка Болат
Ерка Болат
836
Доброго времени суток.

Вот это говорит о том, что у вас обе матрицы имееют [bold]одинаковую [/bold] размерность.

type matr=array[1..N,1..M] of integer;
var A,B:matr;

Просто не все элементы заполнены. Это раз. Во-вторых, зачем столько параметров в процедуре? Достаточно трех: матрица и два столбца, которые надо поменять местами. Вот так

procedure Obmenstolbcov(var A: matr; Col1, Col2: integer);

Обратите внимание, параметры, указывающие столбцы, передаются по значению (без var). Это позволяет при обращении к процедуре использовать константы. Держу пари, что компилятор ругался на ваш код.

А дальше надо просто пробежаться по [bold]всем [/bold] строкам матрицы, объявленного типа, т. е. от 1 до N и используя буфер обменять значениями два элемента, принадлежащих к разным столбцам одной строки. Короче, вот так процедура будет выглядеть.

procedure Obmenstolbcov(var A: matr; Col1, Col2: integer);
var
i, buf : integer;
begin
for i:=1 to N do begin
buf := A[i,Col1];
A[i,Col1] := A[i,Col2];
A[i,Col2] := buf;
end;
end;

Если хотите экзотики, можете дополнительным параметром передавать число строк в обрабатываемой матрице, тогда цикл будет не до N, а до значения, задаваемого этим параметром. Именно так, как сделали вы. Но смысла в этом нет никакого.

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

Удачи!
Денис Федунов
Денис Федунов
59 613
Лучший ответ
Ерка Болат Размерность увы разная, но я взял большую размерность. Дело в том, что L3 для этого и введён. А что касается (var A:matr) - у нас же это результат, поэтому и var.
посмотрите что выводится на экран, держу пари это не верно.
Ерка Болат Всё дело в операторных скобках, спасибо.
Ерка Болат Спасибо
Вот, совсем немного переделал, скомпилировал, запустил, ввёл значения, программа вывела "матрицу", но правильность проверять долго :) лень :)

Program Z_4_2_6_17;
uses CRT;
const N=5; M=4; P=3;
type matr=array[1..N,1..M] of integer;
var A,B:matr; i,j:integer;
procedure Obmenstolbcov(A:matr; L1,L2,L3:integer);
var buf:integer;
begin
for i:=1 to L3 do {L3-число строк в произвольной матрице)
buf:=A[i,L1];
A[i,L1]:=A[i,L2];{l1-произвольный столбец, L2 - второй произвольный столбец}
A[i,L2]:=buf;
end;
begin
for I:=1 to N do
for J:=1 to M do
readln(A[i,j]);
Obmenstolbcov(A,2,4,5);
for I:=1 to M do
for J:=1 to P do
readln(B[i,j]);
Obmenstolbcov(B,2,3,4);
for I:=1 to N do
begin
for J:=1 to M do
write(A[i,j],' ');
writeln;
end;
for I:=1 to M do
begin
for J:=1 to P do
write(B[i,j],' ');
writeln;
end;
repeat until keypressed;
end.
Ерка Болат Процедуру я уже переделал - Obmenstolbcov(var A:matr; L1,L2,L3:integer);
вопрос в правильности
Дмитрий Соловьёв наверно я опоздал с решением, но вот вроде работает :)
Program Z_4_2_6_17;
uses CRT;
const N=5; M=4; P=3;
type matr=array[1..N,1..M] of integer;
var A,B:matr; i,j,buf:integer;
procedure Obmenstolbcov(var X:matr; L1,L2,L3:integer);
begin
for i:=1 to L3 do {L3-число строк в произвольной матрице}
begin
buf:=X[i,L1];
X[i,L1]:=X[i,L2];{l1-произвольный столбец, L2 - второй произвольный столбец}
X[i,L2]:=buf;
end;
end;
begin
for I:=1 to N do
for J:=1 to M do
readln(A[i,j]);
Obmenstolbcov(A,2,4,5);
for I:=1 to M do
for J:=1 to P do
readln(B[i,j]);
Obmenstolbcov(B,2,3,4);
for I:=1 to N do
begin
for J:=1 to M do
write(A[i,j],' ');
writeln;
end;
for I:=1 to M do
begin
for J:=1 to P do
write(B[i,j],' ');
writeln;
end;
repeat until keypressed;
end.