![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по написанному мной коду :) [D7, XP]
repus © (2008-01-16 09:09:00)Дело в том, что изучаю 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 16:03:00) [81]Не, во-первых названия недостаточно понятны, во-вторых сти ль написания не приятый в Delphi
Примерно так:
procedure Dice(DiceNumber, DiceSide: Integer; var Res: String);
что имелось ввиду под Res я не понял.
Ну а тут:
var
i,m,min,z,k:integer;
Порядок навести? Стиль написание исправь. + I и K оставь это нормально, а что такое Z и M ?
repus (2008-01-16 15:57:00) [82]Исправил))
Еще исправил ошибку в поиске минимального значения. Я 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 14:33:00) [83]> Поправьте, если что где не так сделал. ))
Уже чуть лучьше. Теперь твою процедуру Dice можно использовать и в других программа, так как она не зависит от контролов(Edit'ов, Label'ов).
Но лучьше достаточно.
вот представь я даю тебе процедуру:
ProcessWord(d,nr: Integer; L: string);
И прошу использовать её.
Первое что ты спросишь, а что такое d, nr и L.
Так и любой другой человек глядя на твою
Dice(a,b:integer;var s:string);
спросит что такое a,b и s
Чтобы такого вопоса не возникало надо назвать их внятно.
Исправляй
repus (2008-01-16 14:28:00) [84]упс(( обнаружил ошибку((
repus (2008-01-16 14:25:00) [85]
> 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;
Поправьте, если что где не так сделал. ))
Kolan (2008-01-16 11:42:00) [86]Да, благодарю, перезалил
pavel_guzhanov (2008-01-16 11:28:00) [87]
> Delphi 6 качал
Скачай еще и по Delphi5 этих же авторов. Очень рекомендую. Книга есть по той же ссылке.
Kolan (2008-01-16 11:12:00) [88]Ок проверю
repus (2008-01-16 11:10:00) [89]Delphi 6 качал. Там она написан 7.11 мб, у меня так и весит. А вот по новой ссылке она весит почти 9 метров. Скачаю оттуда.
Kolan (2008-01-16 10:50:00) [90]> Два раза скачивал, оба раза при открытии говорит, что файл
> поврежден((
Странно. Какую качал? Может проблемы с нетом и не дкачал, какой размер скаченного?
Возьми тут:
http://www.podgoretsky.com/ddp.html
repus (2008-01-16 10:42:00) [91]ок.
з.ы.
Че-то с ссылкой на книгу проблемы :(
Два раза скачивал, оба раза при открытии говорит, что файл поврежден((
Kolan (2008-01-16 10:39:00) [92]> [16] repus © (16.01.08 10:38)
Весьма похвально. Сделай то, что тебе советывали, выкладывай сюда
repus (2008-01-16 10:38:00) [93]
> oldman ©
Не, не курсач. Я просто сам решил поучить Delphi.
А это програмка. Если ты знаком с ролевыми играми, там используются кубики с различным количеством граней. Edit2 - это количество граней этого самого кубика, а Евше1 - это количество этих кубиков. Таких прог в инете много, но так как я только начал bexbnmcz? мне интересно было сделать самому :) А с 4 дело в том, что при создании в игре перса, кидаются 4 кости(вообще 6-гранных, но я просто не стал писать это), самая меньшая убирается, а остальные три суммируются.
oldman (2008-01-16 10:29:00) [94]
> repus © (16.01.08 10:26) [13]
Вместо данных 2,4 можно использовать 1,8
То есть, первый Edit не нужен.
И с 4 какая-то фигня. На фиг это надо?
ЗЫ: Курсач пишешь или лабу?
oldman (2008-01-16 10:27:00) [95]А зачем для поиска минимального использовать массив?
Запоминаем первый random в переменную.
Если следующий random меньше переменной, то присваиваем его этой переменной,
если нет, не присваиваем
:)))
repus (2008-01-16 10:26:00) [96]
> >
> > какие еще вопросы?
>
> Дык это он так и хотел что бы было, и сделал…
ага. Я просто спрашивал насчет упрощения кода :)
oldman (2008-01-16 10:23:00) [97]А зачем вместо random выдавать сумму random???
Не понимаю...
Kolan (2008-01-16 10:20:00) [98]>
> какие еще вопросы?
Дык это он так и хотел что бы было, и сделал
repus (2008-01-16 10:17:00) [99]спасибо за книжку. Скачаю, почитаю.
а то тот самоучитель, что у меня, так плохо распознан, что иногда в новых примерах приходится долго сидеть и пытаться понять что там должно быть, вместо того, что написано :)
oldman (2008-01-16 10:17:00) [100]
> Но если в первое поле вместо 1 ввести 2 или другое число,
> то случайное число вычисляется 2 раза или больше
a:=StrToInt(Edit1.Text);
...
for i:=1 to a do
begin
m:=Random(b)+1;
какие еще вопросы?