• 第三次寒假作业


    《面向对象程序设计》——寒假作业3

    1.合作者

    林燊 031602325 https://www.cnblogs.com/linshen/

    卢泽明 031602328 http://www.cnblogs.com/luzeming/

    github链接(https://github.com/Travaill/arithmetic.git)

    2.设计思路

    绘图1

    3.程序功能

    • 能对0--10之间的整数进行四则运算(加减乘除)

    • 能实现选择中文和英文两种语言

    • 程序能接收用户输入的整数答案,并判断对错

    • 程序结束时,统计出答对、答错的题目数量

    4.算法分析

    • 类generate 实现随机算式的生成
    • 类calculate 计算算式的结果
    • 类control 控制题目生成的数量 控制生成符合要求的算式 控制程序的 退出 控制程序的语言
    • 类printf 输出算式、判断结果、统计答题情况

    5.代码规范

    • 函数的命名必须使用英文单词,不使用拼音缩写
    • 函数的命名如果一个单词的必须首字母大写,如果多个单词的用下划线隔开
    • 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。
    • 要随意定义全局变量,尽量使用局部变量。
    • 函数的旁边必须注释上本函数的功能
    • 禁止GOTO语句。

    6.代码展示

    代码部分较长,所以仅截取程序最为核心的部分

    随机生成表达式

    #include "generate.h"
    #include <iostream>
    #include <stdlib.h>
    #include <time.h> 
    #include <string>
    #include <sstream>
    #include <string.h>
    using namespace std;
    int Generate::generate_rand(int low,int high)  //生成[low,high]随机数 
    {
    	return (rand()% (high - low+1) + low);
    }  
    
    string Generate::generate_operator(void)     //生成四则运算符 
    {
    	string ope;
        switch(generate_rand(1,4)) 
        {
        	case 1:ope='+'; break;
        	case 2:ope='-'; break;
        	case 3:ope='*'; break;
        	case 4:ope='/'; break;
    	}
    	return ope;
    }
    
    string Generate::generate_polynomial(void)  //生成多项式 
    {
    	int a,b,c;
        stringstream ss;
    	a=generate_rand(0,10);    
        b=generate_rand(0,10);
        c=generate_rand(1,3);  
       if(c==1) 
      {
      	ss << '(' << a<<generate_operator()<<b<<')';
      } 
        if(c==2)
      {
        ss<<a<< generate_operator()<<b;
      }
        if(c==3)	
      {
    	ss<<a;
      }
      	string str = ss.str();  
      	ss.str("");
        return str;
    }
    
    string Generate::generate_formula(void)     //生成算式 
    {
    	stringstream ss;
    	ss<<generate_polynomial();
    	for(int i=1;i<generate_rand(2,4);i++)
    	{
    		ss<<generate_operator()<<generate_polynomial();
    	}
    	string str = ss.str();  
    	ss.str("");
        return str;
    }
    

    计算表达式结果

    #include "calculate.h"
    #include "generate.h"
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <stack>
    using namespace std;
    stack<double> num_stk;
    stack<char> ope_stk;
    void Calculate::calculate_polynomial()      //计算多项式结果 
    {
    	char ope=ope_stk.top();
        double a,b,res;
        b=num_stk.top();
        num_stk.pop();
        a=num_stk.top();
        num_stk.pop();
        switch(ope)
        {
            case '+':res=a+b; break;
            case '-':res=a-b; break;
            case '*':res=a*b; break;
            case '/':res=a/b; break;
            default: break;
        }
        num_stk.push(res);
        ope_stk.pop();
    }
    
    int Calculate::Rank(char x)                //计算优先级 
    {
        if(x=='(')
            return 0;
        else if(x=='+')
            return 1;
        else if(x=='-')
            return 2;
        else if(x=='*')
            return 3;
        else if(x=='/')
            return 4;
    }
    
    double Calculate::calculate_formula(string str)     //计算算式 
    {
    	
    	int x=0;
    	int  num_flag=0;
    	for(int i=0;i<str.size();i++)
    	{
            if((str[i]>='0')&&(str[i]<='9'))
    		{
                x=x*10+str[i]-'0';
                num_flag=1;
                if(i==str.size()-1)
                num_stk.push(x);
            }
            else{
                if(x)
    			{
                    num_stk.push(x);
                    x=0;
                    num_flag=0;
                }
                if(ope_stk.empty())
                    ope_stk.push(str[i]);
                else if(str[i]=='(')
                    ope_stk.push(str[i]);
                else if(str[i]==')')
                {
                    while(ope_stk.top()!='(')
                        calculate_polynomial();                
                        ope_stk.pop();
                }
                else if((Rank(str[i]))<=Rank(ope_stk.top()))
                {
                    calculate_polynomial();
                    ope_stk.push(str[i]);
                }
                else
    			{
                    ope_stk.push(str[i]);
                }
            }
        }
        while(!ope_stk.empty())
        calculate_polynomial();
        double res=num_stk.top();
        return res;
    }
    

    过滤不符合要求的表达式

    string Control::judge_formula(void)               //生成的算式是否合法 
    {
    	string str=Generate().generate_formula();
    	char ptr[35];
        strcpy(ptr,str.c_str()); 
    	const char *substr1="/0";
    	const char *substr2="/(1-1)";
    	const char *substr3="/(2-2)";
    	const char *substr4="/(3-3)";
    	const char *substr5="/(4-4)";
    	const char *substr6="/(5-5)";
    	const char *substr7="/(6-6)";
    	const char *substr8="/(7-7)";
    	const char *substr9="/(8-8)";
    	const char *substr10="/(9-9)";
    	const char *substr11="/(10-10)";
    	const char *substr12="0*";
    	const char *substr13="0/";
        char *s1 = strstr(ptr, substr1);
        char *s2 = strstr(ptr, substr2);
        char *s3 = strstr(ptr, substr3);
        char *s4 = strstr(ptr, substr4);
        char *s5 = strstr(ptr, substr5);
        char *s6 = strstr(ptr, substr6);
        char *s7 = strstr(ptr, substr7);
        char *s8 = strstr(ptr, substr8);
        char *s9 = strstr(ptr, substr9);
        char *s10 = strstr(ptr, substr10);
        char *s11 = strstr(ptr, substr11);
        char *s12 = strstr(ptr, substr12);
        char *s13 = strstr(ptr, substr13);
         if(s1==NULL&&s2==NULL&&s3==NULL&&s4==NULL&&s5==NULL&&s6==NULL&&s7==NULL&&s8==NULL&&s9==NULL&&s10==NULL&&s11==NULL&&s12==NULL&&s13==NULL)
         {
         	return str;
    	 }
    	 else
    	 {
    	 	return judge_formula();
    	 }
        
    }
    
    string Control::judge_result(void)          //判断结果是否为整数  
    {
      	string str=Control().judge_formula();
      	double res=Calculate().calculate_formula(str);
      	if((int)res==res)
      	{
      		return str;
    	}
    	else
    	{
    		return Control().judge_result();
    	}
    }
    

    7.合作证明

    hezuo1 hezuo2

    8.程序测试结果

    EN CH

    9.代码规范

    • 函数的命名必须使用英文单词,不使用拼音缩写
    • 函数的命名如果一个单词的必须首字母大写并且具有实际意义,如果多个单词的用下划线隔开
    • 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。
    • 要随意定义全局变量,尽量使用局部变量。
    • 函数的旁边必须注释上本函数的功能
    • 禁止GOTO语句。
    • 每一个重点步骤需要有注释(默认为中文注释)

    10.个人体会

    这一次作业对于初学c++的我来说确实是个挺大的挑战,难怪之前老师叫我们看面向对象的教学视频。我大概看了一些。然后开始和小伙伴思考该怎么写,小伙伴很赞,一下子想到了几个重点(随机数生成,生成算式和计算结果).而我就负责算式计算的实现。中途遇到过很多不懂的地方,也由请教同学和百度得知(百度是个好东西)。在这里也感谢林燊同学,因为我只写了一部分代码,很多都是他做的,thank you!

  • 相关阅读:
    Dll 入口函数
    .net中Global.asax
    jquery图片翻转
    c#发送邮件
    jquery ajax里面的datetype设成json时,提交不了数据的问题
    今儿写前台tab效果时用的,(jquery)
    C# 的一些常用日期时间函数(老用不熟)
    下午的表单注册~~~
    CSS图片、文字垂直居中对齐
    asp.net 用继承方法实现页面判断session
  • 原文地址:https://www.cnblogs.com/luzeming/p/6413979.html
Copyright © 2020-2023  润新知