作业四:四则运算

时间:2022-05-22 22:00:21

一、需求分析

  任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 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("回答正确!\n");
        a=1;
        }
    else
    {
        printf("I回答错误!\n");
        printf("正确答案是: %d\n",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("回答完毕!\n");
         printf("回答正确数量:%d\n",right);
         percent=((double)right*100.00)/(double)n;
         printf("正确率:%0.2f %%\n",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