• 四则运算加界面


    #include<iostream>
    #include<ctime>
    #include<cmath>
    #include<sstream>
    #include<string>
    #include<fstream>
    #include<iomanip>
    #define MAX 1000
    using namespace std;
    #pragma once
    class Input
    {
    public:
        Input()
        {
            for( int i = 0;i < MAX;i++ )
                Str_input[i] = '';
        }
        char Str_input[MAX];
        void inStr(string str11)
        {
            strcpy(Str_input,str11.c_str());
        }
    };
    Input.h
    // 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;
    jimian.h
    // 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);
    };
    jimianDlg.h
    #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错误,终止!
    ";
                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]='';
                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]='';
                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]='';
                    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;
    };
    jisuan.h
    #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;
    };
    Output.h
    //{{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
    Resource.h
    /*计算用的存储结构*/
    #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;}
    };
    STACK.h
    // 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
    stdafx.h
    #pragma once
    
    // 包括 SDKDDKVer.h 将定义最高版本的可用 Windows 平台。
    
    // 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
    // WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
    
    #include <SDKDDKVer.h>
    targetver.h
    // 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.cpp
    // 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] + "=" + "
    ";
            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("回答正确!
    ");
                   MessageBox("     回答正确!","恭喜");
                 //  UpdateData(TRUE);
                   str.Format("result = %f",r);
                   m_edit7.SetWindowText(str);
                   //UpdateData(FALSE);
                   
               }
        else
               {
                   //cout<<"回答错误!"<<endl;
                  // cout<<"正确结果为:"<<r<<endl;
                   //m_edit7.SetWindowText("回答错误!
    ");
                 
                   MessageBox("   回答错误!","再接再厉");
                   
                   
                  // m_edit7.SetWindowText("正确结果为:");
                   
             
                   
                   str.Format("结果= %f",r);
                   m_edit7.SetWindowText(str);
                   
                   //MessageBox(str);
                    //MessageBox(ans);
                    str.ReleaseBuffer();
                   //m_edit7.SetWindowText("
    ");
                   
               }
    }
    
    
    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.cpp
    // stdafx.cpp : 只包括标准包含文件的源文件
    // jimian.pch 将作为预编译头
    // stdafx.obj 将包含预编译类型信息
    
    #include "stdafx.h"
    stdafx.cpp

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

    二、设计思路:实验核心是按以前实验编写的,这次就是加的界面,用MFC做的界面,代码比较难,主要是在网上查的相关的资料和找同学帮的忙。

    三、用时:这次实验感觉比较难,不敢估计,实际用了30多个小时。

    四、体会:C++做界面还是很麻烦的,做界面或是网页用java比较合适。做程序选择语言很重要。

    五、截图:

    听课

    编写程序

    阅读相关书籍

    网上查找资料

    日总计

    周一

    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)

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

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

    星期一

    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 ”;四则运算的界面有一些错误,不美观经过查找和改正成功。

    慧慧:http://www.cnblogs.com/yhhzxcvbnm/

  • 相关阅读:
    nginx部分功能配置备忘
    mysql 截取数据 组合排序
    java实现排列组合
    每日记载内容总结48
    http请求转换为https请求
    每日记载内容总结47
    rabbitmq 基本操作
    redis免密登录被入侵解决方式
    支付宝支付sign_type从RSA到RSA2遇到的问题
    Java面试题2
  • 原文地址:https://www.cnblogs.com/lvlan/p/5360698.html
Copyright © 2020-2023  润新知