Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Внизкак-то видел на этом форуме... Найти похожие ветки
← →
Игорь Шевченко © (2004-12-14 15:38) [40]Суслик © (14.12.04 15:34) [38]
Ви таки хотите доводов? Их есть у меня.
Дело в том, что используя такой код, ты не найдешь первое нечетное число. Ты даже не узнаешь, есть ли в массиве нечетные числа.
← →
Суслик © (2004-12-14 15:41) [41]
> [40] Игорь Шевченко © (14.12.04 15:38)
> Дело в том, что используя такой код, ты не найдешь первое
> нечетное число. Ты даже не узнаешь, есть ли в массиве нечетные
> числа.
А я его искал?
Мы вроде обсуждаем подход, а не функцию odd и невозможность пользования i после цикла.
Забыл сказать, что Odd моя кстати функция, выше описана - первые идущие подряд элементы равные 0 устанавливает в 1, как только не 0 - прерывается.
Ну?
← →
KSergey © (2004-12-14 15:42) [42]> [36] Суслик © (14.12.04 15:30)
>
> > for i := 0 to Len - 1 do
> > if Odd(M[i]) then Break;
>
> я тоже не против такого.
В таком подходе меня заботит одно: приписочка в хелпе
After the for statement terminates, the value of counter is undefined.
(выделено мной)
И хотя на самом деле все работает (D5, либо я что-то проглядел, мож крыж какой есть?), т.е. если после цикла используешь - даже не ругается и оптимизацию "назад" не включает (хотя когда-то точно помню натыкался на предупреждение). Вот эсти бя не было такой приписки - все было бы здорово, а так...
ЗЫ
Надеюсь, цель не просто найти, а еще и индекс узнать.. Можно, конечно, в переменную какую перед break перенести - но выход ли это? Вернее, на сколько это красиво?
← →
Verg © (2004-12-14 15:43) [43]
> [40] Игорь Шевченко © (14.12.04 15:38)
+1 :)
да уж, прграммеры
> [32] SharkKiller (14.12.04 15:23)
I := 0;
Код еще быстрее твоего, сохранив всю его ф-циональность :)))
← →
имя (2004-12-14 15:45) [44]Удалено модератором
← →
DiamondShark © (2004-12-14 15:48) [45]Удалено модератором
← →
Игорь Шевченко © (2004-12-14 15:48) [46]Суслик © (14.12.04 15:41) [41]
> А я его искал?
Я забыл спросить: а ты его искал ? Если нет, то зачем код привел ?
Verg © (14.12.04 15:43) [43]
> +1 :)
Переведи ? :)
← →
Суслик © (2004-12-14 15:51) [47]
> > +1 :)
>
>
> Переведи ? :)
Можно я ? Ну типа ты классную вещь сказал, достойно уважения.
Я так понимаю - это из системы оценок rsdn.
> Я забыл спросить: а ты его искал ? Если нет, то зачем код
> привел ?
Мы обсуждали подход - пользоваться break или нет. Все. Затем и привел.
← →
Кудесник © (2004-12-14 15:53) [48]А вот ещё помню, говорили, что следует избегать имён переменных - l, O и т.п... типа, обозвали переменную l (эль) оператор при вводе перепутал её с 1 (адин)... спутник улетел... долго выясняли... куда? %)
← →
Кудесник © (2004-12-14 15:53) [49]Удалено модератором
Примечание: Дубль
← →
KSergey © (2004-12-14 15:57) [50]> SharkKiller (14.12.04 15:23)
> Прогони оба цикла при Len = High(Integer). Сравни скорость.
> Больше про школу не говори.
Ну я сравнил. Почему про школу не говорить - можно уточнить?
← →
DiamondShark © (2004-12-14 16:01) [51]
> Мы обсуждали подход - пользоваться break или нет. Все. Затем
> и привел.
За что и получил. Ибо, задача поиска в массиве -- не самый удачный, да что уж там, совсем не удачный пример его использования.
← →
KSergey © (2004-12-14 16:02) [52]> [47] Суслик © (14.12.04 15:51)
> Мы обсуждали подход - пользоваться break или нет. Все. Затем
> и привел.
Не, гнилая отмазка ;) Уж извините.. ;)
← →
имя (2004-12-14 16:05) [53]Удалено модератором
← →
Суслик © (2004-12-14 16:07) [54]
> DiamondShark © (14.12.04 16:01) [51]
Не надо песен про получил.
> KSergey © (14.12.04 16:02) [52]
Гнилые слова, тоже без обид.
-----------
детский сад
← →
имя (2004-12-14 16:11) [55]Удалено модератором
← →
Mystic © (2004-12-14 16:17) [56]Насколько я помню, мода на неиспользование Break и Continue давно прошла. Связано это было с существовавшими парадигмами. Сейчас, вроде бы как принято, чтобы при написании метода можно было легко определить главную (основную) последовательность выполняемых действий. Скажем там, последовательность, которая возникает в случае отсутствия ошибок, ... Для этой цели использование Break, Exit и Continue очень даже помогает.
Кстати, кому интересно, Д. Кнут даже в одно время написал статью "структурное программирование с использованием goto" В реализации TeX-а goto встречается, и не только в качестве сокращения Break, Exit и Continue, которых нет в стандарте паскаля, но и в других случаях. Но там используются принципы литературного программирования, код ну очень хорошо задокументирован и метки почти не мешают пониманию.
← →
Игорь Шевченко © (2004-12-14 16:19) [57]SharkKiller (14.12.04 16:05) [53]
Те, кто в танке, смотрят на окно CPU
← →
KSergey © (2004-12-14 16:22) [58]> [55] SharkKiller (14.12.04 16:11)
> > KSergey © (14.12.04 15:57) [50]
> Потому что первое бывает и последним.
> Массив заполнял перед прогоном? Чем?
Числами ;)
Ну уж заполнил как надо, будьте покойны.
Если интересно, сразу скажу, мерял "на глаз". Но явно оличия более, чем на 10% - не наблюдалось (это я так оцениваю свою ошибку изменения).
Код, если интересно:procedure TForm1.Button1Click(Sender: TObject);
const
ARR_MAX = 355350000;
var
M: packed array of Shortint;
i, Len: Integer;
begin
//
SetLength(M, ARR_MAX);
for i := Low(M) to High(M)-1 do
M[i] := 2;
M[High(M)] := 3;
Len := Length(M);
ShowMessage ("--- Start ---");
// - 1 -
i := 0;
while (i < Len) and not odd(M[i]) do inc(i);
ShowMessage ("-1- " + IntToStr(i));
// - 2 -
for i := 0 to Len - 1 do
if Odd(M[i]) then Break;
ShowMessage ("-2- " + IntToStr(i));
end;
Мерял по появлению MessageBox"ов.
На моем компе это выполнялось примерно 5 сек, это вполне достаточное время, чтобы получить указанную точность, бОльшая меня и не интересовала.
Формально - да, это не High(Integer), однако, согласитесь, тенденция налицо.
← →
DiamondShark © (2004-12-14 17:26) [59]
> SharkKiller (14.12.04 16:05) [53]
Какой настырный пионер.
При Len=High(Integer) массив у тебя окажется в свопе (это если он of byte, с массивом integer ты будешь послан ещё на этапе компиляции).
Ловить блох с организацией цикла в этом случае -- скучно и пошло.
Это момент номер раз.
На размерах, влезающих в физ. память, никакого существенного различия не обнаруживается.
Это момент номер два.
Наконец, даже не гоняя бестолку машину, можно было посмотреть на полученный машинный код.
Это момент номер три.
Какой из этого всего вывод?
А очень простой: сам ты ничего не гонял, теоретические твои познания находятся на уровне плинтуса, а появилось ты здесь исключительно из желания повонять.
Посему надлежит тебе удавиться как можно скорее.
← →
Юрий Зотов © (2004-12-14 18:42) [60]> DiamondShark
Допустим, оппонент прав. Или неправ. Или частично прав. Или еще как угодно - но зачем же ТАК разговаривать?
Не в трамвае ведь.
← →
Vovchik_A © (2004-12-14 19:18) [61]2Юрий Зотов © (14.12.04 18:42) [60]
А в трамвае, выходит, можно ?
← →
Nous Mellon_ (2004-12-14 19:24) [62]
>
> А в трамвае, выходит, можно ?
Тебе да.
← →
Юрий Зотов © (2004-12-14 19:28) [63]> Vovchik_A © (14.12.04 19:18) [61]
В пустом - можно. Только негромко.
:о)
← →
DiamondShark © (2004-12-14 19:30) [64]Удалено модератором
Примечание: Предупреждение тебе.
← →
Igorek © (2004-12-14 20:03) [65]DiamondShark © (14.12.04 15:29) [35]
> Ты хочешь сказать, что логика написанного тебе не
> очевидна?
Мне то очевидна. А может быть неочевидна другим. А если брать пионеров - то большинству. Хотя в данном случае думаю непонятка вышла из-за отсутствия форматирования.
> Так ведь и то не годится: два пионера -- ещё, отнюдь,
> не большинство.
Давай проголосуем? Напишем по варианту процедуры, а народ пусть скажет - какой вариант читабельнее, безопаснее, быстрее там и т.д. Ок?
Итак стоит задача: "написать функцию, которая ищет первое нечетное число в массиве в видеfunction FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean
Если число не найдено, то она возвращает false, иначе - true, а само число можно найти в FirstOdd."
Для начала с постановкой согласен? Если да, то можешь сразу кинуть свой вариант.
← →
Alexander Panov © (2004-12-14 20:10) [66]:-)
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to Length(M)-1 do
begin
if (M[i] and 1) = 1 then
begin
FirstOdd := M[i];
Result := True;
break;
end;
end;
end;
← →
Игорь Шевченко © (2004-12-14 20:21) [67]Igorek © (14.12.04 20:03) [65]
> DiamondShark © (14.12.04 15:29) [35]
>
> > Ты хочешь сказать, что логика написанного тебе не
> > очевидна?
>
> Мне то очевидна. А может быть неочевидна другим. А если
> брать пионеров - то большинству. Хотя в данном случае думаю
> непонятка вышла из-за отсутствия форматирования.
Я наверное не совсем понимаю, это призыв к подробному толкованию для пионеров или как ?
← →
jack128 © (2004-12-14 20:27) [68]марсианин © (14.12.04 15:16) [31][Ответить]
> а как вот насчет, например, вызова виртуальных функций в
> конструкторе?
> Страуструп не рекомендует
AFAIK в C++ это просто невозможно. Точнее вызвать то можно, но вызов будет не полиморфным.
← →
Igorek © (2004-12-14 20:40) [69]Piter © (13.12.04 17:18) [12]
Да в Дельфи нельзя. А в С++ можно. Просто я подумал, что разговор идет вообще об операторах прерывания цикла/процедуры.
Vasya.ru © (13.12.04 18:34) [14]
> неверно принцим работы for а представляешь
С чего ты взял?
KSergey © (14.12.04 7:59) [21]
> while (TRUE) {
Кстати "вечный цикл" очень даже хорош во многих ситуациях. Очевиднее, яснее.
pasha_golub © (14.12.04 11:51) [24]
> сначала рассказывают о циклах for, а уж потом о
> while&repeat. Ведь первый, по сути, подвид второго.
В каком смысле?
← →
DiamondShark © (2004-12-14 20:43) [70]
> Igorek © (14.12.04 20:03) [65]
> Мне то очевидна. А может быть неочевидна другим.
Тут я согласен. Например, непрограммистам она не очевидна.
> А если брать пионеров - то большинству.
Потому и написано было про школу.
> Для начала с постановкой согласен?
А то.
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
i: integer;
begin
i := Low(M);
while (i <= High(M)) and not odd(M[i]) do inc(i);
Result := i <= High(M);
if Result then FirstOdd := M[i];
end;
← →
Piter © (2004-12-14 20:48) [71]DiamondShark © (14.12.04 12:30) [27]
А там какое находится? Десятое?
Сори, не понял кода, подумал о другом...
← →
Piter © (2004-12-14 22:06) [72]DiamondShark © (14.12.04 15:48) [45]
А потом удавись
DiamondShark © (14.12.04 17:26) [59]
Посему надлежит тебе удавиться как можно скорее
в стиле DiamondShark...
Ты мне ответь - тебя в детстве часто били что ли, что ты на весь мир озлобленный?
P.S. Не понимаю, как модераторы такое с легкостью прощают. Может, за DiamondShark стоят хорошие знания, но что бросается в глаза - за ним стоит неприкрытое хамство.
Vovchik_A © (14.12.04 19:18) [61]
А в трамвае, выходит, можно ?
:))))
← →
Igorek © (2004-12-14 22:58) [73]Игорь Шевченко © (14.12.04 20:21) [67]
> Я наверное не совсем понимаю, это призыв к подробному
> толкованию для пионеров или как ?
Это призыв к ясности кода. А на пионерах хорошо проверяется.
← →
Igorek © (2004-12-14 23:25) [74]DiamondShark © (14.12.04 20:43) [70]
Вот мой вариант.function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
I: Integer;
begin
Result := False;
for I := Low(M) to High(M) do
if (M[I] mod 2) <> 0 then
begin
Result := True;
FirstOdd := M[I];
break;
end;
end;
← →
Igorek © (2004-12-14 23:28) [75]Igorek © (14.12.04 23:25) [74]
Млин, нету предпросмотра, что-то с форматированием. Еще раз.
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
I: Integer;
begin
Result := False;
for I := Low(M) to High(M) do
if (M[I] mod 2) <> 0 then
begin
Result := True;
FirstOdd := M[I];
break;
end;
end;
← →
Igorek © (2004-12-14 23:29) [76]Сорри.
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
I: Integer;
begin
Result := False;
for I := Low(M) to High(M) do
if (M[I] mod 2) <> 0 then
begin
Result := True;
FirstOdd := M[I];
break;
end;
end;
---
Хорошо бы предпросмотр.
← →
Игорь Шевченко © (2004-12-14 23:35) [77]Igorek © (14.12.04 22:58) [73]
> Это призыв к ясности кода. А на пионерах хорошо проверяется.
Ясный код обычно находится в Source\VCL, не так ли ? :) Проверен на бесчисленном множестве пионеров.
С уважением,
← →
Кудесник © (2004-12-15 00:56) [78]
> [77] Игорь Шевченко © (14.12.04 23:35)
> Ясный код обычно находится в Source\VCL, не так ли ? :)
> Проверен на бесчисленном множестве пионеров.
Но не смотря на проверку бесчисленным множеством "пионэров", в указанном коде, тоже не всё так гладко, и подпорок в нём с затычками хватает и других странностей... потому, наверно, и глючат (иногда) на ровном месте...
← →
euru © (2004-12-15 01:35) [79]
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
i: Integer;
begin
Result := True;
for i := low(M) to high(M) do begin
FirstOdd := M[i];
if FirstOdd mod 2 = 1 then exit;
end;
Result := False;
end;
← →
KSergey © (2004-12-15 08:11) [80]Если уж голосовать, то я за
> [70] DiamondShark © (14.12.04 20:43)
Только с поправочкой: обязательно перед вставить {B-}. Для однозначности, чтобы не было кривотолков.
Хотя, если честно, есть у меня подозрение, что код (rjvgbkbhjdfyysq b jgnbvbpbhjdfyysq) выйдет практически одинаковым: что с while, что с for
Страницы: 1 2 3 4 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.048 c