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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2015, 14:41   #1
milamore
Новичок
Джуниор
 
Регистрация: 25.03.2015
Сообщений: 4
По умолчанию Задан двумерный целочисленный массив.

Задан двумерный целочисленный массив. Известно, что среди его эле-ментов два и только два равны между собой. Составить программу нахождения координат этих элементов.
Прошу помощи, зачёт горит.
Есть примерный код, нужно доделать либо переделать
Код:
Код:
Procedure More;
Begin
For i1:=1 to MaxN do
 For j1:=1 to MaxM do
   For i2:=1 to MaxN do
    For j2:=1 to MaxM do
      If m[i1,j1]=m[i2,j2] and ((i1<>i2) and (j1<>j2)) then
      Begin
         Writeln(i1,',',j1,' : ',m[i1,j1]);
         Writeln(i2,',',j2,' : ',m[i2,j2]);
         Exit;
      End;
end;
milamore вне форума Ответить с цитированием
Старый 25.03.2015, 14:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так у Вас почти всё правильно.
я бы только один AND на OR поменял и скобки поставил:
Код:
      If (m[i1,j1]=m[i2,j2]) and ((i1<>i2) or (j1<>j2)) then
      Begin
         Writeln(i1,',',j1,' : ',m[i1,j1]);
         Writeln(i2,',',j2,' : ',m[i2,j2]);
         Exit;
      End;

можно, конечно, намного эффективней написать перебор, когда внутренний цикл по I2,J2 выполнять не от 1,1, а от элемента, следующего за I1,J1...
Это не так сложно, как может показаться, а производительность резко увеличит!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2015, 17:25   #3
milamore
Новичок
Джуниор
 
Регистрация: 25.03.2015
Сообщений: 4
По умолчанию

Что то попробовал но всё равно получилось что то не то)
Код:
program mila;
var MaxN, MaxM, m, i1, i2, j1, j2: integer;
Begin
Procedure More;
Begin
For i1:=1 to MaxN do
 For j1:=1 to MaxM do
   For i2:=1 to MaxN do
    For j2:=1 to MaxM do
      If m[i1,j1]=m[i2,j2] and ((i1<>i2) or (j1<>j2)) then
      Begin
         Writeln(i1,',',j1,' : ',m[i1,j1]);
         Writeln(i2,',',j2,' : ',m[i2,j2]);
         Exit;
      End;
end;
end.
milamore вне форума Ответить с цитированием
Старый 25.03.2015, 21:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Что то попробовал но всё равно получилось что то не то)
Это ваша проба?!

это неверно.
для начала, КРИТИЧЕСКАЯ ошибка - определение типа переменной m
Ведь в коде перебора вы к ней обращаетесь как к массиву?
Цитата:
Задан двумерный целочисленный массив.
а почему описываете не как массив, а как скалярную переменную?
нужно описывать двухмерый массив.
Код:
var m : array[1..КоличествоСтрок, 1..КоличествоСтолбцов] of integer;
Это раз.

Второе. Переменные MaxN и MaxM используются в коде в качестве размерности массива. Значит, они где-то должны задаваться.

Третье. Массив нужно заполнить значениями, он сам по себе не заполнится.

жду ваш код с исправлениями.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2015, 21:33   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

предлагаю автору повзрослеть: называть пипиську членом, а массивы нумеровать с нуля.
кстати, двумерный статич. массив можно обрабатывать, как одномерный; чтобы исключить такую жуткую вложенность циклов.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.03.2015, 21:37   #6
milamore
Новичок
Джуниор
 
Регистрация: 25.03.2015
Сообщений: 4
По умолчанию

Простите но не пойму ваших аллегорий.

вот код
Код:
program mila;
var MaxN, MaxM, i1, i2, j1, j2: integer;
m: array [1..10, 1..10] of integer;
Begin
MaxN := 10;
MaxM := 10;
Procedure More;
Randomize;
Begin
For i1:=1 to MaxN do
 For j1:=1 to MaxM do
   For i2:=1 to MaxN do
    For j2:=1 to MaxM do
      If (m[i1,j1]=m[i2,j2]) and ((i1<>i2) or (j1<>j2)) then
      Begin
         Writeln(i1,',',j1,' : ',m[i1,j1]);
         Writeln(i2,',',j2,' : ',m[i2,j2]);
         Exit;
      End;
end;
end.
milamore вне форума Ответить с цитированием
Старый 25.03.2015, 21:43   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Простите но не пойму ваших аллегорий.
вот матчасть, читай.

так что никаких аллегорий, чистый смысл и всё.
чего ты не понимаешь?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 26.03.2015, 21:52   #8
milamore
Новичок
Джуниор
 
Регистрация: 25.03.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

жду ваш код с исправлениями.
Сергей жду вашего ответа
milamore вне форума Ответить с цитированием
Старый 26.03.2015, 23:02   #9
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

milamore, а ведь min@y™ дело говорит.
Смотри. Вот реши эту же задачу, но для массива. Будет всего два цикла.
А теперь, внимание фокус. Обращение по i к элементу матрицы a[][] выполняется так
a[i div MaxN, i mod MaxN]. Всего элементов "псевдомассива" MaxN*MaxM. Итак, в решении для массива делается замена a[] на a[][] и всё работает.

Вот отвлечённый пример сортировки матрицы как массива (для FPC)
Код:
program MatrixSort;
 
type
  TMatrix = array of array of integer;
 
  procedure SortMatrix(var a: TMatrix; m, n: integer);
  var
    i, j: integer;
    t: integer;
  begin
 
    for i := 0 to (m * n - 1) do
      for j := 0 to (m * n - 1) - i - 1 do
        if a[j div n, j mod n] > a[(j + 1) div n, (j + 1) mod n] then
        begin
          t := a[j div n, j mod n];
          a[j div n, j mod n] := a[(j + 1) div n, (j + 1) mod n];
          a[(j + 1) div n, (j + 1) mod n] := t;
        end;
  end;
 
var
  m, n: integer;
  i, j: integer;
  a: TMatrix;
begin
  {ввод размерности и заполнение матрицы}
  m := 2;
  n := 8;
  SetLength(a, m, n);
  for i := 0 to m - 1 do
    for j := 0 to n - 1 do
      a[i, j] := 10 * (m - i) + (n - j);
  {матрица до сортировки}
  writeln('Before:');
  for i := 0 to m - 1 do
  begin
    for j := 0 to n - 1 do
      Write(a[i, j]: 4);
    writeln;
  end;
  {вызов процедуры сортировки}
  SortMatrix(a, m, n);
  {матрица после сортировки}
  writeln('After');
  for i := 0 to m - 1 do
  begin
    for j := 0 to n - 1 do
      Write(a[i, j]: 4);
    writeln;
  end;
end.
FPaul вне форума Ответить с цитированием
Старый 27.03.2015, 11:17   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от milamore Посмотреть сообщение
Сергей жду вашего ответа
milamore, замечание 1 выполнили (массив описан верно)
замечание 2 выполнили (переменные с количеством строк/столбцов задали).
а замечание 3 ( массив заполнить значениями) почему не сделали?!

ну и ещё. процедуру вы описали. Но этого мало. Надо эту процедуру вызвать!


ладно. вот пример рабочей программы на основе ваших попыток:
Код:
program mila;
var MaxN, MaxM : integer;
m: array [1..10, 1..10] of integer;

procedure FillRandomArray;
var i, j : integer;
begin
  Randomize;
  For i:=1 to MaxN do
   For j:=1 to MaxM do
     m[i,j] := Random(50)+1; {заполним массив случайными числами от 1 до 50 }
end;

procedure PrintArray;
var i, j : integer;
begin
  For i:=1 to MaxN do 
  begin
    For j:=1 to MaxM do Write(m[i,j]:3,' ');
    WriteLn;
  end;   
 end;

Procedure FindDublicate;
var i1, i2, j1, j2: integer;
Begin
For i1:=1 to MaxN do
 For j1:=1 to MaxM do
   For i2:=1 to MaxN do
    For j2:=1 to MaxM do
      If (m[i1,j1]=m[i2,j2]) and ((i1<>i2) or (j1<>j2)) then
      Begin
         Writeln(i1,',',j1,' : ',m[i1,j1]);
         Writeln(i2,',',j2,' : ',m[i2,j2]);
         Exit;
      End;
end;

Begin
  MaxN := 5; {5 строк}
  MaxM := 5; {5 столбцов}
  
  FillRandomArray;
  
  PrintArray;
   
  FindDublicate
  
end.

Последний раз редактировалось Serge_Bliznykov; 27.03.2015 в 11:26.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задан целочисленный массив maxim1592 Паскаль, Turbo Pascal, PascalABC.NET 8 31.05.2014 19:42
Задан целочисленный массив, состоящий из n элементов maxim1592 Помощь студентам 13 29.05.2014 00:29
Задан целочисленный одномерный массив A из N элементов. Найти номер последне Vladimir Ryabov Фриланс 5 01.11.2011 13:21
задан двумерный массив Boris)) Паскаль, Turbo Pascal, PascalABC.NET 2 25.10.2011 19:18
Задан двумерный массив dolya2007 Общие вопросы C/C++ 0 01.05.2009 02:45