Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 10.03.2012, 18:21
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
PHP код:
const ABCstring 'abcdefghijklmnopqrstuvwxyz'
остальной код тоже можно сократить, но за счёт скорости выполнения

А можно на счет скорости выполнения по подробней ?
Ответить с цитированием
  #17  
Старый 10.03.2012, 18:28
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
PHP код:
const ABCstring 'abcdefghijklmnopqrstuvwxyz'

Это вместо массива использовать ? Если можно объясните принцип с const .
Ответить с цитированием
  #18  
Старый 10.03.2012, 19:41
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от UchusNaDelhi7
Это вместо массива использовать ? Если можно объясните принцип с const .
да, вместо массива. обращение такое же, как и в массиве - ABC[n], где n>1. ABC[0] = длине этой строки и к нему лучше напрямую не обращаться и туда не писать.
const - это раздел программы (по аналогии с type или var) - в нем ты указываешь, что данная переменная является константой и в программе значение этой переменной меняться не будет (тебе и компилятор не позволит это сделать). выигрыш - в использовании памяти. возможно еще и в скорости обработки, но тут я не уверен.

Последний раз редактировалось nixel, 10.03.2012 в 19:44.
Ответить с цитированием
Этот пользователь сказал Спасибо nixel за это полезное сообщение:
UchusNaDelhi7 (10.03.2012)
  #19  
Старый 10.03.2012, 19:50
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

по поводу сокращения кода

Код:
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  
Старый 10.03.2012, 20:44
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от nixel
да, вместо массива. обращение такое же, как и в массиве - ABC[n], где n>1. ABC[0] = длине этой строки и к нему лучше напрямую не обращаться и туда не писать.
const - это раздел программы (по аналогии с type или var) - в нем ты указываешь, что данная переменная является константой и в программе значение этой переменной меняться не будет (тебе и компилятор не позволит это сделать). выигрыш - в использовании памяти. возможно еще и в скорости обработки, но тут я не уверен.

Все ясно . Спасибо !
Ответить с цитированием
  #21  
Старый 10.03.2012, 20:47
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от nixel
по поводу сокращения кода

Код:
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. это я к написанному выше о нулевом элементе.

Код намного меньше и красивей будет , сейчас переделаю . Заодно с константой познакомлюсь , никогда не работал с ними . Спасибо !
Ответить с цитированием
  #22  
Старый 10.03.2012, 21:12
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Программу переписал с вашей помощью : с 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  
Старый 10.03.2012, 21:17
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Все правильно.
Ответить с цитированием
Этот пользователь сказал Спасибо m1sclick за это полезное сообщение:
UchusNaDelhi7 (10.03.2012)
  #24  
Старый 10.03.2012, 21:19
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

если массив объявлен в поле const - то его элементы менять нельзя.
string - это, по сути, массив символов char. в данном случае ты объявляешь содержимое этого массива в поле const.

если массив/строку объявить в поле var, то можно менять и его содержимое и размер.
Ответить с цитированием
Этот пользователь сказал Спасибо nixel за это полезное сообщение:
UchusNaDelhi7 (11.03.2012)
  #25  
Старый 10.03.2012, 21:22
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от nixel
выигрыш - в использовании памяти. возможно еще и в скорости обработки, но тут я не уверен.
Если говорить о константах числовых - то всё зависит от компилятора. Умный подставит значение везде, где она юзается, и выигрыш будет в одно обращение к памяти и в 4 байта (для integer) в памяти. А не очень умный создаст переменную, и выигрыша не будет вообще (например, так делают многие компиляторы Си; делфовский у меня только один, он подставляет числовые константы в код сразу).
А если говорить про строковые константы - тут несколько иначе. Экономия памяти байта в 4 (на фоне самой строки почти ничто), ускорение на 1 обращение к памяти: строка в делфи на деле есть указатель на строку, и получается, для обращения к обычной строке
Код:
var s: string;
...
Write(s);
будет сначала (1) браться значение из переменной s (являющееся адресом строки), потом (2) значение по этому адресу (сама строка). Для константных строк делфа пропускает первый шаг, т.е. везде сразу используется адрес строки.
Хотя вполне возможно, что другие компиляторы делфи (напр. 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  
Старый 10.03.2012, 21:31
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

спасибо за подробное разъяснение. Знал, что разница небольшая и исчисляется байтами и количеством обращений к памяти, но теперь буду знать подробно.

p.s. в данном примере, думаю, прирост в скорости будет ощутимый =) все таки обращений к строкам идет очень много.

p.s.s. а вообще еще на первом курсе преподаватель по программированию вбил в голову, что байты надо экономить и при необходимости считать =)

Последний раз редактировалось nixel, 10.03.2012 в 21:38.
Ответить с цитированием
  #27  
Старый 10.03.2012, 21:48
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Байты надо экономить и считать, да. Но без фанатизма.
Я не так давно тоже страдал таким: мол экономия аж 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  
Старый 11.03.2012, 09:15
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

PHP код:
//const ABC: string = 'abcdefghijklmnopqrstuvwxyz';
const first 'a';
const 
last 'z';
function 
next(cchar): char;
begin
  result 
:= char(byte(c)+1);
end;

function 
GetNext(sstring): string;
var 
ijinteger;
begin
  result 
:= s;
  for 
:= length(resultdownto 1 do
    if 
result[i] <> last then begin
      result
[i] := next(result[i]);
      for 
:= i+1 to length(result) do result[j] := first;
      exit;
    
end;
  
SetLength(resultlength(result) + 1);
  for 
:= 1 to length(result) do result[i] := first;
end
вот функция, из одной строки делает следующую
напр: a->b az->ba zz->aaa
максимальная гибкость, вроде бы
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
UchusNaDelhi7 (11.03.2012)
  #29  
Старый 11.03.2012, 09:20
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от Pyro
PHP код:
function next(cchar): char
begin 
  result 
:= char(byte(c)+1); 
end
Разве не
PHP код:
result := char(ord(c)+1); 
?
Ответить с цитированием
  #30  
Старый 11.03.2012, 12:44
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вот не нравятся мне такие решения. А если надо 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 символов это будет 308,915,776 комбинаций. Не упаритесь ждать?
Ну а если нужен сложный пароль, то там вообще становится все грустно. Для пароля в 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)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter