|
#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. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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 обращение к памяти. ЗЫЖ если циклиться на объемах памяти, то нужно полностью отказываться от ООП и тем более разного рода скриптов, юзать только ПОП и по возможности исключать из процесса написания кода языки высокого уровня. Но прогресс не стоит на месте, и ради удобства и уменьшения времени, затраченного на разработку ПО, обычно жертвуют памятью и скоростью. Хотя разумеется, при написании специфических приложений стоит по-максимуму оптимизировать отдельные участки кода, которые критичны в конкретной программе (если таковые имеются). jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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)
|