Вход

Классовая надстройка над стандартным типом float

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 113388
Дата создания 2010
Страниц 22
Источников 3
Мы сможем обработать ваш заказ (!) 22 апреля в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
2 000руб.
КУПИТЬ

Содержание

Содержание
1. Постановка задачи
2. Разработка класса-надстройки над стандартным типом данных float
3. Разработка win-приложения, демонстрирующего работу класса
Литература
Приложение 1
Приложение 2
Приложение 3
Приложение 4
Приложение 5

Фрагмент работы для ознакомления

getval());
if(tst < FLT_MIN){
state=Underflow;
throw state;
}
else if(tst > FLT_MAX){
state=Overflow;
throw state;
}
else
value=(float)tst;
return(*this);
}
Float & Float::operator%=(Float lvl) // остаток от деления и присваивание
{
if(lvl.getval() ==0.){
state=zeroDiv;
throw state;
}
double tst=value/lvl.getval();
if(tst < FLT_MIN){
state=Underflow;
throw state;
}
else
value -= (float)(tst > 0 ? floor(tst) : ceil(tst))*lvl.getval();
return(*this);
}
// операция взятия значения
float Float::getval(){return(value);}
// операция преобразования в символьный тип
Float::operator const char*(){
sprintf(buffer,"%10G",value);
return(buffer);
}
// унарные операции
float operator-(Float op1){Float res=op1;return (-res.getval());}
float operator+(Float op1){Float res=op1;return ( res.getval());}
// бинарные операции
Float operator+(Float op1,Float op2){Float res=op1;res += op2.getval();return(res);}
Float operator-(Float op1,Float op2){Float res=op1;res -= op2.getval();return(res);}
Float operator*(Float op1,Float op2){Float res=op1;res *= op2.getval();return(res);}
Float operator/(Float op1,Float op2){Float res=op1;res /= op2.getval();return(res);}
Float operator^(Float op1,Float op2){Float res=op1;res ^= op2.getval();return(res);}
Float operator%(Float op1,Float op2){Float res=op1;res %= op2.getval();return(res);}
// реализация операций сравнения
int operator>(Float op1,Float op2){return op1.getval()-op2.getval() > 0;}
int operator<(Float op1,Float op2){return op1.getval()-op2.getval() < 0;}
int operator>=(Float op1,Float op2){return op1.getval()-op2.getval() >= 0;}
int operator<=(Float op1,Float op2){return op1.getval()-op2.getval() <= 0;}
int operator==(Float op1,Float op2){return op1.getval()-op2.getval() == 0;}
int operator!=(Float op1,Float op2){return op1.getval()-op2.getval() != 0;}
// реализация операций ввода/вывода в поток
istream& operator>>(istream &op1, Float &op2){
float val;
op1 >> val;
op2=val;
return op1;
}
ostream& operator<<(ostream &op1, Float &op2){
return op1 << op2.getval();
}
Приложение 3
// E6965.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Float.h"
#include <string.h>
#include <math.h>
int main(int argc, char* argv[])
{
Float a,b;
a="5"; // инициализация символьным массивом
cout << a << "\n"; // вывод в поток
cout << +a << "\n"; // унарный плюс
cout << -a << "\n"; // унарный минус
cout << ++a << "\n"; // инкремент
cout << --a << "\n"; // декремент
b=a+3.; // сложение с числом и присваивание
cout << b << "\n"; // вывод в поток
cout << a+b << "\n"; // сложение
cout << a-b << "\n"; // вычитание
cout << a/b << "\n"; // деление
cout << a*b << "\n"; // умножение
cout << (a^b) << "\n"; // возведение в степень
cout << (a*20.)%b << "\n"; // умножение и взятие остатка от деления
cout << (const char *)(b/3.) << "\n";// деление и перевод в символьный формат
//
// Тестирование исключений
//
cout << "\nсложение и присваивание\n";
a=3.4e+38;
try{
while(1)
cout << (a += 1e35) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
//
cout << "\nвычитание и присваивание\n";
a=-3.4e+38;
try{
while(1)
cout << (a -= 1e35) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
//
cout << "\nумножение и присваивание\n";
a=3.4e+30;
try{
while(1)
cout << (a *= 1e4) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
//
cout << "\nделение и присваивание\n";
a=3.4e+30;
try{
cout << (a /= 0) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
try{
while(1)
cout << (a /= 1e9) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
//
cout << "\nостаток от деления и присваивание\n";
a=1000.;
try{
cout << (a %= 0.) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
a=1e-38;
try{
cout << (a %= 1e9) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
//
cout << "\nвозведение в степень и присваивание\n";
a=50.6;
try{
while(1)
cout << (a^=2.) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
a=0.;
try{
cout << (a^=-2.) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
a=50.6;
try{
while(1)
cout << (a^=-2.) << "\n";
}
catch(EHstate eObj){
if(eObj == zeroDiv)
cout << "zeroDiv\n";
if(eObj == Overflow)
cout << "Overflow\n";
if(eObj == Underflow)
cout << "Underflow\n";
};
return 0;
}
Приложение 4
// calcDlg.h : header file
//
#if !defined(AFX_CALCDLG_H__7C908145_97F8_44F6_A794_DC0D7D0528B9__INCLUDED_)
#define AFX_CALCDLG_H__7C908145_97F8_44F6_A794_DC0D7D0528B9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Float.h"
/////////////////////////////////////////////////////////////////////////////
// CCalcDlg dialog
class CCalcDlg : public CDialog
{
private:
char buf[100]; // буфер для обмена с содержимым индикатора

BOOL New; // новое число
BOOL Comma; // точка
int OP; // зафиксированная операция
Float res; // переменная для вычислений
// Construction
public:
CCalcDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CCalcDlg)
enum { IDD = IDD_CALC_DIALOG };
CEdit m_Status;
CEdit m_Ind;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCalcDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
void Digits(char *dig); // функция ввода цифры/десятичной точки
void OPs(int NewOP); // функция отработки нажатия кнопки операции
// Generated message map functions
//{{AFX_MSG(CCalcDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnButton3();
afx_msg void OnButton4();
afx_msg void OnButton5();
afx_msg void OnButton6();
afx_msg void OnButton7();
afx_msg void OnButton8();
afx_msg void OnButton9();
afx_msg void OnButton0();
afx_msg void OnButtonC();
afx_msg void OnButtonComma();
afx_msg void OnButtonPlus();
afx_msg void OnButtonMinus();
afx_msg void OnButtonMult();
afx_msg void OnButtonDiv();
afx_msg void OnButtonMod();
afx_msg void OnButtonPow();
afx_msg void OnButtonTotal();
afx_msg void OnButtonNeg();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_CALCDLG_H__7C908145_97F8_44F6_A794_DC0D7D0528B9__INCLUDED_)
Приложение 5
// calcDlg.cpp : implementation file
//
#include "stdafx.h"
#include "calc.h"
#include "calcDlg.h"
#include <string.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCalcDlg dialog
CCalcDlg::CCalcDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalcDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCalcDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCalcDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCalcDlg)
DDX_Control(pDX, IDC_EDIT2, m_Status);
DDX_Control(pDX, IDC_EDIT1, m_Ind);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalcDlg, CDialog)
//{{AFX_MSG_MAP(CCalcDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
ON_BN_CLICKED(IDC_BUTTON10, OnButton0)
ON_BN_CLICKED(IDC_BUTTON18, OnButtonC)
ON_BN_CLICKED(IDC_BUTTON19, OnButtonComma)
ON_BN_CLICKED(IDC_BUTTON11, OnButtonPlus)
ON_BN_CLICKED(IDC_BUTTON14, OnButtonMinus)
ON_BN_CLICKED(IDC_BUTTON12, OnButtonMult)
ON_BN_CLICKED(IDC_BUTTON15, OnButtonDiv)
ON_BN_CLICKED(IDC_BUTTON13, OnButtonMod)
ON_BN_CLICKED(IDC_BUTTON16, OnButtonPow)
ON_BN_CLICKED(IDC_BUTTON17, OnButtonTotal)
ON_BN_CLICKED(IDC_BUTTON20, OnButtonNeg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalcDlg message handlers
BOOL CCalcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
New=TRUE;
Comma=FALSE;
OP=0;
return TRUE; // return TRUE unless you set the focus to a control
}
// 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 CCalcDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CCalcDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
// Цифровые кнопки
void CCalcDlg::OnButton1(){Digits("1");}
void CCalcDlg::OnButton2(){Digits("2");}
void CCalcDlg::OnButton3(){Digits("3");}
void CCalcDlg::OnButton4(){Digits("4");}
void CCalcDlg::OnButton5(){Digits("5");}
void CCalcDlg::OnButton6(){Digits("6");}
void CCalcDlg::OnButton7(){Digits("7");}
void CCalcDlg::OnButton8(){Digits("8");}
void CCalcDlg::OnButton9(){Digits("9");}
void CCalcDlg::OnButton0(){Digits("0");}
// Кнопка десятичной точки
void CCalcDlg::OnButtonComma()
{
if(!Comma){ // в числе еще нет десятичной точки
Digits("."); // ставим ее
Comma=TRUE; // устанавливаем признак, что точка уже есть
}
}
// Обработка событий от кнопок цифр и десятичной точки
void CCalcDlg::Digits(char *dig)
{
UpdateData();
m_Ind.GetWindowText(buf,100); // считываем содержимое индикатора
if(New){ // Новое число
buf[0]=0; // обнуляем буфер
m_Status.SetWindowText(""); // очищаем строку статуса
New=FALSE; // снимаем признак Нового числа
}
strcat(buf,dig); // добавляем полученный знак
m_Ind.SetWindowText(buf); // выводим буфер на индикатор
UpdateData(FALSE);
}
// Кнопки операций
void CCalcDlg::OnButtonPlus() {OPs(1);}
void CCalcDlg::OnButtonMinus(){OPs(2);}
void CCalcDlg::OnButtonMult() {OPs(3);}
void CCalcDlg::OnButtonDiv() {OPs(4);}
void CCalcDlg::OnButtonMod() {OPs(5);}
void CCalcDlg::OnButtonPow() {OPs(6);}
void CCalcDlg::OnButtonTotal(){OPs(0);}
// Отработка операций
void CCalcDlg::OPs(int NewOP)
{
UpdateData();
m_Ind.GetWindowText(buf,100); // считываем содержимое индикатора
m_Status.SetWindowText(""); // очищаем строку статуса
try{
switch(OP){ // выполняем зафиксированную операцию
case 0: // нет операции
res=buf;
break;
case 1: // +
res += buf;
break;
case 2: // -
res -= buf;
break;
case 3: // *
res *= buf;
break;
case 4: // /
res /= buf;
break;
case 5: // %
res %= buf;
break;
case 6: // ^
res ^= buf;
break;
}
OP=NewOP; // фиксируем новую операцию
m_Ind.SetWindowText((const char *)res);// выводим результат на индикатор
}
catch(EHstate &eObj){ // произошло исключение
if(eObj == zeroDiv) // выводим сообщение в строку статуса
m_Status.SetWindowText("Деление на 0");
else if(eObj == Overflow)
m_Status.SetWindowText("Переполнение");
else
m_Status.SetWindowText("Потеря порядка");
}
Comma=FALSE; // снимаем признак десятичной точки
New=TRUE; // устанавливаем признак Нового числа
UpdateData(FALSE);
}
// Кнопка смены знака
void CCalcDlg::OnButtonNeg()
{
Float tmp;
UpdateData();
m_Ind.GetWindowText(buf,100); // считываем содержимое индикатора
m_Status.SetWindowText(""); // очищаем строку статуса
tmp=buf; // переводим буфер в числовое значение
tmp=-tmp; // меняем знак числового значения
if(OP == 0)
res=tmp;
m_Ind.SetWindowText((const char *)tmp); // выводим результат на индикатор
UpdateData(FALSE);
}
// Кнопка сброса
void CCalcDlg::OnButtonC()
{
Comma=FALSE; // снимаем признак десятичной точки
New=TRUE; // устанавливаем признак Нового числа
OP=0; // сбрасываем зафиксированную операцию
m_Status.SetWindowText(""); // очищаем строку статуса
m_Ind.SetWindowText(""); // очищаем индикатор
UpdateData(FALSE);
}
34

Список литературы [ всего 3]

Литература
1. Б. Страуструп Язык программирования C++. Специальное издание.– СПб.: "Невский Диалект", 2001.–1099 с.
2. C++ для начинающих. Электронное пособие по языку С++. [электронный ресурс]: http://www.find-info.ru/doc/cpp/001/index.htm
3. Системы автоматизированного проектирования: Учеб. пособие для втузов: В 9 кн. / Под ред. И.П. Норенкова. Кн. 3: В.Г. Федорук, В.М. Черненький. Информационное и прикладное программное обеспечение. – М.: Высш. шк., 1986. – 159 с., ил.
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.0104
© Рефератбанк, 2002 - 2024