四则运算终结版
题目要求:将四则运算开发成网页版或是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”;四则运算的界面有一些错误,不美观经过查找和改正成功。 |