Разработка программы для расчета площади треугольника по двум сторонам и углу между ними

Создание программы на языке Visual C++ с использованием библиотеки MFC для тестирования знаний пользователя в области геометрии. Генерирование тестовых заданий, введение ответа, оценка результата; логическая структура приложения; техническое обеспечение.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.06.2011
Размер файла 2,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

АННОТАЦИЯ

Курсовой проект посвящен созданию программы на языке Visual C++ с использование библиотеки MFC.

В этой работе представлена программа, которая тестирует знания пользователя в области геометрии. Данное приложение генерирует пять заданий и предлагает ввести пользователю ответ. После окончания тестирования выводит результаты.

Пояснительная записка содержит 42 страницы, 10 рисунков, 2 таблицы, 2 приложения.

СОДЕРЖАНИЕ

Аннотация

Введение

1. Теоретическая часть разработки приложений с использованием библиотеки MFC

1.1 Обработка сообщений

1.2 Карта сообщений

1.3 Диалоговые окна

2. Общая часть

2.1 Общие сведения о приложении

2.2 Функциональное назначение

2.3 Описание логической структуры

2.4 Требования к техническому обеспечению

2.5 Вызов программы

2.6 Входные данные

2.7 Выходные данные

2.8 Описание тестовых прогонов

Заключение

Список используемой литературы

Приложение 1

Приложение 2

ВВЕДЕНИЕ

Среда программирования Visual Studio используется не только для редактирования, компиляции и отладки программ, но и для генерации их заготовок. Эти заготовки представляют собой работоспособные программы, реализующие основные элементы интерфейса Windows, необходимые в любой пользовательской программе, и, естественно, не выполняющие никакой обработки.

Библиотека MFC является одной из основных библиотек языка Visual C++. Она используется для работы с элементами управления окон Windows и обработки поступающих от них сообщений. Применение данной библиотеки существенно облегчает написание программ на языке Visual C++.

1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ РАЗРАБОТКИ ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ MFC

Пакет Microsoft Foundation Classes (MFC) -- библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путем использования богатого набора библиотечных классов.

Библиотека MFC, как и её основной конкурент, Borland VCL, облегчает работу с GUI путем создания ''каркаса приложения'' -- «скелетной» программы, автоматически создаваемой по заданному макету интерфейса и полностью берущей на себя рутинные действия по его обслуживанию (отработка оконных событий, пересылка данных между внутренними буферами элементов и переменными программы и т.п.). Программисту после генерации каркаса приложения необходимо только вписать код в места, где требуются специальные действия. Каркас должен иметь вполне определенную структуру, поэтому для его генерации и изменения в Visual C++ предусмотрены мастера. Кроме того, MFC предоставляет объектно-ориентированный слой оберток над множеством функций Windows API, делающий несколько более удобной работу с ними. Этот слой представляет множество встроенных в систему объектов (окна, виджеты, файлы и т. п.) в виде классов и опять же берет на себя рутинные действия вроде закрытия дескрипторов и выделения или освобождения памяти [1].

Добавление кода приложения к каркасу реализовано двумя способами. Первый использует механизм наследования: основные программные структуры каркаса представлены в виде классов, наследуемых от библиотечных. В этих классах предусмотрено множество виртуальных функций, вызываемых в определенные моменты работы программы.

Второй способ используется для добавления обработчиков оконных событий. Мастер создает внутри каркасов классов, связанных с окнами, специальные массивы -- ''карты оконных сообщений''. При добавлении или удалении обработчика мастер вносит изменения в соответствующую карту сообщений.

Мастер создания приложений MFC позволяет создавать четыре вида приложений:

- диалоговые приложения;

- однооконные приложения;

- многооконные приложения;

- приложения с несколькими документами верхнего уровня.

Диалоговые приложения рассматриваются корпорацией Microsoft как простейший тип приложения, которое не должно иметь никаких меню, кроме системного, а также не может открывать или сохранять информацию в файле. Оба эти ограничения могут быть обойдены, однако при этом возникают определенные сложности. Другое неудобство, возникающее при работе с диалоговыми приложениями, связано с тем, что, по мнению разработчиков Visual C++, считывание из него информации должно производиться только при его закрытии, что исключает взаимодействие его элементов управления [1]. Поэтому очень часто возникают сложности при необходимости вывести в одном элементе управления изменения, произведенные в другом элементе управления. Особые сложности возникают в том случае, если изменения вносятся в текстовое поле. Диалоговое приложение является полноценным приложением Windows, в котором может быть использована поддержка технологии ActiveX, что позволяет решить вопрос с передачей данных в приложение и из приложения [3].

1.1 Обработка общений

Для того чтобы иметь возможность работать с каким-либо устройством, например с клавиатурой или мышью, программам DOS приходилось постоянно отслеживать состояние этих устройств и ожидать их реакции на посланные им сообщения. В Windows картина кардинально меняется. Данная система управляется сообщениями и уже не программа ожидает реакции от устройства, а сообщение о реакции устройства запускает ту или иную программу. Та часть программы, которая запускается в ответ на конкретное сообщение, называется функцией его обработки.

Большую часть работы по передаче сообщений и вызову соответствующих функций обработки берут на себя внутренние процедуры Windows и функции библиотеки MFC. Однако, поскольку в большинстве случаев посылка сообщения является единственной возможностью обеспечить интерфейс между отдельными частями программы пользователя, прежде чем приступить к детальному рассмотрению различных программ, необходимо глубже познакомиться с механизмом работы с сообщениями.

Для идентификации сообщений операционная система использует целые числа. Однако для удобства пользователей вместо этих чисел используются символьные идентификаторы. Для установления соответствия между идентификатором и соответствующей ему числовой величиной используется огромное количество директив #define. Оконные сообщения в Windows имеют префикс WM_, что означает сообщение Windows (Windows Message).

В любом сообщении содержится информация о том, какому окну оно предназначено. Кроме того, любое сообщение может иметь до двух аргументов, в которых могут передаваться различные данные (в том числе и указатели на большие структуры данных).

Обработка различных сообщений выполняется разными компонентами операционной системы, некоторые из которых включают в себя собственные функции обработки данного сообщения.

Библиотека MFC берет на себя обработку большинства сообщений низкого уровня, таких как WM_KEYDOWN, WM_MOUSEMOVE и других, и позволяет пользователю получать более информативные сообщения. До появления этой библиотеки пользователям приходилось самостоятельно отслеживать большинство сообщений низкого уровня, что негативно сказывалось на объеме программы и ее читабельности.

Каждая программа Windows имеет свой цикл обработки сообщений (Message Loop), который практически всегда находится в функции winMain. Библиотека MFC скрыла эту функцию в своих недрах, и теперь она не появляется в текстах пользовательских приложений. Обычно цикл обработки сообщений реализуется с использованием оператора while, внутри которого вызывается функция GetMessage, отыскивающая сообщение в очереди сообщений данного потока и помещающая его в объект соответствующей структуры. При поиске сообщений производится проверка на нахождение их в определенном диапазоне значений. Данная функция не может отыскивать сообщения, направленные другим окнам или приложениям. Если найдено любое другое сообщение, отличное от WMQUIT, данная функция возвращает ненулевое значение. В противном случае она возвращает ноль. В случае ошибки возвращаемое значение равно - 1.

Следующей функцией, вызываемой в цикле обработки сообщений, является TransiateMessage. Данная функция переводит сообщения виртуальных клавиш в сообщения о введенных символах. Эти сообщения помещаются в очередь сообщений и впоследствии считываются функциями GetMessage и PeekMessage. Единственным аргументом данной функции является указатель на структуру, содержащую сообщение [5].

Последней функцией, вызываемойв стандартном цикле обработки сообщений, является функция DispatchMessage, передающая сообщение, содержащееся в структуре, на которую указывает ее единственный аргумент процедуре окна. Функция процедуры окна обычно представляет собой огромный оператор-переключатель (оператор switch), в котором перечислены все возможные сообщения и каждому из них сопоставлен вызов соответствующей функции обработки. Естественно, что работать с таким оператором было бы очень сложно, поэтому в библиотеке MFC предусмотрено использование карты сообщений.

1.2 Карта сообщений

Использование карты сообщений (Message Map) является основным подходом библиотеки MFC к вопросу обработки сообщений. Вместо того чтобы самому писать функцию процедуры окна и указывать в ней все возможные сообщения, пользователь использует стандартный набор макросов библиотеки MFC, позволяющих определить для каждого класса набор обрабатываемых им сообщений и сопоставить им функцию обработки. Кроме того, среда программирования Visual C++ позволяет освободить пользователя даже от необходимости составления карты сообщений: она формируется автоматически.

Карта сообщений состоит из двух частей, одна из которых расположена в файле заголовка класса, а вторая -- в файле реализации. Первая часть карты сообщений, располагаемая в файле заголовка, должна заканчиваться макросом DECLARE_MESSAGE_MAP, не имеющим аргументов. Вторая часть карты сообщений, располагаемая в файле реализации, должна начинаться макросом BEGIN_MESSAGE_MAP, первым аргументом которого является имя класса, сообщения которого будут обрабатываться данной картой, а вторым аргументом -- имя базового класса. Вторая часть карты сообщений должна закапчиваться макросом END_MESSAGE_MAP, не имеющим аргументов [8].

1.3 Диалоговые окна

Диалог (диалоговое окно) представляет собой специальный вид окна, которые предназначены для взаимодействия с пользователем. Обычно они используются для изменения настроек приложения и ввода информации. Диалоги используются очень часто. Например, практически все окна настроек приложения Microsoft Word являются диалогами [4].

Взаимодействие между диалогом и пользователем осуществляется с помощью элементов управления. Это особый тип окон для ввода или вывода. Элемент управления принадлежит окну-владельцу, в данном случае - диалогу. Все версии Windows поддерживают некоторый набор стандартных элементов управления, к которым относятся кнопки, контрольные переключатели, селекторные кнопки, списки, поля ввода, комбинированные списки, полосы прокрутки и статические элементы [2]. Вам должны быть знакомы все эти элементы. Рассмотрим кратко каждый из них:

- кнопка (push button) - это кнопка, которую пользователь "нажимает" мышью или клавишей Enter, переместив предварительно на нее фокус ввода;

- контрольный переключатель (check box) может быть либо выбранным, либо нет. Если в диалоге есть несколько контрольных переключателей, то могут быть выбраны одновременно несколько из них;

- радиокнопка (radio button) - это почти то же самое, что и контрольный переключатель. Только при наличии нескольких кнопок в группе может быть выбрана только одна;

- список (list box) содержит набор строк, из которого можно выбрать одну или несколько. Широко используется при отображении имен файлов;

- поле ввода (edit box) - это элемент, позволяющий ввести строку текста;

- комбинированный список (combo box) представляет собой список со строкой ввода;

- статический элемент (static control) предназначен для вывода текста или графики, но не предназначен для ввода.

Элементы управления способны как генерировать сообщения в ответ на действия пользователя, так и получать их от приложения. В последнем случае сообщения являются, фактически, командами, на которые элемент управления должен отреагировать [6].

В MFC содержатся классы для всех стандартных элементов управления. Эти классы описывают сами элементы, а также содержат функции для работы с ними. Их называют классами управления. Они порождаются от класса CWnd. Таким образом, все они обладают характеристиками окна. Ниже приведены основные классы управления:

Таблица 1

Классы элементов управления

Класс

Элемент управления

CButton

Кнопки, селекторные кнопки и контрольные переключатели

CEdit

Поля ввода

CListBox

Списки

CComboBox

Комбинированные списки

CScrollBar

Полосы прокрутки

Cstatic

Статические элементы

В MFC допускается также и непосредственное обращение к элементам управления, но на практике это происходит очень редко. Намного удобнее пользоваться соответствующими классами. Наиболее часто элементы управления используются с диалоговыми окнами, хотя можно создавать и отдельные элементы, расположенные в главном окне [6].

Полноценная программа в среде Windows может иметь множество диалоговых окон, каждое из которых будет предназначено для обмена или вывода информации в своем специфическом случае. Описание каждого диалогового окна состоит из двух частей, расположенных в различных файлах: описания ресурсов диалогового окна, для хранения которых используются специальные файлы ресурсов, имеющие, как правило, расширение “rс”, и описания класса диалогового окна, расположенного в файле реализации. Каждому из этих файлов соответствует свой файл заголовка.

Каждое приложение в среде Visual C++ содержит единственный файл ресурсов, имеющий расширение гс, имя которого совпадает с именем приложения. В этом файле содержится описание всех ресурсов данного приложения, к которым, помимо диалоговых окон, относятся также таблица назначения клавиш, значки, меню, таблица строковых ресурсов, панели инструментов и сведения о версии приложения. Данный файл использует файл заголовка Resource.h, содержащий таблицу соответствия идентификаторов ресурсов числовым величинам. Использование программой единственного файла ресурсов, имеющего имя приложения, не означает, что пользователь не может создавать собственного файла ресурсов. Просто этот файл необходимо включить в главный файл ресурсов приложения с использованием директивы #include, как это сделано для некоторых файлов стандартных ресурсов таких, как afxres.rc и afxprint.rc. Однако ресурсы, описанные в данных файлах, не могут редактироваться в стандартных окнах редактирования ресурсов, а сами эти ресурсы не отображаются в окне Resource View (см. рисунок 1).

Рисунок 1 - Окно просмотра ресурсов

В первой строке этой структуры указан идентификатор ресурса диалогового окна и его размеры в оконных координатах, поэтому верхний левый угол данного окна всегда имеет координаты о, 0. После этого следует описание стиля диалогового окна, его заголовок и описание используемого в нем шрифта. Далее, между программными скобками BEGIN И END, располагается описание элементов управления данного окна. Описание элемента управления начинается с указания на то, что это за элемент управления, затем следует его заголовок, если он есть, идентификатор и другая специфическая информация. В конце описания элемента управления расположены координаты его рамки [7].

Если пользователя не устраивает дизайн диалогового окна, он можете внести в него изменения. Для того чтобы перенести любой элемент управления на новое место, достаточно выделить его щелчком левой кнопки мыши, что приведет к визуализации рамки элемента управления и превращению курсора мыши в крестик со стрелками на концах. После этого вы можете его перемещать с клавиатуры клавишами управления курсором или мышью, для чего достаточно нажать левую кнопку мыши, когда курсор имеет форму крестика со стрелками на концах и, удерживая кнопку нажатой, переместить элемент управления в новое место. При этом перемещаться будет не сам элемент управления, а его тонкая штриховая рамка.

Для выравнивания размеров и положения элементов управления можно воспользоваться услугами панели инструментов Dialog Editor (см. рисунок 2), обычно расположенной над окном редактирования ресурса.

Рисунок 2 - Редактор диалогового окна

При необходимости изменить размер элемента управления достаточно выделить его, как описано выше, и поместить курсор на один из синих квадратов в рамке элемента управления. При этом курсор примет форму отрезка линии с двумя стрелками на концах. Направление стрелок указывает, в какую сторону будет перемещаться соответствующая сторона рамки.

программа visual тестирование геометрия

2. ОБЩАЯ ЧАСТЬ

2.1 Общие сведения о приложении

Программа Gtest.exe представляет собой приложение, написанное в среде программирования Microsoft Visual Studio 2008, на языке программирования Visual C++. Программа предназначена для работы только под управлением ОС Windows XP/Vista/Seven. Совместимость с более ранними версиями ОС Windows - неизвестна. Программа состоит из одного исполняющего файла и имеет размер 42 Кб. Интерфейс программы изображен на рисунке 3.

Рисунок 3 - Интерфейс основного окна программы Gtext.exe

2.2 Функциональное назначение

Согласно заданию по курсовому проектированию, функциональным назначением программы является тестирование знаний пользователя по разделу геометрии, в частности, знаний способов расчета площади треугольника по двум сторонам и углу между ними.

Программа состоит из трех диалоговых окон, которые функционально связанны друг с другом. Первое окно - «Окно приветствия» (см. рисунок 4). В нем содержится краткая информация о программе, а так же кнопки «Старт» и «Выход».

Рисунок 4 - Первое окно программы

При нажатии на кнопку «Старт», создается новое модальное диалоговое окно - «Главное окно». Это окно выводит сгенерированные случайные числа в качестве исходных данных, а так же предлагает пользователю ввести результат вычислений. Это диалоговое окно также содержит две кнопки «ОК» и «Выход». При нажатии на кнопку «Выход» текущее окно закрывается, и программа переходит к «Окну приветствия». При нажатии на кнопку «Ок», программа осуществляет проверку корректности введенных данных, проверку соответствия пользовательского ответа результату программного вычисления площади треугольника и генерирует новые исходные данные.

После пяти нажатий на кнопку «Ок», программа вызывает модальное диалоговое окно «Вывод результатов» (см. рисунок 5).

В нем содержатся элементы статического текста, в которые, при нажатии на кнопку «Показать результаты», выводятся результаты тестирования.

Рисунок 5 - Окно вывода результатов тестирования

2.3 Описание логической структуры

В первом диалоговом окне, при нажатии на кнопку "Старт" вызывается обработчик события BN_CLICKED, который в свою очередь создает объект класса CMDlg, являющегося наследником класса CDialog. После этого, используя метод DoModal() вызывается окно второго диалога. В этом окне выводятся генерированные с помощью функции rand() случайные значения трех переменных: val_A, val_B, val_Alpha, которые преобразуются в строковый тип с помощью функции _itoa(),после чего выводятся в элементы "Edit". С каждым нажатием на кнопку "Ок" прибавляется единица к счетчику нажатий, а также ответ пользователя записывается в переменную val_S, которая ассоциирована с полем для ввода ответа. После того, как счетчик нажатий становится равным пяти, создается объект класса CResDlg, являющегося наследником класса CDialog. После этого, используя метод DoModal() вызывается окно третьего диалога. В нем содержатся элементы типа "Static Text", в которые при нажатии на кнопку показать результаты, будут выведены с использованием функции Out_S() результаты тестирования.

Таблица 2

Описание логической структуры

Имя класса

Список членов

Спецификация доступа

Назначение

Cdialog

DoModal()

public

Данная функция вызывается для отображения модального диалогового окна.

SetDlgItemText(int nID, Cstring str)

public

Функция передает текст элементу диалога. Использует два аргумента: nID - Id элемента и str - строка, которую необходимо передать.

OnCancel()

public

Закрывает диалоговое окно.

CGTestDlg

OnBnClickedButtonStart()

public

Обработчик сообщения BN_CLICKED для кнопки "Старт"

OnCancel()

public

Закрывает диалоговое окно.

CMDlg

UINT val_A

public

Содержит случайно сгенерированное значение стороны А.

UINT val_B

public

Содержит случайно сгенерированное значение стороны А.

UINT val_Alpha

public

Содержит случайно сгенерированное зугла Альфа.

int val_S

public

Содержит введенную пользователем площадь треугольника.

int i, schet

public

Счетчик нажатий и счетчик правильных ответов

int array_S[5]

public

Массив правильных ответов, если значение площади введенное пользователю равно правильному значению, array_S[i]=0

void OnBnClickedButtonNext()

public

Обработчик сообщения BN_CLICKED для кнопки "ОК"

void OnBnClickedButtonHint()

public

Обработчик сообщения BN_CLICKED для кнопки подсказки

int calcS(int a, int b, int alpha)

public

Функция возвращающая значение площади. Использует три аргумента: a - значение стороны А, b - значение стороны B, alpha - значение угла Альфа.

CResDlg

int schet;

public

Счетчик нажатий

int array_S[5];

public

Массив правильных ответов, если значение площади введенное пользователю равно правильному значению, array_S[i]=0

void OnBnClickedButton1()

public

Обработчик сообщения BN_CLICKED для кнопки "Выход"

void OnBnClickedButtonResult()

public

Обработчик сообщения BN_CLICKED для кнопки "Результат"

void outS(int value, int nID)

public

Функция выводит ответы в элементы "Static Text". Использует два аргумента: value - значение, которое необходимо вывести и nID - ID элемента, в которое будет помещено значение.

void srand()

public

Обновляет таблицу генерации случайных чисел.

time(NULL)

public

Функция возвращает текущее время

int rand()

public

Функция генерирует случайно значение.

double sin(double x)

public

Функция вычисляет синус угла в радианах.

void _itoa(value ,string_temp,10)

public

Функция переводит целочисленное значение в строковый тип. Используются три аргумента: value - переменная типа int, которую необходимо преобразовать, string - строка в которую будет помещена преобразованая переменная и третий аргумент - основание системы счисления.

2.4 Требования к техническому обеспечению

Для работоспособности программы необходим компьютер, удовлетворяющий минимальным системным требованиям Windows XP. (Процессор Pentium с частотой 233 МГц или более быстрый (рекомендуется не менее 300 МГц). Не менее 64 МБ оперативной памяти (рекомендуется не менее 128 МБ). Клавиатура, мышь Microsoft Mouse или совместимое указывающее устройство. Видеокарта и монитор, поддерживающие режим Super VGA с разрешением не менее чем 800x600 точек).

2.5 Вызов программы

Программа поставляется без установочного ПО, в неархивированном виде. Для вызова программы достаточно дважды щелкнуть на GTest.exe. Для того, что бы просмотреть исходный код программы необходимо скопировать с носителя папку с проектом на жёсткий диск компьютера.

2.6 Входные данные

Входными данными приложения является рассчитанная пользователем площадь треугольника. Входные данные имеют тип int (integer), т.е. целые числа в диапазоне от 1 (т.к. площадь треугольника не может быть отрицательной и не может равняться нулю) и до максимального числа, которое может храниться в переменной типа int (2147483647). Эти данные помещаются пользователем в элемент диалогового окна «Edit Box», которому сопоставляется переменная val_S.

2.7 Выходные данные

Выходные данные приложения - преобразованные в строковый тип целые числа типа UINT (unsigned integer). Выходные данные являются результатом генерирования случайных чисел в указанном диапазоне, а так же результатом вычисления функции расчета площади треугольника. Эти данные помещаются в элементы диалогового окна «Static Text» и «Edit Box».

2.8 Описание тестовых прогонов

Для тестирования программы попробуем ввести различные некорректные значения. Для начала, введем в поле для ввода ответа отрицательное число и нажмем кнопку «Ок». Программа обрабатывает введенное значение и выводит сообщение об ошибке, которое изображено на рисунке 6.

Рисунок 6 - Сообщение о некорректности ввода данных

Следующим этапом тестирования будет ввод недопустимых символов. При нажатии на кнопку «Ок», программа обрабатывает введенное значение и выводит сообщение об ошибке, которое изображено на рисунке 7.

Рисунок 7 - Сообщение об ошибке при вводе недопустимых символов

Следующим этапом тестирования будет ввод пяти заранее неверных ответов. В окне вывода результатов тестирования, при нажатии на кнопку «Показать результаты», появляется список правильных ответов и соотношение правильных ответов 0 из 5 вопросов (см. рисунок 8).

Рисунок 8 - Окно вывода результатов без правильных ответов

Следующим этапом тестирования будет ввод пяти заранее верных ответов. В окне вывода результатов тестирования, при нажатии на кнопку «Показать результаты», появляется список ответов (см. рисунок 9).

Рисунок 9 - Окно вывода результатов правильных ответов

Последним этапом тестирования будет ввод двух правильных ответов из пяти. При завершении тестирования программа выводит соотношения правильных и неправильных ответов (см. рисунок 10).

Рисунок 10 - Окно вывода результатов с двумя правильными ответами

ЗАКЛЮЧЕНИЕ

В ходе выполнения курсового проекта было создано приложение, разработанное на языке программирования высокого уровня Visual C++ с использованием библиотеки MFC. Данное приложение выполняет проверку знаний пользователя по разделу геометрии.

В ходе разработки проекта были получены навыки работы с Microsoft Visual Studio 2008. Подробно изучены основные этапы создания Dialog-based приложений с использованием библиотеки MFC. Рассмотрены основные вопросы разработки простых Windows-приложений.

В целом, библиотека MFC показала себя отличным инструментом для упрощения и ускорения разработки приложений. Автоматически создавая готовый «каркас» приложения, MFC позволяет не отвлекаясь на решение стандартных задач создания окон или элементов диалога, решать поставленные задачи с наибольшей производительностью.

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

Шилдт Г. Самоучитель С++. - BHV - Санкт-Петербург, 2002.

Подбельский В.В. Программирование на языке Си++. - М.: Финансы и статистика, 2006.

Гилберт Стивен, Маккарти Билл. Программирование на Visual C++ 2008. Этюды профессионалов - К.: Издательство “ДиаСофт”, 2009.

Александр Фролов, Григорий Фролов Том 24, М. Microsoft visual C++ и MFC.: Диалог-МИФИ, 1999.

Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Пер. с англ. - М.: «Издательство Бином», СПб.: «Невский диалект», 1999. - 560 с.

D. Grune, C.H. Parsing Techniques - A Practical Guide. Chichester: Ellis Horwood./Пер. с англ. - М.: «Издательство Бином», СПб.: «Невский диалект», 1990. - 456 с.

M. Уэйт, С.П. Разработка Windows приложений. Руководство для начинающих. /Москва: Мир., 2005. - 348 с.

А. Ахо, Р.С. Компиляторы: принципы, технологии и инструменты./ Москва: Вильямс, 2001. - 652 с.

ПРИЛОЖЕНИЕ 1

ПРИЛОЖЕНИЕ 2

Листинг программы

// Заголовочный файл GTestDlg.h

#pragma once

// CGTestDlg dialog

class CGTestDlg : public CDialog

{

// Конструкторы

public:

CGTestDlg(CWnd* pParent = NULL);// стандартный конструктор

// Dialog Data

enum { IDD = IDD_GTEST_DIALOG };

protected:

virtual void DoDataExchange(CDataExchange* pDX);// Поддержка DDX/DDV

protected:

HICON m_hIcon;

// Создание карты сообщений диалога

virtual BOOL OnInitDialog();

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnBnClickedButtonStart();

};

// Исполняющий файл GTestDlg.cpp

// GTestDlg.cpp : Мсполняющий файл

#include "stdafx.h" //Предкомпилируемые библиоткеки.

#include "GTest.h" //Главный заголовочный файл приложения.

#include "GTestDlg.h" //Заголовочный файл текущего окна.

#include <time.h> //Библиотека работы со временем.

#include "MDlg.h" //Заголовочный файл следующего окна.

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CGTestDlg dialog

CGTestDlg::CGTestDlg(CWnd* pParent /*=NULL*/)

: CDialog(CGTestDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CGTestDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CGTestDlg, CDialog)

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_BUTTON_START, &CGTestDlg::OnBnClickedButtonStart)

END_MESSAGE_MAP()

// CGTestDlg message handlers

BOOL CGTestDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Устанавливаем иконку приложения.

SetIcon(m_hIcon, TRUE);// Установить большую иконку.

SetIcon(m_hIcon, FALSE);// Установить маленькую иконку.

return TRUE;

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CGTestDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

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

{

CDialog::OnPaint();

}

}

// The system calls this function to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CGTestDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

//Обработчки наджатия кнопки "Старт"

void CGTestDlg::OnBnClickedButtonStart()

{

srand((unsigned int)time(NULL));//Обновляем таблицу случайных чисел, используя как аргумент текущее время.

CMDlg MainDlg; //Создаем объект нового диалогового окна.

MainDlg.DoModal(); //Вызываем модальное диалоговое окно.

}

// Заголовочный файл MDlg.h

#pragma once

// CMDlg dialog

class CMDlg : public CDialog

{

DECLARE_DYNAMIC(CMDlg)

public:

CMDlg(CWnd* pParent = NULL); // Стандартный конструктор

virtual ~CMDlg();

// Dialog Data

enum { IDD = IDD_MDLG };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // Поддержка

DDX/DDV

DECLARE_MESSAGE_MAP()

public:

// Объявляются переменные и прототипы функций.

UINT val_A;

UINT val_B;

UINT val_Alpha;

int val_S;

int i, schet;

int array_S[5];

afx_msg void OnBnClickedButtonNext();

int calcS(int a, int b, int alpha);

void Out(int value, int nID);

afx_msg void OnBnClickedButtonHint();

};

// Исполняющий файл MDlg.cpp

// MDlg.cpp : исполняющий файл

//

#include "stdafx.h" //Предкомпилируемые библиотеки

#include "GTest.h"// Подключаем главный заголовочный файл приложения.

#include "MDlg.h"// Подключаем заголовочный текущего окна.

#include <math.h>// Подключаем математическую библиотеку.

#include "ResDlg.h"// Подключаем заголовочный файл окна "Вывод результатов".

// CMDlg dialog

IMPLEMENT_DYNAMIC(CMDlg, CDialog)

CMDlg::CMDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMDlg::IDD, pParent)

//Задаем начальные значения переменных.

, val_A((rand()%30)+1)

, val_B((rand()%31)+1)

, val_Alpha((rand()%180)+1)

, val_S(0)

{

i=0;//Обнуляем счетчик вопросов

schet=0;// Обнуляем счетчик правильных ответов

}

CMDlg::~CMDlg()

{

}

void CMDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT_A, val_A);

DDX_Text(pDX, IDC_EDIT_B, val_B);

DDX_Text(pDX, IDC_EDIT_ALPHA, val_Alpha);

DDX_Text(pDX, IDC_EDIT_S, val_S);

}

BEGIN_MESSAGE_MAP(CMDlg, CDialog)

ON_BN_CLICKED(IDC_BUTTON_NEXT,

&CMDlg::OnBnClickedButtonNext)

ON_BN_CLICKED(IDC_BUTTON_HINT,

&CMDlg::OnBnClickedButtonHint)

END_MESSAGE_MAP()

// CMDlg message handlers

void CMDlg::OnBnClickedButtonNext()//Обработчик нажатия на кнопку "ОК".

{

//Сопоставляем значение в элементах диалога и сопряженных переменных.

UpdateData();

if (val_S<=0) //Проверка на корректность введенных данных.

{

MessageBox("Площадь треугольника всегда больше нуля!");

}

else

{

//Сравниваем результат ф-ции со значением, введенным пользователем

if (calcS(val_A,val_B,val_Alpha)==val_S)

{

schet++;//+1 к счетчику правильных ответов.

//Обнуляем соответствующий номеру вопроса элемент массива.

array_S[i]=0;

}

else

{

//Если ложь - присваиваем элементу массива правильный ответ.

array_S[i]=calcS(val_A,val_B,val_Alpha);

}

i++; // Добавляем 1 к счетчику вопросов.

}

if (i==5) //Если это пятый вопрос

{

MessageBox("Тестирование окончено!");

//Создаем объект - новое диалоговое окно "Вывод результатов".

CResDlg ResultDlg;

//Присваиваем переменной "счет" нового окна, значение переменной "счет" //текущего окна.

ResultDlg.schet=schet;

for (int ix=0; ix<5; ix++) //Создаем цикл от 0 до 4.

{

//Присваиваем значение массива текущего окна, массиву нового окна.

ResultDlg.array_S[ix]=array_S[ix];

}

//Вызываем модальное диалоговое окно "Вывод результатов".

ResultDlg.DoModal();

//Закрытие текущего окна. Срабатывает только после закрытия окна "Вывод //результатов".

OnCancel();

}

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

srand((unsigned int)time(NULL));

val_A=(rand()%30)+1;//Диапазон случайных значений от 1 до 30.

val_B=(rand()%31)+1;//Диапазон случайных значений от 1 до 30.

val_Alpha=(rand()%180)+1;//Диапазон случайных значений от 1 до 180.

val_S=0;//Обнуляем введенное пользователем значение площади.

Out(val_A,IDC_EDIT_A);//Выводим новое значение стороны А.

Out(val_B,IDC_EDIT_B);//Выводим новое значение стороны В.

Out(val_Alpha,IDC_EDIT_ALPHA); //Выводим новое значение угла Альфа.

Out(val_S,IDC_EDIT_S); //Выводим нулевое значение.

Out(i+1,IDC_STATIC_NUMBER); //Выводим номер вопроса.

}

//Ф-ция вычисляет площадь треугольника.

int CMDlg::calcS(int a, int b, int alpha)

{

double pi=3.1416, alphaRad=0;//Объявляем переменные Пи и Угол в радианах.

int S; //Площадь треугольника

alphaRad=alpha*(pi/180); //Переводим угол из градусов в радианы.

S=(int)(a*b*sin(alphaRad))/2; // Вычисляем площадь треугольника.

return S;//Возвращаем значение площади

}

//Ф-ция выводит значение типа int в элемент диалога.

void CMDlg::Out(int value, int nID)

{

char string_temp[20]; //Создаем буфер - строку из 20 символов.

_itoa(value ,string_temp,10); //Переводим значение из int в char.

SetDlgItemText(nID, string_temp); //Выводим значение в элемент диалога.

}

//Эта кнопка - подсказка, выводит правильный ответ.

void CMDlg::OnBnClickedButtonHint()

{

char hint[20];//Создаем буффер - строку из 20 символов

_itoa(calcS(val_A,val_B,val_Alpha),hint,10); //Значение ф-ции в char

MessageBox(hint);//Создаем сообщение, которое будет содержать подсказку.

}

// Заголовочный файл ResDlg.h

#pragma once

// CResDlg dialog

class CResDlg : public CDialog

{

DECLARE_DYNAMIC(CResDlg)

public:

CResDlg(CWnd* pParent = NULL); // Стандартный конструктор

virtual ~CResDlg();

// Dialog Data

enum { IDD = IDD_RESDLG };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // Поддержка DDX/DDV

DECLARE_MESSAGE_MAP()

public:

// Объявляются переменные и прототипы функций.

void outS(int value, int nID);

int schet;

int array_S[5];

afx_msg void OnBnClickedButtonResult();

afx_msg void OnBnClickedButton3();

};

// Исполняющий файл ResDlg.cpp

// ResDlg.cpp : исполняющий файл

//

#include "stdafx.h" //Предкомпилируемые библиотеки

#include "GTest.h" // Подключаем главный заголовочный файл приложения.

#include "ResDlg.h" // Подключаем заголовочный текущего окна.

#include "MDlg.h" // Подключаем заголовочный файл предыдущего окна.

// CResDlg dialog

IMPLEMENT_DYNAMIC(CResDlg, CDialog)

CResDlg::CResDlg(CWnd* pParent /*=NULL*/)

: CDialog(CResDlg::IDD, pParent)

{

}

CResDlg::~CResDlg()

{

}

void CResDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CResDlg, CDialog)

ON_BN_CLICKED(IDC_BUTTON3, &CResDlg::OnBnClickedButton3)

END_MESSAGE_MAP()

// CResDlg message handlers

//Ф-ция вывода результатов тестирования

void CResDlg::outS(int value, int nID)

{

if (value==0)//Проверка правильности ответа.

{

SetDlgItemText(nID, "Правильно!");

}

else

{

char string_temp[20]; //Создаем буффер строку из 20 символов.

_itoa(value, string_temp, 10); //Переводим int в char.

SetDlgItemText(nID, string_temp); //Выводим строку в элемент диалога

}

}

//Обработчик нажатия кнопки "Вывод результатов"

void CResDlg::OnBnClickedButton3()

{

char string1[20];//Создаем буффер строку из 20 символов.

_itoa(schet ,string1,10);//Переводим int в char.

SetDlgItemText(IDC_STATIC_SCHET, string1);//Вывод кол-ва правильных ответов

//Заполнение списка ответов.

outS(array_S[0],IDC_STATIC_S1);

outS(array_S[1],IDC_STATIC_S2);

outS(array_S[2],IDC_STATIC_S3);

outS(array_S[3],IDC_STATIC_S4);

outS(array_S[4],IDC_STATIC_S5);

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.