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

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

Форум «Всё о Паскале» _ Задачи _ Задача с массивом(не могу сообразить)

Автор: Gogi 5.12.2008 21:55

Нужна помощь. Пока препода дождешься сессия пройдет. Вот условие задачи:
Найти минимальные в строках значения компонент вещественной матрицы m(n,k) и записать их в одномерный массив v(n) .
Найти максимальное значение компонент массива v(n). Если максимумов в массиве несколько, то запомнить индекс первого встреченного при переборе из максимумов.
Поменять местами компоненты последней строки матрицы m(n,k) и строки, содержащей первый из встреченных максимумов. Если максимум окажется в последней строке, то оставить матрицу без изменения.
Вычислить сумму компонент матрицы m(n,k) .
На экран вывести исходную матрицу m(n,k), массив v(n) , первую встреченную максимальную компоненту с индексом, изменённую матрицу m(n,k) , сумму компонент матрицы m(n,k).
Вот моё творение:


Program task3;
type matrix=array [1..10, 1..10] of real;
odn=array [1..10] of real;
var m:matrix;
v: odn;
g,x:real;
n,k,y,q:integer;
procedure input_matrix (var m:matrix; var n,k:integer);
var a,b,p1,p2,i,j:integer;
begin
write('vvedite chislo strok n matrici ');
writeln('ne menee 2 i ne bolee 10');
readln(n);
if (n<2) or (n>10) then
begin
write('vvedeno n<2 ili bolshe 10 poetomu budet prinat ');
write('maximalniy razmer n=10');
n:=10;
end;
write('vvedite chislo stolbcov k matrici ');
writeln('oshibka vvoda budet vzyto 10');
readln(k);
if (k<2) or (k>10) then
begin
write('vvedeno chislo menshe 2 ili bolshe 10, poetomu budet prinyat ');
write('maximalniy razmer, k=10');
k:=10;
end;
write('vvedite levuyu a i pravuyu b granicu ');
writeln('diapazon znacheniy matrici');
write('a='); readln(a);
write('b='); readln(b);
if a>b then
begin
p1:=a; a:=b; b:=p1;
end;
if a=b then
begin
p1:=0; p2:=b;
end else if b=0 then
begin
p1:=a; p2:=0;
end else
begin
p1:=b-a; p2:=a;
end;
randomize;
for i:=1 to n do
for j:= 1 to k do
m[i,j]:=random(p1+1)+p2;
end;
procedure output_matrix (var m:matrix; n,k:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to k do write(m[i,j]:4 :2, ' ');
writeln;
end;
end;
procedure form_matrix(var m:matrix; n,k:integer);
var i,j:integer;
begin
x:=0;
for i:=1 to n do
begin
v[i]:=m[i,1];
for j:=1 to k do
begin
x:=x+m[i,j];
if m[i,j]<v[i] then v[i]:=m[i,j];
end;
end;
writeln('Massiv V(n)');
for i:=1 to n do
write(v[i]:4 :2, ' ');
readln;
end;
function maxzn(var v: odn; var n:integer):integer;
var i:integer; c:real;
begin
q:=1;
for i:=1 to n do
begin
c:= v[1];
if v[i]>c then
begin
c:=v[i]; q:=i;
end;
end;
maxzn:=q;
g:=c;
end;
procedure perestanovka(var m:matrix; n,k,y:integer);
var i,j:integer;
z:real;
begin
if y=n then output_matrix(m,n,k)
else begin
for j:=1 to k do
begin
z:=m[y,j];
m[y,j]:=m[n,j];
m[n,j]:=z;
end;
writeln('izmenennaya matrica M');
output_matrix(m,n,k);
end;
end;
begin
input_matrix(m,n,k);
writeln('ishodnaya matrica m(n,k):');
output_matrix(m,n,k);
form_matrix(m,n,k);
y:=maxzn(v,n);
writeln('indeks pervogo vstrechnjgo:',y);
writeln('ego znachenie:',g);
perestanovka(m,n,k,y);
write('summa komponentov:',x);
readln;
end.


Проблема с первым встречным индексом (его определяет функция odn), программа не правильно его определяет, да и значение не правильно выдаёт. В чём ошибка?

Автор: volvo 5.12.2008 22:10

Цитата
В чём ошибка?

Чем более извращенный способ нахождения первого вхождения максимума ты выбираешь - тем сложнее отлавливать ошибки:

function maxzn(var v: odn; var n:integer):integer;
var i:integer; c:real;
begin
q:=1;
c:= v[1]; { <--- Эта строка должна быть здесь, а не там, где была... }
for i:=1 to n do begin
if v[i]>c then begin
c:=v[i]; q:=i;
end;
end;
maxzn:=q;
g:=c;
end;



А насколько все могло быть проще:
function maxzn(var v: odn; var n:integer):integer;
var i: integer;
begin
q := 1;
for i := 2 to n do
if v[i] > v[q] then q := i;

maxzn := q;
g := v[q];
end;