Консультация № 156740
05.01.2009, 18:09
0.00 руб.
0 5 4
Дана матрица A[k,n].В строках, где все элементы четные и положительные найти максимум.
Программа почему то выводит всегде значение первого элемента строки

Приложение:
Program kaer;
uses crt;
type mas=array[1..50,1..50] of integer;
var j,i,max,y,k,n:integer;A:mas;
begin
clrscr;
writeln('vvedite znachenie n i k');
readln(n,k);
writeln('vvedite elementi massiva');
for i:=1 to n do
for j:=1 to k do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
max:=a[1,1];
for j:=1 to n-1 do
for i:=1 to k do
begin
if (a[i,j]>0) and (a[i,j] mod 2=0) then
for y:=1 to k do
if a[y,j]>max then
max:=a[y,j];
end;
writeln('max=',max);
end.

Обсуждение

Неизвестный
05.01.2009, 18:24
общий
А что выводить в тех строках, где не все элементы четные и положительные?
давно
Профессор
401888
1232
05.01.2009, 18:35
общий
это ответ
Здравствуйте, Жгун Дмитрий Андреевич!
Исправил Ваш код, немного еще переделал по своему, не понравится, переделаете обратно. Это ввод и вывод.

Приложение:
Program kaer;
uses crt;
type mas=array[1..50,1..50] of integer;
var n,k,i,j,max,p,l:integer;
A:mas;
begin
clrscr;
write('n=');readln(n);
write('k=');readln(k);
writeln('Vvedite ',n*k,' elementov massiva');
for i:=1 to n do
for j:=1 to k do
read(a[i,j]);{вводим в строку или столбиком, но через пробел}
readln;
clrscr;{очищаем экран}
writeln('Matrica A:');{выводим матрицу}
for i:=1 to n do
begin
for j:=1 to k do
write(a[i,j]:3);
writeln;
end;
max:=-maxint-1;{за макс нельзя брать первый элемент, он может вообще не участвовать в поиске, если в первой строке не все элементы положительные и четные, а оказаться самым большим, поэтому за макс берем самое маленькое число из integer}
for i:=1 to n do {идем по строкам}
begin
p:=0;{в начале строки четных положительных=0}
for j:=1 to k do {идем по строке}
if(a[i,j]>0) and (a[i,j] mod 2=0) then p:=p+1;{считаем четные положительные}
if p=k then {если все такие}
for l:=1 to k do {опять идем по строке}
if a[i,l]>max then {ищем максимальный}
max:=a[i,l];
end;
writeln('max=',max);
readln
end.
давно
Старший Модератор
31795
6196
05.01.2009, 18:48
общий
это ответ
Здравствуйте, Жгун Дмитрий Андреевич!

Вариант с использованием логических переменных.
Комментировал только измененный код.
ps:помему так проще
Удачи!

Приложение:
Program kaer;
uses crt;
type mas=array[1..50,1..50] of integer;
var j,i,max,y,k,n:integer;A:mas;
z,x:boolean;
begin
clrscr;
writeln('vvedite znachenie n i k');
readln(n,k);
writeln('vvedite elementi massiva');
for i:=1 to n do
for j:=1 to k do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
z:=false;{максимум не определен}
for i:=1 to n do
begin
x:=true;{проверяем соответсвие условию все положительные и четные}
for j:=1 to k do
x:=x and (a[i,j]>0) and (a[i,j] mod 2=0);
if x then
for j:=1 to k do
if z then
begin{максимум был уже определен}
if a[i,j]>max then max:=a[i,j];
end
else
begin{максимум не опроеделен - устанавливаем его}
max:=a[i,j];
z:=true;
end;
end;
{выводим результат}
if z then writeln('max=',max)
else writeln('inpossible');
readln;
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
05.01.2009, 19:00
общий
05.01.2009, 20:43
это ответ
Здравствуйте, Жгун Дмитрий Андреевич!
Как я понял. Задание - вывести ОДИН элемент матрицы, но ЧЕТНЫЙ и МАКСИМАЛЬНЫЙ.
В таком случае в вашем коде 1 лишняя строка, назначение которой мне не понятно.
И самое интересное. При вводе вы сначала перебираете слолбцы(элементы в строке), а затем строки, т. е. вводите матрицу по столбцам. А когда проверяете(ищите максимум), то вы транспонируете "матрицу проверки", т.е. если у вас матрица строка, а вы проверяете ее как матрицу столбец, то совпадает только первый элемент, который и является максимальным.
Вым следует, либо поменять i на j во второй паре "for'ов", либо потом при взятии элементов, что я и сделал.

Как пишут во многих книгах(рассылках) по программированию на Ассемблере - пользуйтесь отладчиком.

Отладчик объясняет программисту - что делает его программа :)

Ваш код ниже, тестил на FreePascal:

Приложение:
Program kaer;
uses
crt;
type
mas=array[1..50,1..50] of integer;
var
j, i, max, y, k, n:integer;
A:mas;
begin
clrscr;

writeln('vvedite znachenie n i k');
readln(n,k);
writeln('vvedite elementi massiva');

for i := 1 to n do
for j := 1 to k do
begin

write('a[', i, ',', j, ']=');
readln(a[i, j]);
end;

max:=a[1, 1];

for j := 1 to n do //Перебираем все элементы, поэтому до п
for i := 1 to k do
begin //Ниже я поменял i и j местами
if (a[j, i] > 0) and (a[j, i] mod 2 = 0) then
// for y := 1 to k do Мы и так перебираем все элементы ???
if a[j, i] > max then
max := a[j, i];
end;

writeln('max=', max);
end.
Неизвестный
05.01.2009, 19:12
общий
это ответ
Здравствуйте, Жгун Дмитрий Андреевич!
Из Вашего задания я не совсем понял надо найти в каждой такой строке максимум, или в совокупности таких строк. Поэтому 2 программы. 1я ищет в каждой строке, удовлетворяющей условию, а вторая в совокупности таких строк. Я убрал лишний цикл по строкам. Он абсолютно не нужен. Так же массив размещается в памяти динамически.

Приложение:
{* Первая программа *}
program Pascal_156740;

type
TMatrixData=Integer;
PMatrix=^TMatrix;
TMatrix=array[Byte,Byte] of TMatrixData;

var
K,N,I,J,Max:Byte;
A:PMatrix;

label break;

begin
Write('Enter K,N : ');
ReadLn(K,N);
GetMem(A,K*N*SizeOf(TMatrixdata));
if A=nil then begin
WriteLn('Can''t allocate memory for A');
end else begin
for I := 0 to K - 1 do
for J := 0 to N - 1 do begin
Write('A[',I+1,',',J+1,']=');
ReadLn(A^[I,J]);
end;
WriteLn;
for I := 0 to K - 1 do begin
Max:=0;
for J := 0 to N - 1 do begin
if Odd(A^[I,J]) or (A^[I,J]<0) then goto break;
if A^[I,J]>A^[I,Max] then Max:=J;
end;
WriteLn('Str:',I+1,' Max=',A^[I,Max]);
break:
end;
end;
ReadLn;
end.


{* Вторая программа *}
program Pascal_156740_2;

type
TMatrixData=Integer;
PMatrix=^TMatrix;
TMatrix=array[Byte,Byte] of TMatrixData;

var
K,N,I,J,MaxIndex:Byte;
A:PMatrix;
Max:TMatrixData;
isFound:Boolean;

label break;

begin
Write('Enter K,N : ');
ReadLn(K,N);
GetMem(A,K*N*SizeOf(TMatrixdata));
if A=nil then begin
WriteLn('Can''t allocate memory for A');
end else begin
isFound:=false;
for I := 0 to K - 1 do
for J := 0 to N - 1 do begin
Write('A[',I+1,',',J+1,']=');
ReadLn(A^[I,J]);
end;
WriteLn;
for I := 0 to K - 1 do begin
MaxIndex:=0;
for J := 0 to N - 1 do begin
if Odd(A^[I,J]) or (A^[I,J]<0) then goto break;
if A^[I,J]>A^[I,MaxIndex] then MaxIndex:=J;
end;
if not isFound then Max:=A^[I,MaxIndex]
else if Max<A^[I,MaxIndex] then Max:=A^[I,MaxIndex];
isFound:=true;
break:
end;
if isFound then WriteLn('Max=',Max);
end;
ReadLn;
end.
Форма ответа