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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2018, 15:46   #1
dol
Пользователь
 
Регистрация: 02.12.2018
Сообщений: 12
Радость delphi Поиск одинаковых чисел в матрице

Здравствуйте.
По заданию нужно создать матрицу, заполнить случайными числами и проверить эти числа на совпадения. Застрял с проверкой чисел, либо неправильно определяет совпадения, либо выдает всегда одно и то же. Сижу уже несколько дней, подскажите, что делаю не так.
Спасибо.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,n,m,p,q,z: Integer;
  a:array[0..50, 0..50] of Integer;
begin
  if ComboBox1.ItemIndex<0 then      //проверка параметров матрицы
    begin
      Showmessage('Укажите размеры матрицы');
      exit;
    end;

                 //заполнение массива случайными числами
  randomize;
  n:=StrToInt(ComboBox2.Text);
  m:=StrToInt(ComboBox1.Text);
  with StringGrid1 do
  begin
    RowCount:=n+1;
    ColCount:=m+1;
    for i:=0 to n-1 do
    for j:=0 to m-1 do
    begin
      a[i,j]:=-100+Random(201);
      Cells[j+1,i+1]:=inttostr(a[i,j]);
    end;
  end;
          //нумерация строк и столбцов
 with StringGrid1 do
 begin
  Cells[0,0]:=('@');
  i:=0;
  for j:=1 to RowCount do
  Cells[i,j]:=IntToStr(j);
  j:=0;
  for i:=1 to ColCount do
  Cells[i,j]:=IntToStr(i);
 end;
                   //проверка на повторы
begin
 for i:=1 to n do
  for j:=1 to m do
    for p:=i to n do
      for q:=1 to m do
  if (a[i,j]=a[p,q])and((p<>q)or(q<>j))then
    begin
      ShowMessage('Повтор найден');
      Exit;
    end
  else
    begin
      ShowMessage('Повторов нет');
      Exit;
    end;
 end;
end;
end.
dol вне форума Ответить с цитированием
Старый 02.12.2018, 16:10   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

А если так:
Код:
 
flag: Boolean
  ......................
 flag := False ;
 for i:=0 to n do
  for j:=0 to m do
    for p:=0 to n do
      for q:=0 to m do
         if (a[i,j]=a[p,q]) and not ((p=i) and (q=j)) then Flag := True
И в зависимости от флага выдавать соответствующий ShowMessage в конце внешнего цикла.
and((p<>q) - вот ошибка

Последний раз редактировалось digitalis; 02.12.2018 в 16:14.
digitalis вне форума Ответить с цитированием
Старый 02.12.2018, 16:28   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Только до n-1 и m-1. Можно схитрить и двумя циклами:
Код:
  for i:=0 to n*m-2 do
    for j:=i+1 to n*m-1 do
      if a[i div m,i mod m]=a[j div m,j mod m] then ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.12.2018, 18:42   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Только до n-1 и m-1.]
А почему? Вдруг совпавшее значение притаилось именно в последней строке (столбце) ? Ведь это не Си, массив [0..m,0..n] .
А насчет 2 циклов - не знаю, будет ли экономия, но ущерб в ясности понимания будет, я думаю.
В одной умной книжке я прочел: "Некоторые программисты полагают, что мировой запас скобок ограничен и поэтому употребляют их крайне редко" Я применил это к вложенности циклов В данном случае "уполовинивание" имело бы смысл для массивов очень больших размерностей (много индексов) , в результате могла быть превышена допустимая глубина вложенности циклов, но этот случай, думаю, не из реальной жизни.

Последний раз редактировалось digitalis; 02.12.2018 в 18:47.
digitalis вне форума Ответить с цитированием
Старый 02.12.2018, 18:57   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А почему?
Просто посмотреть как он заполняется

В двух циклах операции деления конечно не подарок. Но можно и их избежать )

ps ой, к тому массиву мой пример не подходит, m и n может быть меньше фактической размерности массива
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.12.2018 в 19:10.
Аватар вне форума Ответить с цитированием
Старый 03.12.2018, 10:39   #6
dol
Пользователь
 
Регистрация: 02.12.2018
Сообщений: 12
По умолчанию

Большое спасибо всем за помощь, все работает, как надо.
Есть только пара вопросов:
n-1 и m-1 нужно прописывать, чтобы последние ячейки не сравнивались сами с собой? Если не прописывать -1, то программа ошибается с ответами.

Цитата:
Сообщение от Аватар Посмотреть сообщение
к тому массиву мой пример не подходит, m и n может быть меньше фактической размерности массива
можно подробнее в какой ситуации это возможно? Я проверил многократно с разными параметрами и всегда работает правильно.
dol вне форума Ответить с цитированием
Старый 03.12.2018, 11:12   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

У меня "несравнение с самим собой" обеспечивается вот этим
Код:
and not ((p=i) and (q=j)
У Аватар как-то по другому, но сложно, и я не понял, а думать неохота, бо не мне же курсель сдавать.
digitalis вне форума Ответить с цитированием
Старый 03.12.2018, 11:36   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от dol Посмотреть сообщение
можно подробнее в какой ситуации это возможно? Я проверил многократно с разными параметрами и всегда работает правильно.
Все нормально, той ой к примеру с двумя циклами и зря написал - он будет правильно работать )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск одинаковых чисел в столбцах pain2430 Microsoft Office Excel 10 31.12.2015 16:18
Поиск одинаковых чисел (Visual Basic) Чуччи Помощь студентам 2 30.10.2011 11:17
Поиск чисел в матрице Dmitri4 Общие вопросы Delphi 3 23.05.2010 23:57
Поиск одинаковых значений в стобце, возврат суммы чисел из другого столбца в найденных строках! Kup Microsoft Office Excel 2 25.03.2010 10:15
Поиск одинаковых чисел bvden Microsoft Office Excel 3 05.07.2009 01:29