zoukankan      html  css  js  c++  java
  • 个人作业1——四则运算题目生成程序(基于控制台)

    代码:https://coding.net/u/AJIAN044/p/cyuyan/git/tree/master

    题目描述:

    从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

    除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24

      1. 运算符为 +, −, ×, ÷
      2. 并且要求能处理用户的输入,并判断对错,打分统计正确率。
      3. 要求能处理用户输入的真分数, 如 1/2, 5/12 等
      4. 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
        Myapp.exe -n 10

    分析:

              程序要求:

                         1、自动生成题目

                         2、除了整数,还要支持真分数运算

                         3、判断答案正确与否(可以识别真分数答案)

                         4、可以控制生成题目数量实现步骤

                         5、化简分数成最简结果

    实现方式:

                         1、题目生成利用两个随机数,使用基于时间的随机,避免多次运行时产生的随机数相同。

                         2、利用switch语句以及随机数rand()%4,产生基于—+*/的随机。

                         3、gcd(int m,int n)生成最大公约数,便于计算。

                         4、两个函数fs()、zs()用于分数和整数的四则运算。

                         5、整数的除法以及分数的四则运算,将其结果转换为字符串,方便比较。

                         6、题目的生成数量,根据输入值d设置循环。

    代码说明:

      整数运算部分代码:

    void zs() //整数 
    { 
        int a,b,temp;
        int x,y;
        char result1[10],answer1[10],s[10];//作为除法的分数比较
        int answer,result;//用于+-*三种运算
        srand((int)time(0));//以时间为基数的随机
        x=rand()%100;
        y=rand()%100;
        int c=rand()%4;
        switch(c)
        {
            case 0:    printf("%d+%d=",x,y);  //case 0、1、2用数字比较 
                        temp=x+y; 
                        scanf("%d",&answer);
                        if(answer==temp)
                           {
                             printf("正确
    ");
                             ttrue++;
                           }
                         else 
                            printf("错误  	答案是%d
    ",result); 
                            break;
            case 1: 
                        if(x<y)
                        {
                            int temp =x;
                            y=x;
                            x=temp;
                        }
                        printf("%d-%d=",x,y);
                        temp=x-y;
                        scanf("%d",&answer);
                        if(answer==temp)
                           {
                             printf("正确
    ");
                             ttrue++;
                           }
                         else 
                            printf("错误  	答案是%d
    ",result);
                        break;
            case 2:    printf("%d×%d=",x,y); 
                        temp=x*y;
                        
                        scanf("%d",&answer);
                        if(answer==temp)
                           {
                             printf("正确
    ");
                             ttrue++;
                           }
                         else 
                            printf("错误  	答案是%s
    ",result);
                        break;
            case 3:    printf("%d÷%d=",x,y);  //采用字符串进行比较 
                        if(x%y==0)
                        {
                            temp=x/y;
                            itoa(temp,result1,10);
                        }
                        else 
                        {
                            temp=gcd(x,y);
                            if(temp>0) 
                                {
                                    x=x/temp;
                                    y=y/temp;
                                }
                            else if (temp<0)
                                {
                                    x=-x/temp;
                                    y=-y/temp;
                                }
                            itoa(x,result1,10);
                            strcat(result1,"/");
                            itoa(y,s,10);
                            strcat(result1,s);
                        }
                        scanf("%s",&answer1);
                        if(strcmp(answer1,result1)==0)
                           {
                             printf("正确
    ");
                             ttrue++;
                           }
                         else 
                            printf("错误  	答案是%s
    ",result1);
                        break; 
        }
        
    }

    分数运算部分代码:

    void fs() //分数 
    {
        int x1,y1,x2,y2,p,fz,fm,temp; //分子fz 分母fm 
        char answer[20],result[20],s[9];
        int d;
        d=rand()%4;
        srand((int)time(0));
        x1=rand()%20+1;
        y1=rand()%20+1;
        if(x1>y1||x1==y1)
            {    
                x1=rand()%20+1;
                y1=rand()%20+1;
            }
        temp=gcd(x1,y1);
        if(temp>0) {
                    x1=x1/temp;
                    y1=y1/temp;
                }
        else if (temp<0)
                {
                    x1=-x1/temp;
                    y1=-y1/temp;
                }
        x2=rand()%20+1;
        y2=rand()%20+1;
        if(x2>y2||x2==y2)
            {    
                x2=rand()%20+1;
                y2=rand()%20+1;
            }
        temp=gcd(x2,y2);
        if(temp>0) {
                    x2=x2/temp;
                    y2=y2/temp;
                }
        else if (temp<0)
                {
                    x2=-x2/temp;
                    y2=-y2/temp;
                }
        switch(d)
        {
            case 0:   printf("%d/%d+%d/%d=",x1,y1,x2,y2);   
                        fz=x1*y2+x2*y1; 
                        fm=y1*y2; break;
            case 1:   printf("%d/%d-%d/%d=",x1,y1,x2,y2);   
                        fz=x1*y2-x2*y1; 
                        fm=y1*y2; break;
            case 2:    printf("%d/%d×%d/%d=",x1,y1,x2,y2);  
                        fz=x1*x2;       
                        fm=y1*y2; break;
            case 3:    printf("%d/%d÷%d/%d=",x1,y1,x2,y2); 
                            fz=x1*y2; 
                            fm=y1*x2; break; 
            }
        p=gcd(fz,fm);
        if(p>0) {
                    fz=fz/p;
                    fm=fm/p;
                }
        else if (p<0)
                {
                    fz=-fz/p;
                    fm=-fm/p;
                }
        if(fz%fm==0)
        {
            temp=fz/fm;
            itoa(fz,result,10);
        }
        else
        {
            itoa(fz,result,10);
            itoa(fm,s,10);
            strcat(result,"/");
            strcat(result,s);
        }
        scanf("%s:",&answer);
        if(strcmp(result,answer)==0)
            {
                printf("正确
    ");
                ttrue++;
            }
            else 
                printf("错误  	答案是%s
    ",result);
        
    }

    展示PSP:

    PSP2.1

    Personal Software Process Stages

    Time (%) Senior Student

    Time (%)

    SDE

    Planning

    计划

    8

    6

    ·         Estimate

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

    8

    6

    Development

    开发

    82

    88

    ·         Analysis

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

    6

    10

    ·         Design Spec

    ·         生成设计文档

    5

    6

    ·         Design Review

    ·         设计复审 (和同事审核设计文档)

    4

    6

    ·         Coding Standard

    ·         代码规范 (为目前的开发制定合适的规范)

    3

    3

    ·         Design

    ·         具体设计

    10

    20

    ·         Coding

    ·         具体编码

    36

    90

    ·         Code Review

    ·         代码复审

    7

    9

    ·         Test

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

    13

    21

    Reporting

    报告

    9

    20

    • Test Report
    • 测试报告
     

    3

    10

    • Size Measurement
    • 计算工作量
     

    2

    1

    • Postmortem & Process Improvement Plan
    • 事后总结, 并提出过程改进计划
     

    3

    3

    小结:在前面整数的四则运算的编程时还算顺利,到了分数部分就开始卡住了。 也在网上借鉴了一些其他人的代码,自己也在理解后进行再编程。自己平时编程的练习还是不够,遇到bug的时候总要一条条的去搜索或者找问题。在后面的学习中一定多多练习,增强自己的编程能力。

  • 相关阅读:
    [CF600E]Lomsat gelral
    [BZOJ3237]连通图
    [CF580D]Kefa and Dishes
    [BZOJ4726]Sabota?
    bzoj2120&&2453 -- 带修改莫队
    bzoj4726 [ POI2017 ] -- 树形DP
    bzoj2809 [ APIO2012 ] -- 主席树
    bzoj4216 -- 分块
    bzoj4173 -- 欧拉函数
    bzoj2982 -- Lucas定理
  • 原文地址:https://www.cnblogs.com/Ajian044/p/6513588.html
Copyright © 2011-2022 走看看