ООПиП (часть 3). Пример лабораторной работы №1
..pdf
БГУИР: Дистанционное обучение (неофициальный сайт)
}
else if (strlen( txt ) < max_text-serv)
// Если введено значение и оно меньше максимума - дописать цифру
{
char txt2 [ 2 ]; txt2[ 0 ] = C; txt2[ 1 ] = '\0';
strcat( txt, txt2 ); m_edit.SetWindowText( txt );
}
}
FocusEdit();
// Сброс выделения в поле ввода, установка фокуса
}
void CLab3_1Dlg::OnBnClickedButtonSign() // Обработчик нажатия кнопки "+/-"
{
if (EndError) { FocusEdit(); return; } // Пока ошибка - нет изменений
if ((state == state_0) || (state == state_2) || (state == state_4))
//Если состояние 0, 2 или 4 - присвоить значение "0"
{
m_edit.SetWindowText( "0" );
if ((state == state_0) || (state == state_4)) state = state_1; else state = state_3;
}
else
//Если состояние 1 или 3
{
char txt [ max_text+1 ]; char txt2 [ max_text+1 ];
m_edit.GetWindowText( txt, max_text+1 ); if (strcmp( txt, "0" ) != 0)
// Если введен не "0"
{
if (txt[0]=='-') strncpy( txt2, txt+1, max_text );
//Убрать знак else
//Добавить знак
{
strcpy( txt2, "-" ); strcat( txt2, txt );
}
m_edit.SetWindowText( txt2 );
}
}
FocusEdit();
// Сброс выделения в поле ввода, установка фокуса
}
void CLab3_1Dlg::OnBnClickedButtonPoint() // Обработчик нажатия кнопки "."
{
if (EndError) { FocusEdit(); return; }
//Пока ошибка - нет изменений char txt [ max_text+1 ];
if ((state == state_0) || (state == state_2) || (state == state_4))
//Если состояние 0, 2 или 4 - присвоить значение "0."
{
strcpy( txt, "0" ); char txt2 [ 2 ];
txt2[ 0 ] = PointChar; txt2[ 1 ] = '\0'; strcat( txt, txt2 );
m_edit.SetWindowText( txt );
http://do.ucoz.net |
11 |
БГУИР: Дистанционное обучение (неофициальный сайт)
if ((state == state_0) || (state == state_4)) state = state_1; else state = state_3;
}
else
// Если состояние 1 или 3
{
m_edit.GetWindowText( txt, max_text+1 ); size_t serv = 0;
if (txt[0] != '-') serv += 1;
if ((strchr( txt, PointChar ) == NULL) && (strlen( txt ) < max_text-
serv))
// Если введено значение и оно меньше максимума - дописать "."
{
char txt2 [ 2 ];
txt2[ 0 ] = PointChar; txt2[ 1 ] = '\0'; strcat( txt, txt2 );
m_edit.SetWindowText( txt );
}
}
FocusEdit();
// Сброс выделения в поле ввода, установка фокуса
}
void CLab3_1Dlg::OnBnClickedButtonBack()
//Обработчик нажатия кнопки "<-"
//(удаление последней введенной цифры)
{
if (EndError) { FocusEdit(); return; } // Пока ошибка - нет изменений
if ((state == state_1) || (state == state_3)) // Если состояние 1 или 3
{
char txt [ max_text+1 ]; m_edit.GetWindowText( txt, max_text+1 ); if (strlen( txt ) > 1)
//Если количество цифр больше 1 - удалить последнюю цифру,
//иначе присвоить значение "0"
{
txt[ strlen( txt )-1 ] = '\0';
if (strcmp( txt, "-" ) == 0) strcpy( txt, "0" );
}
else strcpy( txt, "0" ); m_edit.SetWindowText( txt );
}
FocusEdit();
// Сброс выделения в поле ввода, установка фокуса
}
void CLab3_1Dlg::OnBnClickedButtonClear()
//Обработчик нажатия кнопки "C"
//(сброс в первоначальное состояние)
{
n_c_list.clear();
//Очистка лога
PrintList();
//Вывод лога
m_edit.SetWindowText( "0" );
//Сброс поля ввода state = state_0;
//Сброс состояния
EndError = FALSE;
//Сброс флага ошибки
FocusEdit();
//Сброс выделения в поле ввода, установка фокуса
}
http://do.ucoz.net |
12 |
БГУИР: Дистанционное обучение (неофициальный сайт)
void CLab3_1Dlg::OnBnClickedButtonClearEnd()
//Обработчик нажатия кнопки "CE"
//(сброс последнего введенного числа)
{
m_edit.SetWindowText( "0" );
//Сброс поля ввода
EndError = FALSE;
//Сброс флага ошибки
FocusEdit();
//Сброс выделения в поле ввода, установка фокуса
}
void CLab3_1Dlg::OnBnClickedButtonReturn()
{
if (EndError) { FocusEdit(); return; }
//Пока ошибка - нет изменений char txt [ max_text+1 ];
m_edit.GetWindowText( txt, max_text+1 ); double B = atof( txt );
if ((state == state_0) || (state == state_1))
//Если состояние 0 или 1 - запомнить число из поля ввода
{
numb = B;
n_c_list.insert( n_c_list.begin(), txt ); state = state_0;
}
else if ((state == state_2) || (state == state_3))
//Если состояние 2 или 3 - сохранить предыдущие значение, вычислить новое
{
numb_d = B;
numb = exec( comm, numb, B ); n_c_list.insert( n_c_list.begin(), txt ); state = state_4;
}
else
//Если состояние 4 - вычислить новое значение
{
txt[ 0 |
] |
= comm; |
|
txt[ 1 |
] |
= '\0'; |
|
n_c_list.insert( n_c_list.begin(), txt |
); |
||
_gcvt( |
numb_d, max_text/2, txt ); |
|
|
if (txt[ |
strlen(txt)-1 ] == PointChar) |
txt[ strlen(txt)-1 ] = '\0'; |
|
n_c_list.insert( n_c_list.begin(), txt |
); |
||
numb = |
exec( comm, numb, numb_d ); |
|
|
}
PrintResult( numb );
//Вывод результата вычислений if (EndError) state = state_0;
//Если ошибка - сброс состояния
PrintList();
//Вывод лога
FocusEdit();
// Сброс выделения в поле ввода, установка фокуса
}
/* =================================== */ /* Обработчики нажатия кнопок операций */
void CLab3_1Dlg::OnBnClickedButtonDiv() { AddCommand( '/' ); } void CLab3_1Dlg::OnBnClickedButtonMul() { AddCommand( '*' ); } void CLab3_1Dlg::OnBnClickedButtonSub() { AddCommand( '-' ); } void CLab3_1Dlg::OnBnClickedButtonAdd() { AddCommand( '+' ); } /* =================================== */
void CLab3_1Dlg::AddCommand( const char command ) // Функция добавления операции
http://do.ucoz.net |
13 |
БГУИР: Дистанционное обучение (неофициальный сайт)
{
if (EndError) { FocusEdit(); return; } // Пока ошибка - нет изменений
char txt [ max_text+1 ];
if (state == state_2) { if (!( n_c_list.empty() )) n_c_list[ 0 ] = command;
}
//Если состояние 2 - перезапись сохраненной операции else
//Если состояние 0, 1, 3 или 4
{
m_edit.GetWindowText( txt, max_text+1 ); n_c_list.insert( n_c_list.begin(), txt ); double B = atof( txt );
if (state == state_3)
//Если состояние 3 - вычислить новое значение
{
numb = exec( comm, numb, B ); PrintResult( numb );
}
else numb = B;
//Если состояние 0, 1 или 4 - сохранить значение txt[ 0 ] = command;
txt[ 1 ] = '\0';
if (!EndError) n_c_list.insert( n_c_list.begin(), txt );
}
if (EndError) state = state_0; else state = state_2;
comm = command;
//Сохранение операции
PrintList();
//Вывод лога
FocusEdit();
//Сброс выделения в поле ввода, установка фокуса
}
void CLab3_1Dlg::PrintList()
// Вывод лога выполнения операций
{
CString str = "";
for (size_t i = 0; i < n_c_list.size(); i++)
{
str.Append( n_c_list[i] ); str.Append( "\r\n" );
}
m_static.SetWindowText( str.GetString() );
}
void CLab3_1Dlg::PrintResult( const double res ) // Вывод результата вычислений
{
if (EndError)
//Если ошибка - ввывод сообщения об ошибке
{
m_edit.SetWindowText( "error" ); n_c_list.insert( n_c_list.begin(), "= error" );
}
else
//Если не ошибка - вывод результата выполнения операции
{
char txt [ max_text+1 ]; char txt2 [ max_text+1 ];
_gcvt( res, max_text/2, txt );
if (txt[ strlen(txt)-1 ] == PointChar) txt[ strlen(txt)-1 ] = '\0'; m_edit.SetWindowText( txt );
strcpy( txt2, "= " ); strcat( txt2, txt );
http://do.ucoz.net |
14 |
БГУИР: Дистанционное обучение (неофициальный сайт)
n_c_list.insert( n_c_list.begin(), txt2 );
}
}
double CLab3_1Dlg::exec( const char C, const double A, const double B ) // Функция выполнения операции
{
try
{
double res = 0; EndError = FALSE; switch ( C )
{
case '+': res = (A + B); break; case '-': res = (A - B); break; case '*': res = (A * B); break; case '/':
if (B == 0) EndError = TRUE;
// Установить флаг ошибки, если деление на 0 else res = (A / B);
break; default: res = 0;
}
return res;
}
catch (...)
// Установить флаг ошибки, если вызван обработчик прерывания
{
EndError = TRUE; return 0;
}
}
BOOL CLab3_1Dlg::PreTranslateMessage(MSG* pMsg) // Обработчик сообщений (нажатия клавиш)
{
switch (pMsg->message) |
|
|
|
{ |
|
|
|
case WM_CHAR: |
|
|
|
// Нажатие цифровых клавиш или клавиш операций |
|
||
switch (pMsg->wParam) |
|
|
|
{ |
|
|
|
case (WPARAM)'0': AddChar( '0' ); |
return |
TRUE; break; |
|
case (WPARAM)'1': AddChar( '1' ); |
return |
TRUE; break; |
|
case (WPARAM)'2': AddChar( '2' ); |
return |
TRUE; break; |
|
case (WPARAM)'3': AddChar( '3' ); |
return |
TRUE; break; |
|
case (WPARAM)'4': AddChar( '4' ); |
return |
TRUE; break; |
|
case (WPARAM)'5': AddChar( '5' ); |
return |
TRUE; break; |
|
case (WPARAM)'6': AddChar( '6' ); |
return |
TRUE; break; |
|
case (WPARAM)'7': AddChar( '7' ); |
return |
TRUE; break; |
|
case (WPARAM)'8': AddChar( '8' ); |
return |
TRUE; break; |
|
case (WPARAM)'9': AddChar( '9' ); |
return |
TRUE; break; |
|
case (WPARAM)'*': AddCommand( '*' |
); return TRUE; break; |
||
case (WPARAM)'/': AddCommand( '/' |
); return TRUE; break; |
||
case (WPARAM)'+': AddCommand( '+' |
); return TRUE; break; |
||
case (WPARAM)'-': AddCommand( '-' |
); return TRUE; break; |
||
case (WPARAM)'.': |
|
|
|
case (WPARAM)',': OnBnClickedButtonPoint(); return TRUE; break; |
|||
default: return CDialog::PreTranslateMessage(pMsg); |
|||
} |
|
|
|
case WM_KEYDOWN: |
|
|
|
// Нажатие служебных клавиш |
|
|
|
switch (pMsg->wParam) |
|
|
|
{ |
|
|
|
case VK_BACK: |
OnBnClickedButtonBack(); |
return TRUE; break; |
|
case VK_RETURN: OnBnClickedButtonReturn(); return TRUE; break; |
|||
|
http://do.ucoz.net |
|
15 |
БГУИР: Дистанционное обучение (неофициальный сайт)
case VK_ESCAPE: OnBnClickedButtonClear(); return TRUE; break; case VK_DELETE: OnBnClickedButtonClearEnd(); return TRUE; break; default: return CDialog::PreTranslateMessage(pMsg);
}
default:
return CDialog::PreTranslateMessage(pMsg);
}
}
void CLab3_1Dlg::FocusEdit()
//Сброс выделения в поле ввода, установка фокуса
{
m_edit.SetFocus(); m_edit.HideCaret();
}
3.2.3Заголовок класса Lab3_1 (Lab3_1.h)
//Заголовок класса Lab3_1 (головное приложение)
#pragma once
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h"
// Заголовок констант ресурсов
class CLab3_1App : public CWinApp
{
public:
virtual BOOL InitInstance();
//Обработчик инициализации приложения
DECLARE_MESSAGE_MAP()
//Функция генерации карты сообщений
};
extern CLab3_1App theApp;
//Объявление переменной - приложения
3.2.4Реализация класса Lab3_1 (Lab3_1.cpp)
//Реализация класса Lab3_1 (головное приложение)
#include "stdafx.h" #include "Lab3_1.h" #include "Lab3_1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW #endif
BEGIN_MESSAGE_MAP(CLab3_1App, CWinApp) // Функция генерации карты сообщений
END_MESSAGE_MAP()
CLab3_1App theApp;
// Переменная - приложение
BOOL CLab3_1App::InitInstance()
{
InitCommonControls();
// Инициализация общих компонентов
CWinApp::InitInstance();
http://do.ucoz.net |
16 |
БГУИР: Дистанционное обучение (неофициальный сайт)
//Вызов метода класса-родителя
CLab3_1Dlg dlg;
//Объявление экземпляра класса диалога m_pMainWnd = &dlg;
//Определение главного окна приложения dlg.DoModal();
//Модальный вызов диалога
return FALSE;
}
3.3 Результаты работы программы
Для проверки работоспособности программы были использованы следующие последовательности арифметических операций (все операции выполняются последовательно):
а) (124.5 + 19) * 89,765 / (-14); результат: -920,09125; б) 125000000 * 14 / 185,125; результат: 9453072,248480756; в) (85,675 + 1.000001) * 96,4; результат: 8355,4700964;
Работоспособность программы подтверждается следующими снимками экрана, приведенными на рисунке 3.5.
Наиболее типичной ошибкой при вычислениях является деление на ноль. Работоспособность приложения была проверена на отслеживание данной ошибки, что подтверждается снимком экрана, приведенном на рисунке 3.5 г).
а) |
б) |
в) |
г) |
Рисунок 3.5 – |
Проверка работоспособности программы |
http://do.ucoz.net |
17 |
БГУИР: Дистанционное обучение (неофициальный сайт)
Вывод: в ходе выполнения лабораторной работы:
−произошло ознакомление с теоретическим материалом, посвященным диалоговым окнам Windows, возможности их создания и редактирования, что было закреплено на практике;
−были изучены и практически освоены способы работы с элементами управления диалоговых окон, в том числе принципы ассоциации элементов управления с переменными класса;
−были изучены принципы обработки сообщений от элементов управления MFC и реализованы соответствующие обработчики;
−были изучена особенность обработки нажатий клавиш клавиатуры в диалоговых окнах и реализован обработчик;
−была разработана программа, удовлетворяющая поставленному заданию.
http://do.ucoz.net |
18 |
