题目描述:

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

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

需求分析:

1.能够自动生成四则运算;
2.随机生成分数运算或整数运算;
3.用户自定义题目生成的数量;
4.用户可以输入答案;
5.程序判断对错并给出正确答案;
6.答完题后给出正确率。

Coding代码地址

https://coding.net/u/wumingxiang/p/ming_2017/git/blob/master/test1.cpp

程序设计:

本程序由C++语言编写,主要有四个函数,定义了一个 integer() 函数来生成整数的四则运算,定义了一个 fraction() 函数来生成分数的四则运算,由于分数需要化简,定义了 divisor (int a,int b) 函数通过辗转相除法求分子和分母的最大公约数,定义了 CheckResult(char result[]) 函数来判断输入的答案是否正确。
为了计算回答的正确率,定义全局变量 ri 来计算回答正确的题数。
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <string.h>

using namespace std;

int ri = 0;

int divisor (int a,int b)
{
  int  temp;
  if(a<b)
  {
      temp=a;
      a=b;
      b=temp;
    }
   while(b!=0)
   {
      temp=a%b;
      a=b;
      b=temp;
    }
  return a;
}

int CheckResult(char result[])
{
    char answer[10] ;
    cin>>answer;
    if(strcmp(answer,result)==0)
    {
        cout<<"回答正确"<<endl<<endl;
        ri++;
    }
    else
    {
        cout<<"回答错误,正确答案为"<<result<<endl<<endl;
    }
}

void integer()
{
    int x,y,z,temp;
    char result[10];
    srand(time(NULL));
    x = rand() % 10;
    y = rand() % 10+1;
    z = rand()%4;
    switch(z)
    {
        case 0 :
            cout<<x<<" + "<<y<<"=";
            temp = x + y;
            sprintf(result, "%d", temp);
            break;
        case 1 :
            if(x<y)
            {
                temp=x;
                x=y;
                y=temp;
            }
            cout<<x<<" - "<<y<<"=";
            temp = x - y;
            sprintf(result, "%d", temp);
            break;
        case 2 :
            cout<<x<<" * "<<y<<"=";
            temp = x * y;
            sprintf(result, "%d", temp);
            break;
        case 3 :
            cout<<x<<" ÷"<<y<<"=";
            if(x%y==0)
            {
                temp = x / y;
                sprintf(result, "%d", temp);
            }
            else
            {
                temp = divisor(x,y);
                x = x/temp;
                y = y/temp;
                sprintf(result, "%d/%d", x, y);
            }
            break;
    }
    CheckResult(result) ;
}

void fraction()
{
    int a,b,c,d,x,y,z,temp;
    char result[10];
    srand(time(NULL));
    a = rand() % 10;
    b = rand() % 10+1;
    c = rand() % 10;
    d = rand() % 10+1;
    z = rand() % 4;
    if(a>b)
    {
        temp=a;
        a=b;
        b=temp;
    }
    if(c>d)
    {
        temp=c;
        c=d;
        d=temp;
    }
    switch(z)
    {
        case 0 :
            cout<<a<<"/"<<b<<" + "<<c<<"/"<<d<<"=";
            x = a*d+b*c;
            y = b*d;
            temp = divisor(x,y);
            x = x/temp;
            y = y/temp;
            if(y==1)
            {
                sprintf(result, "%d", x);
            }
            else
            {
                sprintf(result, "%d/%d", x, y);
            }
            break;
        case 1 :
            if(a*d<b*c)
            {
                temp = a;
                a = c;
                c = temp;
                temp = b;
                b = d;
                d = temp;
            }
            cout<<a<<"/"<<b<<" - "<<c<<"/"<<d<<"=";
            x = a*d-b*c;
            y = b*d;
            temp = divisor(x,y);
            x = x/temp;
            y = y/temp;
            sprintf(result, "%d/%d", x, y);
            break;
        case 2 :
            cout<<a<<"/"<<b<<" * "<<c<<"/"<<d<<"=";
            if(a==0||c==0)
            {
                temp = 0;
                sprintf(result, "%d", temp);
            }
            else
            {
                x = a*c;
                y = b*d;
                temp = divisor(x,y);
                x = x/temp;
                y = y/temp;
                sprintf(result, "%d/%d", x, y);
            }
            break;
        case 3 :
            cout<<a<<"/"<<b<<" ÷"<<c<<"/"<<d<<"=";
            if((a*d)%(b*c)==0)
            {
                x = a*d;
                y = b*c;
                temp = x / y;
                sprintf(result, "%d", temp);
            }
            else
            {
                x = a*d;
                y = b*c;
                temp = divisor(x,y);
                x = x/temp;
                y = y/temp;
                if(y==1)
                {
                    sprintf(result, "%d", x);
                }
                else
                {
                    sprintf(result, "%d/%d", x, y);
                }
            }
            break;
    }
    CheckResult(result);
}

int main()
{
    int n,q;
    cout<<"输入要生成的题数:";
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int a = rand()%2;
        switch(a)
        {
            case 0: integer();break;
            case 1: fraction();break;
        }
    }
    q=(ri*100)/n;
    cout<<"回答对了"<<ri<<"题"<<endl;
    cout<<"正确率为:"<<q<<"%"<<endl<<endl;
}

测试:

PSP:

小结:

这次实验花了我较多的时间,通过这次实验,我也认识到自己对编程语言的掌握不够熟悉,在实验中我学会了许多技巧,比如说,我们在拿到实验题目的时候不能直接埋头写代码,而是应该先做一下需求分析,理清一下自己所需要实现的功能,我们应该先在脑海中有一个清晰的思路,写的代码才能够简洁明了。

在完成实验的时候,遇到了一些语法不太熟悉的问题,我也上网查了一下资料,像sprintf()这个函数,以前没学过,但我知道自己所需要的功能,所以上网就查到了这个函数。其实我这次写的代码其实还存在一些代码重复写的问题,有些代码其实可以提取出来封装成一个函数,但因为怕超过实验的截止日期,没有实现,下次我会改进的。

个人作业1——四则运算题目生成程序(基于C++)的更多相关文章

  1. 个人作业1——四则运算题目生成程序(java代码,基于控制台)

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

  2. 个人作业1——四则运算题目生成程序(基于java)

    项目代码: https://git.coding.net/YJh_/11.git 题目要求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:/ + / = / 运算符为 +, −, ×, ...

  3. 【2015 软件工程 个人项目 PJ1】四则运算题目生成程序

    1.开发时间预估 PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 2day Dev ...

  4. 高级软件工程2017第3次作业——结对项目:四则运算题目生成程序(基于GUI)

    Deadline:2017-10-11(周三)21:00pm (注:以下内容参考集大作业 ) 前言 想过和别人一起探索世界吗?多么希望,遇到困难时,有人能一起探讨:想要懈怠时,有人推你一把:当你专注于 ...

  5. 四则运算题目生成程序(基于控制台)(Bug修改)

    针对上个程序中出现的bug进行修改 https://git.coding.net/cx873230936/calculator.git Bug: 1.控制台输入问题数问题 a.不能处理用户输入负数. ...

  6. 1st 四则运算题目生成程序

    程序代码见此 程序展示 需求分析 需要程序能根据用户指定生成四则运算的题目,并且能让用户做题,并且最后打分统计正确率 功能设计 主要实现的功能就是: 接受用户输入以便知道要出多少道题目(-n x) 能 ...

  7. 四则运算题目生成(python版)

    四则运算题目生成-基于控制台 项目托管在码云:飞机票 需求分析 根据控制台提示信息,输入题目生成相关配置参数 题目生成数量 数字范围 式子中是否有分数 .... 程序支持 10000 题目生成 题目与 ...

  8. 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序

    1. 编写一个能自动生成小学四则运算题目的程序.(10分)   基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图.   本题发一篇随笔,内容包括: 题 ...

  9. 软工作业NO.2小学生线上杨永信——四则运算题目生成

    项目题目:实现一个自动生成小学四则运算题目的命令行程序 github地址:https://github.com/a249970271/Formula 驾驶员:梁沛诗 副驾驶:曾祎祺 项目说明 自然数: ...

随机推荐

  1. UUID.randomUUID().toString() 的作用

    public static String createNewId(){ return UUID.randomUUID().toString() ; } UUID.randomUUID().toStri ...

  2. Canvas: 优雅的代码作图系列:中国国旗

    Canvas: 优雅的代码作图系列:中国国旗 有很多个这练手的,好的差的都有.这次,我演示下用极客的代码,画出最标准的中国国旗,并详细说明代码是怎么写出来的. 绘制规范: 一.严格按照绘制说明: 二. ...

  3. 报错:No identifier specified for entity: main.java.com.sy.entity.User的解决办法

    自己也没怎么搭建过框架,更何况还是spring mvc的,最近在带两个实习生,正好教他们怎么搭建一个spring mvc的框架,然而我在映射表的时候,提示报错了. 实体基类: public class ...

  4. shell 脚本编程之特殊变量

    $0 当前脚本的文件名$n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2.$# 传递给脚本或函数的参数个数.$* 传递给脚本或函数的所有参数.$@ ...

  5. SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

    原文链接:http://www.powerxing.com/sql-join/ 总的来说,四种JOIN的使用/区别可以描述为: left join 会从左表(shop)那里返回所有的记录,即使在右表( ...

  6. 在Android中使用枚举注解而不是枚举

    Enums often require more than twice as much memory as static constants. You should strictly avoid us ...

  7. Python 函数装饰器和闭包

    装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px ...

  8. js与php的区别

     1 . PHP拼字符串用的是点.         js用+号.2.  php文件要放在wamp文件里面的www里面.3.  php与js的嵌入方式相同,只是嵌入的标记不一样.4.  php输出语法用 ...

  9. 80C51 K1控制D1发光

    #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit led = P2^0; sb ...

  10. JSON异步及跨域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...