Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1190975644
Trible
2007-09-28 14:34
2008.09.07
Пример OnDrawCell


2-1216971118
lavgirls
2008-07-25 11:31
2008.09.07
Подскажите как запустить exe файл другого приложения


11-1193140621
Yury Sidorov
2007-10-23 15:57
2008.09.07
Релиз KOL-CE


1-1198227129
Afonya
2007-12-21 11:52
2008.09.07
FastScript доступ к объектам дочерних окон.


15-1216122640
denic
2008-07-15 15:50
2008.09.07
AVR + LCD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский