![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск 2 одинаковых элементов в массиве.
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 обработка ошибок превращается в кошмар :)