个人作业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("正确\n");
                         ttrue++;
                       }
                     else 
                        printf("错误  \t答案是%d\n",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("正确\n");
                         ttrue++;
                       }
                     else 
                        printf("错误  \t答案是%d\n",result);
                    break;
        case 2:    printf("%d×%d=",x,y); 
                    temp=x*y;
                    
                    scanf("%d",&answer);
                    if(answer==temp)
                       {
                         printf("正确\n");
                         ttrue++;
                       }
                     else 
                        printf("错误  \t答案是%s\n",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("正确\n");
                         ttrue++;
                       }
                     else 
                        printf("错误  \t答案是%s\n",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("正确\n");
            ttrue++;
        }
        else 
            printf("错误  \t答案是%s\n",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的时候总要一条条的去搜索或者找问题。在后面的学习中一定多多练习,增强自己的编程能力。

posted on 2017-03-07 10:55  阿坚044  阅读(195)  评论(1编辑  收藏  举报