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

Лабник по СПО

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

Рис.2.5. Окно программы для расчёта параметров

колебательного контура

Присваиваем оригинальные имена всем установленным на форме объектам. Например, меткам для обозначения величин присваиваем имена: NamL, NamC, Namf. Редакторам присваиваем имена: EdL, EdC, Edf. Спискам присваиваем имена: IzmL, IzmC, Izmf. Списку рассчитываемых параметров присваиваем имя Param. Метке для обозначения списка рассчитываемых параметров присваиваем имя LabelParam. Метке для вывода сообщения об ошибке присваиваем имя LabErr. Многострочному редактору для записи результатов присваиваем имя RezOut. Кнопкам присваиваем имена WrBut и ClsBut.

Всвойство Items списка IzmС вводим две строки: мкФ и пкФ. В свойство Items списка IzmL вводим три строки: Гн, мГн и мкГн. В свойство Items списка Izmf вводим три строки: Гц, кГц и МГц. В свойство Items списка Param вводим три строки: f, L и С.

Начальные значения f, L и С, которые должны выводиться при запуске программы, вводим в свойства Text соответствующих редакторов. Значения параметров должны быть согласованы между собой. Следует также учесть, что реально ни один параметр не может равняться нулю. Если по умолчанию предусматривается расчёт частоты, то необходимо свойству ReadOnly редактора Edf присвоить значение True.

Всвойстве Align объекта RezOut выбираем значение alBottom, чтобы окно

многострочного редактора занимало всю ширину формы и прижималось к нижнему краю формы.

Раскрываем подпункты свойства Anchors и в свойстве akTop выбираем значение True, чтобы при изменении размеров формы автоматически изменялись размеры окна редактора RezOut.

51

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

Текст программы на языке С++

В заголовочном файле объявляем шесть глобальных переменных типа double и одну переменную типа int.

double L=1,C=1,f=159.15,Lr,Cr,fr; int IndWr=0;

Три переменные L, C и f необходимы для хранения исходных данных в единицах измерения исходных данных, и три переменные Lr, Cr и fr необходимы для хранения расчётных значений в основных единицах измерения (генри, фарады и герцы). Инициализируем переменные, выведенные в качестве начальных исходных данных, в соответствии со значениями, записанными в редакторах. Переменная целого типа IndWr предназначена для регистрации факта записи результата.

В соответствии со схемой (см. рис.2.1) работа программы должна начинаться с вывода начальных значений на экран. Для вывода начальных значений в обработчике создания формы FormCreate задаём начальные значения индексов списков.

void __fastcall TfmLCF::FormCreate(TObject *Sender)

{

Param->ItemIndex = 0;

IzmL->ItemIndex = 0;

IzmC->ItemIndex = 0;

Izmf->ItemIndex = 0;

}

Создаём функцию преобразования строки в число в соответствии со схемой, приведённой на рис.2.2. Операторы преобразования строки помещаем в блок try, в блок catch помещаем оператор, обнуляющий переменную, и оператор, записывающий в заголовок метки сообщение об ошибке. При корректном вводе исходных данных записываем в метку один пробел. Пользователи иногда перед вводом числа удаляют весь текст из редактора, в результате в редакторе остаются только пробелы. Для того чтобы при пустом окне редактора не возникала исключительная ситуация, необходимо присвоить вводимой переменной нулевое значение. Получим следующий текст функции

Vvod:

double TfmLCF::Vvod(AnsiString Str)

{

double Nm; try

52

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

{

Nm=StrToFloat(Trim(Str)); LabErr->Caption=" ";

}

catch(...)

{

Nm=0;

if ((Str != "")&&(Str != " ")) LabErr->Caption=" Ошибка ввода ";

}

return Nm;

}

Прототип функции записываем в секцию Public. double Vvod(AnsiString Str);

В обработчики события OnChange всех редакторов записываем функцию ввода данных. Для определения рассчитываемого параметра, значение которого не должно считываться, воспользуемся условным оператором if и номером индекса объекта Param.

void __fastcall TfmLCF::EdfChange(TObject *Sender)

{

if (Param->ItemIndex != 0) f = Vvod((Edf->Text)); LabErr->Caption=FloatToStr(f);

}

void __fastcall TfmLCF::EdLChange(TObject *Sender)

{

if (Param->ItemIndex != 1) L = Vvod((EdL->Text)); LabErr->Caption=FloatToStr(L);

}

void __fastcall TfmLCF::EdCChange(TObject *Sender)

{

if (Param->ItemIndex != 2) C = Vvod((EdC->Text)); LabErr->Caption=FloatToStr(C);

}

Оператор, выводящий на метку LabErr результат работы функции Vvod, вносим для проверки работы функций, обрабатывающих событие OnChange. Проверяем работу

53

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

функций и удаляем оператор, выводящий результат на метку. Редактор, на который выводится рассчитываемый параметр, не должен считывать записанные в него данные.

В обработчик события OnChange списка Param записываем переключатель switch, изменяющий значения свойства ReadOnly редакторов для ввода данных. Редактор, на который выводится рассчитываемый параметр, не должен быть доступным для изменения данных пользователем. Для устранения некорректных результатов, возникающих при ошибочном вводе данных, введём операторы, восстанавливающие исходные данные при изменении рассчитываемого параметра.

void __fastcall TfmLCF::ParamChange(TObject *Sender)

{

switch (Param->ItemIndex)

{

case 0:{Edf->ReadOnly=true; EdL->ReadOnly=false; EdC->ReadOnly=false; EdL->Text=FloatToStrF(L,ffGeneral,5,2); EdC->Text=FloatToStrF(C,ffGeneral,5,2);

}

break; case 1:{

Edf->ReadOnly=false;

EdL->ReadOnly=true;

EdC->ReadOnly=false; Edf->Text=FloatToStrF(f,ffGeneral,5,2); EdC->Text=FloatToStrF(C,ffGeneral,5,2);

}

break; case 2:{

Edf->ReadOnly=false;

EdL->ReadOnly=false;

EdC->ReadOnly=true; Edf->Text=FloatToStrF(f,ffGeneral,5,2); EdC->Text=FloatToStrF(L,ffGeneral,5,2);

}

break;

54

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

}

Создаём заготовку функции расчёта параметров с именем CalcLCF. void TfmLCF::CalcLCF()

{

}

Прототип функции записываем в секцию Public. void CalcLCF();

Записываем текст функции расчёта. После считывания исходных данных необходимо привести их значения к основным единицам измерения (генри, герцы и фарады), т.е. реализовать схему подпрограммы, показанную на рис.2.3. Для этого вводим в функцию CalcLCF переключатели switch (блоки 2, 6 и 10 на рис.2.3), выбирающие

коэффициенты перевода значений параметров из значений в задаваемых единицах измерения в значения в основных единицах измерения параметров. Проверяем работу программы.

switch (IzmL->ItemIndex)

{

case 0: Lr = L ; break;

case 1: Lr = L/1000 ; break;

case 2: Lr = L/1000000 ; break;

}

switch (IzmC->ItemIndex)

{

case 0: Cr = C*1E-6 ; break;

case 1: Cr = C*1E-12 ; break;

}

switch (Izmf->ItemIndex)

{

case 0: fr = f ; break;

case 1: fr = f*1000 ;

55

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

break;

case 2: fr = f*1E6 ; break;

}

Затем необходимо вычислить значение рассчитываемого параметра и привести его значение к заданным единицам измерения. Текст расчётных операторов приведён в распечатке 2.5.

Для ввода числа π используем глобальную константу M_PI, имеющую значение,

равное числу π. Константа M_PI хранится в библиотечном файле math.h, который не подключается автоматически. Для подключения библиотечного файла math.h нужно включить его вызов в заголовочный файл строкой #include <math.h>.

Распечатка 2.5

switch (Param->ItemIndex)

{

case 0:

if (Lr*Cr>0)

{

fr = 0.5/sqrt(Lr*Cr)/M_PI; switch (Izmf->ItemIndex) {case 0: f = fr;

break;

case 1: f = fr/1000; break;

case 2: f = fr*1E-6; break;

}

Edf->Text = FloatToStrF(f,ffGeneral,5,2);

}

else Edf->Text = " ???";

break; case 1:

if (fr*Cr>0)

{

Lr = 0.25/fr/fr/Cr/M_PI/M_PI; switch (IzmL->ItemIndex)

56

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

{

case 0: L = Lr; break;

case 1: L = Lr*1000; break;

case 2: L = Lr*1E6; break;

}

EdL->Text = FloatToStrF(L,ffGeneral,5,2);

}

else EdL->Text = " ??"; break;

case 2:

if (fr*Lr>0)

{

Cr = 0.25/fr/fr/Lr/M_PI/M_PI; switch (IzmC->ItemIndex) {case 0: C = Cr*1E6;

break;

case 1: C = Cr*1E12; break;

}

EdC->Text = FloatToStrF(C,ffGeneral,5,2);

}

else EdC->Text = " ?? "; break;

}

}

Вводим вызов функции CalcLCF в обработчики события OnChange всех объектов, через которые могут вноситься изменения исходных данных или единиц измерения. Ниже показан пример записи функции расчёта в два объекта: EdL и IzmL.

void __fastcall TfmLCF::EdLChange(TObject *Sender) {if (Param->ItemIndex != 1) {

L = Vvod(EdL->Text); CalcLCF();

57

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

}

}

void __fastcall TfmLCF::IzmLChange(TObject *Sender) { CalcLCF(); }

Запись результатов расчёта желательно сформировать столбцами одинаковой ширины, независимо от введённых или полученных значений величин. Для обеспечения одинаковой ширины столбцов в объекте RezOut выбираем шрифт Courier и создаём функцию WrRez, дополняющую строку результата до 16 символов. Если длина строки, содержащей результат, меньше 16 символов, то функция добавляет пробелы в конец строки. Текст функции приведён в распечатке 2.6.

Распечатка 2.6

AnsiString TfmLCF::WrRez (AnsiString Num, AnsiString UnV) {AnsiString Rez=Num+UnV;

while ( Rez.Length()<16) Rez=Rez+" "; return Rez;

}

Строка типа AnsiString в языке C++ Builder определена как класс, поэтому функцию Length для определения длины строки следует вызывать как метод класса через точку. Функцию WrRez создаём как члена класса формы, поэтому объявляем её в секции public класса формы.

public: // User declarations __fastcall TfmLCF(TComponent* Owner); double Vvod(AnsiString Str);

void CalcLCF();

AnsiString WrRez(AnsiString, AnsiString);

};

Операторы, форматирующие и записывающие результаты расчёта в многострочный редактор RezOut, вводим в обработчик события OnClick кнопки записи WrBut. Текст функции приведён в распечатке 2.7. Написав текст, убедимся, что ширина столбцов с результатами не зависит от значений результатов и исходных данных. Для этого произведём несколько расчётов с данными, имеющими разную длину.

58

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

Распечатка 2.7

void __fastcall TfmLCF::WrButClick(TObject *Sender)

{

if (IndWr==0) RezOut->Lines->Add ("Результаты расчёта параметров LC контура"); IndWr=1;

if (Param->ItemIndex==0) RezOut->Lines->Add("L="+WrRez(EdL->Text,IzmL->Text)+

"C="+WrRez(EdC->Text,IzmC->Text)+ "f="+Edf->Text+Izmf->Text);

if (Param->ItemIndex==1) RezOut->Lines->Add("f="+WrRez(Edf->Text,Izmf->Text)+

"C="+WrRez(EdC->Text,IzmC->Text)+ "L="+EdL->Text+IzmL->Text);

if (Param->ItemIndex==2) RezOut->Lines->Add("f="+WrRez(Edf->Text,Izmf->Text)+

"L="+WrRez(EdL->Text,IzmL->Text)+ "C="+EdC->Text+IzmC->Text);

}

Если в программе нет ошибок и всё нормально работает, то нужно проверить и задать последовательность перехода фокуса при нажатии клавиши Tab. Для задания последовательности перехода фокуса щёлкаем правой кнопкой мыши по форме, в контекстном меню выбираем команду Tab Order... и открываем диалоговое окно Edit Tab Order (рис.2.6).

Рис.2.6. Диалоговое окно задания последовательности

59

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

перемещения фокуса При запуске программы фокус должен получить список рассчитываемых величин

Param. Выбираем такую последовательность перемещения фокуса клавишей табуляции, чтобы фокус со списка рассчитываемых величин переходил на единицы измерения, а потом на редакторы для ввода значений параметров.

Текст программы на языке Delphi

Объявляем в разделе Var перед блоком Implementation шесть глобальных переменных типа Double и одну переменную типа Byte.

Var

fmLCF: TfmLCF;

L :Double=1; C :Double=1; f :Double=159.15;

Lr,Cr,fr :Double;

IndWr :Byte=0;

Три переменные L, C и f необходимы для хранения исходных данных в единицах измерения исходных данных, и три переменные Lr, Cr и fr необходимы для хранения расчётных значений в основных единицах измерения (генри, фарады и герцы). Инициализируем переменные, выведенные в качестве начальных исходных данных, в соответствии со значениями, записанными в редакторах. Переменная целого типа IndWr предназначена для регистрации факта записи результата.

В соответствии со схемой (см. рис.2.1) работа программы должна начинаться с вывода начальных значений на экран. Для вывода начальных значений в обработчике создания формы FormCreate задаём начальные значения индексов списков.

Procedure TfmLCF.FormCreate(Sender: TObject);

Begin

Param.ItemIndex := 0;

IzmL.ItemIndex := 0;

IzmC.ItemIndex := 0;

Izmf.ItemIndex := 0

End;

Создаём функцию преобразования строки в число в соответствии со схемой, приведённой на рис.2.2. Операторы преобразования строки помещаем в блок Try, в блок Except помещаем оператор, обнуляющий переменную, и оператор, записывающий в

60

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

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