第一次作业

一、作业信息

这个作业属于哪个课程 https://edu.cnblogs.com/campus/ahgc/1720837536qq
这个作业要求在哪里 https://edu.cnblogs.com/campus/ahgc/1720837536qq/homework/11377
这个作业的目标 能对需求进行分析并实现;编码格式规范;学习博客撰写
学号 3180701326

二、作业要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

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

2)程序要求能处理用户的输入,判断对错,累积分数

3)程序支持可以由用户自行选择加、减、乘、除运算

4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

三、代码提交与运行截图
1、源代码
//

// main.cpp

// 四则运算生成

//

// Created by Chen on 2020/11/2.

// Copyright © 2020 xxc. All rights reserved.

//

include

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;

}

2、运行截图
(1)、加法

(2)、减法

(3)、乘法

(4)、除法

四、个人小结

第一次接触到这种类型的题目,觉得还可以,挺有意思的,跟很多类型的都差不多,困难的话也没有遇到很多,都向同学请教解决了。然后就是会通过自己花时间琢磨,把要求都做到,尽力以后将一些部分做得更完善,更有美感。

(psp表格)

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 60 55
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 15 10
Development 开发 150 180
Analysis 需求分析(包括学习新技术) 25 30
Design Spec 生成设计文档 20 20
Design Review 设计复审 25 20
Coding Standard 代码规范 15 10
Design 具体设计 20 20
Coding 具体编码 40 45
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 60 55
Reporting 报告 25 20
Test Report 测试报告 10 10
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 15 10
posted @ 2020-11-08 22:50  小源123456  阅读(106)  评论(0)    收藏  举报