作业描述 | 详情 |
---|---|
这个作业属于哪个课程 | 2020福大面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业二 |
这个作业的目标 | a.新建github仓库,使用git或github desktop上传编程题代码及测试脚本到仓库 (使用.gitignore文件忽略不要上传的文件); b.完成编程题,优化架构、规范; c.制作编译脚本,运行脚本,编译代码; d.进行单元测试,并制作测试脚本; e.通过命令行读取文件,然后运行文件 |
作业正文 | 寒假作业二 |
其他参考文献 | Git教程、Git忽略提交规则、Windows批处理 |
一、实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
请使用.gitignore文件忽略不要上传的文件
之前已经绑定用户名、邮箱(与github的相同)、配置ssh key、建立本地仓库,并关联了github的一个仓库
这里简单说一下流程
建立本地仓库
在本地建个文件夹,可以建几个空文件夹
打开Git Bash Here,进入项目目录
执行指令
git init
git add.
Git commit -m “提交文件”
关联github仓库
复制github要关联的一个仓库地址
执行指令 git remote add origin [email protected]:账户名/仓库名
上传代码及测试脚本
通过git上传,执行指令:git push -u origin master(第一次需要加参数-u,之后可以不用加)
其中用.gitignore忽略不上传的文件
二、编程题
编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个模块。
思考每个模块如何编写。
查阅资料。
对每个模块设计测试用例。
思考
首先定义初始值,之后进行加减运算,“看看”表示输出结果。
需考虑输入输出转换,以及计算过程的实现。
之前无法对初始值大于十的数进行转换,这次优化代码通过convert1函数进行转换,其中调用convert0函数进行单个数转换
代码中输出有三种情况:小于十的结果;整十的结果;大于十但不为整十的结果
代码问题:目前没有办法实现数量变量的错误输入判断
程序划分
汉字转换过程:通过两个函数实现
1.char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };作为转换桥梁
2.通过convert1函数把单个数转换成数字。
3.通过convert0函数分情况拆分输入的数,调用convert0转换成数字。
4.其中借助strcmp函数和strlen函数实现转换和情况拆分。
运算过程:通过opera函数实现
1.通过这个函数完成运算操作的输入。
2."增加"减少""乘以"除以"的运算编写。
还有部分输入以及输出过程:在主函数完成(其中还包括部分错误输入的排除)
输出过程同样进行情况拆分,并借助num字符串转换输出汉字
转化过程:
1.char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
2.convert1函数
int convert1(char wen[])
{
using namespace std;
int z;
for (z = 0; z < 11; z++){//通过for循环找到对应数字,进行转换
if (strcmp(num[z], wen) == 0)
return z;
}
}
3.convert0函数
int convert0(char wen[])
{
using namespace std;
char c[10],d[10];//c,d是为了储存大于十的数量拆分出的数
if (strlen(wen) == 2)//输入的是一位数的转换
return convert1(wen);
else if (strlen(wen) == 4){//输入的是两位数的转换,其中又分为十一~十九和大于十九且为整十的两种情况
c[0] = wen[2];
c[1] = wen[3];
c[2] = '\0';//通过c储存个位上的数
if (convert1(c) != 10) {//输入的是十一~十九的转换
return convert1(c) + 10;}
else {//输入的是大于十九且为整十的转换
c[0] = wen[0];
c[1] = wen[1];
c[2] = '\0';//通过c储存十位数的数
return 10 * convert1(c);}
}
else if (strlen(wen) == 6){//输入的是三位数的转换
c[0] = wen[4];
c[1] = wen[5];
c[2] = '\0';//通过c储存个位数上的数
d[0] = wen[0];
d[1] = wen[1];
d[2] = '\0';//通过d储存十位上的数
return 10 * convert1(d) + convert1(c);
}
}
4.opera函数
void opera(char x[])
{
using namespace std;
char m[20], n[20], s[20];
while (1) {//通过while循环实现连续运算操作
cin >> m;
if (strcmp(m, "看看") == 0) break;//这里是对运算过程结束与否的判断,当输入"看看"时,运算结束
if (strcmp(m, x) != 0) {//对运算对象错误输入的判断
cout << "输入错误" << endl; break;}
cin >> n >> s;//n为运算方式,s为变化量,接下来是运算的操作过程
if (strcmp(n, "增加") == 0)
integer = integer + convert0(s);
else if (strcmp(n, "减少") == 0)
integer = integer - convert0(s);
else if (strcmp(n, "乘以") == 0)
integer = integer * convert0(s);
else if (strcmp(n, "除以") == 0)
integer = integer / convert0(s);
else {//对错误运算操作的反馈
cout << "输入错误" << endl; break;}
}
}
5.主函数
int main(void)
{
using namespace std;
char a[20], x[20], b[20], y[20], h[20];
cin >> a >> x >> b >> y;
if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)//对"整数""大于"错误输入与否的判断
cout << "输入错误" << endl;
integer = convert0(y);//将转换的值赋给integer
opera(x);
cin >> h;
if (integer > 99 || integer < 0)//超出范围的结果
cout << "超出范围";
else if (integer >= 0 && integer < 11)//小于10的结果输出
cout << num[integer];
else if (integer > 11 && integer < 20)//11~19的结果输出
cout << "十" << num[integer % 10];
else if (integer > 19 && integer % 10 == 0)//整10(不含10)的结果输出
cout << num[integer / 10] << "十";
else if (integer > 19 && integer % 10 != 0)//大于19,且非整10
cout << num[integer / 10] << "十" << num[integer % 10];
return 0;
}
完整代码
#include
#include
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };//储存要转换的几个量,用于汉字与数字间转换
int integer=0;
int convert1(char wen[])//将单个汉字转换成数字
{
using namespace std;
int z;
for (z = 0; z < 11; z++){
if (strcmp(num[z], wen) == 0)
return z;
}
}
int convert0(char wen[])//将输入的数量转化成数字,其中调用了convert1函数
{
using namespace std;
char c[10],d[10];
if (strlen(wen) == 2)//输入的是一位数
return convert1(wen);
else if (strlen(wen) == 4){输入的是两位数
c[0] = wen[2];
c[1] = wen[3];
c[2] = '\0';
if (convert1(c) != 10) {//输入的是十一~十九的情况 转换
return convert1(c) + 10;}
else {//输入的是整十的情况 转换
c[0] = wen[0];
c[1] = wen[1];
c[2] = '\0';
return 10 * convert1(c);}
}
else if (strlen(wen) == 6){//输入的是三位数
c[0] = wen[4];
c[1] = wen[5];
c[2] = '\0';
d[0] = wen[0];
d[1] = wen[1];
d[2] = '\0';
return 10 * convert1(d) + convert1(c);
}
}
void opera(char x[])//运算过程
{
using namespace std;
char m[20], n[20], s[20];
while (1) {//用于循环输入运算操作
cin >> m;
if (strcmp(m, "看看") == 0) break;//输入到“看看”,结束循环,进入下一步
if (strcmp(m, x) != 0) {//对运算对象的判断
cout << "输入错误" << endl; break;}
cin >> n >> s;
if (strcmp(n, "增加") == 0)
integer = integer + convert0(s);
else if (strcmp(n, "减少") == 0)
integer = integer - convert0(s);
else if (strcmp(n, "乘以") == 0)
integer = integer * convert0(s);
else if (strcmp(n, "除以") == 0)
integer = integer / convert0(s);
else {//对错误运算操作的反馈
cout << "输入错误" << endl; break;}
}
}
int main(void)
{
using namespace std;
char a[20], x[20], b[20], y[20], h[20];
cin >> a >> x >> b >> y;
if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)
cout << "输入错误" << endl;
integer = convert0(y);
opera(x);
cin >> h;
if (integer > 99 || integer < 0)
cout << "超出范围";
else if (integer >= 0 && integer < 11)
cout << num[integer];
else if (integer > 11 && integer < 20)
cout << "十" << num[integer % 10];
else if (integer > 19 && integer % 10 == 0)
cout << num[integer / 10] << "十";
else if (integer > 19 && integer % 10 != 0)
cout << num[integer / 10] << "十" << num[integer % 10];
return 0;
}
三、编译脚本以及测试脚本
刚开始没有对编码进行转换,之后运行出现乱码,后来改成ANSI就可以了
1.编译脚本
@echo off
set line=-----------------------------------------------------------------------
echo 输入文件所在路径
set /p a=
cd "%a%"
echo 输入文件名
set /p b=
echo %line%
echo 编译开始
cl "%b%"
echo %line%
if exist "guwen.exe" echo 编译成功
if not exist "guwen.exe" echo 编译失败
pause
2.单元测试脚本
这里对convert1和convert0进行测试
convert1测试代码
#include
#include
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int convert1(char wen[])
{
using namespace std;
int z,i;
for (z = 0,i=0; z < 11; z++,i++) {
if (strcmp(num[z], wen) == 0) {
return z;
}
}
}
int main()
{
using namespace std;
int x[12] = { 0,2,4,6,8,10,9,7,5,3,1 ,22};
char y[12][9] = { "零","二","四","六","八","十","九","七","五","三","一","二十二" };
int i, h = 0;
for (i = 0; i < 12; i++) {
if (x[i] == convert1(y[i])) {
cout << y[i] << " 测试成功" << endl;
h++;
}
else cout << y[i] << " 测试失败,为异常测试数据" << endl;
}
cout << endl;
if (h == 12)
cout << "测试成功";
else cout << "出现异常测试数据";
return 0;
}
convert1测试脚本
@echo off
title 单元测试:convert1函数
set line=-----------------------------------------------------------------------
cd "C:\Users\Q sea\source\repos\convert1\convert1"
cl convert1.cpp
echo %line%
echo 测试开始
convert1.exe
echo %line%
pause
convert0测试代码
#include
#include
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int integer = 0;
int convert1(char wen[])
{
using namespace std;
int z;
for (z = 0; z < 11; z++) {
if (strcmp(num[z], wen) == 0)
return z;
}
}
int convert0(char wen[])
{
using namespace std;
char c[10], d[10];
if (strlen(wen) == 2)
return convert1(wen);
else if (strlen(wen) == 4) {
c[0] = wen[2];
c[1] = wen[3];
c[2] = '\0';
if (convert1(c) != 10) {
return convert1(c) + 10;
}
else {
c[0] = wen[0];
c[1] = wen[1];
c[2] = '\0';
return 10 * convert1(c);
}
}
else if (strlen(wen) == 6) {
c[0] = wen[4];
c[1] = wen[5];
c[2] = '\0';
d[0] = wen[0];
d[1] = wen[1];
d[2] = '\0';
return 10 * convert1(d) + convert1(c);
}
}
int main(void)
{
using namespace std;
int x[20] = { 7,17,70,77,110 };
char y[17][10] = { "七","十七","七十","七十七","一百一十" };
int i,j=0, h = 0;
for (i = 0; i < 5; i++) {
if (x[i] == convert0(y[i])) {
cout << y[i] << " 测试成功" << endl;
h++;
}
else
cout << y[i] << " 测试失败,为异常测试数据" << endl;
}
cout << endl;
if (h == 5)
cout << "测试通过,无异常数据" << endl;
else cout << "出现异常测试数据" << endl;
}
convert0测试脚本
@echo off
title 单元测试:convert0函数
set line=-----------------------------------------------------------------------
cd "C:\Users\Q sea\source\repos\convert0\convert0"
cl convert0.cpp
echo %line%
echo 测试开始
convert0.exe
echo %line%
pause
四、命令行读取并运行文件
要求:在作业一编程题的基础上添加以下功能:
通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
假设我的1.txt内容如下:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输入lang 1.txt后,命令行输出一。
代码如下:
其中用了freopen_s函数,一开始查阅了资料,用freopen函数,但是在编译时,VS报错,并警告,建议我换成freopen_s
int main(void)
{
FILE* stream;
char file[200];
using namespace std;
cin >> file;
freopen_s(&stream, "file", "r", stdin);
char a[20], x[20], b[20], y[20], h[20];
cin >> a >> x >> b >> y;
if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)
cout << "输入错误" << endl;
integer = convert0(y);
opera(x);
cin >> h;
if (integer > 99 || integer < 0)
cout << "超出范围";
else if (integer >= 0 && integer < 11)
cout << num[integer];
else if (integer > 11 && integer < 20)
cout << "十" << num[integer % 10];
else if (integer > 19 && integer % 10 == 0)
cout << num[integer / 10] << "十";
else if (integer > 19 && integer % 10 != 0)
}
可以在VS的解决方案->资源文件添加要测试的输入文本