Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
ВнизО правильном коде Найти похожие ветки
← →
ifrau (2008-07-29 13:30) [0]Доброго времени. Взять, например, цикл:
while count <= length(src) //здесь src: string
begin
...
или правильнее будет заранее присвоить длину строки в переменную:len := length(src);
и цикл писать уже так:while count <= len do
begin
...
В общем, что лучше, выделять для таких вещей переменные (а их может быть много) или при каждом цикле вычислять длину строки (цикл может очень много раз запускаться) ? Спасибо
← →
Johnmen © (2008-07-29 13:34) [1]Что значит "лучше"?
И с чего ты взял, что длина строки вычисляется?
← →
Palladin © (2008-07-29 13:35) [2]правильней будет использовать for
← →
Григорьев Антон © (2008-07-29 13:39) [3]Делать переменные.
Существует такое понятие - инвариант цикла. Так называется выражение, значение которого не меняется во время выполнения цикла. С точки зрения оптимизации лучше вычислить такое выражение один раз и сохранить в переменной. Кроме того, понятие инварианта цикла очень важно с точки зрения верификации кода. Выявление инвариантов способствует тому, что код становится понятнее для чтения (в первом случае читающему не сразу становится ясно, может ли меняться длина src внутри цикла, во втором - сразу). А ещё вывление инвариантов цикла - важная часть разработки алгоритма, если это делать, то в сложных случаях будет проще не запутаться.
На всякий случай добавлю, что цикл for оптимизировать таким образом не надо - он вычисляет свои границы один раз в любом случае.
← →
ifrau (2008-07-29 13:41) [4]Johnmen, Не лучше, а правильнее. Что в моём случае будет правильнее?
Palladin, почему? Хотя бы в двух словах
← →
TUserClass © (2008-07-29 13:42) [5]
while count <= length(src) //здесь src: string
begin
Кстати, о правильном коде - do пропущено. :)
← →
ifrau (2008-07-29 13:42) [6]Григорьев Антон, спасибо, всё четко и ясно
← →
ifrau (2008-07-29 13:43) [7]TUserClass, да, прав )
← →
Johnmen © (2008-07-29 13:44) [8]
> (цикл может очень много раз запускаться) ?
Это что значит? Много раз подряд в линейном коде или много раз подряд при топтании батона?
← →
Palladin © (2008-07-29 13:46) [9]
> ifrau (29.07.08 13:41) [4]
Потому что в случае пробега по строке до Length - цикл прост до невозможности и никакого смысла использовать более сложную конструкцию с while и заводить лишнюю переменную нет. При чем для цикла for есть вкусность, на которую и указал Антон в последнем предложении.
← →
ifrau (2008-07-29 13:49) [10]Johnmen, в линейном коде
Palladin, удивительное рядом
← →
Anatoly Podgoretsky © (2008-07-29 13:50) [11]
> Что в моём случае будет правильнее?
Оба варианта правильные. Но второй оптимальный.
← →
Johnmen © (2008-07-29 13:51) [12]
> Palladin © (29.07.08 13:46) [9]
> заводить лишнюю переменную
Не лишняя, та же, что и в for
← →
Игорь Шевченко © (2008-07-29 13:53) [13]правильнее будет меньшее количество строк кода, значит, без лишних переменных
← →
Anatoly Podgoretsky © (2008-07-29 13:56) [14]
> Потому что в случае пробега по строке до Length - цикл прост
> до невозможности и никакого смысла использовать более сложную
> конструкцию с while и заводить лишнюю переменную нет. При
> чем для цикла for есть вкусность, на которую и указал Антон
> в последнем предложении.
А вот это нельзя сказать не видя остального кода, может как раз конструкция FOR не применима. А поскольку остального кода нет, то и говорить о правильности можно только условно, может в коде меняется length(src) и тогда не только вариант с for не применим, но и вариант с len
Правильность определяется не этим, а результатом.
← →
ifrau (2008-07-29 14:00) [15]Вообще, весь код выглядит так:
procedure TForm1.symbtobin(src: string; lines: TStrings);
var
len, count, i, iost: integer;
code: string;
begin
len := length(src);
count := 1;
while count <= len do
begin
i := ord(symb.Text[count]);
while i > 0 do
begin
iost := i mod 2;
code := inttostr(iost) + code;
i := i div 2;
end;
binary.Lines.Add(code);
code:="";
count := count + 1;
end;
end;
← →
Palladin © (2008-07-29 14:01) [16]
> Johnmen © (29.07.08 13:51) [12]
в for мы лишь объявляем индексную переменную, в while, дабы не приводить к постоянному вызову length, мы еще к индексной переменной заводим переменную обозначающую верхнюю границу индекса до которой будем бежать.
← →
Johnmen © (2008-07-29 14:03) [17]
> ifrau (29.07.08 14:00) [15]
Где здесь "цикл может очень много раз запускаться" "в линейном коде"?
Вобщем, без переменных, не стОит экономить на спичках, теряя читабельность.
Согласен с Игорь Шевченко © (29.07.08 13:53) [13]
← →
Palladin © (2008-07-29 14:04) [18]хотя, да, можно завести только одну переменную, содержащую значение верхней границы и в цикле ее уменьшать до нижнего индекса... но for выглядит куда лаконичней... )
← →
Плохиш © (2008-07-29 14:05) [19]
> code:="";
Стоит в неправильном месте.
← →
Johnmen © (2008-07-29 14:05) [20]
> Palladin © (29.07.08 14:01) [16]
А, ты про это... Не надо её заводить. Повторюсь про спички :))
← →
ifrau (2008-07-29 14:07) [21]
> Плохиш
Надо в начале?
← →
Игорь Шевченко © (2008-07-29 14:10) [22]
> Вообще, весь код выглядит так:
ты эта...чего хочешь-то от кода ?
← →
Плохиш © (2008-07-29 14:11) [23]
> ifrau (29.07.08 14:07) [21]
>
> > Плохиш
>
> Надо в начале?
Смотря чего...
← →
Leonid Troyanovsky © (2008-07-29 14:12) [24]
> ifrau (29.07.08 14:00) [15]
> Вообще, весь код выглядит так:
В печь его.
--
Regards, LVT.
← →
ifrau (2008-07-29 14:15) [25]Все, что хотел, выяснил, всем большое спасибо
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c