zoukankan      html  css  js  c++  java
  • 第三次作业:个人项目-小学四则运算 “软件”

    本次作业要求来自: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

  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/Tqin/p/9755739.html
Copyright © 2011-2022 走看看