四则运算终结版

题目要求:将四则运算开发成网页版或是APP形式,能让用户使用。

设计思路:老师吩咐的内容:将程序做成APP或者网页版;考虑到我们的程序是用C++语言编写的,以及对java语言和javascript语言掌握的不太好,所以选择用c++语言和C#编写界面,而用C#语言做界面需要将C++做成一个动态链接库(Dynamic-link Library,缩写为 DLL),尝试了一段时间结果进展的比较慢,所以我们转向用MFC(Microsoft Foundation Classes)做界面,但我们承认MFC确实是个不太人性化,操作比较麻烦。

设计思路:

1首先添加两个单选按钮,用来选择输出方式,单击按钮调用代码

并将变量way设值,用于选择将表达式和答案输出的方式;

2.设置列表框用于获取所选择的年级,并将其赋值给grade

3.插入编辑框用来获取题目的数量(int 型),考虑到编辑框获得的值为字符串,需要用函数atoi()将其转换为int型

4.插入三个编辑框,分别作为题目,答案的输出位置,以及用户的输入位置,前两者由于只是作为输出框,属性为只读。并分别他们为添加变量(代表他们获取值,调用函数的作用)

// jimian.cpp : 定义应用程序的类行为。

#include "stdafx.h"
#include "jimian.h"
#include "jimianDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CjimianApp

BEGIN_MESSAGE_MAP(CjimianApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CjimianApp 构造

CjimianApp::CjimianApp()
{
    // 支持重新启动管理器
    m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;

    // TODO: 在此处添加构造代码,
    // 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CjimianApp 对象

CjimianApp theApp;


// CjimianApp 初始化

BOOL CjimianApp::InitInstance()
{
    // 如果一个运行在 Windows XP 上的应用程序清单指定要
    // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
    //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 将它设置为包括所有要在应用程序中使用的
    // 公共控件类。
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();


    AfxEnableControlContainer();

    // 创建 shell 管理器,以防对话框包含
    // 任何 shell 树视图控件或 shell 列表视图控件。
    CShellManager *pShellManager = new CShellManager;

    // 标准初始化
    // 如果未使用这些功能并希望减小
    // 最终可执行文件的大小,则应移除下列
    // 不需要的特定初始化例程
    // 更改用于存储设置的注册表项
    // TODO: 应适当修改该字符串,
    // 例如修改为公司或组织名
    SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

    CjimianDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: 在此放置处理何时用
        //  “确定”来关闭对话框的代码
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: 在此放置处理何时用
        //  “取消”来关闭对话框的代码
    }

    // 删除上面创建的 shell 管理器。
    if (pShellManager != NULL)
    {
        delete pShellManager;
    }

    // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
    //  而不是启动应用程序的消息泵。
    return FALSE;
}
//出题程序输出函数
// jimian.h : PROJECT_NAME 应用程序的主头文件
//

#pragma once

#ifndef __AFXWIN_H__
    #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif

#include "resource.h"

// 主符号
// CjimianApp:
// 有关此类的实现,请参阅 jimian.cpp
//

class CjimianApp : public CWinApp
{
public:
    CjimianApp();

// 重写
public:
    virtual BOOL InitInstance();

// 实现

    DECLARE_MESSAGE_MAP()
};

extern CjimianApp theApp;
// jimianDlg.cpp : 实现文件

#include "stdafx.h"
#include "jimian.h"
#include "jimianDlg.h"
#include "afxdialogex.h"
#include "Input.h"
#include "Output.h"
#include "STACK.h"
#include "jisuan.h"
#include <stdlib.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
CString grade;
CString str1;
CString str2;
CString str4[];
CString ans;
int N,j;
int way;
double a,r;

BOOL flag;
string str[1000];
string str3[];
ofstream outfile("questions.txt");
ofstream outfile_1("answers.txt");
CString strText;//获取listbox的文本
class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};
CAboutDlg CAD;
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CjimianDlg 对话框




CjimianDlg::CjimianDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CjimianDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CjimianDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST2, m_listBox);
    DDX_Control(pDX, IDC_RADIO1, m_ctrlRadio1);
    DDX_Control(pDX, IDC_RADIO2, m_ctrlRadio2);
    DDX_Control(pDX, IDC_EDIT3, m_edit);
    //    DDX_Control(pDX, IDC_EDIT2, m_edit2);
    DDX_Control(pDX, IDC_BUTTON1, m_btn);
    //DDX_Control(pDX, IDC_EDIT5, m_edit1);
    DDX_Control(pDX, IDC_EDIT5, m_edit6);
    DDX_Control(pDX, IDC_EDIT6, m_edit7);
    DDX_Control(pDX, IDC_EDIT7, m_edit8);
}

BEGIN_MESSAGE_MAP(CjimianDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_LBN_SELCHANGE(IDC_LIST2, &CjimianDlg::OnLbnSelchangeList2)
    ON_BN_CLICKED(IDC_RADIO1, &CjimianDlg::OnBnClickedRadio1)
    ON_EN_CHANGE(IDC_RICHEDIT22, &CjimianDlg::OnEnChangeRichedit22)
    ON_BN_CLICKED(IDC_RADIO2, &CjimianDlg::OnBnClickedRadio2)
    ON_EN_CHANGE(IDC_EDIT3, &CjimianDlg::OnEnChangeEdit3)
//    ON_EN_CHANGE(IDC_EDIT2, &CjimianDlg::OnEnChangeEdit2)
    ON_BN_CLICKED(IDC_BUTTON1, &CjimianDlg::OnBnClickedButton1)
//    ON_EN_CHANGE(IDC_EDIT1, &CjimianDlg::OnEnChangeEdit1)
ON_EN_CHANGE(IDC_EDIT5, &CjimianDlg::OnEnChangeEdit5)
ON_BN_CLICKED(IDC_BUTTON2, &CjimianDlg::OnBnClickedButton2)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


// CjimianDlg 消息处理程序

BOOL CjimianDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    CBitmap bmp;
    bmp.LoadBitmapA(IDB_BITMAP1);
    m_brBK.CreatePatternBrush(&bmp);
    bmp.DeleteObject();
    // TODO: 在此添加额外的初始化代码
    m_listBox.AddString(_T("二年级"));
    m_listBox.AddString(_T("三年级"));
    m_listBox.AddString(_T("四年级"));
    m_listBox.AddString(_T("五年级"));
    m_listBox.AddString(_T("六年级"));
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CjimianDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CjimianDlg::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
    {
        CDialogEx::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CjimianDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}



void CjimianDlg::OnLbnSelchangeList2()
{
    // TODO: 在此添加控件通知处理程序代码
    m_listBox.GetText(m_listBox.GetCurSel(),strText);
    grade = strText;
    MessageBox("  您选择的是"+grade+"的题","题的类型");
}


void CjimianDlg::OnBnClickedRadio1()
{
    // TODO: 在此添加控件通知处理程序代码
    if(m_ctrlRadio1.GetCheck())
    {    
        way =0;
        MessageBox("问题与答案将输出到文件","输出方式");
        
    }
}


void CjimianDlg::OnEnChangeRichedit22()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
}


void CjimianDlg::OnBnClickedRadio2()
{
    // TODO: 在此添加控件通知处理程序代码
    if(m_ctrlRadio2.GetCheck())
    {    
        way =1;
        
        MessageBox("问题与答案将输出到本界面","输出方式");
    }
    
}
int CjimianDlg::Expression(CString grade,int N)
{
    
    Input in;
    jisuan cl;
    Output out;
    double sum=0.0;
    double result;
    double answer;
    cout.precision(5);
    int random_a,random_b,random_c,random_e,random_f,random_g;
    int max,min;//整数
    int random_d;
    double random_h;
    
    //根据年级的不同选择每道题目的数的数量
    if(grade=="二年级")
    {
        random_a=rand()%2+2;
        max=50;
        min=1;
    }
    if(grade=="三年级")
    {
        random_a=rand()%3+2;
        max=100;
        min=1;
    }
    if(grade=="四年级")
    {
        random_a=rand()%3+2;
        max=500;
        min=1;
    }
    if(grade=="五年级")
    {
        random_a=rand()%3+2;
        max=1000;
        min=1;
    }
    if(grade=="六年级")
    {
        random_a=rand()%3+2;
        max=1000;
        min=1;
    }
    for(int j=0;j<N;j++)
    { 
        int flag=0;
        int count_p=0,count_q=0;//计算括号的数量
        for(int i=0;i<random_a;i++)
       {
          if(grade=="二年级"||grade=="三年级"||grade=="四年级")
            {
                random_b=0;//只有整数计算
            }
         if(grade=="五年级"||grade=="六年级")
            {
                random_b=rand()%3+0;
            }
        char str1[100];
        if(random_a>2&&i<(random_a-1))
        {
              random_d=rand()%4+0;
              switch(random_d)//控制括号的产生
              {
                case 0:flag=0;break;
                case 1:if(i!=(random_a-1)&&i<(random_a-2)){str[j]+='(';flag=1;count_q+=1;}break;
                case 2:flag=0;break;
                case 3:if(i!=(random_a-1)&&i<(random_a-2)){str[j]+='(';flag=1;count_q+=1;}break;
                }
          }
            //数字的产生
            switch(random_b)
            {
                
            case 0:
                {
                    random_c=rand()%(max-min+1)+min;//整数
                    itoa(random_c,str1,10);
                    str[j]+=str1;
                   } break;
                   
            case 1:
                {
                       random_h=(rand()%100)/100.0;//小数
                       random_e=rand()%10+0;
                       random_h+=random_e;
                       stringstream ss;
                       ss<<random_h;
                       str[j]+=ss.str();
                   }
                   break;
            case 2:
                 {//分数
                do{
                    random_f=rand()%20+1;
                    random_g=rand()%10+1;
                   }while(random_g==random_f);
                int number=1;
                int m;
                if(random_g>random_f)
                {    
                     m=random_f;
                }
                else 
                { m=random_g;}
                for(int k=2;k<m+1;k++)
                {
                     if((random_g%k==0)&&(random_f%k==0))
                    {
                         number=k;
                    } 
                }
                random_f=random_f/number;
                random_g=random_g/number;
                str[j]+='(';
                if(random_g==1)
                {
                     int n=0;
                     n=random_g;
                     random_g=random_f;
                     random_f=n;
                }
                itoa(random_f,str1,10);
                str[j]+=str1;
                str[j]+='/';
                itoa(random_g,str1,10);
                str[j]+=str1;
                str[j]+=')';
               }break;
            }
            //右括号的产生
           if((flag!=1)&&(count_p!=count_q))
           {
               str[j]+=')';
               count_p+=1;
           }
           if(i==(random_a-1))
           {
               if(count_p<count_q)
               {
                   for(int k=0;k<(count_q-count_p);k++)
                   str[j]+=')';
               }
            }
        if(i!=(random_a-1))
        {
            random_b=rand()%4+0;
            switch(random_b)
            {
            case 0:{str[j]+='+';}break;
            case 1:{str[j]+='-';}break;
            case 2:{str[j]+='*';}break;
            case 3:{str[j]+='/';}break;
            }
        }
     }    
       
       in.inStr(str[j]);                              //输入模块
       out.getRes( cl.Calculate(in.Str_input,sum) ); //计算模块
       out.printRes(result);
       if (result<0)
       {
           str[j]="";
           j--;
           
       } 
       else
       {
           
           if(way==1)
           {
          // cout<<str[j]<<"="<<endl;
            str[j] = str[j] + "=" + "\r\n";
        UpdateData(true);
           m_edit6.SetWindowText(CString(str[j].c_str()));
           str[j] = "";
          // GetDlgItem(IDC_EDIT1)->SetWindowText(str3[j]);
           cout<<"请输入答案(小数点后保留两位):";
           UpdateData(false);
           cin>>answer;
         CString str;
           r=result;
           
         //str.Format("result = %f",r);
          //MessageBox(str);
         // m_edit7.SetWindowText(str);
          //
           }
           else
           {
               outfile<<str[j]<<"=";
               outfile<<endl;
               outfile_1<<"正确结果为:"<<result;
               outfile_1<<endl;
           }
       }
            
    }
    
    return 0;
}    


void CjimianDlg::OnEnChangeEdit3()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    UpdateData(TRUE);
    /*N = m_edit.GetDlgItemInt(IDC_EDIT3,&flag,true);*/
    CString str;
    ((CEdit *)GetDlgItem(IDC_EDIT3))->GetWindowText(str);//获得
    N = atoi(str);
    // MessageBox(str);
}


void CjimianDlg::OnEnChangeEdit2()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    
}


void CjimianDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    
    
    /*GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW);
    GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE);
    GetDlgItem(IDC_EDIT7)->ShowWindow(SW_SHOW);*/
        srand((unsigned)time(NULL));
    if(grade=="二年级")
    {
    Expression(grade,N);
    }
    if(grade=="三年级")
    {
        Expression(grade,N);
    }
    if(grade=="四年级")
    {
        Expression(grade,N);
    }
    if(grade=="五年级")
    {
        Expression(grade,N);
    }
    if(grade=="六年级")
    {
        Expression(grade,N);
    }
    outfile.close();
    outfile_1.close();
    
}


void CjimianDlg::OnEnChangeEdit1()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    
    
}


void CjimianDlg::OnEnChangeEdit5()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
}


void CjimianDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    /*GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE);
    GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW);
    GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE);*/
    CString str;  
    //UpdateData(TRUE);
           ((CEdit *)GetDlgItem(IDC_EDIT7))->GetWindowText(ans);
          
           a = atof(ans);
           
               
    //UpdateData(FALSE);
    if (a == r)
           {
               
               cout<<"回答正确!"<<endl;
               //m_edit7.SetWindowText("回答正确!\r\n");
               MessageBox("     回答正确!","恭喜");
             //  UpdateData(TRUE);
               str.Format("result = %f",r);
               m_edit7.SetWindowText(str);
               //UpdateData(FALSE);
               
           }
    else
           {
               //cout<<"回答错误!"<<endl;
              // cout<<"正确结果为:"<<r<<endl;
               //m_edit7.SetWindowText("回答错误!\r\n");
             
               MessageBox("   回答错误!","再接再厉");
               
               
              // m_edit7.SetWindowText("正确结果为:");
               
         
               
               str.Format("结果= %f",r);
               m_edit7.SetWindowText(str);
               
               //MessageBox(str);
                //MessageBox(ans);
                str.ReleaseBuffer();
               //m_edit7.SetWindowText("\r\n");
               
           }
}


HBRUSH CjimianDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  在此更改 DC 的任何特性

    // TODO:  如果默认的不是所需画笔,则返回另一个画笔
    if(pWnd ==this)
    {    
        return m_brBK;
    }
      if( nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC)  //静态文本颜色,并且指定控件ID号       
    {            
                     
        pDC->SetBkMode(TRANSPARENT);    //静态文本框背景设置为透明
         return   (HBRUSH)GetStockObject(NULL_BRUSH);
             
    }
    
           if( nCtlColor==CTLCOLOR_STATIC &&pWnd->GetDlgCtrlID()==IDC_RADIO1||nCtlColor==CTLCOLOR_STATIC &&pWnd->GetDlgCtrlID()==IDC_RADIO2 )  //单选按钮颜色,并且指定控件ID号       
    {            
                       
        pDC->SetBkMode(TRANSPARENT);    //背景设置为透明
        return   (HBRUSH)GetStockObject(NULL_BRUSH);
   } 
       return hbr;
}
// jimianDlg.h : 头文件
//

#pragma once
#include "afxwin.h"


// CjimianDlg 对话框
class CjimianDlg : public CDialogEx
{
// 构造
public:
    CjimianDlg(CWnd* pParent = NULL);    // 标准构造函数
    int Expression(CString grade,int N);
// 对话框数据
    enum { IDD = IDD_JIMIAN_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    CBrush m_brBK ;
    CBrush m_brush;

// 实现
protected:
    HICON m_hIcon;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    CListBox m_listBox;
    afx_msg void OnLbnSelchangeList2();
    afx_msg void OnBnClickedRadio1();
    afx_msg void OnEnChangeRichedit22();
    CButton m_ctrlRadio1;
    CButton m_ctrlRadio2;
    afx_msg void OnBnClickedRadio2();
    CEdit m_edit;
    afx_msg void OnEnChangeEdit3();
    afx_msg void OnEnChangeEdit2();
    CEdit m_edit2;
    afx_msg void OnBnClickedButton1();
    CButton m_btn;
    afx_msg void OnEnChangeEdit1();
    CEdit m_edit1;
    CEdit m_edit6;
    CEdit m_edit7;
    CEdit m_edit8;
    afx_msg void OnEnChangeEdit5();
    afx_msg void OnBnClickedButton2();
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
};
#include"Input.h"
#include"STACK.h"
/*计算的模块*/
#pragma once
class jisuan
{
public: 
    bool shuhanshu(char);                 
    bool fuhanshu(char);                 
    int jckh(char);                  
    bool jcxsd(char *);              
    int pdyxj(char);                 
    double ToData(char*);             
    double Call(double,double,char);    
    int ppkh(char* buffer,int pos); 
    void Opr( STACK<char>&, STACK<double>&, int& ); 
    double Calculate(char*, double& );   

};
bool jisuan::shuhanshu(char ch)      
{
    return ((ch>='0'&&ch<='9')||ch=='.')?true:false;
}
bool jisuan::fuhanshu(char ch)     
{
    return (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#')?true:false;
}
int jisuan::jckh(char ch)
{
    if(ch=='(')
        return 1;
    if(ch==')')
        return -1;
    return 0;
}
bool jisuan::jcxsd(char *ch)
{
    int a=0;
    for(unsigned int i=0;i<strlen(ch);i++)
        if(ch[i]=='.')          
            a++;
    if(a>1)
        return false;
    return true;
}
int jisuan::pdyxj(char ch)          //符号的优先极别
{
    switch(ch)
    {
    case '+':
        return 0;
    case '-':
        return 0;
    case '*':
        return 1;
    case '/':
        return 1;
    case '#':
        return 0;
    default:
        return -1;
    }
}
double jisuan::ToData(char* ch)   //将数字转化为数值
{
    unsigned int i,j;
    int sumn=0;
    double sum=0.0;
    if(!jcxsd(ch)) return 0.0;
    for(i=0;i<strlen(ch);i++)           
    {
        if(ch[i]!='.')
            sumn=sumn*10+(ch[i]-'0');
        else break;
    }
    if(i<strlen(ch))
        for(j=i+1;j<strlen(ch);j++)        
            sum=sum*10+(ch[j]-'0');
    sum /= pow(10.0,(double)(strlen(ch)-1-i));
    return (sum+sumn);                    
}
double jisuan::Call(double sum,double data,char ch)
{
    double ans=0.0;
    switch(ch)
    {
    case '+':
        ans=sum+data;
        break;
    case '-':
        ans=sum-data;
        break;
    case '*':
        ans=sum*data;
        break;
    case '/':
        if( data != 0.0 )
            ans=sum/data;
        else
        {
            cout<<"程序出现除0错误,终止!\n";
            system("pause");
            exit(1);
        }
        break;
    case '#':
        return 0;
    default:ans=0.0;
        break;
    }
    int b=(int)(ans*100+0.5);
    ans=b/100.0;
    return ans;
}
int jisuan::ppkh(char* buffer,int pos)     //利用栈找到匹配的括号
{
    STACK<char> Temp;
    unsigned int i;
    for(i=pos;i<strlen(buffer);i++)
    {
        if(jckh(buffer[i])==1)
            Temp.push('0');
        if(jckh(buffer[i])==-1)
        {
            Temp.pop();
            if(Temp.size()==0) return i;
        }
    }
    return -1;
}
void jisuan::Opr(STACK<char>& symbol,STACK<double>& data,int& mark)
{
    double sum;
    while(symbol.size()!=0)
    {
        char tem=symbol.pop();
        int temp=pdyxj(tem);
        symbol.push(tem);
        if(temp<mark)
            break;
        else{
            sum=Call(data.pop(),data.pop(),symbol.pop());
            data.push(sum);
        }
    }
}
double jisuan::Calculate(char* buffer,double& sum)   //字符串读入和各个函数调配
{
    STACK<double> data;
    STACK<char> symbol;
    double ans;
    char temp[MAX];
    unsigned int ct=0;
    int mark=0,tp=0;
    data.push(sum);
    while(ct<=strlen(buffer))
    {
        if(shuhanshu(buffer[ct]))            //如果是数字或小数点
        {
            while( ct < strlen(buffer) && shuhanshu(buffer[ct]) )
                temp[tp++]=buffer[ct++];
            temp[tp]='\0';
            tp=0;                         //读到非数字也非小数为止
            ans=ToData(temp);             //把读到的字符串转化为数
            data.push(ans);

            if(ct==strlen(buffer))        //已经独到字符串末尾
            {
                mark=0;
                Opr(symbol,data,mark);    
                sum=data.pop();           
                return sum;               
            }
            else{
                int mark=pdyxj(buffer[ct]);
                Opr(symbol,data,mark);     //计算
            }
        }
        else if(fuhanshu(buffer[ct]))         //如果是运算符
            symbol.push(buffer[ct++]);     //运算符入symbol栈
        else
        {
            char BF[100];int k=0;          //如果都不是,则只能是括号
            while( jckh( buffer[ct] ) != 1 && ct <= strlen(buffer) )
                BF[k++] = buffer[ct++];
            BF[k]='\0';
            if(jckh(buffer[ct])==1)       //一旦读到左括号,寻找它匹配的右括号
            {
                int i,j;
                char Temp[100];
                for(i=ct+1,j=0;i<ppkh(buffer,ct);i++,j++)
                    Temp[j]=buffer[i];     //把这对括号中的字符串存入Temp
                Temp[j]='\0';
                data.push(Calculate(Temp,sum)); 

                ct+=(strlen(Temp)+1);       
                if(ct+1==strlen(buffer))   
                {
                    mark=0;
                    Opr(symbol,data,mark);
                    sum=data.pop();
                    return sum;
                }
                else
                {
                    mark=pdyxj(buffer[ct+1]); //不是的话继续计算
                    Opr(symbol,data,mark);
                }
                ct++;                           //读入下一个字符
            }
        }
    }
    return 0;
};
#pragma once
class Output
{
public:
    Output()
    {
        result = 0;
    }
    void getRes( double res )
    {
        result = res;
    }
    void printRes(double &num_an)
    {
        num_an=result;
    }
private:
    double result;
};
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by jimian.rc
//
#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
#define IDS_ABOUTBOX                    101
#define IDD_JIMIAN_DIALOG               102
#define IDR_MAINFRAME                   128
#define IDB_BITMAP1                     132
#define IDC_RADIO1                      1000
#define IDC_RADIO2                      1001
#define IDC_LIST1                       1002
#define IDC_LIST2                       1003
#define IDC_RICHEDIT21                  1004
#define IDC_RICHEDIT22                  1005
#define IDC_BUTTON1                     1009
#define IDC_BUTTON2                     1010
#define IDC_EDIT3                       1011
#define IDC_EDIT5                       1013
#define IDC_EDIT6                       1014
#define IDC_EDIT7                       1015

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        133
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1014
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
/*计算用的存储结构*/
#pragma once
template <class Type>
class STACK{                 
private:
    Type base[MAX];
    int Size;
public:
    STACK()
    {
        Size=0;
    };
    void push(Type a)     
    {
        base[Size]=a;
        Size++;
    }
    Type pop()           
    {
        return base[--Size];
    }
    int size()
    {return Size;}
};
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展


#include <afxdisp.h>        // MFC 自动化类



#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持









#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

 

 

时间记录日志:(单位:min):



 

听课

编写程序

阅读相关书籍

网上查找资料

日总计

周一

0

5

0

0.5

5.5

周二

0

4

0

0.5

4.5

周三

0

4

0

0

4

上周一

2

0

0

1

3

上周二

0

1

0

1

2

上周三

0

3

0

0

3

上周四

2

4

0

0

6

上周五

0

4

0

0.5

4.5

上周六

0

5

0

0.5

5.5

上周日

0

3

0

0

3

周总计

4

33

0

      4

41


项目计划日志(单位:h)


日期

开始时间

结束时间

中断时间

净时间

活动

备注

星期一

10:00

12:00

0

120

编写程序和网上查找资料

求最大连通数组

 

14:00

17:00

0

240

编写程序

求最大连通数组

星期二

13:30:00

18:00

30

240

编写程序

求最大连通数组

 

19:00

19:30

0

30

查找资料修复缺陷

求最大连通数组

星期三

13:30

18:00

30

240

编写程序

四则运算界面

 

19:00

20:00

0

60

读书

构建之法

上周一

14:00

15:50

10

100

听课

构建之法

 

16:00

17:00

0

60

查找资料

四则运算界面

上周二

14:30

15:30

0

60

网上查找资料

四则运算界面

 

21:00

22:00

0

60

编写程序

四则运算界面

上周三

15:00

17:00

0

120

编写程序

四则运算界面

 

21:30

22:30

0

60

编写程序

四则运算界面

上星期四

14:00

15:50

10

100

听课

软件工程

 

19:00

23:00

0

240

编程

求最大数组

上星期五

16:00

21:00

60

240

编程上网查找资料

结对编程

 

 

21:30

22:00

0

30

网上查找资料

四则运算界面

上星期六

12:00

14:00

0

120

编程和写博客

四则运算界面

 

19:00

22:30

0

210

编写程序和网上查找资料

四则运算界面

上星期日

19:00

22:00

0

180

编写程序和写阅读笔记

四则运算和求最大连通数组



缺陷记录日志:


日期

编号

修复时间

修复缺陷

3月29

1

21:00-22:00

选用MFC初步进行学习,终于完成了界面的初步设计。

3月30

2

15:00-17:00

选用MFC后,遇到很多问题,今天我们完成了按钮与源代码中各项属性的连接。

3月31

3

19:00-23:00

传值出现问题,改了好久,字符与数字的来回转化太多,终于实现了数字的正确输出。

4月1

4

16:00-21:00

输出到文件这一功能差点要放弃,总是找不到输出的文件,查了很多资料才找到问题出处。

4月2

5

19:00-22:30

加了背景之后导致单选框出现黑条,来回改了好多次。

并且单选框的选项顺序总是出错,还好修改成功。

4月3

6

19:00-22:00

四则运算求其结果时输出小数点后六位,且输入的结果也要为6位,经过查找资料和讨论能保留两位有效数字并且可以精确的保留。

4月4

7

14:00-17:00

开始程序输出不成功,实验有bug,是程序的取值范围出错,输出乱码,并且输出的结果不正确,是程序定义和调用不正确,结果的错误是设计思路出错。

4月5

8

14:30-20:30

文件输出不成功,并且不能换行只能输出一行的数字。文件输出用outfile<<”r\n”;四则运算的界面有一些错误,不美观经过查找和改正成功。

posted @ 2016-04-06 18:05  我心悦你  阅读(361)  评论(1编辑  收藏  举报