Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабник по СПО

.pdf
Скачиваний:
9
Добавлен:
05.06.2015
Размер:
1.59 Mб
Скачать

В обработчик изменения текста редакторов записываем операторы ввода чисел. Для индикации того, что действие ещё не выполнено и результат не соответствует введённым данным, цвет результата изменяем на красный или светло-серый. Изменение цвета результата с чёрного на красный или светло-серый должно происходить при любых изменениях параметров, влияющих на значение результата. Чёрный цвет шрифта восстанавливаем только после выполнения расчёта.

void __fastcall TfmCalc::Nm1EdChange(TObject *Sender)

{

Nm1 = Vvod(Nm1Ed->Text); ResLab->Font->Color=clFuchsia;

}

void __fastcall TfmCalc::Nm2EdChange(TObject *Sender)

{

Nm2 = Vvod(Nm2Ed->Text); ResLab->Font->Color=clFuchsia;

}

Создаём текст функции обработчика нажатия кнопки Сложение с проверкой режима расчёта: одинарный или дополняющий режимы сложения (кнопки ButSum и But1_2) с указанием номера дополняющего числа.

void __fastcall TfmCalc::ButAddClick(TObject *Sender) {LabErr->Caption = "";

if (ButSum->Down==true) if (But1_2->Down==true)

ActLab->Caption=" Res = Res + Nm1"; else ActLab->Caption=" Res = Res + Nm2"; else ActLab->Caption=" Res = Nm1 + Nm2"; ResLab->Font->Color=clFuchsia;

}

Нажатие кнопки Сложение задаёт тип действия, но само действие происходит только после нажатия кнопки Расчёт, поэтому при задании типа действия результат не изменяется. Для того чтобы показать несоответствие исходных данных и результата, цвет шрифта результата делаем серым или красным, так же как и при вводе значения числа. Чёрный цвет шрифта восстанавливаем только после выполнения расчёта.

Создаём текст функции обработчика нажатия кнопки Вычитание с проверкой режима расчёта и последовательности операндов (кнопки ButSum и But1_2).

91

PDF created with pdfFactory Pro trial version www.pdffactory.com

void __fastcall TfmCalc::ButSu bClick(TObject *Sender)

{

LabErr->Caption = "";

if (ButSum->Down==true) if (But1_2->Down==true)

ActLab->Caption=" Res = Re s - Nm1"; else ActLab->Caption=" Res = Res - Nm2"; else if (But1_2->Down==false)

ActLab->Caption=" Res = Nm1 - Nm2"; else ActLab->Caption=" Res = Nm2 - Nm1";

ResLab->Font->Color=clFuchsia;

}

Аналогичные тексты пи шем для кнопок Умножение и Деление. Для кнопок ButSub и ButDiv создаём свои контекстные меню SubMenu и DivMenu, позволяю щие производить перестановку операндов (рис.3.13).

а б

Рис.3.13. Контекстные меню кнопок Вычитание (а) и Деление (б)

Записываем тексты обр аботчиков пунктов контекстных меню. void __fastcall TfmCalc::SubM enu12Click

(TObject *Sender)

{

ButSub->Down=true;

But1_2->Down=false;

ButSubClick(Sender);

}

void __fastcall TfmCalc::SubM enu21Click (TObject *Sender)

{

ButSub->Down=true;

But1_2->Down=true;

92

PDF created with pdfFactory Pro trial version www.pdffactory.com

ButSubClick(Sender);

}

void __fastcall TfmCalc::DivMenu21Click (TObject *Sender)

{

ButDiv->Down=true;

But1_2->Down=true;

ButDivClick(Sender);

}

void __fastcall TfmCalc::DivMenu12Click (TObject *Sender)

{

ButDiv->Down=true;

But1_2->Down=false;

ButDivClick(Sender);

}

Цифры 12 в имени функции означают, что используется прямая последовательность переменных, т.е. первым операндом является переменная Nm1, вторым операндом - переменная Nm2. Цифры 21 означают, что используется обратная последовательность переменных, т.е. первым операндом является переменная Nm2, вторым операндом - переменная Nm1.

При нажатии кнопок But1_2 и ButSum также должна изменяться информация о выбранном действии, поэтому в обработчики события OnClick этих кнопок записываем функции, изменяющие информацию о выбранном действии.

Проверяем работу программы.

void __fastcall TfmCalc::ButSumClick(TObject *Sender) {if (ButAdd->Down==true) ButAddClick(Sender);

if (ButSub->Down==true) ButSubClick(Sender);

if (ButMulty->Down==true) ButMultyClick(Sender); if (ButDiv->Down==true) ButDivClick(Sender);

}

void __fastcall TfmCalc::But1_2Click(TObject *Sender)

{

LabErr->Caption = "";

if (ButAdd->Down==true) ButAddClick(Sender);

93

PDF created with pdfFactory Pro trial version www.pdffactory.com

if (ButSub->Down==true) ButSubClick(Sender);

if (ButMulty->Down==true) ButMultyClick(Sender); if (ButDiv->Down==true) ButDivClick(Sender);

}

В функцию BitBtCalcClick вводим операторы, выполняющие операции сложения, умножения, вычитания и деления в соответствии со схемами рис.3.6 - 3.8, и операторы для формирования строки результата. Полный текст функции расчёта приведён в распечатке 3.7.

Распечатка 3.7

void __fastcall TfmCalc::CalcBitBtClick (TObject *Sender)

{

ResLab->Font->Color=clBlack;

ResStr=" "+FloatToStrF(Res,ffGeneral,4,1); if (ButAdd->Down==true)

if (ButSum->Down==true) if (But1_2->Down==true)

{

Res=Res+Nm1; ResStr=ResStr+" + "+

FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{Res=Res+Nm2; ResStr=ResStr+" + "+

FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{

Res=Nm1+Nm2;

ResStr=" "+FloatToStrF(Nm1,ffGeneral,4,1)+" + " +FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

94

PDF created with pdfFactory Pro trial version www.pdffactory.com

}

if (ButSub->Down==true) if (ButSum->Down==true) if (But1_2->Down==false)

{

Res=Res-Nm1; ResStr=ResStr+" - "+

FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{

Res=Res-Nm2; ResStr=ResStr+" - "+

FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{if (But1_2->Down==false)

{

Res=Nm1-Nm2;

ResStr=" "+FloatToStrF(Nm1,ffGeneral,4,1)+

"- "+FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{

Res=Nm2-Nm1;

ResStr=" "+FloatToStrF(Nm2,ffGeneral,4,1)+

"- "+FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

}

if (ButMulty->Down==true) if (ButSum->Down==true)

95

PDF created with pdfFactory Pro trial version www.pdffactory.com

if (But1_2->Down==true)

{

Res=Res*Nm1;

ResStr=ResStr+

"* "+FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{

Res=Res*Nm2;

ResStr=ResStr+

"* "+FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else

{

Res=Nm1*Nm2;

ResStr=" "+FloatToStrF(Nm1,ffGeneral,4,1)+

"* "+FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

if (ButDiv->Down==true) if (But1_2->Down==true)

if (Nm1==0) LabErr->Caption = "Деление на нуль"; else if (ButSum->Down==true)

{

Res=Res/Nm1; ResStr=ResStr+" / "+

FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else if (ButSum->Down==true)

{

Res=Res/Nm1; ResStr=ResStr+" / "+

96

PDF created with pdfFactory Pro trial version www.pdffactory.com

FloatToStrF(Nm1,ffGeneral,4,1)+" = " +FloatToStrF(Res,ffGeneral,4,1);

}

else { Res=Nm2/Nm1; ResStr=" "+

FloatToStrF(Nm2,ffGeneral,4,1)

+" / "+FloatToStrF(Nm1,ffGeneral,4,1)+ " = "+FloatToStrF(Res,ffGeneral,4,1);

}

else

if (Nm2==0) LabErr->Caption = "Деление на нуль"; else if (ButSum->Down==true)

{

Res=Res/Nm2; ResStr=ResStr+" / "+

FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

else { Res=Nm1/Nm2; ResStr=" "+

FloatToStrF(Nm1,ffGeneral,4,1)+" / "+

FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);

}

ResLab->Caption=FloatToStrF(Res,ffGeneral,4,1);

}

Проверяем правильность вычисления результата.

Всобытие OnClick кнопки ButOpen вводим команду на открытие второй формы. void __fastcall TfmCalc::ButOpenClick(TObject *Sender)

{

fmOut->Show();

}

Всобытие OnClick кнопки ButWr вводим команду на запись результата.

97

PDF created with pdfFactory Pro trial version www.pdffactory.com

void __fastcall TfmCalc::ButWrClick(TObject *Sender)

{

fmOut->OutRes->Lines->Add(ResStr); fmOut->Show();

}

Записываем тексты пунктов контекстного меню на второй форме. void __fastcall TfmOut::ClrResClick(TObject *Sender)

{ //Пункт Удалить результаты

OutRes->Clear();

OutRes->Lines->Add(" Результаты расчёта"); OutRes->Lines->Add(" ");

}

void __fastcall TfmOut::CalcPMenuClick (TObject *Sender)

{//Пункт Расчёт

fmCalc->CalcBitBtClick(Sender);

}

void __fastcall TfmOut::SaveResClick(TObject *Sender)

{//Пункт Сохранить

OutRes->Lines->SaveToFile(fmCalc->NameFileEd->Text);

}

void __fastcall TfmOut::WrResClick(TObject *Sender)

{//Пункт Записать

fmOut->OutRes->Lines->Add(fmCalc->ResStr);

}

В пункт Выход записываем команду, закрывающую программу, без вызова сообщения о закрытии программы.

void __fastcall TfmOut::ClsPrtClick(TObject *Sender)

{

Application->Terminate();

}

или

void __fastcall TfmOut::ClsPrtClick(TObject *Sender)

{

98

PDF created with pdfFactory Pro trial version www.pdffactory.com

fmCalc->Close();

}

Записываем тексты обработчиков OnClick пунктов главного меню. Начнём создание текстов с пунктов раздела Результаты (см. рис.3.10,а).

void __fastcall TfmCalc::CalcResClick(TObject *Sender) { //Пункт Расчёт

CalcBitBtClick(Sender);

}

void __fastcall TfmCalc::WrResClick(TObject *Sender) { //Пункт Записать

ButWrClick(Sender);

}

void __fastcall TfmCalc::OpResClick(TObject *Sender) { //Пункт Открыть

fmOut->Show();

}

void __fastcall TfmCalc::ResSaveClick(TObject *Sender) { //Пункт Сохранить fmOut->SaveResClick(Sender);

}

void __fastcall TfmCalc::ClsPrClick(TObject *Sender)

{Close();

//Пункт Выход

}

 

Записываем тексты обработчиков пунктов и подпунктов раздела Действия главного меню

(см. рис.3.10,б).

void __fastcall TfmCalc::ActAddClick(TObject *Sender)

{

 

ButAdd->Down=true;

//Пункт Сложить

ButAddClick(Sender);

 

}

 

void __fastcall TfmCalc::ActSubClick(TObject *Sender)

{

 

ButSub->Down=true;

//Пункт Вычесть

ButSubClick(Sender);

 

}

 

 

99

PDF created with pdfFactory Pro trial version www.pdffactory.com

void __fastcall TfmCalc::Nm1SubNm2Click (TObject *Sender)

{ //Пункт Nm1–Nm2

ButSub->Down=true;

But1_2->Down=false;

ButSubClick(Sender);

}

void __fastcall TfmCalc::Nm2SubNm1Click (TObject *Sender)

{ //Пункт Nm2–Nm1

ButSub->Down=true;

But1_2->Down=true;

ButSubClick(Sender);

}

void __fastcall TfmCalc::ActMultyClick(TObject *Sender) { //Пункт Умножить

ButMulty->Down=true;

ButMultyClick(Sender);

}

void __fastcall TfmCalc::ActDivClick(TObject *Sender) { //Пункт Разделить

ButDiv->Down=true;

ButDivClick(Sender);

}

void __fastcall TfmCalc::Nm1DivNm2Click (TObject *Sender)

{ //Пункт Nm1/Nm2

ButDiv->Down=true;

But1_2->Down=false;

ButDivClick(Sender);

}

void __fastcall TfmCalc::Nm2DivNm1Click (TObject *Sender)

{//Пункт Nm2/Nm1

100

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]