Консультация № 146116
05.10.2008, 18:12
0.00 руб.
0 2 2
Дана целочисленная прямоугольная матрица. Определить максимальное из чисел, встречающихся в заданной матрице более одного раза (оформить в виде процедуры) (коментарии к каждой переменной )

Приложение:
помогите пожалуйста. зарание спасибо.

Обсуждение

давно
Профессор
401888
1232
06.10.2008, 07:20
общий
это ответ
Здравствуйте, Сухотерин Андрей Сергеевич!
Эту задачу можно решить по разному. Предлагаю следущий способ: сортируем матрицу построчно по невозрастанию, потом ищем в ней первые два одинаковых элемента. Код программы в приложении.

Приложение:
uses crt;
const n=4; {размеры матрицы}
m=5;
var a:array[1..n,1..m]of integer; {матрица}
i,i2,i3,v,k:integer; {счетчики циклов, буфер для обмена,счетчик совпадений}
begin
clrscr;
randomize;
for i:=1 to n do
begin
for i2:=1 to m do
begin
a[i,i2]:=random(100);{заполним матрицу случайными числами в инт[0,99]}
write(a[i,i2]:3);
end;
writeln;
end;
k:=0;
for i3:=1 to n*m do {сортировка матрицы}
for i:=1 to n do
for i2:=1 to m do
begin
if i2<>m then {если элемент в строке не последний}
begin
if a[i,i2+1]>a[i,i2] then {обычная сортировка пузырьком}
begin
v:=a[i,i2+1];
a[i,i2+1]:=a[i,i2];
a[i,i2]:=v;
end;
end
else
if (a[i+1,1]>a[i,i2])and(i<>n) then {если строка не последняя}
begin
v:=a[i+1,1]; {меняем первый элемент в следущей строке с последним элементом в текущей строке}
a[i+1,1]:=a[i,i2];
a[i,i2]:=v;
end;
end;
k:=0;
for i3:=1 to n*m do {поиск первых двух одинаковых}
for i:=1 to n do
for i2:=1 to m do
begin
if i2<>m then {если элемент в строке не последний}
begin
if a[i,i2+1]=a[i,i2] then {находим}
begin
writeln('Max element >1 raza=',a[i,i2]);{выводим сообщение}
k:=k+1; {фиксируем (вместо к можно переменную типа boolean)}
readln;
exit; {выходим из программы}
end;
end
else
if (a[i+1,1]>a[i,i2])and(i<>n) then {если строка не последняя}
begin
writeln('Max element >1 raza=',a[i,i2]);
k:=k+1;
readln;
exit;
end;
end;
if k=0 then writeln('Takogo chisla net!');
readln;
end.

Неизвестный
06.10.2008, 13:41
общий
это ответ
Здравствуйте, Сухотерин Андрей Сергеевич!

Далее я привожу программу, которая, по-логике, должна выполнять требуемое.
К сожалению в связи с недостатком времени и программы Turbo Pascal я не могу ни проверить насколько эта программа правильно работает ни дать более подробное описание, хотя в комментариях все должно быть понятно.

УДАЧИ!

Приложение:
uses crt;
const n=10; {Размер исходной квадратной матрицы}

var
mas:array[1..n,1..n] of integer;
{Массив, в котором будет храниться исходная матрица}
i,j:integer; {переменные для организации цикла в основной программе}

procedure get_double_max; {сама процедура}
var
tmpmas:array[1..n*n]of boolean;
{массив, в ктором будут храниться существующие значения в исходном массиве}
i,j,k:integer;
{переменные для циклов}
bool:boolean;
{условие при проверке повторного значения}

begin
for i:=1 to n*n do tmpmas[i]:=false;
{обнуление встречающихся чисел}

for i:=1 to n do
for j:=1 to n do
mas[i,j]:=true;
{В данном цикле происходит просмотр всех полей исходного массива и запись в переменную tmpmas всех встречающихся в основном массиве значений}

for i:=n*n downto 1 do
{цикл просмотра диапазона возможных значений (по убыванию, поскольку нужно максимальное число)}
if tmpmas[i] then
{если данное число встречется в исходном массиве, то смотрим сколько раз оно встречается}
begin
bool:=false;
{просматриваемое число пока не встречалось}
for j:=1 to n do
for k:=1 to n do
{цикл перебора исходного массива}
if mas[j,k]=tmpmas[i]then
{если просматриваемое число совпадает с числом из главного массива}
begin
if bool then
{если просматриваемое число встретилось повторно}
begin
writeln('Максимальное повторяющееся число = ',tmpmas[i]);
exit;
{выход из процедуры и запись на экран найденного значения}
end;
bool:=true; {ставим метку, что число уже встретилось}
end;
end;
end; {конец процедуры}


begin {основная программа}
{Заполнение исходного массива случайными числами}
for i:=1 to n do
for j:=1 to n do
mas[i,j]:=random(100);

clrscr;
for i:=1 to n do
begin
for j:=1 to n do write(mas[i,j]:3);
writeln;
end;
{вывод на экран заполненного массива}
writeln;
get_double_max; {запуск процедуры}
readkey;
end. {конец главной программы}
Форма ответа