Хорошего человека должно быть много.
Коварное заблуждение
Поставим перед собой более серьёзную задачу, чем на предыдущем семинаре: поможем себе и своим близким приблизиться к идеалу. Пока только в смысле веса.
Некоторые, так называемые, специалисты считают, что здоровый человек должен иметь идеальный вес, который можно определить по формуле
P= (3 xA- 450 + B) x 0,25 + 45 - для мужчин, P= (3 xA - 450 + B) x 0,225 + 40,4 - для женщин,
где под загадочными буквами А и В скрываются рост (в сантиметрах) и возраст (в годах).
Попробуем согласиться с ними и напишем чрезвычайно полезную для дома и семьи программу, которая позволит вам и всем окружающим оценить свои материальные (опять же только в смысле веса) достоинства.
Какой же должна быть программа, основанная на этих незамысловатых формулах? Ясно, что главную роль в ней должна играть функция, вычисляющая идеальный вес по заданным параметрам - полу «подопытного индивидуума», его возрасту и росту. С написанием функции проблем не будет, ведь достаточно перевести на «дельфийский» язык обычные математические выражения. Чтобы функция «знала» исходные величины, введём переменные, в которых будем хранить текущие значения возраста и роста.
Нам нужно позаботиться о том, чтобы пользователь мог быстро и удобно передавать в программу необходимые величины. Так как пол может быть либо мужской, либо женский, то логично поставить два переключателя: нажмёшь один - выключится другой, и наоборот. И в программе нетрудно будет узнать, какой переключатель включен в настоящий момент.
Возраст и рост могут принимать большое количество последовательных целых значений. Их можно вводить по-разному. Выберем наиболее удобный способ. Поставим два скроллера (он же ползунок, он же полоса прокрутки), которые обычно используются для прокручивания окон. Перемещая движок, мы сможем установить нужное значение, которое будем
выводить на экран с помощью хорошо нам уже известного компонента - метки.
Вот, пожалуй, и вся премудрость. Осталось только воплотить мечту в реальность.
Откроем новый проект.
В заголовке формы напишем Вес, то есть свойству Captionприсвоим значение 'Вес'.
Из свойств Borderlconsмы оставим только biSystemMenuи biMinimize, а для BorderStyleвыберем bsSingle, чтобы размеры формы нельзя было изменять в работающей программе.
Для выбора пола «клиента» установим компонент RadioGroupсо страницы StandardПалитры компонентов (щёлкните дважды на значке TGroupBox)
Он позволяет очень быстро сформировать набор переключа- TGroupBox
телей. В его рамке выведем соответствующую надпись жирным шрифтом (Caption= ' Пол ', Font.Style= [fsBold]),
установим форму курсора в виде руки (Cursor= crHandPoint) - прозрачный намёк на то, что здесь нужно приложить руки. Дважды щёлкните на окошке свойства Itemsи в раскрывшемся редакторе StringListEditorнаберите две строки:
Нажмите кнопку ОК - и у компонента появятся два переключателя с этими надписями. Свойство Itemlndexпоказывает, какой из переключателей выбран (первоначально его значение равно 0 - по умолчанию пол предполагается мужской; суфражистки, феминистки и подкаблучники могут изменить последовательность строк или установить ItemIndex=1).
Чтобы придать интерфейсу элегантный вид, установим на форму компонент TPaneL, а уже на нём разместим два скроллера TScrollBar
Первый (Name= sbAge) будет отвечать за возраст, второй (Name= sbRost) - за рост. Выберем по изложенным выше причинам для обоих ползунков курсор в виде руки (Cursor= crHandPoint). Дополнительно сделаем подсказки (Hint= 'Возраст' и Hint= 'Рост', ShowHint= True). Будем считать, что возраст изменяется в пределах от 0 до 100 (Min= 0, Max= 100, значение по умолчанию Position= 20), а рост от 60 до 220 (Min= 60, Max= 220, значение по умолчанию Position= 160).
Справа от скроллеров разместим две метки (lblAgeи lblRost), в которые будем выводить текущие значения возраста и веса. Шрифт установим покрупнее (Font.Height= -16), потолще (Font.Style= [fsBold]) и поярче (Font.Color= clRed). В каждой метке напишем значения по умолчанию (Caption= '20' и Caption= '160'). Чтобы числа всегда были расположены строго друг под другом, установите Alignment= taRightJustifyи AutoSize= False. Осталось справа от них поместить две метки, поясняющие назначение скроллеров. Забегая немного вперёд, мы должны увидеть такую картину
Осталось самое «главное» - установить на форме пару меток для вывода вычисленного значения идеального веса:
Метка lblVes: Caption = '52', Font.Color = clRed, Font.Height = -32, Font.Style= [fsBold] Метка Label2: Caption = 'Идеальный вес =', Font.Height = -19, Font.Style =[fsBold].
С визуальной частью интерфейса мы справились неплохо, можно браться за функциональную.
Как мы уже выяснили, нам потребуются две переменные для хранения введённых значений возраста и веса. Объявим их сразу перед разделом implementation:
var Form1: TForm1; age, rost: integer; Рядышком объявим функцию, которая по «учёным» формулам будет вычислять вес: private { Private declarations } function Ves: single; Что до самой формулы, то исключительно вручную наберите её код: //ВЫЧИСЛИТЬ ИДЕАЛЬНЫЙ ВЕС function TForm1.Ves: single; begin if RadioGroup1.ItemIndex= 0 then //мужской пол Result:= (rost*3 - 450 + age) * 0.25 + 45 else //женский пол Result:= (rost*3 - 450 + age) * 0.225 + 40.4; //скорректировать отрицательные значения: if Result< 0 then Result:= 4; end;
Действует-злодействует (сказочное выражение) она так. По номеру нажатого переключателя (отсчёт начинается с нуля!) определяется пол «персонажа», в соответствии с которым выбирается одна из двух формул. Последняя строчка заменяет отрицательное значение на более осмысленное. Это вызвано тем, что данные формулы не универсальны, то есть действительны только для разумных сочетаний параметров, поэтому идеальный вес Кощея Бессмертного или дядьки Черномора по ней вычислять нельзя.
Мы поступим правильно, если при запуске программы сразу же выведем значение веса по установкам скроллеров (в Инспекторе объектов перейдите на страницу Eventsи дважды щёлкните на окошечке события OnCreate, а затем в заготовке процедуры обработки напишите следующие строки):
//СОЗДАТЬ ФОРМУ procedure TForm1.FormCreate(Sender: TObject); begin //снять значения со скроллеров: age:= sbAge.Position; Rost:= sbRost.Position; //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end;
Конечно, можно сразу же во всех метках вывести согласованные значения, но если вы потом измените одно из них, то либо придётся исправлять и вес, либо при запуске программы вес не будет соответствовать положениям движков. Ничего страшного в этом нет - вряд ли вы угадаете возраст и рост пользователя, он всё равно будет двигать ползунки, - но лучше приучить себя всё доводить до ума.
Запустив эту программу, «клиент» будет вводить свои данные, то есть пол, возраст и вес. Чтобы не заставлять его нажимать после этого кнопку для вычисления веса, будем «публиковать» его сразу после каждого изменения параметров. Например, пользователь сменил пол (к счастью, только в программе), и тут же выводится новое значение веса:
//ВЫБРАТЬ ПОЛ procedure TForm1.RadioGroup1Click(Sender: TObject); begin //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end; Аналогично поступаем и при изменении положения ползунка скроллера: //ЗАДАТЬ ВОЗРАСТ procedure TForm1.sbAgeChange(Sender: TObject); begin //возраст: age:= sbAge.Position; //вывести значение на экран: lblAge.Caption:= inttostr(age); //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end; //ЗАДАТЬ РОСТ procedure TForm1.sbRostChange(Sender: TObject); begin //рост: Rost:= sbRost.Position; //вывести значение на экран: lblRost.Caption:= inttostr(Rost); //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end;
Значения возраста и роста определяем по положению ползунка (свойство Positionкомпонента ScrollBar), вычисляем вес, округляем его до целого числа (формулы, естественно, не настолько точны, чтобы рассчитывать ещё и граммы), которое преобразуем в строку и выводим на экран.
Перед тем как предлагать эту программу другим людям, очень полезно испытать её на себе. Запустите программу, подвигайте ползунки, оцените все достоинства и недостатки интерфейса:
Последний штрих
Вы можете продолжить свои исследования рода человеческого с помощью компьютера. Немного подправив нашу программу Вес, вы легко определите жирность тела любого гражданина (или гражданки).
Дотошная наука выяснила, что тело молодых здоровых мужчин содержит около 15%, а тело женщин - 22% жира. Жирность произвольно выбранного тела приблизительно оценивается по формуле:
Ж = (Вес - Р) : Вес х 100 + 15 - для мужчин,
Ж = (Вес - Р) : Вес х 100 + 22 - для женщин,
где Р - идеальный вес, который определяется по предыдущим формулам.
Не будем целиком переписывать всю программу Вес, а адаптируем её к «новым реалиям». Для этого создадим новую папку Zhir, в которую перепишем файлы формы и программы (Главное меню File> Saveas..., затем File> SaveProjectas.). В файле модуля формы добавим ещё одну переменную - для хранения веса тела:
var Form1: TForm1; age, rost, ves: integer;
Также нужно исправить название функции - теперь мы будем вычислять не вес тела, а его жирность:
private { Private declarations } function Zhir: single;
Основательно поработаем и над самой функцией:
//ВЫЧИСЛИТЬ ЖИРНОСТЬ ТЕЛА function TForm1.Zhir: single; var v: single; begin if RadioGroup1.ItemIndex= 0 then begin //мужской пол v:= (rost*3 - 450 + age) *0.25 + 4 5; Result:= (ves - v) / ves *100+ 15 end else begin //женский пол v:= (rost*3 - 450 + age)*0.225+ 4 0.4; Result:= (ves - v) / ves*100 +22 end; //скорректировать значения if Result< 0 then Result:=0; if Result> 100 then Result=100; end;
Сначала, как и раньше, мы находим идеальный вес тела, а затем его жирность. Так как она вычисляется в процентах, то следует выправить курьёзные значения.
На форму «придётся» добавить ещё один скроллер - для ввода истинного веса тела:
Name = sbVes Cursor = crHandPoint Hint = ’Вес’ Max = 200 Min = 3 Position = 60 ShowHint = True и метку: Name = lblVes Alignment = taRightJustify AutoSize = False Caption = ’100’ Font.Color = clRed Font.Height = -16 Font.Style = [fsBold]
Остальные изменения внесите сами, поглядывая на картинку:
Не забудьте прежнюю метку IblVesпереименовать в lblZhir. Осталось подправить код модуля (выделенные строки):
//СОЗДАТЬ ФОРМУ procedure TForm1.FormCreate(Sender: TObject); begin //снять значения со скроллеров: age:= sbAge.Position; Rost:= sbRost.Position; Ves:= sbVes.Position; //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ВЫБРАТЬ ПОЛ procedure TForm1.RadioGroup1Click(Sender: TObject); begin //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ЗАДАТЬ ВОЗРАСТ procedure TForm1.sbAgeChange(Sender: TObject); begin //возраст: age:= sbAge.Position; //вывести значение на экран: lblAge.Caption:= inttostr(age); //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ЗАДАТЬ РОСТ procedure TForm1.sbRostChange(Sender: TObject); begin //рост: Rost:= sbRost.Position; //вывести значение на экран: lblRost.Caption:= inttostr(Rost); //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ЗАДАТЬ BEC procedure TForm1.sbVesChange(Sender: TObject); begin //вес: ves:= sbVes.Position; //вывести значение на экран: lblVes.Caption:= inttostr(Ves); //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end;
Протестируйте программу на ком только сможете. Наверное, это доставит и вам, и всем испытуемым массу удовольствия и запомнится на всю жизнь.
Если для вас это настоящая докука - из элементарных формул делать не очень простые программы, то дельфопланеризм - не ваша стихия, постарайтесь найти себя в других областях нескучных развлечений.
Но если Вы чувствуете, что это самое то что вам нужно, то Вы можете освоить в совершенстве язык программирования Delphi прямо сейчас вот тут.