第三次作业:个人项目-小学四则运算 “软件”

本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166

我的github远程仓库的地址:https://github.com/CTqin/CTqin

第一部分:要求

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

23 - 3 * 4 = 11

第二部分:设计

1.需求分析

    1.实现以正整数组成的两个运算符的四则等式
    2.结果必须大于0,结果精确到小数点后两位。
    3.可以随用户输入具体的题目数
      4.可判断用户输入值的对错,并给出用户的正确题目数和准确率
      5.要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题
2.功能设计
      1.给定一个参数,由用户自定义,进行循环输出随机四则运算
      2.判断用户输入值对错
      3.计算用户的正确题目数和准确率
 

第三部分:实现

(功能一)整数部分的相加减 实现    

           通过产生随机数字,其中的两个随机数是符号对应随机产生的符号。

        a = rand() % 99+1;//产生随机数a
        b = rand() % 99+1;//随机数b
        c = rand() % 99+1;//随机数c
        d = rand() % 4+1;//随机产生第一个对应符号位+-/*
        d2 = rand() % 4+1;//随机产生第二个对应符号位+-/*

         获取用户输入需求的题目道数n,利用for()语句循环实现功能需求。

         里面嵌套switch()case语句实现整个四则运算功能。如下是实现首先随机产生加号的代码:

    case 1://+
            switch(d2)
            {
            case 1://+
                printf("请计算\n");
                printf("%d + %d + %d= ",a,b,c);
                scanf("%d",&useranswser);
                answer=a+b+c;
                if(useranswser==answer)
                {
                    
                    percentageAnswer++;
                    printf("答对%d题目\n",percentageAnswer);
                }
                else
                {
                    printf("答案错误\n");
                    printf("答案是:%d\n",answer);
                }
                break;
            case 2://-
                printf("请计算\n");
                if((a+b)<c)//不能负数处理
                {
                    temp=a;
                    a=c;
                    c=a;
                    printf("%d + %d - %d=",a,b,c);
                    scanf("%d",&useranswser);
                    answer=a+b-c;
                    if(useranswser==answer)
                    {
                        
                        percentageAnswer++;
                        printf("答对%d题目\n",percentageAnswer);
                    }
                    else
                    {
                        printf("答案是:%d\n",answer);
                        printf("答案错误\n");
                    }  
                }
                else
                {
                    printf("%d + %d - %d=",a,b,c);
                    scanf("%d",&useranswser);
                    answer=a+b-c;
                    if(useranswser==answer)
                    {
                        
                        percentageAnswer++;
                        printf("答对%d题目\n",percentageAnswer);
                    }
                    else
                    {
                        printf("答案是:%d\n",answer);
                        printf("答案错误\n");
                    }
                }
                break;
            case 3://*
                
                printf("请计算\n");
                printf("%d + %d  *  %d= ",a,b,c);
                scanf("%d",&useranswser);
                answer=a+b*c;
                if(useranswser==answer)
                {
                    
                    percentageAnswer++;
                    printf("答对%d题目\n",percentageAnswer);
                }
                else
                {
                    printf("答案是:%d\n",answer);
                    printf("答案错误\n");
                }
                
                break;
            case 4://除/
                printf("请计算(精算小数点后两位)\n");
                printf("%d + %d  / %d= ",a,b,c);
                scanf("%f",&useranswser2);
                
                answer=(int)(useranswser2*100 ) ;
                //    printf("%f\n",ftemp);
                fanswer=(float)a+(float)b/c;//强转结果数据类型
                intanswer=     (int)( (fanswer+0.005)*100 ) ;
                //  printf("%d",intanswer);//答案扩大100
                if(-0.02<answer - intanswer  && answer - intanswer <0.02)
                {
                    percentageAnswer++;
                    printf("答对%d题目\n",percentageAnswer);
                    
                    
                    
                }
                else
                {     
                    printf("答案是:%0.2f\n",fanswer);
                    printf("答案错误\n");
                    
                }
                break;
                }
                break;

而后的减乘除也是同理。实现功能的同时利用percentageAnswer来记录已经答对的题目,一些细节要考虑清楚,利用if语句来进行判断,处理一些不能负数的结果。比如如果两数相加后随机产生的随机符号是减号,

两数相加后需要判断下是否大于0

    if((a+b)<c)//不能负数处理
                {
                    temp=a;
                    a=c;
                    c=a;
                    printf("%d + %d - %d=",a,b,c);
                    scanf("%d",&useranswser);
                    answer=a+b-c;
                    if(useranswser==answer)
                    {
                        
                        percentageAnswer++;
                        printf("答对%d题目\n",percentageAnswer);
                    }
                    else
                    {
                        printf("答案是:%d\n",answer);
                        printf("答案错误\n");
                    }  
                }
                else
                {
                    printf("%d + %d - %d=",a,b,c);
                    scanf("%d",&useranswser);
                    answer=a+b-c;
                    if(useranswser==answer)
                    {
                        
                        percentageAnswer++;
                        printf("答对%d题目\n",percentageAnswer);
                    }
                    else
                    {
                        printf("答案是:%d\n",answer);
                        printf("答案错误\n");
                    }

}

(功能二)分数部分的相加减实现

通过定义结构体

typedef struct
{
    int numerator; /* 分子 */
    int denominator; /* 分母 */
} Fraction;

函数最小公倍数,最小公因数(借鉴网上知识)

/* 返回两个整数的最大公约数 */
int GCD(int a,int b)
{
    int i,temp_gcd;
    for(i=a;i>=1;i--)
    {
        if(a%i==0)
        {
            if(b%i==0)
            {
                temp_gcd=i;
                return temp_gcd;
            }
        }
    }
}
/* 返回两个整数的最小公倍数 */
int LCM(int a,int b)
{
    int temp_lcm;
    temp_lcm = a * b / GCD(a,b);
    return temp_lcm;
}

通分实现分数的相加减,详细代码有注释。

 

第四部分:问题解决

在本次布置作业中主要遇到两个问题,一个就是在整数四则运算计算的时候,保留两位小数和用户输入的答案进行的比较,即是两个浮点数之间的比较,我原本通过定义宏常量0.001,fas(两数相减)//绝对值是否大于定义的宏常量即可。不知到为什么,我测试的时候老是出现的结果不是我想要的,可能是某处的逻辑问题。然后再修改-0.02<结果(保留两位小数,扩大一百倍)<0.02来比较,后来还是没达到我想要的效果,仔细想了想,发现没有-0.02<结果(保留两位小数,扩大一百倍)<0.02这种表示方法,具体的是里面要夹带&&。通过强转数据类型解决我的问题。处理的代码如此

printf("%d / %d /  %d=",a,b,c);
              scanf("%f",&useranswser2);
              
              answer=(int)(useranswser2*100 ) ;
              //    printf("%f\n",ftemp);
              fanswer=(float)a/b/c;//强转结果数据类型
              intanswer=(int)( (fanswer+0.005)*100 ) ;
              //  printf("%d",intanswer);//答案扩大100
              if(-0.02<answer - intanswer  && answer - intanswer <0.02)
              {
                  percentageAnswer++;
                  printf("答对%d题目\n",percentageAnswer);
                  
              }
              else
              {
                  printf("答案是:%0.2f\n",fanswer);
                  
                  printf("答案错误\n");
                  
              }

还有一个就是公约数,公因数那块,在网上学习观摩了一会就理解解决问题。

 

第五部分:运行结果截图

主菜单功能:

功能一:

功能二    分数题目(扩展题目)

 

附图:统计表

PSP2.1

Personal Software Process Stages

Time Senior Student(h)

Time(h)

Planning

计划

0

0

· Estimate

估计这个任务需要多少时间

5

6

Development

开发

1

1.5

· Analysis

需求分析 (包括学习新技术)

0.1

0.01

· Design Spec

生成设计文档

0

0

· Design Review

设计复审

3

2

· Coding Standard

代码规范

0.1

0.1

· Design

具体设计

0.5

0.5

· Coding

具体编码

3

3.5

· Code Review

代码复审

1

1

· Test

测试(自我测试,修改代码,提交修改)

0.5

0.6

Reporting

报告

0

0

Test Report

测试报告

0

0.5

·workload

计算工作量

0

0.2

·correction

并提出过程改进计划

0

0

posted @ 2018-10-08 20:47  代码是肥钦喔  阅读(242)  评论(2编辑  收藏  举报