- •Ключевые особенности
- •Полная интеграция с web-службами бизнес-партнеров
- •Быстрая и эффективная разработка web-приложений
- •Высокопроизводительное промежуточное по для web-служб
- •Кросс-платформенные решения
- •Эффективная работа с корпоративными базами данных
- •Корпоративные приложения для электронного бизнеса
- •Технология быстрой разработки приложений
- •Диагностический инструмент CodeGuard
- •Полный контроль над сложными проектами
- •Решения "под ключ" на основе Borland InterBase
- •Требования к системе
- •Ход работы
- •4. Создание библиотеки dll
- •Создайте консольное приложение.
- •Создайте приложения с графическим интерфейсом.
- •Создайте простейшую dll и тестирующее ее приложение.
- •Теоретические сведения
- •Ход работы
- •11. Аналогично вставьте в форму еще несколько текстовых полей с вашими биографическими данными.
- •12. Вставьте в форму объект типа Image (изображение).
- •13. Вставьте свою портретную фотографию с помощью свойства Picture (иллюстрация) объекта Image1.
- •14. Вставьте свою художественную фотографию в форму поверх имеющейся, воспользовавшись еще одним объектом типа Image.
- •16. Вставьте в форму кнопки для подсвечивания фотографий – два объекта типа Button с названиями Button1 и Button2.
- •17. Запрограммируйте кнопку "Портретная фотография" так, чтобы после ее нажатия в форме появлялась портретная фотография.
- •18. Запрограммируйте кнопку "Художественная фотография" соответственно ее назначению (см. П. 17).
- •19. Выполните программу и убедитесь, что кнопки выполняют свои функции. Закройте окно программы "Анкета студента".
- •20. Сохраните созданную программу в своей папке.
- •21.Создайте exe-файл программы.
- •Задания
- •Лабораторная работа n 3
- •Задача про обмен валюты
- •Теоретические сведения
- •Ход работы
- •Откажитесь от возможности изменять размеры окна программы, придав свойству формы BoderStyle значение bsDialog.
- •Вставьте в форму два объекта типа RadioButton (переключатели), как показано на рисунке 1.
- •Запрограммируйте кнопку «Конец».
- •Запрограммируйте кнопку «Вычислить».
- •Создайте exe файл вашей программы.
- •Продемонстрируйте созданную форму преподавателю. Задания
- •Лабораторная работа n 4
- •Программирование циклов.
- •Объекты: Memo, MainMenu, PopurMenu, CheckBox, GroupBox
- •Задача табулирования функции
- •Теоретические сведения
- •Ход работы
- •Замените Caption формы с “Form1” на «Табулирование функции».
- •Табулирование функции
- •Табулирование функции
- •20. Запустите созданную программу и исследуйте ее работу.
- •Задания
- •Табулирование функции
- •Английский язик - тестирование
- •После размещения рисунков!!!
- •Теоретические сведения
- •Ход работы
- •2.Замените заголовок (Caption) формы с "Forml" на "Английский язык — тестирование".
- •3.Откажитесь от всех системных кнопок формы, задав значение False во всех позициях свойства Bordericons: biSystemMenu, biMinimize, biMaximize и biHelp.
- •4.Расположите на форме объекты так, как показан на рис. 1.
- •5. Дважды щелкните на первом таймере и запрограммируйте мигание сообщения "Обязательно нажмите на кнопку "Готово" после размещения рисунков!!!" так:
- •6. Введите описание глобальных переменных программы:
- •7. Вставьте рисунки factory.Bmp, shipping.Bmp и finance.Bmp с папки
- •8. Запрограммируйте конструктор формы tForm1::tForm1 и функцию Result() сообщения результатов теста:
- •10. Аналогично запрограммируйте соответствующие события для перетягивания двух других рисунков.
- •11. Создайте функцию lmageInShape для проверки расположения рисунка (объекта Image) в середине некоторой геометрической фигуры (объекта Shape).
- •13. Запрограммируйте второй таймер, который обеспечивает индикацию времени выполнения от 100 до 0% со скоростью, обратно пропорциональной к числу в cSpinEdit1.
- •Сохраните программу и проект в рабочей папке.
- •Запустите программу. Перетягивайте мышью рисунки в середину соответствующих фигур. Закончите работу. Задания
- •Лабораторная работа n 6 объектно-ориентированное программирование в
- •Создания собственных классов. Наследование и виртуальные функции. Интерпретатор математических выражений.
- •Теоретические сведения
- •Ход работы
- •6. Введите математические выражения в поля Edit1 и Edit2 и очистите поля результатов Edit3 и Edit4. Запрограммируйте кнопку „Выход".
- •7. Задайте начальную точность вычислений, которая равна двум десятичным знакам.
- •8. Запрограммируйте кнопку „Вычислить” так:
- •9. Запрограммируйте функцию, которая будет выполняться после изменения числа в поле ComboBox1.
- •Задания
- •2. Вычислите значение функции от двух переменных f(X,y).
- •Лабораторная работа n 7
- •Усовершенствования интерпретатора математических выражений. Вычисление первой и второй производной
- •Ход работы
- •Создайте форму, показанную на рис. 1.
- •Введите описания классов и функций, которые будут использоваться в этой задаче.
- •5.Запрограммируйте кнопку "Вычислить" таким образом:
- •6. Запрограммируйте функцию, которая будет выполняться после изменения числа y поле ComboBox1.
- •Сохраните программу и убедитесь в ее работоспособности. Задания
Задания
1. Постройте дерево выражения 3 * 4 + 2, воспользовавшись примером из части „Теоретические сведения и анализ задачи" этого параграфа.
Подсказка. Для этого вставьте в форму еще одну кнопку и три дополнительные поля редактирования для значений функции rezult() объектов p, m и а. Для вывода результатов в полях Edit воспользуйтесь функцией FloatToStr:
Edit5->Text = FloatToStrF(p.rezult(), ffFixed, 25, 8);
2. Вычислите значение функции от двух переменных f(X,y).
Подсказка. Для этого добавьте переменную y в описание функции form() и соответствующее поле Edit на форму.
Лабораторная работа n 7
РАЗВИТИЕ НАВЫКОВ ООП В C++ BUILDER
Усовершенствования интерпретатора математических выражений. Вычисление первой и второй производной
Цель работы. Развить навыки объектно-ориентированного программирования, использовав для реализации задачи про интерпретатор механизмы инкапсуляции, наследования, полиморфизма, динамического связывания и виртуальных функций.
Усовершенствовать интерпретатор математических выражений (см. лаб.7) с целью нахождения значения выражения и его производных произвольного порядка.
Применить интерпретатор для решения задачи о полете ракеты. Вычислить путь, скорость и ускорения ракеты, движение которой описывается математическим выражением, которые вводят в компьютер во время работы программы. В выражениях ограничиться операциями добавления, вычитания, умножения и деления, которые будут применяться к действительным числам и переменным.
Анализ задачи. Задачу будем решать по схеме, аналогичной к описанной в лаб. 7. Для этого создадим набор классов, связанных между собою такими отношениями наследственности:
Telement
Real Var Plus Minus Mult Div
Рис.1. Иерархическое дерево
где класс Real реализует число, Var - переменную, Plus, Minus, Mult, Div -арифметические операции „+”, „-“ , „*”, „/” соответственно. К описанию базового класса Telement из лаб.7 прибавим три виртуальные функции copy(), differ() и set_var():
c lass Telement {
protected:
Telement *left, *right;
Telement (Telement* L,Telement* R)
{
left = L; right = R;
}
public:
~Telement(void) {delete left; delete right;} virtual double rezult(void) {} virtual Telement* copy(void) {} virtual Telement* differ(void) {}
virtual void set_var(double X)
{
if (left) left -> set_var(X);
if (right) right -> set_var(X);
}
};
Функция set_var() предоставляет переменной x конкретное значение. В производном классе Var (переменная) эта функция будет переопределена. Во всех других классах set_var() не переопределяется, поэтому C++ осуществит вызов этой функции из базового класса, который приведет к рекурсивным вызовам ее вниз по дереву.
Функция differ() в производных классах должна возвращать указатель на новое дерево, которое определено дифференцированием поддерева, подвешенного к вершине вызова этой функции. Функция copy() создает в памяти копию дерева и возвращает указатель на его вершину. Эта функция есть вспомогательной и используется для реализации differ() в производных классах.
Рассмотрим реализацию класса Real:
class Real: public Telement{
double f;
public:
Real(doubleF):Telement(NULL,NULL){f=F;}
double rezult(void)
{
return f;
}
Telement* copy (void)
{return new Real(f);}
Telement* differ(void)
{return new Real(0);}
}
Функция copy() делает копию объекта и возвращает указатель на эту копию. Функция differ() возвращает указатель на созданный объект класса Real со значением нуля для поля f, поскольку производной любого действительного числа есть число 0.
Аналогично реализуется класс Var:
class Var:public Telement
{
double x;
public:
Var(double X = O):Telement(NULL, NULL)
{x = X;)
double rezult(void)
{return x;}
Telement* copy(void)
{return new Var(x);}
Telement* differ(void)
{return new Real(1.0);}
void set_var(double X) {x = X;}
Реализация этого класса подобна предыдущему. Функция Var::set_var() переопределяет виртуальную функцию из базового класса. Этот механизм определения переменной есть довольно удобным: вызовется функция set_var() с аргументом - значением переменной для вершины дерева, и по целому дереву все вершины типа Number будут наполнены этим значением (см. описание Var::set_var()). Вершины других типов лишь будут передавать вызов set_var() вниз по подчиненным ребрам (см. описание Tele-ment::set_var()). По умолчанию переменная инициализуется нулем, что видно из заголовка конструктора Var::Var().
Опишем класс Plus:
struct Plus:public Telement
{
Plus(Telement* L,Telement* R):Telement(L, R)
{};
double rezult(void)
{
return left -> rezult() + right -> rezult();
Telement* copy(void)
{
return new Plus(left -> copy(), right -> copy());
Telement* differ(void)
{
return new Plus(left -> differ(), right -> differ());
}
В функции Plus::differ() использовано правило дифференцирования суммы:
(u + v)’ = u' + v'. Итак, дифференцирование дерева
+ +
U V дает дерево: U’ V’
Аналогично создадим классы других арифметических операций:
struct Minus:public Telement
{
Minus(Telement* L,Telement* R):Telement(L, R)
doublerezult(void) {
return left->rezult() - right->rezult();
Telement* copy(void) {
return new Minus(left->copy(), right->copy());
Telement* differ(void) {
return new Minus(left->differ(), right->differ());
}
};
struct Mult:public Telement
{
Mult(Telement* L, Telement* R):Telement(L, R)
{};
double rezult(void)
{return left->rezult()*right->rezult();}
Telement* copy(void)
{return new Mult(left->copy(),right->copy());}
Telement* differ(void)
{
return new Plus(new Mult( left->differ(), right->copy()),
new Mult( left->copy(), right->differ()));
}
//—: —
struct Div:public Telement
{
Div(Telement* L,Telement* R):Telement(L, R) {};
double rezult(void)
{return left->rezult() / right->rezult();}
Telement* copy(void)
{return new Div(left->copy(), right->copy());}
Telement* differ(void)
{return new Div( new Minus(new Mult(left->differ(), right->copy()),
new Mult(left->copy(), right->differ())),
new Mult( right->copy(), right->copy()));
}
};
Теперь рассмотрим функцию form(), которая по заданным математическим
выражением строит дерево объектов.
//Декларация вспомогательной функции
int PosFromEnd(AnsiString s, AnsiString sub);
Telement* form(AnsiString s)
{
Telement* h;
int и, p, I = s.Length();
AnsiString s1, s2;
// Анализируем справа налево:
if ((p = PosFromEnd(s,"+")) > 1) // Если направляется на “+”
{
s1 = s.SubString(1, p - 1);
s2 = s.SubString(p + 1,1 - p);
h = new Plus(form(s1), form(s2)); //Создаем вершину Plus
}
else if ((p = PosFromEnd(s,"-")) > 1) // Если направляется на “-”
{
s1 =s.SubString(1, p-1);
s2 = s.SubString(p + 1,1 - p);
h = new Minus(form(s1), form(s2)); //Создаем вершину Minus
}
else if ((p = PosFromEnd(s, "*")) > 1) // Если наталкиваемся на ”*”
{
s1 =s.SubString(1, p-1);
s2 = s.SubString(p + 1,1 - p);
h = new Mult(form(s1), form(s2)); //Создаем вершину Mult
}
else if ((p = PosFromEnd(s, “/ ”)) > 1)// Если наталкиваемся на “/ ”
{
s1 =s.SubString(1, p-1);
s2 = s.SubString(p + 1,1 - p);
h = new Div(form(s1), form(s2)); // Создаем вершину Div
}
else if (s == "x") h = new Var(); // Создаем вершину Var
else
h = new Real(StrToFloat(s)); // Создаем Real
return h;
}
Эта функция аналогичная к приведенной в лаб.7 за исключением направления поиска операнда, ведь операции "-" и "/" не владеют свойством аддитивности. Строка с математическим выражением будем анализировать справа налево, поскольку арифметические операции одного порядка выполняются слева направо. В самом деле, поскольку корень дерева отвечает за последнюю операцию, которая будет выполняться, этот оператор в выражении будет размещен правее от других того же порядка. Опишем функцию, которая находит позицию из конца первой подстроки в этой строке:
l nt PosFromEnd(AnsiString s, AnsiString sub)
}
int I = s.Length();
AnsiString p;
p.SetLength(l);
for(int i = 1; i <= I ; i++)
p[l - i + 1] = s[i]; // Оборачиваем строку
if (p.Pos(sub) > 0)
return I - p.Pos(sub) + 1;
else return 0;
}
Выводы. Приобретенные навыки можно использовать для решения таких задач:
аналитическое исследование математических выражений;
нахождения значений функции для задачи табулирования функции и ее производных произвольного порядка;
построение графика функции, заданной аналитически, и ее производных произвольного порядка;
задание входных данных (математических функций) для пакетов прикладных программ решения задач математической физики.
