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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2012, 22:27   #1
Proskurina
Форумчанин
 
Регистрация: 27.05.2012
Сообщений: 109
Печаль проверить все ли элементы в массиве различны.

проверить все ли элементы в массиве различны.
Proskurina вне форума Ответить с цитированием
Старый 07.09.2012, 22:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не. Не все. Пятый и седьмой равны
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2012, 03:27   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Proskurina Посмотреть сообщение
проверить все ли элементы в массиве различны.
Проскурина, могу предложить такой алгоритм:
1. упорядочить массив (по возрастанию или убыванию, не важно) любым известным тебе методом;
2. пройтись по массиву, сравнивая соседние элементы.
Вторую часть в Паскале можно сделать как-то так:
Код:
i:= 1;
while (i<n) and (a[i]<>a[i+1]) do inc(i);
if i=n then
  writeln('all elements are different')
else
  writeln('some elements are the same');
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 10.09.2012, 05:11   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

l - Индекс первого значения массива
h - Индекс последнего значения массива
Код:
  Exist := False;
  for i := l to h do
  begin
    for k := i + 1 to h do
    begin 
      if nArray[i] = nArray[k] then
      begin
        Exists := True;
        Break;
      end;
    end;
  end;
Если после цикла переменная Exists равна True, значит в массиве есть повторяющиеся значения.
kangreon вне форума Ответить с цитированием
Старый 10.09.2012, 16:48   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

kangreon, в Вашем варианте можно убрать 1 BeginEnd.
Poma][a вне форума Ответить с цитированием
Старый 10.09.2012, 21:49   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
2. пройтись по массиву, сравнивая соседние элементы.
Ну, что ж... после того, как массив уже отсортирован, предлагаю сделать так:
Код:
for i:=1 to n-1 do
	 if a[i] = a[i+1]
	 	then
	 	 begin
	 	  WriteLn('В массиве есть одинаковые элементы');
	 	  EXIT;
	 	 end;
WriteLn('В массиве все элементы различны');
Вадим Мошев вне форума Ответить с цитированием
Старый 10.09.2012, 22:08   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

В какой-то книжке было сказано использование операторов прерывающих структурные блоки, приравнивается к goto что является синонимом ереси. После прочитанных строк я пытался воздержаться от прерывания чего-либо...
Poma][a вне форума Ответить с цитированием
Старый 10.09.2012, 22:44   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Exit - Это процедура, которая не просто прерывает структурный блок, она завершает выполнение той программы (подпрограммы). Поэтому если при чтении кода вы наткнулись на на неё, код этой подпрограммы можете дальше не читать.

Цитата:
В какой-то книжке было сказано использование операторов прерывающих структурные блоки, приравнивается к goto что является синонимом ереси.
А вот у меня за спиной лежит книжка, где написано, что использование break/continue является более предпочтительным, нежели goto, то есть, они не отождествляются. Ну, если не нравится тот мой код, используйте флаг.
Вадим Мошев вне форума Ответить с цитированием
Старый 11.09.2012, 15:39   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Простите, если чем-то Вас обидел. Спасибо за разъяснения.
Цитата:
используйте флаг
Простите, но что это?
Poma][a вне форума Ответить с цитированием
Старый 11.09.2012, 16:18   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Цитата:
используйте флаг
Простите, но что это?
так принято называть переменную булевского типа (семафор), которая помогает прервать цикл без операции break/exit
например
Код:
  fExist := False;
  i := 1;
  while ( i<h ) and Not fExist do
  begin
    k := i+1;
    while ( k<=h ) and Not fExist do 
    begin
      if nArray[i] = nArray[k] then  fExists := True;
      inc(k);
    end;
    inc(i)
  end;
  if fExist 
       then // есть одинаковые элементы
       else // нет одинаковых элементов

но лично я не стал бы городить огород там, где он не нужен.
Оператор Break вполне себе легитимен и весьма удобен!
я лично всегда его использую, если алгоритм (и ЯП) это допускают!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверить все ли элементы в массиве различны. Proskurina Помощь студентам 7 08.09.2012 23:36
Перестановкой из n элементов называется последовательность длины n, все элементы которой различны. Получить перестановки (Паскаль) Pa s Помощь студентам 3 24.05.2012 13:06
в массиве все максимальные элементы заменить первым элементом, а все минимальные элементы заменить последним элементом Валерия2701 Паскаль, Turbo Pascal, PascalABC.NET 1 12.10.2011 15:49
Дана действительная матрица размером n x m, все элементы которой различны. В каждой строке выбирается эл bayker Помощь студентам 5 30.05.2010 21:32
Найти кол-во её стобцов,все элементы которых различны. Delphi. Flashcherry Помощь студентам 1 21.03.2009 00:46