Раніше було розглянуто розв’язання прикладу, в якому компоненти Label і Editвикористовувалися для введення однієї змінної. Якщо в задачі виникає потреба введення багатьох значень змінних і для кожної з них призначаються окремі компоненти, то вікно форми виявиться перевантаженим і менш зручним у застосуванні.
Цього можна уникнути, багаторазово використовуючи одне вікно введення з відповідною підказкою для різних змінних.
Приклад 12.2. Необхідно обчислити значення функції z при різних значеннях а і b, якщо х є [1; 4], h, = 0,5, у є [4; 12], hy = 2
Алгоритм процесу розгалуження та програмну реалізацію схожого за умовою завдання наведено у прикладі 5.2, а також у прикладі 1.2 (частина І).
Цю задачу можна розв’язати шляхом призначення окремого поля введення для а і для b,тобто розміщення на формі двох компонентів Edit1 і Edit2. Відповідні підказки призначення цих компонентів здійснено за допомогою компонентів Label1 і Label2. КомпонентLabel3 використаний для виведення повідомлення «РЕЗУЛЬТАТ», а компонент Label4реалізує виведення результату обчислень.
Вікно форми, програмний код та результат розв’язання мають вигляд:
[thumb]http://cpp.dp.ua/uploads/posts/2016-01/1453339473_12_1_6.png[/thumb]
Методика створення вікна форми, складання програми, запису додатка на диск і розв’язання задачі аналогічна до розглянутої у прикладі 12.1 цього розділу. З метою перегляду всіх одержаних значень параметра z у програмному коді використана функція виведення ShowMessage(), яка здійснює виведення повідомлення користувачу «далее»(due. розділ 13).
Після запуску додатка на виконання в активному вікні форми, що з’явиться, треба спочатку помістити курсор у вікно введення Edit1 і набрати значення змінної а, потім змістити курсор у вікно Edit2 і ввести значення змінної b, після чого натиснути кнопку«Вычислить». У вікні висновку Label4 з’явиться результат розв’язання задачі. Для закінчення роботи з додатком треба натиснути кнопку «Конец работы».
У цій програмі для переведення дійсних значень змінних х, у і z у їхнє рядкове подання використовується безформатна функція FloatToStr(), тому виведений результат представлений «довгими» числами. Для його форматування можна було б записати функцію FloatToStrF() з зазначенням форматного коду, як це було зроблено в прикладі12.1.
Розв’язок був отриманий для значень змінних а = 5 і b = 9. Це видно у вікнах введення додатка. Під час повторного запуску можна було б ввести інші значення для а і b та одержати відповідні результати.
Приклад 12.3. Розв’язати задачу за умовою прикладу 12.2, використавши для введення параметрів а і b один компонент Edit.
Для введення змінних а і b можна використовувати один компонент Edit, в який слід почергово вводити спочатку значення однієї змінної, а потім другої змінної. При цьому синхронно змінюється напис у властивості Caption компонента Label. Такий додаток має вигляд:
#include <vcl.h> #include <math.h> #pragma hdrstop #include "ODN_okno.h" //----------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; float x, y, z; int a, b; //----------------------------------------------------------------------------- _ fastcall TForm 1::TForm 1 (TComponent* Owner): TForm(Owner) { } void_ fastcall TForm1 ::Edit1KeyPress(TObject "Sender, char &Key) { if(Key==VK_RETURN) if(AnsiString(Label1->Caption) == "Введите a") { a = StrToInt(Edit1->Text); Label3->Caption = "a="+IntToStr(a); Label1->Caption = "Введите b"; Edit1->Text = " "; } else { b = StrToInt(Edit1->Text); Label3->Caption = "b=" + IntToStr(b); Label1->Caption = "Введите a"; } } void_ fastcall TForm1::Button2Click(TObject *Sender) { Close(); } //---------------------------------------------------------------------------------------------------- void_ fastcall TForm1::Button1Click(TObject *Sender) { x=l; while (x<=4) Label3->Caption = "При x=" + FloatToStr(x) + '\n'; for (y = 4; у <=12; у+=2) { if ((x < 3) && (у > 5)) z = pow(a,x) + sqrt(x + y); else if ((x > 3) && ((x + y) < 10)) z = a*exp(x) + log(b+y); else z = sin(x*x) + pow(cos(y),3); Label3->Caption = LabeI3->Caption+"y ="+FloatToStr(y)+" z ="+FloatToStr(z)+'\n'; } ShowMessage ("далее"); x += 0.5; } }
Оскільки створення вікна форми принципово не відрізняється від раніше розглянутої методики, крім того, що в поле Caption мітки Label1 спочатку записується підказка«Введите а», а потім «Введите b», розглянемо детальніше код програми.
Як і раніше, спочатку запишемо заголовний файл math.h, а дані а, b, х, у і z опишемо як глобальні змінні після рядка заготовки TForm *Form1, оскільки вони повинні бути доступними в двох оброблювачах подій: Edit1KeyPress() і Button1Click(), тобто у двох функціях.
Оброблювач Edit1KeyPress() служить для обробки події натискання клавіші Enterпісля введення чергового числа в поле Edit1. Для його створення треба на формі зробити активним компонент Edit1, клацнувши мишкою, а потім у редакторі Object Inspectorперейти на вкладку Events і активізувати в ній рядок onkeypress, двічі клацнувши мишкою. Перед цим треба в активному вікні форми властивості KeyPreview присвоїти значення «true».
Робота цього оброблювача полягає в тому, що спочатку на формі полеEdit1 очищається від інформації, а у властивість Caption компонента Label1 записується підказка «Введите а». Після запуску додатка на виконання у поле Edit1 вводиться значення змінної а і натискається клавіша Enter, яка має віртуальний код VK_RETURN(числовий код дорівнює 13). Цей код системою присвоюється спеціальному параметруKey.
За допомогою оператора if(Key==VK_RETURN)… перевіряється подія натискання клавіші Enter і, якщо вона відбулася, У наступному операторі if()… перевіряється, який напис містить поле Caption компонента Label1. Якщо це напис b то змінній а присвоюється значення поля Edit1, тобто виконується оператор а = StrToInt(Edit1->Text),після чого значення Цієї змінної виводиться у відповідне поле Label3->Caption для контролю. Потім оператор Label1->Caption = “Введите b“; заміняє цим повідомленням раніше введений текст, а наступний оператор очищає поле Edit1->Text. Далі в це поле можна ввести значення змінної b і також натиснути клавішу Enter. При обробці події умова if(AnsiString(Label 1 ->Caption == “Введите a”) тепер виявиться помилковою, і буде виконуватися гілка else, тобто значення поля Edit1->Text буде присвоєне змінній b і виведене в Label3->Caption для контролю. На цьому обробка даного повідомлення закінчується.
Якщо виникає потреба введення у вікно Edit1 значень не двох, а більшої кількості змінних, то в код оброблювача події слід вставити необхідну кількість операторів else,тобто привести їх до вигляду:
else
if(AnsiString(Labell->Caption)==”Bвeдитe b”) {
b = StrToInt(Editl->Text);
Label3->Caption=”b=” +IntToStr(b);
Editl->Text=” “;
}
else
Тут AnsiString служить для приведення тексту поля Caption до рядкового типу [1, 2,13,14,19]. Щоб продовжити роботу додатка, треба ініціювати подію Button1Click()натисканням кнопки «Вычислить». Тоді почнуть виконуватися оператори, записані в цьому оброблювачі події, й у полі компоненти Label3->Caption відобразиться результат розв’язання задачі. В цьому випадку використовуються такі ж оператори, як і у прикладі12.2.