13 авг. 2010 г.

Площадь и периметр треугольника

Площадь треугольника

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

Периметр треугольника

Периметр (др.-греч. περίμετρον — окружность, др.-греч. περιμετρέο — измеряю вокруг) — общая длина границы фигуры (чаще всего на плоскости). Имеет ту же размерность величин, что и длина. Иногда периметром называют границу геометрической фигуры.

Треугольник

Треугольник — простейший многоугольник, имеющий 3 вершины (угла) и 3 стороны; часть плоскости, ограниченная тремя точками, и тремя отрезками, попарно соединяющими эти точки.
Если все три точки треугольника лежат на одной прямой, он называется вырожденным.

Цель работы

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

Задача программы

В меню программы создать 3 пункта: ввод, результаты, выход. При выборе пункта меню ввод открывать диалоговое окно с 3-мя полями для ввода соответствующим 3-м сторонам треугольника. При выборе пункта меню «результаты» открывать диалоговое окно с результатами вычислений площади и периметра заданного треугольника. При выборе пункта меню «выход» производить выход из программы.

Cкриншот работы программы

Площадь и периметр треугольника

Ход выполнения задачи программы

Создаем пункты меню по выбору которых будут открываться различные диалоговые окна. Для этого изменяем ресурс Menu
Площадь и периметр треугольника
Создаем диалоговые окна которые будут открыты при выборе пунктов меню. Так как любым диалоговым окном проще управлять через класс, то следует создать класс на основе классаCDialog из библиотеки MFC. Для этого в окне “Class View” добавляем новый класс
Площадь и периметр треугольника
Создаем MFC Class и мастеру создания классов указываем имя нашего класса и имя базового класса. Мастер автоматически создаст несколько файлов и в ресурсы добавит диалоговое окно. Созданный заголовочный файл в дальнейшем придется подключать к основному вручную.
Площадь и периметр треугольника
Проделав это действие 2 раза получаем 2 диалоговых окна, отредактировать которые можно в ресурсах. Первое диалоговое окно будет играть роль формы для ввода данных.
Площадь и периметр треугольника
Для того что бы получить информацию из элементов “Edit Control”, которые во время работы программы пользователю нужно будет заполнить, нам необходимо связать каждый из них с переменными в классе этого диалогового окна. В окне мастера следует только заполнить поле“Variable name”.
Площадь и периметр треугольника
Завершив с визуальным редактированием диалоговых окон их необходимо связать с пунктами в меню, сделать так что бы при выборе пункта меню открывался нужный нам диалог. Для этого необходимо добавить обработчик события выбора соответствующего пункта меню.
Площадь и периметр треугольника
В окне мастера следует только указать главный класс приложения (обычно он называется CпроектApp, где “проект” это название вашего проекта).
К сожалению описывать процедуру открытия диалогового окна следует вручную.
Для того что бы открыть диалоговое окно следует создать объект класса диалогового окна и вызвать метод DoModal(). Получается следующий код:
1void Claba3App::OnFileEnter()
2{
3    CMyDialog myDlg;
4    myDlg.DoModal();
5}
В таком виде компилятор будет жаловаться на тип CMyDialog, поэтому следует подключить заголовочный файл описывающий этот класс.

#include “MyDialog.h”

Теперь для того что бы данные введенные пользователем сохранялись следует описать событие“Нажатие на кнопку ОК”.
01void CMyDialog::OnBnClickedOk()
02
03{
04    CString tmp;
05    double a, b, c, p;
06    Aedit.GetWindowText(tmp);
07    a = _ttoi(tmp);
08    BEdit.GetWindowText(tmp);
09    b = _ttoi(tmp);
10    CEdit.GetWindowText(tmp);
11    c = _ttoi(tmp);
12    theApp.SetPerimiter(a+b+c); // периметр
13    p = (a + b + c) / 2;
14    theApp.SetSquare(sqrt(p*(p-a)*(p-b)*(p-c)));
15    OnOK();
16}
Введенные пользователем данные не хранятся в чистом виде, они сразу обрабатываются и записывается только результат обработки, для того что бы не производить вычисления каждый раз при запросе результатов (запрос исходных данных не был предусмотрен заданием). Приведенная функция использует методы объекта theApp SetPerimiter и SetSquare. Они были добавленны в класс приложения для сохранения результатов вычислений.
Для реализации работы дилогового окна показывающего результаты вычислений необходимо изменять содержимое этого диалогового окна при его открытии, создании. Проще всего это сделать перегрузив виртуальную вункцию базового класса OnInitDialog().
В обьявлении класса CCalcDlg:

afx_msg BOOL OnInitDialog();

В определении класса CCalcDlg:
01void CMyDialog::OnBnClickedOk()
02
03BOOL CClacDlg::OnInitDialog()
04
05{
06    CDialog::OnInitDialog();
07
08    CString tmp;
09    double tt = theApp.GetPerimiter();
10    tmp.Format(L"%f", tt);
11    perimiter.SetWindowText(tmp);
12
13    tmp.Format(L"%f", theApp.GetSquare());
14    square.SetWindowText(tmp);
15    return true;
16}
Следует обратить внимание на то что в первую очередь необходимо вызвать этот метод в базовом классе, иначе во время работы произойдет ошибка в функции SetWindowText из библиотеки MFC, потому как она будет вызвана для еще непроинициализированного обьекта.

Выводы из проделанной задачи программы

Проделав данную работу, мы отметили для себя основные преимущества и недостатки использования мастеров для генерации кода в Microsoft Visual Studio 2008.
К недостаткам можно отнести: если допустить описку в форме мастера, то получив неправильный результат его сложно исправить; код, полученный в результате работы мастера нельзя назвать чистым; с разными версиями MVS мастера очень сильно меняются. К достоинствам лишь то, что их использование может немного сократить время создания базовой архитектуры программы, описывать работу всех элементов и созданных классов придется исключительно вручную.
Содержание архива:
  • .cpp файл
  • отчет в формате .doc
  • .exe файл в папке debug
Проект разработан в: Visual Studio 2008