4 Розробка та виконання тестового прикладу
Даний проект був створений та розроблений на мові С++ у візуальному редакторі Microsoft Visual Studio 2012 Ultimate.
Основний етап створення проекту на основі діалогу з використанням бібліотеки MFC показано на рисунку 2.
Рисунок 5 – Робота з майстром додатків MFC
Дана програма зчитує вхідні дані з такого файлу:
Рисунок 6 – Файл з вхідними даними
Для рішення задачі та виведення результату на екран викорстивуємо пункти меню «обчислити» та «вивести на екран»:
Рисунок 7 – Виведення результату на екран.
У графічному вікні головної програми зображується рішення задачі, зображене на рисунку 8:
Рисунок 8 – Результат задачі.
Після проведеного тестування програми та всіх компонентів її меню ми впевнені що програма працює без помилок.
5 Інструкція користувача
Даний програмний продукт, розроблений під операційну систему сімейства Windows.
Мінімальні системні вимоги:
• Процессор Intel Pentium, AMD Athlon 233GHz;
• Оперативна пам’ять 64Mb;
• Відеокарта і монітор, що підтримують режим Super VGA;
• 20Mb вільного місця на диску;
• Клавіатура та миша.
Необхідне програмне забезпечення, для роботи програми:
• Microsoft Windows NT/2000/XP/2003/Vista/7/8;
• Microsoft Visual Studio 2010 (для відкриття проекту);
• Текстовий редактор (для відкриття вхідного файлу).
Щоб виконати обчислення за допомогою програми необхідно виконати наступні кроки:
1) Відкривши каталог з програмою, запустіть виконувальний файл proj1. З’явиться головне вікно програми. Це свідчить, про її готовність до роботи.
2) Відкрийте файл та вкажіть у ньому координати прямокутників
3) Збережіть файл та повертайтеся до програми.
4) Щоб виконати обчислення з задании у файлі координатами необхідно в головному меню, натиснути на пункт «Операції», у випавшому підменю обрати пункт «Задача», «Обчислити та вивести на екран».
5) Пункт «Вихід» здійснює завершення роботи програми.
ВИСНОВКИ
Курсова робота присвячена розробці програми для роботи з основними принципами ООП . Початком виконання курсової роботи стало дослідження різного роду інформаційних джерел та ознайомлення з теоретичними засадами; спроектовано зовнішній вигляд інтерфейсу та розподілено функції між його елементами . Розроблені схеми певних алгоритмів, підібрані програмні засоби для виконання завдання курсової роботи.
В ході роботи було створено програмну оболонку вирішуваної задачі і розроблено методи вирішення завдання Найменший та найбільший за периметром прямокутники, що перетинаються між собою, виділити окремим кольором.Таким чином в результаті виконання курсової роботи було відпрацьовано на практиці основні методи та засоби об’єктно-орієнтованого програмування.
Розроблений програмний засіб може використовуватися і як самостійний додаток, так і після модифікування додаток до більшої за обсягами програми, оскільки він розроблявся у відповідності до основних принципів ООП.
ПЕРЕЛІК ПОСИЛАНЬ
Давыдов Владимир Visual C++.Разработка Windows – приложений с помощью MFC и API – функцій / Владимир Давыдов– БХВ – Петербург 2008 559 с. - ISBN 978 – 5 – 9775 - 0157 – 6
Либерти Джесс. Освой самостоятельно C++ за 21 день / Джесс Либерти, Дэвид Хорват. — 4-е изд. — М.: Вильямс, 2007. — 448 с. —ISBN 0-672-32681-7
Переваги та недоліки [Електронний ресурс]. – Режим доступу: URL: http://applmath.lviv.ua/fileadmin/studworks/2010/Andrii_Chukhrai/good- and-bad-parts.html- Назва з екрану
Страуструп Б. Язык программирования C++ / Б. Страуструп — М.: Бином-Пресс, 2007. — 1104 с. — ISBN 5-7989-0223-4.
Семеренко В. П. Програмування мовами С та С++ в середовищі Windows. Навчальний посібник. / В.П. Семеренко – Вінниця: ВДТУ, 2002. – 128 с. –ISBN 966-651-069.
Каплун В. А. Методичні вказівки до виконання курсової роботи з дисципліни «Технологія програмування». Навчальний посібник. / В.А. Каплун – Вінниця: ВНТУ, 2010.
Понарин Я. П. Элементарная геометрия. В 2 тт./Я. Понарин — М.: МЦНМО, 2004. — С. 84-85. — ISBN 5-94057-170-0
Сидорина Татьяна Самоучитель Microsoft Visual Studio C++ и MFC / Татьяна Сидорина - БХВ-Петербург, 2009 г - 848 стр. - ISBN 978-5-9775-0284-9
ДОДАТКИ
Додаток А
(обов’язковий)
Головний код реалізації програми
proj1Dlg.cpp
#include "stdafx.h"
#include "proj1.h"
#include "proj1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Диалоговое окно CAboutDlg используется для описания сведений о приложении
void RTG::draw(HDC dc) //Функция рисования
{
::MoveToEx(dc,rt.left,rt.top,0); //Прыгаем в начальную точку
//Потом рисуем линии к следующим вершинам
::LineTo(dc,rt.right,rt.top);
::LineTo(dc,rt.right,rt.bottom);
::LineTo(dc,rt.left,rt.bottom);
::LineTo(dc,rt.left,rt.top);
}
void RTG::calcRt() //В этой функции производим расчет по точкам
{
rt.left=min(min(toc[0].x,toc[1].x),min(toc[2].x,toc[3].x)); //Находим самую левую координату
rt.top=min(min(toc[0].y,toc[1].y),min(toc[2].y,toc[3].y)); //Находим самую верхнюю координату
rt.right=max(max(toc[0].x,toc[1].x),max(toc[2].x,toc[3].x)); //Находим самую правую координату
rt.bottom=max(max(toc[0].y,toc[1].y),max(toc[2].y,toc[3].y)); //Находим самую нижнюю координату
S=(rt.right-rt.left)*(rt.bottom-rt.top); //Считаем площадь
P=((rt.right-rt.left)+(rt.bottom-rt.top))*2; //Считаем периметр
}
bool RTG::isIn(TOC & t) //Проверяем попала ли точка внутрь прямоугольника
{
if(t.x>rt.right||t.x<rt.left)return false;
if(t.y>rt.bottom||t.y<rt.top)return false;
return true;
}
bool RTG::isPeres(RTG * r) //Проверяем пересечение многоугольников
{
for(int i=0;i<4;++i) //Если хоть одна точка прямоугольника внутри другого прямоугольника - пересекаются
{
if(this->isIn(r->toc[0]))return true;
}
return false;
}
RTG::RTG(){toc=0;} //Конструктор класса
RTG::~RTG(){delete [] toc;} //Деструктор клсса
RTG **arr=0;
int n=0; //Количество прямоугольников в масиве
void addEl(TOC * toc) //Функция, добавляющая в масив новый прямоугольник по четырем точкам
{
RTG ** arr1=new RTG*[n+1]; //Создаем временный масив
for(int i=0;i<n;++i)arr1[i]=arr[i]; //Копируем в него старый
if(arr!=0)delete [] arr; //Удаляем старый
arr1[n]=new RTG; //Создаем во временном новый елемент
arr1[n]->toc=toc; //Присваеваем ему точки переданные в функцию
arr1[n]->calcRt(); //Считаем остальные данные
arr=arr1; //Делаем временный масив главным
n++; //Увеличиваем счетчик прямоугольников
}
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Данные диалогового окна
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
// Реализация
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// диалоговое окно Cproj1Dlg
// диалоговое окно Cproj1Dlg
Cproj1Dlg::Cproj1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(Cproj1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void Cproj1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(Cproj1Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_COMMAND(ID_32775, &Cproj1Dlg::OnInData)
ON_COMMAND(ID_32776, &Cproj1Dlg::OnVievCode)
ON_COMMAND(ID_32777, &Cproj1Dlg::OnCalculate)
ON_COMMAND(ID_32778, &Cproj1Dlg::OnShow)
ON_COMMAND(ID_32771, &Cproj1Dlg::OnAbout)
ON_COMMAND(ID_32774, &Cproj1Dlg::OnExit)
END_MESSAGE_MAP()
// обработчики сообщений Cproj1Dlg
BOOL Cproj1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Добавление пункта ''О программе...'' в системное меню.
return TRUE; // возврат значения TRUE, если фокус не передан элементу управления
}
void Cproj1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
CDialog::OnSysCommand(nID, lParam);
}
void Cproj1Dlg::OnDestroy() //После закрытия диалога очищаем данные
{
for(int i=0;i<n;++i)delete arr[i];
delete [] arr;
arr=0;
n=0;
}
void Cproj1Dlg::Calculate()
{
//Ввод
ifstream inp; //Переменная файла ввода
inp.open("inp_file.txt"); //Открываем файл
if(inp!=0)
{
while(!inp.eof()) //Пока не конец файла
{
TOC * toc=new TOC[5]; //Резервируем место под вершины прямоугольника
char ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr; //Пока не нашли "=" двигаемся дальше
if(ptr=='=')inp>>toc[0].x; //Если нашли "=" - считываем х вершины
else break;
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr; //Пока не нашли "=" двигаемся дальше
if(ptr=='=')inp>>toc[0].y; //Если нашли "=" - считываем у вершины
else break;
//Проделываем для 4 вершин
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr;
if(ptr=='=')inp>>toc[1].x;
else break;
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr;
if(ptr=='=')inp>>toc[1].y;
else break;
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr;
if(ptr=='=')inp>>toc[2].x;
else break;
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr;
if(ptr=='=')inp>>toc[2].y;
else break;
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr;
if(ptr=='=')inp>>toc[3].x;
else break;
ptr=0;
while(ptr!='='&&!inp.eof())inp>>ptr;
if(ptr=='=')inp>>toc[3].y;
else break;
ptr=0;
addEl(toc); //Добавляем прямоугольник в масив
}
inp.close(); //Закрываем файл
//Сортировка по площади
int sort=0;
while(sort==0)
{
sort++;
for(int i=0;i<n-1;++i)
{
if(arr[i]->S<arr[i+1]->S)
{
RTG * tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
sort=0;
}
}
}
//Вывод
ofstream out("out_file.txt"); //Открываем файл
for(int i=0;i<n;++i) //Для каждого прямоугольника
{
out<<"Прямоугольник "<<i+1<<": "; //Выводим
for(int j=0;j<4;++j) //Выводим 4 его вершины
{
out<<"x"<<j+1<<"="<<arr[i]->toc[j].x<<" y"<<j+1<<"="<<arr[i]->toc[j].y<<" ";
}
out<<endl;
}
out.close(); //Закрываем
//Сортировка по периметру
sort=0;
while(sort==0)
{
sort++;
for(int i=0;i<n-1;++i)
{
if(arr[i]->P<arr[i+1]->P)
{
RTG * tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
sort=0;
}
}
}
}
}
// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
// чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,
// это автоматически выполняется рабочей средой.
void Cproj1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Выравнивание значка по центру клиентского прямоугольника
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Нарисуйте значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this); // контекст устройства для рисования
if(arr!=0&&n!=0)
{
CPen gr(0,1,RGB(0,255,0)); //Создаем зеленую кисть
CPen *old; //Тут будем хранить старую кисть
for(int i=0;i<n;++i) //Для всех прямоугольников
{
if((i==0||i==n-1)&&arr[0]->isPeres(arr[n-1]))
{
old=dc.SelectObject(&gr);
}
//::Rectangle(dc,arr[i]->rt.left,arr[i]->rt.top,arr[i]->rt.right,arr[i]->rt.bottom);
arr[i]->draw(dc); //Вызываем функцию рисования
if((i==0||i==n)&&arr[0]->isPeres(arr[n-1])) //Если самый большей по периметру и самый маленький пересекаются - нужно выбрать старую краску
{
dc.SelectObject(old);
}
}
}
CDialog::OnPaint();
}
}
HCURSOR Cproj1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void Cproj1Dlg::OnInData()
{
// TODO: добавьте свой код обработчика команд
if(!CFileFind().FindFile(L"inp_file.txt")) //Если файла нет - создадим его
{
ofstream crt("inp_file.txt");
crt.close();
}
::ShellExecute(0,0,L"inp_file.txt",0,0,SW_SHOW); //Запускаем
}
void Cproj1Dlg::OnVievCode(){
// TODO: добавьте свой код обработчика команд
::ShellExecute(0,0,L"proj1.sln",0,L"../",SW_SHOW); //Запускаем
}
void Cproj1Dlg::OnCalculate(){
// TODO: добавьте свой код обработчика команд
Cproj1Dlg::Calculate();
}
void Cproj1Dlg::OnShow(){
// TODO: добавьте свой код обработчика команд
Invalidate();
}
void Cproj1Dlg::OnAbout(){
// TODO: добавьте свой код обработчика команд
CAboutDlg dlg;
dlg.DoModal();
}
void Cproj1Dlg::OnExit(){
// TODO: добавьте свой код обработчика команд
OnOK();
}
Додаток Б
(обов’язковий)
Класи головної програми
proj1Dlg.h
#pragma once
#include <fstream>
#include "iostream"
using namespace std;
// диалоговое окно Cproj1Dlg
class Cproj1Dlg : public CDialog{
// Создание
public:
Cproj1Dlg(CWnd* pParent = NULL); // стандартный конструктор
// Данные диалогового окна
enum { IDD = IDD_PROJ1_DIALOG };
static void Calculate();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
// Реализация
protected:
HICON m_hIcon;
// Созданные функции схемы сообщений
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnInData();
afx_msg void OnVievCode();
afx_msg void OnCalculate();
afx_msg void OnShow();
afx_msg void OnDestroy();
afx_msg void OnAbout();
afx_msg void OnExit();
};
struct TOC //Структура точки
{
int x; //x точки
int y; //у точки
};
class RTG //Клас прямоугольников
{
public:
RECT rt; //Прямоугольник
TOC *toc; //Точки
int S; //Площадь
int P; //Периметр
void calcRt(); //В этой функции производим расчет по точкам
void draw(HDC dc); //Функция рисования
bool isIn(TOC & t);//Проверяем попала ли точка внутрь прямоугольника
bool isPeres(RTG * r); //Проверяем пересечение многоугольников
RTG(); //Конструктор класса
~RTG(); //Деструктор клсса
}; //Наш масив указателей на прямоугольники
extern RTG **arr;
extern int n;
