四则运算

一、作业要求规范

这个作业属于哪个课程 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
这个作业要求在哪里 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11377
这个作业的目标 熟练使用markdown语法,实现具体要求
学号 3180701102
二、题目要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24
2)程序要求能处理用户的输入,判断对错,累积分数
3)程序支持可以由用户自行选择加、减、乘、除运算
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目
三、代码提交
#include <iostream>
#include <string.h>
#define size 10
using namespace std;

//含有一个二元算数式的三个值以及一个标志符的结构体
typedef struct{
    int x1,x2;
    int y1,y2;
    int z1,z2;
}Arithmetic;

Arithmetic choose(Arithmetic n);//选择函数,根据用户选择 识别将要进行的四则运算类型
int LCM(int a, int b);//最小公倍数
int GCD(int a, int b);//最大公约数
bool judge(Arithmetic n);//结果判断
Arithmetic Addition();//加法运算
Arithmetic Subtraction();//减法运算
Arithmetic Multiplication();//乘法运算
Arithmetic Division();//除法运算



int main(int argc, const char * argv[]) {
    int score = 0, cnt = 0;
    
    printf("请设置题目数量\n");
    scanf("%d",&cnt);

//    if (string(argv[1])=="-n") {      //在terminals或者command中运行的时候,参数顺序存放在argv数组中
//        string c = argv[2];
//        cnt = stoi(c);
//    }
    
    for (int i = 0; i<cnt; i++) {
        Arithmetic t;
        t = choose(t);
        if (judge(t) == true) {
            score+=10;
            cout<<"恭喜您回答正确!\n";
        } else {
            cout<<"很抱歉您的答案不正确,再想想哦~\n";
        }
    }
    printf("满分为:%d  您的得分为:%d分\n",cnt*10,score);
    
    return 0;
}

//函数
//选择函数,根据用户选择识别将要进行的四则运算类型
Arithmetic choose(Arithmetic n){
    int choose = 0;
    cout<<"请选择您需要进行的四则运算类型\n"<<"1.加法\t2.减法\t3.乘法\t4.除法\n";
    cin>>choose;
    switch (choose) {
        case 1:
            n = Addition();
            break;
        case 2:
            n = Subtraction();
            break;
        case 3:
            n = Multiplication();
            break;
        case 4:
            n = Division();
            break;
            
        default:
            break;
    }
    
    return n;
}

//判断对错函数
bool judge(Arithmetic n){
    bool ans = false;  //ans用于记录用户输入答案是否正确,正确return true,否则return false
    string input;
    cin>>input;
    
    bool flag = false, sign = false;
    //flag标记用户输入中是否存在/号,有/号则true否则false
    //sign标记用户输入是否为负数,是负数则true否则false
    int a = 0, b = 0;
    for (int i = 0; i<input.length(); i++) {
     if (input[i] != '/' && input[i] != '-') {
         int num = input[i]-'0'; //将char型转换为int型
         if (!flag) {    //若果flag为false,则说明还未遇到/号
             a *= 10;    //a记录/号前的数值
             a += num;
         } else {
             b *= 10;    //b记录/号后的数值
             b += num;
         }
     } else if (input[i] == '/'){
         flag = true;
     } else {
         sign = true;
     }
    }

    if (flag && sign) { //既有/号,又是负值
        if (n.z1 == -a && n.z2 == b)
            ans = true;
    } else if (flag && !sign){  //有/号,但为正值
        if (n.z1 == a && n.z2 == b)
            ans = true;
    } else if (!flag && sign){  //没有有/号,但为负值
        if (n.z1 == -a)
            ans = true;
    } else {    //没有有/号,且为正值
        if (n.z1 == a)
            ans = true;
    }
    
    return ans;
}

//求最小公倍数
int LCM(int a, int b){
    int tmp,r,n;
    if (a < b) {
        tmp = b;
        b = a;
        a = tmp;
    }
    r = a%b;
    n = a*b;
    while (r != 0) {
        a = b;
        b = r;
        r = a%b;
    }
    
    return n/b;
}

//求最大公约数
int GCD(int a, int b){
    int tmp,r,n;
    if (a < b) {
        tmp = b;
        b = a;
        a = tmp;
    }
    r = a%b;
    n = a*b;
    while (r != 0) {
        a = b;
        b = r;
        r = a%b;
    }
    
    return b;
}

//Addition加法
Arithmetic Addition(){
    Arithmetic n;
    srand((unsigned)time(NULL));
    
    if (rand()%2 == 0) {//若为0则进行整数四则运算,若为1则进行真分数的四则运算
        n.x1 = rand()%size+1;
        n.y1 = rand()%size+1;
        n.z1 = n.x1 + n.y1;
        n.x2 = 1;
        n.y2 = 1;
        n.z2 = 1;
        printf("%d + %d = ?\n",n.x1,n.y1);
    } else {
        n.x1 = rand()%size+1;
        n.x2 = rand()%size+n.x1;
        n.y1 = rand()%size+1;
        n.y2 = rand()%size+n.y1;
        n.z2 = LCM(n.x2, n.y2);
        n.z1 = n.x1*n.z2/n.y2 + n.y1*n.z2/n.x2;
        printf("%d/%d + %d/%d = ?\n",n.x1,n.x2,n.y1,n.y2);
    }
    
    return n;
}

//Subtraction减法
Arithmetic Subtraction(){
    Arithmetic n;
    srand((unsigned)time(NULL));
    
    if (rand()%2 == 0) {//若为偶数则进行整数四则运算,若为奇数则进行真分数的四则运算
        n.x1 = rand()%size+1;
        n.y1 = rand()%size+1;
        n.z1 = n.x1 - n.y1;
        n.x2 = 1;
        n.y2 = 1;
        n.z2 = 1;
        printf("%d - %d = ?\n",n.x1,n.y1);
    } else {
        n.x1 = rand()%size+1;
        n.x2 = rand()%size+n.x1;
        n.y1 = rand()%size+1;
        n.y2 = rand()%size+n.y1;
        n.z2 = LCM(n.x2, n.y2);
        n.z1 = n.x1*n.z2/n.y2 - n.y1*n.z2/n.x2;
        printf("%d/%d - %d/%d = ?\n",n.x1,n.x2,n.y1,n.y2);
    }
    
    return n;
}

//Multiplication乘法
Arithmetic Multiplication(){
    Arithmetic n;
    srand((unsigned)time(NULL));
    
    if (rand()%2 == 0) {//若为偶数则进行整数四则运算,若为奇数则进行真分数的四则运算
        n.x1 = rand()%size+1;
        n.y1 = rand()%size+1;
        n.z1 = n.x1 * n.y1;
        n.x2 = 1;
        n.y2 = 1;
        n.z2 = 1;
        printf("%d * %d = ?\n",n.x1,n.y1);
    } else {
        n.x1 = rand()%size+1;
        n.x2 = rand()%size+n.x1;
        n.y1 = rand()%size+1;
        n.y2 = rand()%size+n.y1;
        
        int num = 0;
        num = GCD(n.x1*n.y1, n.x2*n.y2);
        n.z1 = n.x1*n.y1/num;
        n.z2 = n.x2*n.y2/num;
        
        printf("%d/%d * %d/%d = ?\n",n.x1,n.x2,n.y1,n.y2);
    }
    
    return n;
}

//Division除法
Arithmetic Division(){  //除法不需要考虑两个整数的,没有意义,直接两个真分数的除法
    Arithmetic n;
    srand((unsigned)time(NULL));
    
    n.x1 = rand()%size+1;
    n.x2 = rand()%size+n.x1;
    n.y1 = rand()%size+1;
    n.y2 = rand()%size+n.y1;
    
    int num = 0;
    num = GCD(n.x1*n.y1, n.x2*n.y2);
    n.z1 = n.x1*n.y1/num;
    n.z2 = n.x2*n.y2/num;
    
    printf("%d/%d * %d/%d = ?\n",n.x1,n.x2,n.y1,n.y2);
    
    return n;
}

四、运行截图


五、个人小结

psp2.1 <任务内容> <计划完成需要的时间(min)> <实际完成需要的时间(min)>
Planning 计划 10 8
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 12
Development 开发 100 150
Analysis 需求分析(包括学习新技术 12 5
Design Spec 生成设计文档 5 5
Design Review 设计复审 5 5
Coding Standard 代码规范 3 2
Design 具体设计 10 12
Coding 具体编码 36 21
Code Review 代码复审 5 7
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 9 6
Test Report 测试报告 3 2
Size Measurement 计算工作量 2 1
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3 3
posted @ 2020-11-08 23:55  计算机181王政  阅读(160)  评论(0编辑  收藏  举报