Консультация № 175606
25.12.2009, 15:31
0.00 руб.
0 7 1
Уважаемые эксперты, помогите, пожалуйста, решить задачу с использованием процедур с передачей параметров или подскажите, что надо исправить в моей.

В двумерных массивах A[N*N] и B[M*M] определить минимальное значение. Если минимальное расположено выше побочной диагонали, то числа на этой диагонали поменять местами (первое с последним, второе с предпоследним и т.д.). Если минимальное расположено ниже побочной, то заменить его средним арифмеическим этой строки до побочной диагонали. Если минимальное расположено на самой диагонали, то ничего не делать.



Приложение:
uses crt;
const n=4; m=4;
type matr=array[1..n+m,1..n+m] of real;
var a,b:matr;
imin,jmin,k,i,j:integer;

procedure VVOD(var d:matr;k:integer); {ââîäèì ìàòðèöó}
begin
for i:=1 to k do
for j:=1 to k do
d[i,j]:=random(20);
end;

procedure VIVOD(d:matr;k:integer;t:string); {âûâîäèì ìàòðèöó}
begin
writeln;
writeln(t);
for i:=1 to k do begin
for j:=1 to k do
write(d[i,j]:4:0);
writeln;
end;
end;

procedure MIN(d:matr;k:integer;var imin,jmin:integer); {íàõîäèì ìèíèìàëüíîå}
var min:real;
begin
min:=maxint;
for i:=1 to k do
for j:=1 to k do
if d[i,j]<min then
begin
min:=d[i,j];
imin:=i;
jmin:=j;
end;
writeln('min=',min);
writeln('stroka=',imin);
writeln('stolb=',jmin);
end;

procedure SORT(var d:matr;k:integer;t,t1:string); {ñîðòèðóåì}
var imin,jmin:integer;buf,sum:real;
begin
sum:=0;
VVOD(d,k);
VIVOD(d,k,t);
MIN(d,k,imin,jmin);
if (imin+jmin)<(k+1) then begin {åñëè ìèíèìàëüíîå âûøå ïîáî÷íîé}
for i:=1 to k div 2 do begin
buf:=d[i,k+1-i];
d[i,k+1-i]:=d[k+1-i,i];
d[k+1-i,i]:=buf;
end;
VIVOD(d,k,'vishe po6o4noi'+t1);
end
else
if (imin+jmin)>(k+1) then begin {åñëè ìèíèìàëüíîå íèæå ïîáî÷íîé}
for i:=1 to k do begin
for j:=1 to k-i do begin
sum:=sum+d[i,j];
d[i,k+1-i]:=sum/(k-i);

end;
end;
VIVOD(d,k,'nizhe pobo4noi ' +t1);
end;
end;

BEGIN clrscr;
randomize;
SORT(a,n,'Matr A',' Otsort Matr A');
window(40,1,80,25);
SORT(b,m,'Matr B',' Otsort Matr B');
end.

Обсуждение

давно
Профессионал
304622
583
25.12.2009, 19:12
общий
aggressor92:
Отличная программа, прекрасная передача параметров, практически всё готово. Единственно по
"заменить его средним арифмеическим этой строки до побочной диагонали"

1) У тебя заменяется не найденный минимальный элемент, а один из дигональных. (Наверно, после copy-paste забыл поменять индексы.)
2) Зачем делить на (k-i). На k надо.

Т.е. строчку
d[i,k+1-i]:=sum/(k-i);
ИМХО надо заменить на
d[imin,jmin]:=sum/k;
давно
Академик
320937
2216
26.12.2009, 14:42
общий
это ответ
Здравствуйте, aggressor92. Предлагаемые исправления отмечены комментариями {*************}.
1. Расчет среднего вынесен за цикл.
2. Используются вещественные числа, MaxInt в этом случае может быть преодолен. В качестве минимального значения принимаем a[1,1].
3. Какая-то печать должна быть в случае нахождения минимального на побочной диагонали, добавлена ветвь ELSE.

Дополнение (поскольку вопрос такой не ставился). Процедура должна решать конкретную задачу, например, Sort должна только сортировать.


Приложение:
program p175606;
{
решить задачу с использованием процедур с передачей параметров
подскажите, что надо исправить в моей.
В двумерных массивах A[N*N] и B[M*M] определить минимальное значение.
Если минимальное расположено выше побочной диагонали,
то числа на этой диагонали поменять местами (первое с последним,
второе с предпоследним и т.д.). Если минимальное расположено
ниже побочной, то заменить его средним арифмеическим этой строки
до побочной диагонали. Если минимальное расположено на самой диагонали,
то ничего не делать.
}

uses crt;
const
n=4;
m=4;
type
matr=array[1..n+m,1..n+m] of real;
var
a,b:matr;
imin,jmin,k,i,j:integer;

procedure VVOD(var d:matr;k:integer);
begin
for i:=1 to k do
for j:=1 to k do
d[i,j]:=random(20);
end;

procedure VIVOD(d:matr;k:integer;t:string);
begin
writeln;
writeln(t);
for i:=1 to k do begin
for j:=1 to k do
write(d[i,j]:5:1);
writeln;
end;
end;

procedure MIN(d:matr;k:integer;var imin,jmin:integer);
var
min:real;
begin
(*********************)
min := d[1,1];
imin := 1;
jmin := 1;
(*********************)
for i:=1 to k do
for j:=1 to k do
if d[i,j]<min then begin
min:=d[i,j];
imin:=i;
jmin:=j;
end;
writeln('min=',min:4:1);
writeln('stroka=',imin);
writeln('stolb=',jmin);
end;

procedure SORT(var d:matr;k:integer;t,t1:string);
var
imin,jmin:integer;buf,sum:real;
begin
sum:=0;
VVOD(d,k);
VIVOD(d,k,t);
MIN(d,k,imin,jmin);

if (imin+jmin)<(k+1) then begin
for i:=1 to k div 2 do begin
buf:=d[i,k+1-i];
d[i,k+1-i]:=d[k+1-i,i];
d[k+1-i,i]:=buf;
end;
VIVOD(d,k,'vishe po6o4noi'+t1);
end
else if (imin+jmin)>(k+1) then begin
(*********************)
if imin=k then
{ последняя строка, нет элементов
перед побочной диагональю }
d[imin,jmin]:=0
else begin
sum := 0;
for j:=1 to k-imin do
sum:=sum+d[imin,j];
d[imin,jmin]:=sum/(k-imin);
end;
(*********************)
VIVOD(d,k,'nizhe pobo4noi ' +t1);
end
(*********************)
else
VIVOD(d,k,'na po6o4noi'+t1);
(*********************)
end;

BEGIN
clrscr;
randomize;
SORT(a,n,'Matr A',' Otsort Matr A');
window(40,1,80,25);
SORT(b,m,'Matr B',' Otsort Matr B');
end.
Неизвестный
06.01.2010, 12:34
общий
а если у меня минимум выше побочной диагонали, мне же надо и сортировать диагональ, в которой минимум, а не побочную диагональ.
Неизвестный
06.01.2010, 13:15
общий
aggressor92:
Добрый день! Давайте уточним постановку задачи.
- В Вашем вопросе сказано:
Если минимальное расположено выше побочной диагонали, то числа на этой диагонали поменять местами (первое с последним, второе с предпоследним и т.д.).
Поскольку никакого другого упоминания понятия "диагональ" нет, по умолчанию считается, что "эта" относится к побочной.
- В Вашем сегодняшнем сообщении :
а если у меня минимум выше побочной диагонали, мне же надо и сортировать диагональ, в которой минимум, а не побочную диагональ.
.
1. Что считать верным?
2. Любая точка, не лежащая в углах, лежит на двух диагоналях. Какую сортировать? Параллельную побочной?
3.Нет ли в постановке задачи еще чего-то, что было трактовано автором ответа не так, как предполагалось Вами?
С уважением
Неизвестный
06.01.2010, 13:39
общий
aggressor92:
В программе сделаны изменения в предположении, что надо реверсировать диагональ, параллельную побочной.
Начало и конец изменений отмечены (*=2=*)

Код:
program p175606;
{
решить задачу с использованием процедур с передачей параметров
подскажите, что надо исправить в моей.
В двумерных массивах A[N*N] и B[M*M] определить минимальное значение.
Если минимальное расположено выше побочной диагонали,
то числа на этой диагонали поменять местами (первое с последним,
второе с предпоследним и т.д.). Если минимальное расположено
ниже побочной, то заменить его средним арифмеическим этой строки
до побочной диагонали. Если минимальное расположено на самой диагонали,
то ничего не делать.
}

uses crt;
const
n=4;
m=4;
type
matr=array[1..n+m,1..n+m] of real;
var
a,b:matr;
imin,jmin,k,i,j:integer;

procedure VVOD(var d:matr;k:integer);
begin
for i:=1 to k do
for j:=1 to k do
d[i,j]:=random(20);
end;

procedure VIVOD(d:matr;k:integer;t:string);
begin
writeln;
writeln(t);
for i:=1 to k do begin
for j:=1 to k do
write(d[i,j]:5:1);
writeln;
end;
end;

procedure MIN(d:matr;k:integer;var imin,jmin:integer);
var
min:real;
begin
(*********************)
min := d[1,1];
imin := 1;
jmin := 1;
(*********************)
for i:=1 to k do
for j:=1 to k do
if d[i,j]<min then begin
min:=d[i,j];
imin:=i;
jmin:=j;
end;
writeln('min=',min:4:1);
writeln('stroka=',imin);
writeln('stolb=',jmin);
end;

procedure SORT(var d:matr;k:integer;t,t1:string);
var
imin,jmin:integer;buf,sum:real;
(*=2=*)
jnach: integer;
(*=2=*)
begin
sum:=0;
VVOD(d,k);
VIVOD(d,k,t);
MIN(d,k,imin,jmin);

(*=2=*)
if (imin+jmin)<(k+1) then begin
jnach:=imin+jmin-1;
for i:=1 to jnach div 2 do begin
buf:=d[i,jnach+1-i];
d[i,jnach+1-i]:=d[jnach+1-i,i];
d[jnach+1-i,i]:=buf;
end;
(*=2=*)
VIVOD(d,k,'vishe po6o4noi'+t1);
end
else if (imin+jmin)>(k+1) then begin
(*********************)
if imin=k then
{ последняя строка, нет элементов
перед побочной диагональю }
d[imin,jmin]:=0
else begin
sum := 0;
for j:=1 to k-imin do
sum:=sum+d[imin,j];
d[imin,jmin]:=sum/(k-imin);
end;
(*********************)
VIVOD(d,k,'nizhe pobo4noi ' +t1);
end
(*********************)
else
VIVOD(d,k,'na po6o4noi'+t1);
(*********************)
end;

BEGIN
clrscr;
randomize;
SORT(a,n,'Matr A',' Otsort Matr A');
window(40,1,80,25);
SORT(b,m,'Matr B',' Otsort Matr B');
end.

С уважением
Неизвестный
06.01.2010, 13:48
общий
lamed:
спасибо огромное, теперь сортирует так, как надо.
Неизвестный
06.01.2010, 14:24
общий
aggressor92:
Огромное пожалуйста! Успехов!
Форма ответа