软件工程第二次作业:熟悉使用工具 ——Author:Charlie
项目背景:
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。作为程序员的阿超心想,做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。 他把老师的话翻译一下,就形成了这个软件的需求:程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。 练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。
### 项目的完成过程
### 1.配置环境
因为之前一直使用Visual Studio 2019写C语言和C++程序,配置环境的过程就不再一一赘述。
安装成功后,首次使用 VS 2019 还需要对其进行简单的配置,包括开发环境的主题风格。这里开发设置选择 C++ 控制台应用即可,主题推荐默认的深色主题。
配置环境问题:
###2.克隆项目 从班级要求仓库地址Fork到自己GitHub的仓库中
#### 安装将仓库内容拷贝到本地的工具Git
Git-windows版本下载地址:点击此处
下载安装完成后,新建一个文件夹来保存仓库中的文件,打开文件夹,在文件夹空白区域点击右键,选择Git Bash Here,输入git clone + 仓库的地址,可以直接复制下来,只能通过右键然后paste进行粘贴,输入完成后按回车就可以了。
在完成上述操作后,可在当前目录下看到一个与仓库同名的文件夹Calculator ,这就是克隆到本地的项目。 注意,默认克隆的分支是 java,请使用 git checkout cplusplus 命令切换到 C++ 项目。 进入项目文件夹,新建一个文件夹,重命名为你的 Github 账号名。
接着就可以进行代码的编写,我用到了上学期学的数据结构中栈和队列的思想,将数字和运算符分开进行计算。
之后根据作业要求中的链接,进行Git的下载及环境配置。
配置过程
开始的时候按照作业要求的 Visual Studio 2017 版本,结果网速太差,根本下载不来,所以就用了之前一直使用的 VS 2019,环境差别不大。
代码设计
先定义四则运算的数值,定义一个字符串,包含了加、减、乘、除四个运算符。再定义i,j,x,y作为字符串的下标。并提示用户输入要生成的四则运算个数。运用数据结构栈中计算算数表达式的值的方法将随机产生的算式算出结果。将结果进行类型转换,用字符串函数将结果与算式拼接在一起。然后将产生带结果的算式用文件操作储存到文件中。最后读取文件并打印到屏幕上。
具体代码如下:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
void DealFenshu(int m, int a[][2])
{
for (int p = 0; p < m; p++)
{
int i = (int)rand() % 10;
int j = (int)rand() % 10;
while (j == 0 || i >= j)
{
i = (int)rand() % 10;
j = (int)rand() % 10;
}
int x = (int)rand() % 10;
int y = (int)rand() % 10;
while (y == 0 || x >= y)
{
x = (int)rand() % 10;
y = (int)rand() % 10;
}
int k = (int)rand() % 100 / 25;
switch (k)
{
case 0:
cout << "(" << i << "/" << j << ")" << "+" << "(" << x << "/" << y << ")" << "=";
a[p][0] = i * y + x * j;
a[p][1] = j * y;
break;
case 1:
cout << "(" << i << "/" << j << ")" << "-" << "(" << x << "/" << y << ")" << "=";
a[p][0] = i * y - x * j;
a[p][1] = j * y;
break;
case 2:
cout << "(" << i << "/" << j << ")" << "*" << "(" << x << "/" << y << ")" << "=";
a[p][0] = i * x;
a[p][1] = j * y;
break;
case 3:
a[p][0] = i * y;
a[p][1] = j * x;
cout << "(" << i << "/" << j << ")" << "/" << "(" << x << "/" << y << ")" << "=";
}
if (p % 5 == 4)
{
cout << endl;
}
else
{
cout << "\t";
}
}
}
void DisplayFenshu(int a[][2], int w, int m)
{
if (w == 1)
{
for (int q = 0; q < m; q++)
{
if (a[q][0] == 0)
cout << "0" << "\t";
else
cout << a[q][0] << "/" << a[q][1] << "\t";
if (q % 5 == 4)
{
cout << endl;
}
}
}
else
{
};
}
void DealInt(int m, int a[])
{
for (int p = 0; p < m; p++)
{
int i = (int)rand() % 10;
int j = (int)rand() % 10;
int k = (int)rand() % 100 / 25;
switch (k)
{
case 0:
cout << i << "+" << j << "=";
a[p] = i + j;
break;
case 1:
cout << i << "-" << j << "=";
a[p] = i - j;
break;
case 2:
cout << i << "*" << j << "=";
a[p] = i * j;
break;
case 3:
try
{
a[p] = i / j;
cout << i << "/" << j << "=";
}
catch (...)
{
p--;
}
}
if (p % 5 == 4)
{
cout << endl;
}
else
{
cout << "\t";
}
}
}
void DisplayInt(int a[], int w, int m)
{
if (w == 1)
{
for (int q = 0; q < m; q++)
{
cout << a[q] << "\t";
if (q % 5 == 4)
{
cout << endl;
}
}
}
else
{
};
}
void main()
{
int p;
do
{
system("cls");
int a[1000], b[1000][2];
int m, n, w;
cout << "请输入生成的四则运算题个数:";
cin >> m;
cout << endl;
cout << "请输入要生成的四则运算种类(输入1为整数,否则为真分数):";
cin >> n;
cout << endl;
if (n == 1)
{
DealInt(m, a);
cout << endl;
}
else
{
DealFenshu(m, b);
cout << endl;
}
cout << "是否输出答案(输入1则输出答案否则不输出答案)" << endl;
cin >> w;
if (n == 1)
{
DisplayInt(a, w, m);
}
else
{
DisplayFenshu(b, w, m);
}
cout << endl;
cout << "是否继续生成运算题(输入1则生成否则不生成)" << endl;
cin >> p;
cout << endl;
} while (1 == p);
}
运行结果如下图
保存文件结果如下
克隆代码及提交代码
代码运行时出现了很多小问题,这些问题也正好反映了我数据结构学的不扎实,并没有把理论落实到代码上。
我的感悟
本来想用Python写这个代码,但是自己学的Python还没到这个程度,看着那么多大佬同学用Java Python 写的那么6,我也有了下一步的学习动力。GIT的安装和使用可能是这一次作业最恼火的一部分。通过寝室大佬的帮助,我也一步一步解决了这些问题。还要把数据结构巩固一下,这次敲代码把自己菜鸡的问题全部暴露出来了。以后要少说多做多敲代码,成为一个别人眼里的大佬...
补充
经过助教哥哥的点拨,我又修改了一下程序,将其存在的生成文件和结果的问题解决了,并传上了相应的文件截图。感谢!