Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2013, 20:36   #1
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию Матрица в Pascal'e

Задание: Дана целочисленная матрица. Определить максимальное из чисел, встречающихся в этой матрице более одного раза.
Код:
Код:
 uses crt;
 const N=15;
       M=15;
 type matA=array[1..N,1..M] of integer;
 var i,j,MAXvalue,otvet:integer;
     A:matA;

Function FINMAXvalue (A:matA):integer;
 var i,j,MAXvalue:integer;
 Begin
  MAXvalue:=0;
 for i:=1 to N do
 for j:=1 to M do
 if A[i,j]>MAXvalue
   then MAXvalue:=A[i,j];
 end;
Begin
 for i:= 1 to N do
 for j:= 1 to M do
   read(A[i,j]);
   
 FINMAXvalue (A):=otvet;
 write ('Maximalnoe znachenie elementa matrici= ', otvet);
 end.
Этот код должен возвращать максимальное значение элемента в матрице, но pascal выдаёт ошибку "Нельзя присвоить левой части" ( там где FINMAXvalue (A):=otvet; ). В чём проблема и как сделать, чтобы возвращало значение максимального элемента который встречается в матрице более одного раза? Заранее спасибо

Последний раз редактировалось Stilet; 11.11.2013 в 20:56.
orandzheviyman вне форума Ответить с цитированием
Старый 11.11.2013, 22:29   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Если исправлять именно эту ошибку, то:
Код:
write('Maximalnoe znachenie elementa matrici= ', FINMAXvalue(A));
Пока же это решение не удовлетворяет условию (да и еще ошибки есть, но уже логические).
Насчет алгоритма:
Самым простым способом видится сортировка массива по убыванию, затем поиск первого повторяющегося числа.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.11.2013 в 22:33.
BDA вне форума Ответить с цитированием
Старый 12.11.2013, 05:24   #3
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
"Нельзя присвоить левой части"
все верно! вы функции присваиваете значение переменной,а не на оборот.слева должна стоять переменная принимающая значение,справа функция/формула хоть что. вы же не пишете 2+3:=х на паскале? а пишите х:=2+3
так и тут.
Код:
otvet:=FINMAXvalue (A);
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 12.11.2013, 09:22   #4
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если исправлять именно эту ошибку, то:
Код:
write('Maximalnoe znachenie elementa matrici= ', FINMAXvalue(A));
Пока же это решение не удовлетворяет условию (да и еще ошибки есть, но уже логические).
Насчет алгоритма:
Самым простым способом видится сортировка массива по убыванию, затем поиск первого повторяющегося числа.
Ну смотрите, тут алгоритм такой, что он без сортировки, но сравнивает каждый элемент с MAXvalue, в конце обоих циклов в MAXvalue полюбому будет максимальное значение, встречающееся в матрице.
orandzheviyman вне форума Ответить с цитированием
Старый 12.11.2013, 09:58   #5
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

да, но оно может быть и одно
а по условию
Цитата:
встречающихся в этой матрице более одного раза.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 12.11.2013, 13:06   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

orandzheviyman, очень рекомендую прислушаться к прозвучавшему выше совету BDA:
Цитата:
Сообщение от BDA Посмотреть сообщение
Насчет алгоритма:
Самым простым способом видится сортировка массива по убыванию, затем поиск первого повторяющегося числа.
p.s. разумеется, это не единственный алгоритм, я легко могу предложить и другой, но этот, имхо, вполне себе простой и эффективный!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.11.2013, 16:50   #7
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
orandzheviyman, очень рекомендую прислушаться к прозвучавшему выше совету BDA:

p.s. разумеется, это не единственный алгоритм, я легко могу предложить и другой, но этот, имхо, вполне себе простой и эффективный!
Напиши тогда код, пожалуйста)
orandzheviyman вне форума Ответить с цитированием
Старый 12.11.2013, 18:41   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
я легко могу предложить и другой
Если Вам не сложно, то будьте любезны, предложите..

В голу лезет только вариант с рекурсией.. или с выделением повторяющихся элементов..
Poma][a вне форума Ответить с цитированием
Старый 13.11.2013, 00:07   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, например, так:
Код:
const N=15;
      M=15;
type matA=array[1..N,1..M] of integer;

function isHasDublicate(A:matA; iMatch,jMatch : integer) : boolean;
var ii, jj : integer;
begin
   result := false;
   for ii:=1 to N do
     for jj:=1 to M do
       if ((ii<>iMatch) or (jj<>jMatch))
             and (A[ii,jj] = A[iMatch, jMatch]) then begin
               result := true;
               exit
             end;
end;

Function FINDMAXvalue (A:matA; var isFoundDublicate : boolean):integer;
var
   i,j:integer;
   isFirst : boolean;
 Begin
   isFirst := true;
   result := -1;
   isFoundDublicate := false;
   for i:=1 to N do
     for j:=1 to M do
       if isHasDublicate(A,i,j) then begin
         isFoundDublicate := true;
         if isFirst then begin
             result := A[i,j];
             isFirst := false;
         end
         else
            if A[i,j]>result then result := A[i,j];
       end;
 end;

var i,j,otvet :integer;
    A:matA;
    flag : boolean;

Begin
 for i:= 1 to N do
   for j:= 1 to M do
      read(A[i,j]);
 readln;

 otvet := FINDMAXvalue(A, flag);
 if flag then
   writeLn('Maximalnoe znachenie elementa matrici= ', otvet)
 else
   WriteLn('V matrice net povtorayushihsya chisel!');
 Readln;
end.
p.s. решение крайне неоптимальное - то, что называется - "в лоб"!!

orandzheviyman, вариант кода по алгоритму BDA с сортировкой ещё нужен?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.11.2013, 07:04   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А можно пару вопросов ?
#1
Цитата:
Код:
result := false;
   for ii:=1 to N do
     for jj:=1 to M do
       if ((ii<>iMatch) or (jj<>jMatch))
             and (A[ii,jj] = A[iMatch, jMatch]) then begin
               result := true;
               exit
             end;
Почему бы не сделать так?
Код:
result := true;
 for ii:=1 to N do
     for jj:=1 to M do
       if ((ii<>iMatch) or (jj<>jMatch))
             and (A[ii,jj] = A[iMatch, jMatch]) then 
               exit;

result := false;
#2
Цитата:
Код:
isFoundDublicate := true
А мы ведь может сделать вывод об этом используя лишь result..
Код:
isFoundDublicate := result <> -1;
И теперь в цикле мы не будем крутить это каждый раз..

И, наконец-то, самый главный вопрос :
Цитата:
p.s. решение крайне неоптимальное - то, что называется - "в лоб"!!
А самым оптимальным какое решение будет являться?
Отметка повторяющихся? И потом поиск по ним?
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица Pascal cuntek Помощь студентам 1 25.12.2010 21:00
Матрица (Pascal) Алиса. Помощь студентам 1 21.12.2010 15:11
Матрица в Pascal Nastik Помощь студентам 2 07.06.2010 21:55
Матрица в Pascal W_P Помощь студентам 7 05.03.2008 05:51