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


    本次作业要求来自: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("请计算
    ");
                    printf("%d + %d + %d= ",a,b,c);
                    scanf("%d",&useranswser);
                    answer=a+b+c;
                    if(useranswser==answer)
                    {
                        
                        percentageAnswer++;
                        printf("答对%d题目
    ",percentageAnswer);
                    }
                    else
                    {
                        printf("答案错误
    ");
                        printf("答案是:%d
    ",answer);
                    }
                    break;
                case 2://-
                    printf("请计算
    ");
                    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题目
    ",percentageAnswer);
                        }
                        else
                        {
                            printf("答案是:%d
    ",answer);
                            printf("答案错误
    ");
                        }  
                    }
                    else
                    {
                        printf("%d + %d - %d=",a,b,c);
                        scanf("%d",&useranswser);
                        answer=a+b-c;
                        if(useranswser==answer)
                        {
                            
                            percentageAnswer++;
                            printf("答对%d题目
    ",percentageAnswer);
                        }
                        else
                        {
                            printf("答案是:%d
    ",answer);
                            printf("答案错误
    ");
                        }
                    }
                    break;
                case 3://*
                    
                    printf("请计算
    ");
                    printf("%d + %d  *  %d= ",a,b,c);
                    scanf("%d",&useranswser);
                    answer=a+b*c;
                    if(useranswser==answer)
                    {
                        
                        percentageAnswer++;
                        printf("答对%d题目
    ",percentageAnswer);
                    }
                    else
                    {
                        printf("答案是:%d
    ",answer);
                        printf("答案错误
    ");
                    }
                    
                    break;
                case 4://除/
                    printf("请计算(精算小数点后两位)
    ");
                    printf("%d + %d  / %d= ",a,b,c);
                    scanf("%f",&useranswser2);
                    
                    answer=(int)(useranswser2*100 ) ;
                    //    printf("%f
    ",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题目
    ",percentageAnswer);
                        
                        
                        
                    }
                    else
                    {     
                        printf("答案是:%0.2f
    ",fanswer);
                        printf("答案错误
    ");
                        
                    }
                    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题目
    ",percentageAnswer);
                        }
                        else
                        {
                            printf("答案是:%d
    ",answer);
                            printf("答案错误
    ");
                        }  
                    }
                    else
                    {
                        printf("%d + %d - %d=",a,b,c);
                        scanf("%d",&useranswser);
                        answer=a+b-c;
                        if(useranswser==answer)
                        {
                            
                            percentageAnswer++;
                            printf("答对%d题目
    ",percentageAnswer);
                        }
                        else
                        {
                            printf("答案是:%d
    ",answer);
                            printf("答案错误
    ");
                        }
    
    }

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

    通过定义结构体

    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
    ",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题目
    ",percentageAnswer);
                      
                  }
                  else
                  {
                      printf("答案是:%0.2f
    ",fanswer);
                      
                      printf("答案错误
    ");
                      
                  }

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

    第五部分:运行结果截图

    主菜单功能:

    功能一:

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

    附图:统计表

    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

  • 相关阅读:
    解决Cannot delete or update a parent row: a foreign key constraint fails的mysql报错
    zabbix4.2绘制网络拓扑图-添加链路速率
    zabbix 添加宏变量
    238_Product of Array Except Self
    122_Best Time to Buy and Sell Stock II
    260_Single Number III
    C# 比较时间问题
    226_Invert Binary Tree
    100_Same Tree
    283_Move Zeroes
  • 原文地址:https://www.cnblogs.com/Tqin/p/9755739.html
Copyright © 2020-2023  润新知