С такой задачей довольно часто приходится иметь дело начинающим программистам. И нередко она вызывает серьёзные затруднения, несмотря на то, что принцип её решения предельно прост.
Основная проблема чаще всего кроется в ещё недостаточном понимании структуры как консольных таки оконных программ.
Консольную программу, в большинстве случаев, можно условно разделить на три части выполняемые последовательно.
- Ввод данных;
- Выполнение тех или иных действий;
- Вывод результатов на экран консоли.
В оконной программе первая и третья части объединены в оконном интерфейсе, а вторая часть выполняется при возникновении определённого события (например, нажатие кнопки).
Для наглядности рассмотрим следующий простой пример.
Есть консольная программ, которая перемножает два числа введённые пользователем и выводит результат умножения. Ниже приведён её код на Pascal и C++.
Pascal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var a, b, c: real; begin { 1я часть. Ввод данных } Write('A:'); ReadLn(a); Write('B:'); ReadLn(b); { 2я часть. Собственно алгоритм программы } c := a * b; { 3я часть. Вывод результата } Write(c); ReadLn; end. |
C++
1 2 3 4 5 6 7 8 9 10 11 12 |
#include #include ; #include int _tmain(int argc, _TCHAR* argv[]) { double a, b, c; // 1я часть. Ввод данных cout > a; cout > b; // 2я часть. Собственно алгоритма программы c = a * b; // 3я часть. Вывод результата cout |
Необходимо переделать эту консольную программу в оконную.
Реализацию оконной версии выполним в Delphi и C++ Builder.
Так как программа принимает на вход два числа и возвращает результат в виде одного числа, в окне должны быть два компонента исходных чисел (допустим, поля для ввода Edit) и один компонент для вывода результата (допустим, метка Label).
Для того чтобы дать программе команду выполнить вычисления можно задействовать обычную кнопку. При нажатии на неё оба исходных числа будут перемножены, а результат выведен в Label.
Внешний вид окна показан на скриншоте ниже.
Для большей наглядности можно добавить два дополнительных компонента Label, которые будут служить подписями для компонентов Edit.Однако в силу того, что при перестановке множителей произведение не изменяется, наличие или отсутствие этих компонентов, а также их взаимное расположение на работу пользователя с программой никак не повлияют.
Теперь необходимо обработать событие нажатия на кнопку.
В обработчике нужно преобразовать текст из полей вода в числа, затем перемножить их и вывести результат.
Для Delphi.
1 2 3 4 5 6 7 8 9 10 11 12 |
procedure TForm1.Button1Click(Sender: TObject); var a, b, c: real; begin // Вод исходных данных a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); // Вычисления c := a * b; // Вывод результата Label1.Caption := FloatToStr(c); end; |
Для C++ Builder.
1 2 3 4 5 6 7 8 9 |
void __fastcall TForm1::Button1Click(TObject *Sender) { // Ввод данных double a = StrToFloat(Edit1->Text); double b = StrToFloat(Edit2->Text); // Вычисления double c = a * b; // Вывод результата Label1->Caption = FloatToStr(c); } |
Таким образом, обработчик события нажатия кнопки полностью копирует работу исходной программы (особенно в Delphi).
Однако, несмотря на то, что задача как таковая решена оставлять обработчик события в таком виде нецелесообразно. Его можно значительно упростить и тем самым добиться большей простоты работы программы, чем была изначально в консольном варианте.
Из приведённых примеров кода, очевидно, что переменную a можно легко заметить на:
1 |
StrToFloat(Edit1.Text); |
и
1 |
StrToFloat(Edit1->Text); |
соответственно.
Переменную b можно заменить на:
1 |
StrToFloat(Edit2.Text); |
и
1 |
StrToFloat(Edit2->Text); |
В результате переменную c можно представить в виде:
1 |
StrToFloat(Edit1.Text) * StrToFloat(Edit2.Text); |
и
1 |
StrToFloat(Edit1->Text) * StrToFloat(Edit2->Text); |
Тем самым, можно отказаться от использования дополнительных переменных и свести весь алгоритм работы программы к одной единственной строке кода.
Для Delphi
1 2 3 4 |
procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := FloatToStr(StrToFloat(Edit1.Text) * StrToFloat(Edit2.Text)); end; |
Для C++ Builder
1 2 3 |
void __fastcall TForm1::Button1Click(TObject *Sender) { Label1->Caption = FloatToStr(StrToFloat(Edit1->Text) * StrToFloat(Edit2->Text)); } |
Принцип, показанный на примере, рассмотренном в данной статье, универсален и позволяет решать задачи по переводу консольных программ в оконные практически любой степени сложности.
Добавить комментарий