Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.071 c
10-1138801820
Вопрошающий
2006-02-01 16:50
2008.02.10
Не работает удалённо клиент


15-1200051125
@!!ex
2008-01-11 14:32
2008.02.10
Переключением между ОС


15-1200156462
Dmitry S
2008-01-12 19:47
2008.02.10
вопрос про prototype и js


2-1200246721
Steep
2008-01-13 20:52
2008.02.10
Ошибка "I/O error 104"


2-1200834547
Inslave
2008-01-20 16:09
2008.02.10
Округление





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский