Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

Вопрос по написанному мной коду :)   Найти похожие ветки 

 
repus ©   (2008-01-16 09:09) [0]

Дело в том, что изучаю Delphi по самоучителю и всего несколько дней как начал, и меня некому поправить, если что. В общем, сделал небольшую прогу. В ней 2 поля ввода, в первом по умолчанию стоит 1, во второе вводиться произвольное число. И при нажатии на кнопку прога выдает случайное число от 1 до Числа, введеного во второе поле ввода. Но если в первое поле вместо 1 ввести 2 или другое число, то случайное число вычисляется 2 раза или больше, в зависимости от введеного в первое поле числа, а потом результат складывается. Допустим, если в первом поле - 1, а во втором 6, то результатом будет случайное число от 1 до 6. А если 2 и 6, то результатом будет сумма 2-х разных случайных чисел от 1 до 6, и т.д.
Но есть еще дополнения, если число в поле Edit1 равно 4, то одно самое маленькое значение выкидывается, и в результат выводится сумма только трех случайных чисел.
Код который я написал работает так, как надо :) Но мне хотелось бы узнать у более знающих людей, можно ли сделать это как-то по проще и красивее что-ли...? И нет ли там чего лишнего?

Код:
procedure TForm1.Button1Click(Sender:TObject);
 const
   size=4;
 var
   a:integer;
   b:integer;
   i:integer;
   m:integer;
   z:integer;
   u:array[1..size] of integer;
   min:integer; //минимальный элемент массива
   r:integer;
 begin
   a:=StrToInt(Edit1.Text);
   b:=StrToInt(Edit2.Text);
   z:=0;
   Label2.Caption:="";

   for i:=1 to a do
     begin
       m:=Random(b)+1;
       if i=1 then
           Label2.Caption:=IntToStr(m)
         else
           Label2.Caption:=Label2.Caption+"+"+IntToStr(m);
       z:=z+m;
       if a=4 then
           u[i]:=m;
   end;
   Label2.Caption:=Label2.Caption+"="+IntToStr(z)+#13;
   if a=4 then
     begin
       min:=1;
       for i:=2 to a do
         if u[i]<u[min] then
             min:=i;
       r:=u[min];
       z:=z-r;
       Label2.Caption:=Label2.Caption+"Минимальное значение - "+IntToStr(r)
         +#13+"3 из 4d"+IntToStr(b)+" = "+IntToStr(z);
   end;
end;


 
Kolan ©   (2008-01-16 09:19) [1]

> Но мне хотелось бы узнать у более знающих людей, можно ли
> сделать это как-то по проще и красивее что-ли&#133?

Начни со внятных имен для переменных.(используй CamelCase в названиях)

Отдели твой расчет от работы с полями и лэйблами, то есть в кнопке получай значения из полей ввода( a:=StrToInt(Edit1.Text); и т.д&#133), и выдели отдельную процедуру/функцию, которая ничего не будет знать не о какких полях, а значения передавай в кач параметров.

Пример маленький:

было:


 
Kolan ©   (2008-01-16 09:21) [2]

было:

procedure TForm1.Button1Click(Sender:TObject);
begin
  a:=StrToInt(Edit1.Text);
  &#133

  for i:=1 to a do
&#133


Сделай так:

procedure DoSmth(ACount: Integer);
begin
 for i:=1 to ACount
&#133
end;


procedure TForm1.Button1Click(Sender:TObject);
begin
  a:=StrToInt(Edit1.Text);
  &#133

   DoSmth(a)
&#133


Ну и так далее&#133


 
Sonia ©   (2008-01-16 09:51) [3]


>  a:integer;
>    b:integer;
>    i:integer;
>    m:integer;
>    z:integer;
>    u:array[1..size] of integer;
>    min:integer; //минимальный элемент массива
>    r:integer;

А я бы еще определение объединила. Типа того:

var
 a,b,i,m,z,min,r:integer;


 
Kolan ©   (2008-01-16 09:56) [4]

> А я бы еще определение объединила. Типа того:
>
> var
> a,b,i,m,z,min,r:integer;

:) LOL


 
MsGuns ©   (2008-01-16 10:06) [5]

Пример качественно оформленного кода можно посмотреть у Тексейры с Пачеко или в самой VCL


 
repus ©   (2008-01-16 10:10) [6]

спасибо большое, попробую так сделать.

А что такое Тексейра с Пачеко?


 
Kolan ©   (2008-01-16 10:11) [7]

> А что такое Тексейра с Пачеко?

Это авторы книжки Руководство разработчика, которую обязательно надо прочесть дл яработы с Delphi.

Брать тут:
http://www.ksoftware.ru/library.html


 
Palladin ©   (2008-01-16 10:11) [8]

Люди. Книжки пишут иногда.


 
repus ©   (2008-01-16 10:17) [9]

спасибо за книжку. Скачаю, почитаю.
а то тот самоучитель, что у меня, так плохо распознан, что иногда в новых примерах приходится долго сидеть и пытаться понять что там должно быть, вместо того, что написано :)


 
oldman ©   (2008-01-16 10:17) [10]


> Но если в первое поле вместо 1 ввести 2 или другое число,
>  то случайное число вычисляется 2 раза или больше


a:=StrToInt(Edit1.Text);
...
for i:=1 to a do
  begin
     m:=Random(b)+1;


какие еще вопросы?


 
Kolan ©   (2008-01-16 10:20) [11]

>
> какие еще вопросы?

Дык это он так и хотел что бы было, и сделал&#133


 
oldman ©   (2008-01-16 10:23) [12]

А зачем вместо random выдавать сумму random???
Не понимаю...


 
repus ©   (2008-01-16 10:26) [13]


> >
> > какие еще вопросы?
>
> Дык это он так и хотел что бы было, и сделал…


ага. Я просто спрашивал насчет упрощения кода :)


 
oldman ©   (2008-01-16 10:27) [14]

А зачем для поиска минимального использовать массив?
Запоминаем первый random в переменную.
Если следующий random меньше переменной, то присваиваем его этой переменной,
если нет, не присваиваем
:)))


 
oldman ©   (2008-01-16 10:29) [15]


> repus ©   (16.01.08 10:26) [13]


Вместо данных 2,4 можно использовать 1,8
То есть, первый Edit не нужен.
И с 4 какая-то фигня. На фиг это надо?

ЗЫ: Курсач пишешь или лабу?


 
repus ©   (2008-01-16 10:38) [16]


> oldman ©


Не, не курсач. Я просто сам решил поучить Delphi.
А это програмка. Если ты знаком с ролевыми играми, там используются кубики с различным количеством граней. Edit2 - это количество граней этого самого кубика, а Евше1 - это количество этих кубиков. Таких прог в инете много, но так как я только начал bexbnmcz? мне интересно было сделать самому :) А с 4 дело в том, что при создании в игре перса, кидаются 4 кости(вообще 6-гранных, но я просто не стал писать это), самая меньшая убирается, а остальные три суммируются.


 
Kolan ©   (2008-01-16 10:39) [17]

> [16] repus ©   (16.01.08 10:38)

Весьма похвально. Сделай то, что тебе советывали, выкладывай сюда&#133


 
repus ©   (2008-01-16 10:42) [18]

ок.

з.ы.
Че-то с ссылкой на книгу проблемы :(
Два раза скачивал, оба раза при открытии говорит, что файл поврежден((


 
Kolan ©   (2008-01-16 10:50) [19]

> Два раза скачивал, оба раза при открытии говорит, что файл
> поврежден((

Странно. Какую качал? Может проблемы с нетом и не дкачал, какой размер скаченного?
Возьми тут:
http://www.podgoretsky.com/ddp.html


 
repus ©   (2008-01-16 11:10) [20]

Delphi 6 качал. Там она написан 7.11 мб, у меня так и весит. А вот по новой ссылке она весит почти 9 метров. Скачаю оттуда.


 
Kolan ©   (2008-01-16 11:12) [21]

Ок проверю&#133


 
pavel_guzhanov ©   (2008-01-16 11:28) [22]


> Delphi 6 качал

Скачай еще и по Delphi5 этих же авторов. Очень рекомендую. Книга есть по той же ссылке.


 
Kolan ©   (2008-01-16 11:42) [23]

Да, благодарю, перезалил&#133


 
repus ©   (2008-01-16 14:25) [24]


> pavel_guzhanov ©   (16.01.08 11:28) [22]
>
> > Delphi 6 качал
>
> Скачай еще и по Delphi5 этих же авторов. Очень рекомендую.
>  Книга есть по той же ссылке.


ок. Как-нибудь скачаю, спасибо. Сейчас просто траффика мало осталось((

Вот что у меня получилось из предыдущей проги))

procedure Dice(a,b:integer;var s:string);
 var
   i,m,min,z,k:integer;
 begin
   z:=0;
   for i:=1 to a do
     begin
       m:=Random(b)+1;
       if i=1 then
           s:=IntToStr(m)
         else
           s:=s+"+"+IntToStr(m);
       z:=z+m;
   end;

   s:=s+"="+IntToStr(z)+#13;
   if a=4 then
     begin
       min:=m;
         for k:=2 to a do
             if min>m then
                 min:=m;
       z:=z-min;
       s:=s+"Минимальное значение - "+IntToStr(min)
        +#13+"3 из 4d"+IntToStr(b)+" = "+IntToStr(z);
   end;
end;

procedure TForm1.Button1Click(Sender:TObject);
 var
   a,b:integer;
   s:string;
 begin
   a:=StrToInt(Edit1.Text);
   b:=StrToInt(Edit2.Text);
   Dice(a,b,s);
   Label2.Caption:="";

   Label2.Caption:=s;
end;


Поправьте, если что где не так сделал. ))


 
repus ©   (2008-01-16 14:28) [25]

упс(( обнаружил ошибку((


 
Kolan ©   (2008-01-16 14:33) [26]

> Поправьте, если что где не так сделал. ))

Уже чуть лучьше. Теперь твою процедуру Dice можно использовать и в других программа, так как она не зависит от контролов(Edit"ов, Label"ов).

Но лучьше <> достаточно.

вот представь я даю тебе процедуру:
ProcessWord(d,nr: Integer; L: string);
И прошу использовать её.

Первое что ты спросишь, а что такое d, nr и L.

Так и любой другой человек глядя на твою
Dice(a,b:integer;var s:string);
спросит что такое a,b и s

Чтобы такого вопоса не возникало надо назвать их внятно.

Исправляй&#133


 
repus ©   (2008-01-16 15:57) [27]

Исправил))
Еще исправил ошибку в поиске минимального значения. Я for не там записал


> for i:=1 to a do
>      begin
>        m:=Random(b)+1;
>        if i=1 then
>            s:=IntToStr(m)
>          else
>            s:=s+"+"+IntToStr(m);
>        z:=z+m;
>    end;
>
>    s:=s+"="+IntToStr(z)+#13;
>    if a=4 then
>      begin
>        min:=m;
>          for k:=2 to a do
>              if min>m then
>                  min:=m;


Теперь вот:

procedure Dice(num_dice,dice_side:integer;var res:string);
 var
   i,m,min,z,k:integer;
 begin
   z:=0;
   for i:=1 to num_dice do
     begin
       m:=Random(dice_side)+1;
       for k:=2 to num_dice do
           if min>m then
               min:=m;
       if i=1 then
           res:=IntToStr(m)
         else
           res:=res+"+"+IntToStr(m);
       z:=z+m;
   end;

   res:=res+"="+IntToStr(z)+#13;
   if num_dice=4 then
     begin
       z:=z-min;
       res:=res+"Минимальное значение - "+IntToStr(min)
        +#13+"3 из 4d"+IntToStr(dice_side)+" = "+IntToStr(z);

   end;
end;

procedure TForm1.Button1Click(Sender:TObject);
 var
   num_dice,dice_side:integer;
   res:string;
 begin
   num_dice:=StrToInt(Edit1.Text);
   dice_side:=StrToInt(Edit2.Text);
   Dice(num_dice,dice_side,res);
   Label2.Caption:="";

   Label2.Caption:=res;
end;


 
Kolan ©   (2008-01-16 16:03) [28]

Не, во-первых названия недостаточно понятны, во-вторых сти ль написания не приятый в Delphi

Примерно так:
procedure Dice(DiceNumber, DiceSide: Integer; var Res: String);

что имелось ввиду под Res я не понял.

Ну а тут:
var
  i,m,min,z,k:integer;


Порядок навести? Стиль написание исправь. + I и K  оставь &#151; это нормально, а что такое Z и M ?


 
repus ©   (2008-01-16 16:07) [29]

ок. Завтра исправлю. Сегодня уже домой пора.
Стиль написания учту.
Просто не привык еще))


 
Kolan ©   (2008-01-16 16:09) [30]

Учти еще выравнивание:
Не


  for i:=1 to num_dice do
    begin
      m:=Random(dice_side)+1;
      for k:=2 to num_dice do
          if min>m then
              min:=m;
      if i=1 then
          res:=IntToStr(m)
        else
          res:=res+"+"+IntToStr(m);
      z:=z+m;
  end;


А:

 
  for i:=1 to num_dice do
  begin
    m:=Random(dice_side)+1;
    for k:=2 to num_dice do
      if min>m then
        min:=m;
    if i=1 then
      res:=IntToStr(m)
    else
      res:=res+"+"+IntToStr(m);
    z:=z+m;
  end;


 
ketmar ©   (2008-01-16 19:03) [31]

>[28] Kolan©(16.01.08 16:03)
я бы ещё посоветовал имена переменных начинать с маленькой буквы, а процедур/функций — с большой. но это уже вкусовщина.


 
ketmar ©   (2008-01-16 19:06) [32]

2Kolan: что за дискриминация? почему книги на нормальном языке в уродской chm?! /me обиделсо.


 
Kolan ©   (2008-01-16 19:09) [33]

> посоветовал имена переменных начинать с маленькой буквы

ненадо :)


> на нормальном языке в уродской chm

Ты про Refactoring? Да ниче кстати сделана chm"ка &#151; удобно пользоваться&#133


 
ketmar ©   (2008-01-16 19:17) [34]

>[33] Kolan©(16.01.08 19:09)
>>посоветовал имена переменных начинать с маленькой буквы
>ненадо :)

с чего бы? визуально читать удобней намного, чем когда всё с большой. я не даю советов, которые личной кровью не проверял. %-)

>Ты про Refactoring?
и не только. паттерны тоже.

>Да ниче кстати сделана chm"ка — удобно пользоваться…
неудобно. chm никогда неудобно пользоваться. плюс — это проприетарный формат, для которого надо проприетарный IE. так что всё равно в итоге приходится разбирать его на части, чтобы читать Оперой. ну нафига такой геморрой, если pdf удобней? а чистый html вообще удобней всех.


 
Kolan ©   (2008-01-16 19:22) [35]

> с чего бы?

Венгерская нотация позволяется только в именах перечислимых типов. ©
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=802

:)


 
ketmar ©   (2008-01-16 19:51) [36]

>[35] Kolan©(16.01.08 19:22)
>>с чего бы?
>Венгерская нотация позволяется только в именах перечислимых типов. ©

а) если ты читал Джоэля, то знаешь ведь разницу между «венгерской нотацией» и «системной венгерской нотацией»? если не знаешь и читаешь быдлосоветы тех, кто не знает — ты ССЗБ;
б) ГДЕ я писал про венгерскую нотацию вообще? O_o


 
ketmar ©   (2008-01-16 19:52) [37]

>[35] Kolan©(16.01.08 19:22)
кстати, никогда не считал эти рекомендации удобными во всём.


 
Игорь Шевченко ©   (2008-01-17 10:08) [38]

Kolan ©   (16.01.08 19:22) [35]

Не надо стараться быть правовернее Аллаха.

Никакая нотация, никакое оформление имен переменных, никакие паттерны и прочие умствования яйцеголовых не поможет плохо написанному неструктурированному коду.


 
Kolan ©   (2008-01-17 11:36) [39]

> если ты читал Джоэля, то знаешь ведь разницу между

Читал но не знаю :(


> Никакая нотация, никакое оформление имен переменных, никакие
> паттерны и прочие умствования яйцеголовых не поможет плохо
> написанному неструктурированному коду.

Я не спорю, просто не оч., имхо правильно учить именовать переменные а-ля iCount, dValue итд&#133
Или

> посоветовал имена переменных начинать с маленькой буквы

value, i, j, simpleText

Это непее распространено чем, CamelCase(или как там его)&#133


 
Игорь Шевченко ©   (2008-01-17 12:03) [40]

Kolan ©   (17.01.08 11:36) [39]

Да пофиг, как начинать имена переменных. Главное, чтобы каждая переменная была на своем очевидном месте.


> не оч., имхо правильно учить именовать переменные а-ля iCount,
>  dValue итд…


именовать переменные Count или Value, равно как и count и value не менее "не оч. правильно" - я все к этому веду. А как именовать - это уже сугубо от места именования, то есть, от задачи, зависит.



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.023 c
15-1199731014
Lip
2008-01-07 21:36
2008.02.10
Помогите нарисовать линию на канве


3-1190981424
Tonich
2007-09-28 16:10
2008.02.10
Коннект к базе несколькими приложениями одновременно


1-1194184086
Zakir
2007-11-04 16:48
2008.02.10
Передача данных с помощью сообщений windows


15-1199647800
Sergey Masloff
2008-01-06 22:30
2008.02.10
Рождественская история (ресальная)


15-1199378064
БарЛог
2008-01-03 19:34
2008.02.10
Помогите вспомнить фильм