Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск 2 одинаковых элементов в массиве.


Страницы:   1 2 3

Leon-Z ©   (2011-03-03 20:35:00) 

Дан массив - Mas: array [1..10] of Integer;

В нем 2 числа одинаковые. Как максимально быстро найти их.
Я знаю 1 метод:

var
 mas: array [1..10] of Integer;
 i, j, index1, index2: Integer;
begin
 index1 := 0;
 index2 := 0;
// заполним массив случайными значениями
 Randomize;
 for i := 1 to 10 do mas[i] := Random(100);
 i := Random(9) + 1;
 mas[i] := 8;
 i := Random(9) + 1;
 mas[i] := 8;
// собственно поиск
 for i := 1 to 9 do
   for j := i + 1 to 10 do
     if mas[i] = mas[j] then
     begin
       index1 := i;
       index2 := j;
     end;
end;

Есть другие методы ?


Игорь Шевченко   (2011-03-03 23:52:00) [21]

Сергей М. ©   (03.03.11 23:22) [24]
Противный   (03.03.11 23:49) [30]

Убивать надо за такой код. Медленно и с наслаждением.


Andy BitOff   (2011-03-03 23:52:00) [22]

> Противный   (03.03.11 21:31) [12]
> Goto, Break, Exit, Continue, While-Do, Repeat-Until - моветон.
> Всякие Pascal, C, C++ по сути - моветон. Я даже не упоминаю
> C#, Basic и Java. Настоящие джедаи пишут только на Assembler.
> И даже там стараются избегать всяких Loop'ов. Есть только
> семь истинных мнемоник: Mov, Add, Or, And, Shr, Shl и JmpX.
> Все остальное суть происки нечестивцев.

Истину глаголишь, сын мой, ибо от лукавого остальное фсе.


Противный   (2011-03-03 23:51:00) [23]

[30] Не громоздко, но уродливо... :о(


Сергей М.   (2011-03-03 23:51:00) [24]

Соглашусь с Противным (С) - ох тоскливо взирать на код, тем более чужой, с кучей абы как разбросанных проверяемых флажков.
Флажки хороши и нужны там, где без них попросту нельзя обойтись "малой кровью", т.е. без ущерба читабельности кода и сквозной производительности алгоритма.


Противный   (2011-03-03 23:49:00) [25]

Сергей М. ©   (03.03.11 23:22) [24]
> while True do
> try
>  DoSomething;
> except
>   Break;
> end;


Да, кстати:

try
while True do
   DoSomething;
except
end;


Противный   (2011-03-03 23:46:00) [26]

> Oleg_teacher   (03.03.11 23:28) [26] несоглашусь:

Имхо, флажки еще больше убожество, чем Goto. Проще уж в коде Goto визуально найти, чем проанализировать условие выхода из цикла, а потом отыскивать, в каком месте кода устанавливается то или иное значение флажка. А если флажков несколько, так и вовсе вселенская печаль...


Сергей М.   (2011-03-03 23:39:00) [27]


> несоглашусь


Ну и не соглашайся)
Но тогда не жалуйся на то что этот "заменитель" :
1. Больше в размере исх.текста (+ еще и переменную надо объявлять)
2. Выполняет минимум на одну "лишнюю" проверку больше, т.е. минимально но уступает оригиналу в производительности.


Противный   (2011-03-03 23:38:00) [28]

А как по мне, так очень даже ничего:

function  DoSomething: boolean;
begin
 try
   <...>
 except
   Result := false;
 end;
end;

while DoSomethig do;


А если еще try-except-end убрать внутри DoComething(), так и вовсе сплошной кошер...


Oleg_teacher   (2011-03-03 23:28:00) [29]


> Перепиши его без использования Break - и получишь громоздкий
> и уродливый код.

несоглашусь:
f:=True;
while f do
try
DoSomething;
except
f:=False;
end;


Oleg_teacher   (2011-03-03 23:25:00) [30]


> Речь идет о Break

угу, извините неправильно выразился.

> быть прерван во время УЖЕ выполняющейся его очередной итерации

ну немогу представить даже как ето должно быть и где применяется. Ну в общем понятно, что данные команды использовать можно, и ничего плохого в етом нет. Главное самому не запутаться.


Сергей М.   (2011-03-03 23:22:00) [31]

Вот простейший пример:

> while True do
> try
>  DoSomething;
> except
>   Break;
> end;


Перепиши его без использования Break - и получишь громоздкий и уродливый код.


Сергей М.   (2011-03-03 23:19:00) [32]

Exit - это не выход из цикла, причем он здесь ?
Речь идет о Break - операторе прерывания выполнения цикла, передающем управление оператору, следующему за "закрывающей скобкой" цикла.


> почему бы ето условие и не выбрать условием выхода из цыкла
> while или repeat.


Потому что нередко приключаются ситуации , когда цикл должен быть прерван во время УЖЕ выполняющейся его очередной итерации


Oleg_teacher   (2011-03-03 23:09:00) [33]

непонимаю тогда куда то в цикл нада будет вставить exit? Всеравно что бы его использовать... нужно будет достичь какое то условие, так почему бы ето условие и не выбрать условием выхода из цыкла while или repeat.


Сергей М.   (2011-03-03 23:07:00) [34]


> это делает обслуживание кода трудным


Кому и невеста кобыла)


Сергей М.   (2011-03-03 23:06:00) [35]


> while использую тогда когда нада


Было бы странным если бы его можно было использовать тогда когда "ненада"

Но я вообще-то о другом.
Предположим "алгоритмическая диспозиция" у тебя сложилась такова что нет ни никакой возможности условие выхода из цикла определить пред- либо пост-условием соответственно цикла while или repeat.

И что будешь делать ?)


Oleg_teacher   (2011-03-03 23:05:00) [36]

хотя я так понял ето все на любителя.... вот на одном из сайтов нашел описание:
Описание
Процедура Exit немедленно завершает выполнение текущей функции или процедуры.

При выходе из функции, результат содержит последнее значение.

Предупреждение: используйте с предостережением - это делает обслуживание кода трудным.


Oleg_teacher   (2011-03-03 22:59:00) [37]


>  а не создавать цепочку else if

реально так и делал, когда нада была такая необходимость.

>  А цикл for в Delphi вообще не позволяет добавлять условия
> выхода

а зачем только к for быть привязаным?


Oleg_teacher   (2011-03-03 22:57:00) [38]

нет, посему же. Допустим while использую тогда когда нада.... не обезательно if goto. Допустим с goto вообще не дружу категорически!!!


Сергей М.   (2011-03-03 22:40:00) [39]


> че то привык только условиями обходится (ну например для
> выхода из цикла).


Это как ?)
if Выражение then Выйти_из_цикла?
А Выйти_из_цикла- это, надо понимать, не Break, а goto куда_то_за_пределы_тела_цикла?)


И. Павел   (2011-03-03 22:39:00) [40]


> Oleg_teacher   (03.03.11 21:11) [3]

Конечно, break, exit и raise противоречат принципам структурного программирования, но без них, ИМХО, иногда код может стать намного сложнее для восприятия, чем с ними. Например, если проверяется много условий, мне кажется, что код выглядит понятнее, если при невыполнении условия делать exit, а не создавать цепочку else if. А цикл for в Delphi вообще не позволяет добавлять условия выхода, так что, чтобы прервать его, без break не обойтись.  Ну а без raise обработка ошибок превращается в кошмар :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо