• 作业四:四则运算


    一、需求分析

      任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。

      统计用户共答对多少道题。

    二、功能设计

       1.根据用户要求的题目数n,循环n次输出随机的四则运算。

       2.判断用户输入值是否正确,并给出正确题目数。

       3.运算答案不能小于0,小于0就重新在后台出题目。

    三、详细设计

       随机产生三个100以内的正整数和四个分别用“1”-“4”代表+,-,*,/运算符号,通过对四则运算中乘除和加减的优先级别判断:先乘除后加减,在计算函数中遍历运算符数组中乘除符号后进行优先计算,之后再对乘除计算之后的运算数进行相加减运算。

      遇到当随机产生的正整数运算题计算结果为负数时,递归重新生成运算题,直至结果是大于零时所产生的题目打印在控制台上,用户输入答案,答案与结果匹配正确即累加正确题数,错误的输出打印正确结果,当全部运算题做完后输出统计结果。

    代码实现:

    int random(double start, double end)//获取随机数函数
    {
        return (int)(start+(end-start)*rand()/(RAND_MAX+1.0));
    }
    
    char getSignala()//获取随机运算符函数
    {
        int a;
        char signal1[4]={'+','-','*','/'};
        srand((unsigned)time(NULL));
        a = rand()%4;
        return signal1[a];
    }
    char getSignalb()//获取随机运算符函数
    {
        int b;
        char signal2[4]={'+','-','*','/'};
        srand((unsigned)time(NULL));
        b = rand()%4;
        return signal2[b];
    }
    int getResult(int num1,int num2,int num3,char signal1,char signal2)//结果计算函数
    {
        int i=0,res;
        if(signal1=='+')
        {
            if(signal2=='+')
            {
                res=num1+num2+num3;
            }
            if(signal2=='-')
            {
                res=num1+num2-num3;
            }
            if(signal2=='*')
            {
                res=num2*num3+num1;
            }
            if(signal2=='/')
            {
                res=num2/num3+num1;
            }
        }
        if(signal1=='-')
        {
            if(signal2=='+')
            {
                res=num1-num2+num3;
            }
            if(signal2=='-')
            {
                res=num1-num2-num3;
            }
            if(signal2=='*')
            {
                res=num2*num3-num1;
            }
            if(signal2=='/')
            {
                res=num2/num3-num1;
            }
        }
        if(signal1=='*')
        {
            if(signal2=='+')
            {
                res=num1*num2+num3;
            }
            if(signal2=='-')
            {
                res=num1*num2-num3;
            }
            if(signal2=='*')
            {
                res=num2*num3*num1;
            }
            if(signal2=='/')
            {
                res=num2/num3*num1;
            }
        }
        if(signal1=='/')
        {
            if(signal2=='+')
            {
                res=num1/num2+num3;
            }
            if(signal2=='-')
            {
                res=num1/num2-num3;
            }
            if(signal2=='*')
            {
                res=num2*num3/num1;
            }
            if(signal2=='/')
            {
                res=num2/num3/num1;
            }
        }
        return res;
    }
    
    int takeTest()//题目生成函数
    {
        int get;
        int num1,num2,num3,a;
        char signal1,signal2;
    
        srand((unsigned)time(NULL));
        signal1=getSignala();
        srand((unsigned)time(NULL));
        signal2=getSignalb();
        num1=random(1,100);
        num2=random(0,100);
        num3=random(1,100);
    if(signal1=='-')
        {
            if(num1<num2)
            {
                int temp;
                temp=num1;
                num1=num2;
                num2=temp;
            }
        }
        if(signal1=='/')
        {
            if(num2==0)
            {
                int temp;
                temp=num1;
                num1=num2;
                num2=temp;
            }
        }
        printf("%d%c%d%c%d=",num1,signal1,num2,signal2,num3);
        scanf("%d",&get);
        fflush(stdin);   //清空输入缓冲区
        if(getResult(num1,num2,num3,signal1,signal2)==get)
            {
            printf("回答正确!
    ");
            a=1;
            }
        else
        {
            printf("I回答错误!
    ");
            printf("正确答案是: %d
    ",getResult(num1,num2,num3,signal1,signal2));
            a=0;
        }
        return a;
    }
    
    void main()
    {
             int n,a,right=0,i=0;
             double percent;
             printf("请选择问题数目:");
             scanf("%d",&n);
             for(i;i<n;i++)
             {
                       a=takeTest();
                       right=right+a;
             }
             printf("回答完毕!
    ");
             printf("回答正确数量:%d
    ",right);
             percent=((double)right*100.00)/(double)n;
             printf("正确率:%0.2f %%
    ",percent);
    }

    四、运行结果

    五、问题及解决办法

       问题:不知道如何做到答案不为负数的问题。有时候会出现负数的情况,还有我的运算符也没有做到不同。

    六、过程耗时估计与统计表

    PSP2.1 Personal Software Process Stages 预计时间(分钟) 实际时间(分钟)
    Planning 计划  20  30
    · Estimate 估计这个任务需要多少时间  180 180
    Development 开发  120 2000
    · Analysis 需求分析 (包括学习新技术)  20  20
    · Design Spec 生成设计文档  10  20
    · Design Review 设计复审  10  10
    · Coding Standard 代码规范  10  10
    · Design 具体设计  30  30
    · Coding 具体编码  120  180
    · Code Review 代码复审  30  20
    · Test 测试(自我测试,修改代码,提交修改)  60  120
    Reporting 报告  30  30
    · 测试报告  10  10
    · 计算工作量  10  10
    · 并提出过程改进计划  10  10
  • 相关阅读:
    2018-2019-1 20165313 实验三 实时系统
    2018-2019-1 20165313 《信息安全系统设计基础》第七周学习总结”
    2018-2019-1 20165313 20165312 20165322 实验二 固件程序设计
    2018-2019-1 20165313 《信息安全系统设计基础》第五周学习总结
    2018-2019-1 20165228 《信息安全系统设计基础》第四周学习总结
    BUUCTF 相册 WriteUp
    BUUCTF Youngter-drive WriteUp
    word插入照片格式混乱的解决
    20181218 实验二《Python程序设计》实验报告
    20181218 实验一《Python程序设计》实验报告
  • 原文地址:https://www.cnblogs.com/hjlaaa/p/9790361.html
Copyright © 2020-2023  润新知