Лабораторная работа №2.

 Программирование разветвляющихся алгоритмов

        

Цель работы: изучить операции сравнения, логические операции, операторы передачи управления if, switch, break, научиться пользоваться простейшими компонентами организации переключений (ТСheckBox, RadioGroup). Написать и отладить программу разветвляющегося алгоритма.

 

2.1. Операторы if и switch языка C++

 Для программирования разветвляющихся алгоритмов в языке C++ используются  переменные типа bool, которые могут принимать только два значения - true и false (да, нет), а также операторы if и switch. Оператор if проверяет результат логического выражения или значение переменной типа int лабо bool и организует разветвление вычислений. 

Например, если bool bl;  double x,y,u; то фрагмент программы с оператором if может быть таким:      

bl=x>y;

                     if  (bl)  u=x-y;

               else

u=x+y;

 Оператор выбора swith организует разветвления в зависимости от значения некоторой переменной перечисляемого типа. 

Например, если  int in, то после выполнения    

switсh (in)

                                         {

case 0: u=x+y; break;

case 1: u=x-y; break;

case 2: u=x*y; break;

                                         default u=0;

                                         }

 В соответствии со значением in вычисляется u. Если in=0, то u=x+y, если in=1, то u=x-y, если in=2, то u=x*y и, наконец, u=0 при любых значениях in отличных от 0, 1 или 2. Ветвь default можно при необходимости опустить.

 

2.2. Перечисляемые типы данных

Перечисляемые типы определяют упорядоченное множество идентификаторов, представляющих собой возможные значения переменных этого типа. Вводятся эти типы для того, чтобы сделать код более понятным. Определяются перечисляемые переменные следующим образом:  

 enum {константа 1, ... , константа n} <имена переменных>;

Например:  

 enum {mRed, mYellow, mGreen}  mm;

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

Например:

   if (mm > mRed) 

 

  switсh (mm) { 

  case mRed          

                 brеak;

 

                     }

 

По умолчанию перечисляемые значения интерпретируются как целые числа, начиная с -1.

 

2.3. Кнопки-переключатели в C++ Builder

При создании программ в C++ Builder для организации разветвлений часто используются компоненты в виде кнопок-переключателей. Состояние такой кнопки (включено - выключено) визуально отражается на форме. На форме (рис.2.1) представлены кнопки-переключатели двух типов (TCheckBox, TRadioGroup). 

Компонент TCheckBox создает кнопку независимого переключателя, с помощью которой пользователь может указать свое решение типа да/нет. В программе состояние кнопки связано со значением булевой переменной, которая проверяется с помощью оператора if.

 Компонент TRadiogroup создает группу кнопок - зависимых переключателей. При нажатии одной из кнопок группы все остальные кнопки отключаются. В программу передается номер включенной кнопки (0,1,2,...), который анализируется с помощью оператора switсh.

2.4. Пример написания программы

  Задание: ввести три числа - x,y,z. Вычислить по усмотрению u=sin(x),  u=cos(x) или u=tg(x). Найти по выбору максимальное из трех чисел: max(u,y,z), или max (|u|,|y|,|z|). Cоздать форму, представленную на рис. 2.1, и написать соответствующую программу.

2.4.1. Создание формы

Создайте форму, такую же, как в первом задании, скорректировав текст надписей и положение окон TEdit.

2.4.2. Работа с компонентом TСheckBox

 Выберите в меню компонентов Standard пиктограмму p1 и поместите ее в нужное место формы. С помощью инспектора объектов измените заголовок (Caption) на maxabs. В тексте программы появилась переменная CheckBox1 типа TСheckBox. Теперь в зависимости от того, нажата или нет кнопка, булева переменная CheckBox1. Checked будет принимать значение true или false.

2.4.3. Работа с компонентом TRadioGroup

  Выберите в меню компонентов Standard пиктограммуp3  и поместите ее в нужное место формы. На форме появится окаймленный линией чистый прямоугольник с заголовком RadioGroup1. Замените заголовок (Caption) на U(x). Для того чтобы разместить на компоненте кнопки, необходимо свойство Columns установить равным единице (кнопки размещаются в одном столбце). Дважды щелкните по правой части свойства Items мышью, появится строчный редактор списка заголовков кнопок. Наберите три строки с именами: в первой строке - cos(x), во второй - sin(x), в третьей - tg(x), нажмите ОК.  После этого на форме внутри окаймления появится три кнопки переключателя с введенными надписями.   Обратите внимание на то, что в тексте программы появится переменная RadioGroup1 типа TRadioGroup. Теперь при нажатии одной из кнопок группы в переменной целого типа RadioGroup1->ItemIndex будет находиться номер нажатой клавиши (отсчитывается от нуля), что используется в тексте приведенной программы.

2.4.4. Создание обработчиков событий FormСreate и Botton1Сlick

 Функции для обработки событий FormСreate и Botton1Сlick создаются аналогично тому, как и в первой теме. Текст процедур приведен ниже.  Запустите программу и убедитесь в том, что все ветви алгоритма выполняются правильно. Форма приведена на рис.2.1.

Рис 2.1.

 

Текст программы:

//---------------------------------------------------------------------------

 #include <vcl.h>

 #pragma hdrstop

 #include "Unit1.h"

 #include "math.h"

//---------------------------------------------------------------------------

 #pragma package(smart_init)

 #pragma resource "*.dfm"

 TForm1 *Form1;

 //---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)        

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Edit1->Text="0,3";

Edit2->Text="0,643";

Edit3->Text="0";

Memo1->Clear();

Memo1->Lines->Add("Рез-ты ст. 4к.ПИЭ Курбанова А.");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{ 

double x,y,z,u,ma; 

// Ввод исходных данных и вывод в окно Memo1

x=StrToFloat(Edit1->Text);         

Memo1->Lines->Add("x="+Edit1->Text);

y=StrToFloat(Edit2->Text);           

Memo1->Lines->Add("y="+Edit2->Text);  

z=StrToFloat(Edit3->Text);           

Memo1->Lines->Add("z="+Edit3->Text);                                   

// Проверка номера нажатой кнопки и выбор соответствующей ей

функции

switch(RadioGroup1->ItemIndex)

 {

case 0: u=cos(x);  break;

case 1: u=sin(x);  break;

case 2: u=tan(x);  break;

}

if (CheckBox1->Checked)  // Проверка состояния кнопки CheckBox1

 

   {

  u=fabs(u);

  y=fabs(y);

  z=fabs(z);

  }                 

// Нахождение максимального из трех чисел

if (u>y) ma=u; else ma=y;

if (z>ma) ma=z;

if (CheckBox1->Checked) Memo1->Lines->Add("maxabc="+  

                                                               FloatToStrF(ma,ffFixed,8,6));

else  Memo1->Lines->Add("max="+

                                                                   FloatToStrF(ma,ffFixed,8,6));

2.5. Индивидуальные задания

         Вычислить значение y в зависимости от выбранной функции j(x), аргумент которой определяется из поставленного условия. Возможные значения функции j(x): 2x, x2, х/3 (в оконном приложении выбор выполнить с помощью компоненты RadioGroup). Предусмотреть вывод сообщений, показывающих, при каком условии и с какой функцией производились вычисления у.

1.                .,                где  

2.  ,                          где  

3.       ,                  где

4.       ,           где

5.       ,     где

6.       ,                где    

7.       ,                     где

8.       ,                где

9.       ,                                     где

10.  ,                 где   

11.  ,                          где

12.  ,        где

13.  ,             где

14.  ,              где

15.  ,               где

16.  ,        где