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

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

Форум «Всё о Паскале» _ Задачи _ Матрица

Автор: mikle 25.02.2007 16:40

Пожалуйста, помогите исправить программу. Просто перемкнуло на ней. mega_chok.gif
Текст задания:
Найти max среди всех элементов тех строк заданной матрицы, которые упорядочены по возрастанию.

program pract11_4;
const n=3;m=3;
type mas=array[1..n,1..m] of integer;
mas2=array[1..n] of integer;
function max(n:byte;a:mas):integer;
var i,j:integer;mix:integer;
begin
mix:=a[1,j];
for i:=2 to n do
for j:=1 to m do begin
if a[i,j]>mix then mix:=a[i,j];
max:=mix;
end;
end;
var i,j:integer;k1:byte;a:mas;
begin
for i:=1 to n do
for j:=1 to m do
begin
writeln('wwedite ',i,',',j,' element matrici');
read(a[i,j]);end;
for i:=1 to n-1 do
for j:=1 to m do begin
if a[i,j]<a[i+1,j] then begin
k1:=k1+1;end;end;
if k1=n-1 then begin max(n,a);
end;
writeln('max= ',max(n,a):6);
end.
.

Автор: мисс_граффити 25.02.2007 16:48

1. Сделай нормальное форматирование - не видно, какой begin к какому end относится
2.

function max(n:byte;a:mas):integer;
var i,j:integer;mix:integer;
begin
mix:=a[1,j]; {чему здесь, по-твоему, равно j?}
for i:=2 to n do {почему с 2?}
for j:=1 to m do begin
if a[i,j]>mix then mix:=a[i,j];
max:=mix;
end;
end;

3.
k1:=k1+1;end;end;
if k1=n-1 then begin max(n,a);

а обнулять k1 для каждой строчки кто будет?
и ты, кстати, m и n не перепутал? n-это число строк, а не число элементов в строке... то есть ты сравниваешь не по строкам, а по столбцам.

Автор: klem4 25.02.2007 17:03

Я бы делал так:

{$B-}
uses crt;

const
n = 5; // размерность матрицы

type
TMatrix = array[1..n, 1..n] of Integer; // тип - матрица

(*
функция возвращает TRUE, если строка с номером ROW матрицы M
упорядочена по возрастанию
*)
function IsSorted(const M: TMatrix; const row: Byte): Boolean;
var
i: Byte;
begin
i := 1;
while (i <= n - 1) and (M[row, i] < M[row, i + 1]) do inc(i); // <=
IsSorted := (i = n);
end;

(*
Функция возвращает номер строки из упорядоченных по возрастанию,
в которой находится макс. элемент,
если упорядоченных по вохрастанию строк нет,
функция вернет 0
*)

function FindResult(const M: TMatrix): Integer;
var
i, row: Byte;
begin
row := 0;
for i := 1 to n do
if IsSorted(M, i) and ((row = 0) or (M[i, n] > M[row, n])) then
row := i;
FindResult := row;
end;

var
M: TMatrix = (
(3, 4, 55, 112, 442),
(2, 3, 1, 0, 4),
(3, 5, 15, 16, 500),
(1, 10, 9, 0, 110),
(4, 44, 45, 46, 47)
);

maxRow: Byte;

begin
clrscr;
maxRow := FindResult(M);
if maxrow = 0 then writeln('No') else writeln(M[maxRow, n]);
readln;
end.

Автор: mikle 25.02.2007 18:40

Большое спасибо! Очень помогли.

Автор: mikle 25.02.2007 20:59

Ещё одна проблема. Подскажите что делать.
Если ввожу матрицу как константу, то выдаёт ошибку, а если ввожу матрицу вручную, то на печать выдаётся последний элемент матрицы.

Автор: volvo 25.02.2007 21:09

Цитата
Если ввожу матрицу как константу, то выдаёт ошибку
Какую ошибку, и какой у тебя компилятор?
Цитата
а если ввожу матрицу вручную
показывай, КАК вводишь...

Автор: mikle 25.02.2007 22:12

При ввводе таким образом получаем ошибку №85 на строке var M:TMatrix=((3,4,55,112,442),(2,3,1,0,4),(3,5,15,16,500),(1,10,9,0,110),(4,44,45,
46,47));


program pract11_4;
uses crt;
const n=5;
type tmatrix=array[1..n,1..n] of integer;
function IsSorted(const M:tmatrix;const row:byte):boolean;
var i:byte;
begin
i:=1;
while (i<=n-1) and (M[row,i]<M[row,i+1]) do inc(i);
IsSorted:=(i=n);end;
function FindResult(const M:TMatrix):integer;
var i,row:byte;
begin
row:=0;
for i:=1 to n do
if IsSorted(M,i) and ((row=0) or (M[i,n]>M[row,n])) then row:=i;
row:=i; FindResult:=row;end;
var M:TMatrix=((3,4,55,112,442),(2,3,1,0,4),(3,5,15,16,500),(1,10,9,0,110),(4,44,45,
46,47));
maxRow:byte;
begin
clrscr;
maxRow:=FindResult(M);
if maxrow=0 then writeln('No') else writeln(M[maxrow,n]);
readln;
end.
.


При этои варианте выводит последний элемент матрицы
program pract11_4;
uses crt;
const n=5;
type tmatrix=array[1..n,1..n] of integer;
function IsSorted(const M:tmatrix;const row:byte):boolean;
var i:byte;
begin
i:=1;
while (i<=n-1) and (M[row,i]<M[row,i+1]) do inc(i);
IsSorted:=(i=n);
end;
function FindResult(const M:TMatrix):integer;
var i,row:byte;
begin
row:=0;
for i:=1 to n do
if IsSorted(M,i) and ((row=0) or (M[i,n]>M[row,n])) then row:=i;
row:=i; FindResult:=row;
end;
var M:TMatrix;
maxRow:byte;i,j:integer;
begin
clrscr;
for i:=1 to n do
for j:=1 to n do
begin
writeln('vvedite ',i,',',j,' element matrici');
read(M[i,j]);
end;
maxRow:=FindResult(M);
if maxrow=0 then writeln('No') else writeln(M[maxrow,n]);
readln;
end.
.



Автор: Bokul 25.02.2007 22:40

Цитата
При ввводе таким образом получаем ошибку №85 на строке
var  M:TMatrix=((3,4,55,112,442),(2,3,1,0,4),(3,5,15,16,500),(1,10,9,0,110),(4,44,45,
46,47));



Замени var на const, но потом все равно не забудь поставить var. Хотя результат и так будет не верным.

PS хочешь помощи, обращай внимание на замечания:

Цитата(мисс_граффити @ 25.02.2007 4:48) *

1. Сделай нормальное форматирование - не видно, какой begin к какому end относится