Учебная работа. Реферат: Разработка программы на языке С для построения сложных геометрических фигур на плоскости
Кафедра Вычислительной Техники
и Защиты инфы
Объяснительная записка
к курсовой работе
по дисциплине: «Способы программирования и прикладные методы»
по теме:
«Разработка программки на языке С++ для построения сложных геометрических фигур на плоскости
»
Выполнил студент:
Митряхин А.В.
Факультет: ИРТ
Группа: ЗИ-134
Принял доцент, к.т.н.:
Бабич М. В.
Уфа 2007 г.
Содержание
1. Постановка задачки и начальные данные….………………….…………………..…3
2. Математическое обеспечение ……………………………………..…………….…4
3. Описание работы программки и приобретенные результаты при решении поставленной задачки ….…………………………………………………..……..……..5
4. Разработка метода программки в виде блок-схемы…………………………….8
5. Короткое описание способностей среды программирования
MicrosoftVisualC++………..………….……………………………………………….9
6. Выводы………………………………….……………………….…………….……14
7. Перечень применяемой литературы…….…………………………………………..15
8. приложение А………………….…………………………………………….……..16
Постановка задачки
Задание:
Создать программку для построения изображения фигуры, приведенной на рисунке. Начальные данные (x1,y1,R1,x2,y2,r2,x3,y3,r3) должны быть считаны из избранного юзером файла. Производить проверку начальных данных на соответствие варианту (две окружности находятся снутри третьей).
Математическое обеспечение
Разрабатывать программку для построения изображения фигуры будем по последующему методу:
1) Начальные данные (x1,y1,R1,x2,y2,r2,x3,y3,r3) считываем из избранного юзером файла.
2) Осуществляем проверку начальных данных: две окружности находятся снутри третьей.
Если сразу производятся условия:
(R1 > 0), (R1 > 2*r2), (R1 > 2*r3), ((x2 — r2) > x3), sqrt((x2 — X1)*(x2 — X1) + (y2 — Y1)*(y2 — Y1)) + r2 < R1,
sqrt((x3 — X1)*(x3 — X1) + (y3 — Y1)*(y3 — Y1)) + r3 < R1,
тогда начальные данные верны. Потом производится построение фигуры. В случае ошибки программка выдает сообщение ”Can’t load params”, другими словами разыскиваемые данные не соответствуют варианту.
Описание работы программки и приобретенные результаты при решении поставленной задачки
Рис. 1. Основное окно программки.
программка создана для построения сложной геометрической фигуры (набросок 1).
В диалоге программки имеются две клавиши и поле MFC_DIALOG. В этом поле отображается итог той либо другой функции.
Опосля пуска программки юзер надавливает на клавишу ”Load”, которая вызывает обычное окно для открытия документа. В новеньком диалоге выбирает файл для считывания начальных данных (набросок 2). И опосля того, как юзер изберет верный
файл функция OnBtnLoad() нарисует в точности то, что изображено на рисунке 5, а это то, что и требовалось. Если файл содержит величины не надлежащие условию задачки, тогда функция OnBtnLoad() выведет сообщение ”Can’tloadparams”, другими словами начальные данные не верны.
Рис. 2
Клавиша ”Update” создана для обновления изображения фигуры, опосля исправления данных (x1,y1,R1,x2,y2,r2,x3,y3,r3), которые считываются из избранного юзером файла (набросок 3).
Рис. 3
сейчас разглядим другую ситуацию, когда юзер избрал не верный файл:
Если такое случилось, то код функции OnBtnLoad() предупредит нас о этом сообщением (набросок 4).
Рис. 4
Результат работы приложения приведен на рисунке 5.
Рис. 5
Итог сделанного проекта.
Разработка метода программки в виде блок-схемы
Блок-схема для функции OnBtnLoad()
Среда программирования
Microsoft
Visual
C
++
Введение
C++ — это попытка решения разрабами языка С задач объектно-ориентированного программирования (ObjectOrientedProgramming, OOP). Построенный на жестком фундаменте С, С++ кроме ООР поддерживает огромное количество остальных нужных инструментов, не жертвуя при всем этом ни мощью, ни элегантностью, ни гибкостью С. С++ уже стал всепригодным языком для программистов всего мира.
С++ был разработан сотрудником научно-исследовательского центра AT&TBellLaboratories(Нью-Джерси, США
C++ — всепригодный язык программирования, загаданный так, чтоб создать программирование наиболее приятным для сурового программера. Кроме второстепенных деталей C++ является надмножеством языка программирования C. Кроме способностей, которые дает C, C++ предоставляет гибкие и действенные средства определения новейших типов. Используя определения новейших типов, буквально отвечающих концепциям приложения, программер может делить разрабатываемую программку на просто поддающиеся контролю части. Таковой способ построения программ нередко именуют абстракцией данных. информация о типах содержится в неких объектах типов, определенных юзером. Такие объекты ординарны и надежны в использовании в тех ситуациях, когда их тип недозволено установить на стадии компиляции. Программирование с применением таковых объектов нередко именуют объектно-ориентированным. При правильном использовании этот способ дает наиболее недлинные, проще понимаемые и легче управляемые программки.
Главным понятием C++ является класс. Класс — это тип, определяемый юзером. Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных юзером, динамическое задание типа, контролируемое юзером управление памятью и механизмы перегрузки операций. C++ предоставляет еще наилучшие, чем в C, средства выражения модульности программки и проверки типов. В языке есть также усовершенствования, не связанные конкретно с классами, включающие в себя символические константы, inline- подстановку функций, характеристики функции по дефлоту, перегруженные имена функций, операции управления вольной памятью и ссылочный тип. В C++ сохранены способности языка C по работе с главными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это дозволяет очень отлично реализовывать типы, определяемые юзером.
C++ и его обычные библиотеки спроектированы так, чтоб обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из C++ программ можно употреблять C библиотеки, и с C++ можно употреблять огромную часть инструментальных средств, поддерживающих программирование на C.
Microsoft Visual C++
и
MFC
MFC расшифровываетсякак Microsoft Foundations Classes. Это библиотека, которая употребляется для программирования под Windows на Visual C++. Сам язык C/C++ хотя и дозволяет программировать под Windows, но с большенными трудностями. Так, для сотворения простого приложения (окно, которое можно двигать по экрану, минимизировать и максимизировать) нужно написать несколько 10-ов строчек кода. При помощи MFC вы это сделаете значительно резвее. MFC инкапсулирует в себя почти все рутинные операции, с которыми сталкивается программер при разработке программ по Windows.
вместе с MFC есть и остальные библиотеки для Windows-программирования. к примеру VCL (Visual Component Library) от Borland. Она употребляется в продуктах Borland’а — C++ Builder и Delphi (бесспорный плюс всего этого — исследовав VCL, вы можете работать и в Delphi, и в C++ Builder).
Но на данный момент эталон это всё-таки MFC. И даже в C++ Builder вы сможете употреблять MFC.
процесс разработки Windows-программы в Visual C++ начинается с сотворения новейшего проекта и подготовки набора начальных файлов. Ранее их приходилось созодать вручную, сейчас всю работу берет на себя «мастер» AppWizard.
AppWizard — это особый инструмент для генерации программных текстов. В процессе его работы на дисплее отображается последовательность диалоговых окон, где задаются главные вопросцы, касающиеся хотимых параметров создаваемой программки. Получив ответы, AppWizard генерирует текст базисной программки (скелет программки), содержащий все ее неотклонимые элементы.
Классы графического интерфейса
Весь вывод в системе Windows реализован на принципе унификации работы с таковыми на физическом уровне разными устройствами, как экран монитора, принтеры, плоттеры, и.т.п. Для всех этих устройств, приложение употребляет одни и те же функции и, в общем случае, может «не думать» над тем, куда будет выведена строчка текста либо какой-нибудь графический объект. Система сама распознает устройство ввода и активизирует соответственный драйвер. Таковой подход, с одной стороны, обеспечивает универсальность процесса графического вывода, а с иной – дозволяет, к примеру, создавать платы графических акселераторов, которые без помощи других, без использования центрального микропроцессора производят преобразования установок рисования, значительно разгружая тем всю систему в целом.
Для реализации такового подхода в Windowsпредусмотрен особый объект, именуемый контекстом устройства. Конкретно он хранит нужную информацию, как о устройстве вывода, так и о параметрах соответственно рисования. На физическом уровне весь вывод происходит, естественно, на конкретное устройство, представленное в системе контекстом, описываемым, в свою очередь, дескриптором. Крайний употребляют (в качестве параметра) все функции графического вывода Win32 API, т.е. при всем этом задействуется объект «контекст устройства», до чего же MFC-приложению нет никакого дела – оно работает с объектами классов библиотеки MFC, что значительно удобнее и надежнее.
CDC – базисный класс для всех классов, инкапсулирующих контексты устройств Windows. Объекты этого класса употребляются для работы со всем экраном монитора либо с таковым устройством, как принтер.
CClientDC – объекты этого класса обеспечивают доступ к клиентской части окна. Употребляется для графического вывода в хоть какой функции. При разработке объекта класса CClientDC в конструкторе вызывается функция Win32 APIGetDC, а при разрушении, в деструкторе – ReleaseDC, также из Win32 API, обеспечивая нужные операции для подготовки и окончания процесса графического вывода конкретно и лишь в клиентскую часть окна. За создание объекта класса CClientDC отвечает разраб приложения.
Графические объекты
Настройка характеристик графического вывода проводится 2-мя способами. Одни характеристики настраиваются с помощью вызова функций Win32 APIили функций-членов класса CDC и производных от него, остальные – методом подмены так именуемых графических объектов. библиотека MFC обеспечивает разрабов всеми необходимыми классами, которые инкапсулируют надлежащие графические объекты Windows. Не считая того, библиотека имеет в собственном составе доп классы, существенно облегчающие решение ряда задач (например классы CPointи CRect).
CPen – инкапсулирует объект Windows «карандаш», который быть может избран (назначен) в контекст устройства и употребляться для определения типа и цвета линий и границ фигур.
CBrush – Инкапсулирует объект Windows «кисть», который быть может избран (назначен) в контекст устройства и употребляться для определения типа и цвета заливки внутренних областей замкнутых фигур.
Сделать объекты CPenи CBrush можно 2-мя методами:
1. Конструктор употребляется как для сотворения фактически объекта, так и для его инициализации.
2. Кроме использования конструктора, лишь создающего объект класса, добавочно требуется вызов инициализирующей функции.
2-ой метод лучше, т.к. невозможность инициализации, к примеру, в случае исчерпания соответственных системных ресурсов, легче найти при вызове конкретно функции инициализации. В неприятном случае для гарантии защиты от ошибок, точнее, для их своевременного обнаружения будет нужно механизм обработки исключений.
Настройка режимов отображения
Функции данной группы устанавливают и настраивают систему координат, которая употребляется всеми функциями вывода – координаты вывода задаются конкретно в логических единицах. Не считая единиц по осям Xи Y, функции данной группы задают направление осей и начало координат. Фактически все функции группы реализованы парами. Функции с префиксом Get разрешают получить текущее области вывода, (до этого всего окна). При всем этом ось X ориентирована слева вправо, а ось Y – сверху вниз. Единица измерения – один пиксель (режим MM_TEXT). К слову сказать, конкретно потому на разных устройствах, вследствие различий в размерах пикселя, фактический (зрительный) размер по оси X может не соответствовать размеру по оси Y.
Для опции системы координат в Windows употребляются два понятия – физическая область вывода (viewport), координаты и размеры которой задаются в физических единицах – пикселях, и логическая область вывода (window), координаты и размеры которой задаются в логических единицах, определяемых размером рисования.
И физическая и логическая области вывода характеризуются точкой, определяющей начало координат. Для опции начала координат физической области вывода употребляются функции:
virtual CPoint CDC::SetViewportOrg(int x, int y) либо
virtual CPoint CDC::SetViewportOrg(
Для опции логической области вывода употребляются последующие функции:
CPoint CDC::SetWindowOrg(int x, int y) либо
CPoint CDC::SetWindowOrg(
Все четыре функции в качестве характеристик получают новейшие значения для установки начала координат, а возвращают прошлые значения. Тут есть одна тонкость: если для физической области вывода указываются координаты, которые в предстоящем будут являться началом координат, то для логической области вывода указываются логические координаты, которые в предстоящем будут соответствовать левому верхнему углу логической области вывода.
Из вышесказанного следует, что есть смысл настраивать начало координатной сетки лишь для одной из областей, т.к система координат логической области вывода относительна системе координат физической области.
Рисование линий
Функции данной группы предусмотрены для рисования прямых (LineTo), гладких (Arc, ArcTo) и ломаных линий (Polyline, PolylineTo), установленным на момент рисования карандашом. Часть функций меняют при всем этом текущее положение карандаша, остальные – нет. Даже если в итоге рисования контур выходит замкнутым, закрашивание не осуществляется.
Класс
CFileDialog
Этот класс отвечает за создание и работоспособность 2-ух блоков диалога: один дозволяет избрать файл для его следующего открытия, а иной предназначен для выбора места расположения и имени файла при его сохранении.
Ниже описаны некие главные функции класса.
CFileDialog::CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
LPCSTR lpszFilter = NULL,
CWnd *pParentWnd = NULL) – конструктор класса, делает объект «обычный блок диалога».
Если параметр bOpenFileDialog равен TRUE, создается объект «блок диалога FileOpen (Открытие файла)» и объект «блок диалога FileSaveAs (Сохранение файла)», если bOpenFileDialog равен FALSE.
virtualintCFileDialog::DoModal() – вызов данной функции выводит на экран модальный обычный блок диалога для открытия либо сохранения файла. При успешном окончании функция возвращает IDOKили IDCANCELв зависимости от того, с помощью какой клавиши юзер закрыл блок диалога.
Для того чтоб получить имя файла, определенное юзером в блоке диалога, в классе реализованы несколько функций:
virtualCStringCFileDialog::GetPathName() – возвращает полное имя файла, включая путь.
virtualCStringCFileDialog::GetFileName() – возвращает имя файла с расширением.
virtual CString CFileDialog::GetFileExt() – возвращаетрасширениеименифайла.
virtual CString CFileDialog::GetFileTitle() – возвращаетимяфайлабезрасширения.
Выводы
В процессе выполнения курсовой работы были получены базы разработки Windows – приложений с внедрением MFС. Был освоен объектно-ориентированный язык программирования VisualC++.
В итоге работы была написана программка, которая строит изображение фигуры, приведенной на рисунке 5. При начальных данных (x1, y1,R1, x2, y2, r2, x3, y3, r3), которые должны быть считаны из избранного юзером файла. Выполнил проверку начальных данных на соответствие варианту: две окружности находятся снутри третьей.
Перечень применяемой литературы
1. Шилдт Герберт «Полный справочник по С++»- 4-е издание.: Пер.с англ. – М.: Издательский дом «Вильямс», 2002.- 704с.: ил.
2. Мешков А., Тихомиров Ю. «VisualC++ и MFC» — СПб.:БХВ-Петербург. 2002 – 1017с.
3. Карпов Б., Баранов Т. «С++: особый справочник» — СПб.: Питер, 2001. – 480 с.:ил.
4. Базы Microsoft Visual Studio. Net 2003/ Пер. с англ. — М.:Издательство- торговый дом «Российская редакция», 2003.-464 с: ил.
5. Круглински Д., Уингоу С, Шеферд Дж. «Программирование на Microsoft Visual C++ 6.0 для экспертов»/Пер. с англ.- СПб: Питер, М.:Издательсво- торговый дом «Российская Редакция», 2004.- 861 с.:ил.
6. Бьярн Страуструп « Введение в язык СИ++», 1995
Приложение А
CMyDlg.cpp
#include «stdafx.h»
#include «4ertejmfc.h»
#include «4ertejmfcDlg.h»
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) // конструктор класса, делает объект “обычный блок
диалога”
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_Message_MAP(CMyDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BUTTON2, &CMyDlg::OnBtnUpdate)
ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnBtnLoad)
END_Message_MAP()
// обработчики сообщений
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big Icon
SetIcon(m_hIcon, FALSE); // Set small Icon
return TRUE;
}
void CMyDlg::OnPaint()
{
CPaintDCdc(this); // контекст устройств для рисования
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRectrect; // объявили о разработке объекта класса CRect
GetClientRect(&rect); //передаем размеры иконки в объект Rect
int x = (rect.Width() — cxIcon + 1) / 2;
int y = (rect.Height() — cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon); //рисование
}
else
{
k_Draw.Draw(&dc);
}
}
HCURSOR CMyDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMyDlg::OnBtnLoad()
*.txt
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
this->RedrawWindow();
}
// функция OnSize вызывается при всяком изменении размера окна
void CMyDlg::OnBtnUpdate()
{
if(k_filePath.GetLength() <= 0)return;
if(!k_Draw.LoadParamFromFile(k_filePath.GetString()))
this->MessageBox(_T(«Can’t load params»));
this->RedrawWindow();
}
Рисование
#include «StdAfx.h»
#include «Draw.h»
#include <Math.h>
inline int sqrt(int arg){return (int)sqrt((double) (arg)); }
CDraw::CDraw(void):
isCorrectState(false)
{
}
CDraw::~CDraw(void)
{
}
bool CDraw::LoadParamFromFile(const TCHAR* Path)
{
CStdioFile file;
if(!file.Open(path, CStdioFile::modeRead | CStdioFile::typeText))return false;
CString strs[9];
for(int i = 0; i < 9; i++)
{
if(!file.ReadString(strs[i]))
{
file.Close();
return false;
}
}
int i = 0;
X1 = _tstoi(strs[i++].GetString());
Y1 = _tstoi(strs[i++].GetString());
R1 = _tstoi(strs[i++].GetString());
x2 = _tstoi(strs[i++].GetString());
y2 = _tstoi(strs[i++].GetString());
r2 = _tstoi(strs[i++].GetString());
x3 = _tstoi(strs[i++].GetString());
y3 = _tstoi(strs[i++].GetString());
r3 = _tstoi(strs[i++].GetString());
//test
isCorrectState =
(R1 > 0) &&
(R1 > 2*r2) && (R1 > 2*r3) &&
((x2 — r2) > x3) &&
sqrt((x2 — X1)*(x2 — X1) + (y2 — Y1)*(y2 — Y1)) + r2 < R1 &&
sqrt((x3 — X1)*(x3 — X1) + (y3 — Y1)*(y3 — Y1)) + r3 < R1 ;
return isCorrectState;
}
bool CDraw::Draw(CPaintDC* pDC)
DT_BOTTOM
]]>