![]() |
|
|
#16
|
|||
|
|||
|
Цитата:
А можно на счет скорости выполнения по подробней ? |
|
#17
|
|||
|
|||
|
Цитата:
Это вместо массива использовать ? Если можно объясните принцип с const . |
|
#18
|
|||
|
|||
|
Цитата:
const - это раздел программы (по аналогии с type или var) - в нем ты указываешь, что данная переменная является константой и в программе значение этой переменной меняться не будет (тебе и компилятор не позволит это сделать). выигрыш - в использовании памяти. возможно еще и в скорости обработки, но тут я не уверен. Последний раз редактировалось nixel, 10.03.2012 в 19:44. |
| Этот пользователь сказал Спасибо nixel за это полезное сообщение: | ||
UchusNaDelhi7 (10.03.2012)
| ||
|
#19
|
|||
|
|||
|
по поводу сокращения кода
Код:
a:=0;
While a<=25 do // 1 цикл
begin
a:=a+1;
b:=0;
While b<=25 do // 2 цикл
begin
b:=b+1;
c:=0;
While c<=25 do // 3 цикл
begin
c:=c+1;
d:=0;
While d<=25 do // 4 цикл
begin
d:=d+1;
e:=0;
While e<=25 do // 5 цикл
begin
e:=e+1;
f:=0;
While f<=25 do // 6 цикл
begin
f:=f+1;
g:=0;
While g<=25 do // 7 цикл
begin
g:=g+1;
h:=0;
While h<=25 do // 8 цикл
begin
h:=h+1;
i:=0;
While i<=25 do // 9 цикл
begin
i:=i+1;
Memo1.Lines.Add(Abc[a]+Abc[b]+Abc[c]+Abc[d]+Abc[e]+Abc[f]+Abc[g]+Abc[h]+Abc[i]);можно переписать так: Код:
for a:= 1 to 26 do
for b:= 1 to 26 do
for c:= 1 to 26 do
for d:= 1 to 26 do
for e:= 1 to 26 do
for f:= 1 to 26 do
for g:= 1 to 26 do
for h:= 1 to 26 do
for i:= 1 to 26 do
Memo1.Lines.Add(Abc[a]+Abc[b]+Abc[c]+Abc[d]+Abc[e]+Abc[f]+Abc[g]+Abc[h]+Abc[i]);соответственно это с учетом того, что используется строка ABC: string = 'abcdefghijklmnopqrstuvwxyz', у которой ABC[1] = a, а ABC[26] - z. это я к написанному выше о нулевом элементе. |
| Этот пользователь сказал Спасибо nixel за это полезное сообщение: | ||
UchusNaDelhi7 (10.03.2012)
| ||
|
#20
|
|||
|
|||
|
Цитата:
Все ясно . Спасибо ! |
|
#21
|
|||
|
|||
|
Цитата:
Код намного меньше и красивей будет , сейчас переделаю . Заодно с константой познакомлюсь , никогда не работал с ними . Спасибо ! |
|
#22
|
|||
|
|||
|
Программу переписал с вашей помощью : с const намного удобнее , а цикл While я использовал по старой памяти ( всегда только его использовал ) , с оператором цикла for тоже намного удобнее . Вот код программы ( все работает ) :
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d,e,f,g,h,i: integer;
const
Abc:string = 'abcdefghijklmnopqrstuvwxyz';
begin
for a:= 1 to 26 do
for b:= 1 to 26 do
for c:= 1 to 26 do
for d:= 1 to 26 do
for e:= 1 to 26 do
for f:= 1 to 26 do
for g:= 1 to 26 do
for h:= 1 to 26 do
for i:= 1 to 26 do
Memo1.Lines.Add(Abc[a]+Abc[b]+Abc[c]+Abc[d]+Abc[e]+Abc[f]+Abc[g]+Abc[h]+Abc[i]);
end; Т.е. я правильно понимаю , в const все переменные постоянны ( их менять нельзя ) - как было сказано выше , а в массиве их можно менять ( например можно менять элементы массива ) ? |
|
#23
|
|||
|
|||
|
Все правильно.
|
| Этот пользователь сказал Спасибо m1sclick за это полезное сообщение: | ||
UchusNaDelhi7 (10.03.2012)
| ||
|
#24
|
|||
|
|||
|
если массив объявлен в поле const - то его элементы менять нельзя.
string - это, по сути, массив символов char. в данном случае ты объявляешь содержимое этого массива в поле const. если массив/строку объявить в поле var, то можно менять и его содержимое и размер. |
| Этот пользователь сказал Спасибо nixel за это полезное сообщение: | ||
UchusNaDelhi7 (11.03.2012)
| ||
|
#25
|
||||
|
||||
|
Цитата:
А если говорить про строковые константы - тут несколько иначе. Экономия памяти байта в 4 (на фоне самой строки почти ничто), ускорение на 1 обращение к памяти: строка в делфи на деле есть указатель на строку, и получается, для обращения к обычной строке Код:
var s: string; ... Write(s); Хотя вполне возможно, что другие компиляторы делфи (напр. FreePascal) не особо умны и используют константы как обычные переменные. Вывод: если можно - лучше константы использовать. Медленнее точно не станет, а может даже чутка быстрее. Но и фанатично все пихать в константы особого смысла нет: прирост производительности не будет даже заметен. Если по коду с точки зрения читаемости логичнее сделать VAR, можно и оставить VAR. Последний раз редактировалось Bargest, 10.03.2012 в 21:28. |
| Эти 2 пользователя(ей) сказали Спасибо Bargest за это полезное сообщение: | ||
nixel (10.03.2012),
UchusNaDelhi7 (11.03.2012)
| ||
|
#26
|
|||
|
|||
|
спасибо за подробное разъяснение. Знал, что разница небольшая и исчисляется байтами и количеством обращений к памяти, но теперь буду знать подробно.
p.s. в данном примере, думаю, прирост в скорости будет ощутимый =) все таки обращений к строкам идет очень много. p.s.s. а вообще еще на первом курсе преподаватель по программированию вбил в голову, что байты надо экономить и при необходимости считать =) Последний раз редактировалось nixel, 10.03.2012 в 21:38. |
|
#27
|
||||
|
||||
|
Байты надо экономить и считать, да. Но без фанатизма.
![]() Я не так давно тоже страдал таким: мол экономия аж 4 байта, надо юзать. Но когда окинул взглядом объемы современной памяти, понял, что это ерунда. Через пару лет 8 миллиардов байт оперативки (8гб) будет уже нормой жизни. Заполнить это просто нереально на десктопных ПК. Я ради эксперимента пару раз смотрел, сколько у меня памяти занято. Мощная игра - 1.2 ГБ. 3Д редакторы - около 300 мб. Остальное меньше 100 мб. Если всё сложить - едва ли на 2 ГБ хватит. Свободным остается еще очень, очень много места. Порой можно пожертвовать и 16 байт на структуру ради выравнивания и скорости. По поводу прироста в конкретном случае - опять же, зависит от компилятора. На самом глупом компиляторе да, будет сильный прирост: 1 обращение * количество повторов = много. А вот с умным - не очень: первым же делом умный компилятор запишет адрес строки в регистр и будет дальше оперировать с ним, так что прирост будет всё в то же 1 обращение к памяти. ![]() ЗЫЖ если циклиться на объемах памяти, то нужно полностью отказываться от ООП и тем более разного рода скриптов, юзать только ПОП и по возможности исключать из процесса написания кода языки высокого уровня. Но прогресс не стоит на месте, и ради удобства и уменьшения времени, затраченного на разработку ПО, обычно жертвуют памятью и скоростью. Хотя разумеется, при написании специфических приложений стоит по-максимуму оптимизировать отдельные участки кода, которые критичны в конкретной программе (если таковые имеются). Последний раз редактировалось Bargest, 10.03.2012 в 22:10. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
UchusNaDelhi7 (11.03.2012)
| ||
|
#28
|
|||
|
|||
|
PHP код:
напр: a->b az->ba zz->aaa максимальная гибкость, вроде бы |
| Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
UchusNaDelhi7 (11.03.2012)
| ||
|
#29
|
|||
|
|||
|
Цитата:
PHP код:
|
|
#30
|
||||
|
||||
|
Вот не нравятся мне такие решения. А если надо 3 или 12 символов проверять? Весь код переписывать на 12 циклов? Может так интереснее будет?
Код:
Const
CharSet: String = 'abcdefghijklmnopqrstuvxwz';
procedure PassGen(Pass: String; Depth: Integer);
Var
i: Integer;
begin
for i := 1 to Length(CharSet)
do begin
Pass[Depth] := CharSet[i];
if Depth < Length(Pass)
then PassGen(Pass, Depth + 1)
else Memo1.Lines.Add(Pass);
end;
end;
begin
PassGen('123456', 1);
end;Ну а если нужен сложный пароль, то там вообще становится все грустно. Для пароля в 6 символов у вас уже будет 56,800,235,584 комбинций. Но если это не пугает, то вот вам код для сложного пароля: Код:
Const
CharSet1: String = 'abcdefghijklmnopqrstuvxwz';
CharSet2: String = 'ABCDEFGHIJKLMNOPQRSTUVXWZ';
CharSet3: String = '0123456789';
Var
CharSet: String;
procedure PassGen(Pass: String; Depth: Integer);
Var
i: Integer;
begin
for i := 1 to Length(CharSet)
do begin
Pass[Depth] := CharSet[i];
if Depth < Length(Pass)
then PassGen(Pass, Depth + 1)
else begin
Memo1.Lines.Add(Pass);
Application.ProcessMessages
end;
end;
end;
begin
CharSet := CharSet1 + CharSet2 + CharSet3;
PassGen('123456', 1);
end;Последний раз редактировалось Страдалецъ, 11.03.2012 в 13:09. |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
UchusNaDelhi7 (11.03.2012)
| ||