作业四:四则运算

一、需求分析

  任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 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.1Personal Software Process Stages预计时间(分钟)实际时间(分钟)
Planning计划 20 30
· Estimate估计这个任务需要多少时间 180180
Development开发 1202000
· 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

转载于:https://www.cnblogs.com/hjlaaa/p/9790361.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值