Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursova.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
371 Кб
Скачать
☆

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) Пункт «Вихід» здійснює завершення роботи програми.

ВИСНОВКИ

Курсова робота присвячена розробці програми для роботи з основними принципами ООП . Початком виконання курсової роботи стало дослідження різного роду інформаційних джерел та ознайомлення з теоретичними засадами; спроектовано зовнішній вигляд інтерфейсу та розподілено функції між його елементами . Розроблені схеми певних алгоритмів, підібрані програмні засоби для виконання завдання курсової роботи.

В ході роботи було створено програмну оболонку вирішуваної задачі і розроблено методи вирішення завдання Найменший та найбільший за периметром прямокутники, що перетинаються між собою, виділити окремим кольором.Таким чином в результаті виконання курсової роботи було відпрацьовано на практиці основні методи та засоби об’єктно-орієнтованого програмування.

Розроблений програмний засіб може використовуватися і як самостійний додаток, так і після модифікування додаток до більшої за обсягами програми, оскільки він розроблявся у відповідності до основних принципів ООП.

ПЕРЕЛІК ПОСИЛАНЬ

  1. Давыдов Владимир Visual C++.Разработка Windows – приложений с помощью MFC и API – функцій / Владимир Давыдов– БХВ – Петербург 2008 559 с. - ISBN 978 – 5 – 9775 - 0157 – 6

  2. Либерти Джесс. Освой самостоятельно C++ за 21 день / Джесс Либерти, Дэвид Хорват. — 4-е изд. — М.: Вильямс, 2007. — 448 с. —ISBN 0-672-32681-7

  3. Переваги та недоліки [Електронний ресурс]. – Режим доступу: URL: http://applmath.lviv.ua/fileadmin/studworks/2010/Andrii_Chukhrai/good- and-bad-parts.html- Назва з екрану

  4. Страуструп Б. Язык программирования C++ / Б. Страуструп — М.: Бином-Пресс, 2007. — 1104 с. — ISBN 5-7989-0223-4.

  5. Семеренко В. П. Програмування мовами С та С++ в середовищі Windows. Навчальний посібник. / В.П. Семеренко – Вінниця: ВДТУ, 2002. – 128 с. –ISBN 966-651-069.

  6. Каплун В. А. Методичні вказівки до виконання курсової роботи з дисципліни «Технологія програмування». Навчальний посібник. / В.А. Каплун – Вінниця: ВНТУ, 2010.

  7. Понарин Я. П. Элементарная геометрия. В 2 тт./Я. Понарин — М.: МЦНМО, 2004. — С. 84-85. — ISBN 5-94057-170-0

  8. Сидорина Татьяна Самоучитель 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;

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