/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:设计分数类,开发一个窗口式程序,可以完成分数的四则运算
* 作 者: 刘洋
* 完成日期: 2012 年 05 月 31 日
* 版 本 号: 1.0
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述:
* 程序输出:
* 程序头部的注释结束
*/
// CFractionDlg.cpp : 实现文件 // #include "stdafx.h" #include "MyCFraction.h" #include "CFraction.h" #include "CFractionDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 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() // CCFractionDlg 对话框 CCFractionDlg::CCFractionDlg(CWnd* pParent /*=NULL*/) : CDialog(CCFractionDlg::IDD, pParent) , m_nu1(0) , m_de1(0) , m_nu2(0) , m_de2(0) , m_nu3(0) , m_de3(0) , m_char1(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CCFractionDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_nu1); DDX_Text(pDX, IDC_EDIT2, m_de1); DDX_Text(pDX, IDC_EDIT4, m_nu2); DDX_Text(pDX, IDC_EDIT5, m_de2); DDX_Text(pDX, IDC_EDIT7, m_nu3); DDX_Text(pDX, IDC_EDIT6, m_de3); DDX_Control(pDX, IDC_EDIT3, m_char); DDX_Text(pDX, IDC_EDIT3, m_char1); } BEGIN_MESSAGE_MAP(CCFractionDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &CCFractionDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CCFractionDlg 消息处理程序 BOOL CCFractionDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CCFractionDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CCFractionDlg::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 { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CCFractionDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CCFractionDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(); CFraction c1(m_nu1, m_de1), c2(m_nu2, m_de2), c3(m_nu3, m_de3); if(m_char1 == "+") c3 = c1 + c2; else if(m_char1 == "-") c3 = c1 - c2; else if(m_char1 == "*") c3 = c1 * c2; else if(m_char1 == "/") c3 = c1 / c2; m_nu3 = c3.get_nume(); m_de3 = c3.get_deno(); UpdateData(FALSE); } CFraction.cpp #include "stdafx.h" #include "MyCFraction.h" void CFraction::simplify() { int m,n,r; m=abs(deno); n=abs(nume); while(r=m%n) // 求m,n的最大公约数 { m=n; n=r; } deno/=n; // 化简 nume/=n; if (deno<0) // 将分母转化为正数 { deno=-deno; nume=-nume; } } // 分数相加 CFraction CFraction::operator+(const CFraction &c) { CFraction t; t.nume=nume*c.deno+c.nume*deno; t.deno=deno*c.deno; t.simplify(); return t; } // 分数相减 CFraction CFraction:: operator-(const CFraction &c) { CFraction t; t.nume=nume*c.deno-c.nume*deno; t.deno=deno*c.deno; t.simplify(); return t; } // 分数相乘 CFraction CFraction:: operator*(const CFraction &c) { CFraction t; t.nume=nume*c.nume; t.deno=deno*c.deno; t.simplify(); return t; } // 分数相除 CFraction CFraction:: operator/(const CFraction &c) { CFraction t; if (!c.nume) return *this; //除法无效(除数为0)时,这种情况需要考虑,但这种处理仍不算合理 t.nume=nume*c.deno; t.deno=deno*c.nume; t.simplify(); return t; } int CFraction::get_deno() { return deno; } int CFraction::get_nume() { return nume; } CFraction.h class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1):nume(nu),deno(de){} void simplify(); CFraction operator+(const CFraction &c); //两个分数相加,结果要化简 CFraction operator-(const CFraction &c); //两个分数相减,结果要化简 CFraction operator*(const CFraction &c); //两个分数相乘,结果要化简 CFraction operator/(const CFraction &c); //两个分数相除,结果要化简 int get_nume(); int get_deno(); };