这个作业属于哪个课程 | 2020面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
这个作业的目标 | 1.继续完成编程题 2.新建一个github仓库,并把作业推送到该仓库。 |
作业正文 | 如下 |
其他参考文献 | 在文中相关部分 |
一.实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
请使用.gitignore文件忽略不要上传的文件。用法自行百度。
1.新建仓库并安装Git
(我家的网这几天抽了风,信号时断时续时有时无,导致我作业做得很是痛苦,重点是我下的Git和github desktop一断网就下载失败要重头开始下载,然后这俩还下的贼慢,所以这个作业只有先放一放,等我下好了回补上的)
二.编程题(请使用C语言或者C++完成以下题目):
继续完成作业一的编程题。
- 优化架构,一般要求每个函数长度不超过15行。
- 优化规范,尤其是命名规范。
- 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
示例脚本:
gcc 1.cpp -o lang.exe
- 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
示例脚本:
gcc 1.cpp test.cpp -o test.exe
test
- 在作业一编程题的基础上添加以下功能:
- 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,
lang 1.txt
代表我要运行1.txt这个文本中的代码。 - 假设我的
1.txt
内容如下:
整数 钱包 等于 零 钱包 增加 四 钱包 减少 三 看看 钱包
- 输入
lang 1.txt
后,命令行输出一
。
- 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,
编程题要求:
1.读题,提取出题目的要求。
2.分解需求,把需求分解为几个你觉得不太相关的模块。
3.思考每个模块怎么写,可以从简单的模块开始写。
4.对于不会的问题进行查阅资料。
5.对于每一个模块设计测试用例。
6.详细记录下以上每一步,并写在博客中。
7.不要求完全做出来,但要求记录详细。
8.建议博客长度不少于1000字(不包含代码)。
题目要求:
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包- 本次优化:
优化架构:压缩函数行数
优化命名:函数命名规范
关于命名规范:
以前都是想怎么命名就怎么命名,看到这次作业才知道命名是有规范的,就上网参考了一下,看到函数的命名规则大概有:
(1)函数的命名应该尽量用英文(或英文缩写、中文全拼、中文全拼缩写)表达出函数完成的功能——函数名应准确描述函数的功能。遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于8个字母。函数名首字大写,若包含有两个单词的每个单词首字母大写。如果是OOP 方法,可以只有动词(名词是对象本身)。
(2)避免使用无意义或含义不清的动词为函数命名。如使用process、handle等为函数命名,因为这些动词并没有说明要具体做什么。
(3)必须使用函数原型声明。函数原型声明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名;内部函数,只要注释其定义文件名——和调用者在同一文件中(简单程序)时不需要注释。应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。
参考资料有:c语言变量名、函数名的命名规则,代码的两种命名方法:驼峰命名、匈牙利命名(优缺点)
---
函数一:
int changeInTen(char s[10])//将输入的中文转化成数字
{
if(strcmp(s,"零")==0) return 0;
else if(strcmp(s,"一")==0) return 1;
else if(strcmp(s,"二")==0 return 2;
else if(strcmp(s,"三")==0) return 3;
else if(strcmp(s,"四")==0) return 4;
else if(strcmp(s,"五")==0) return 5;
else if(strcmp(s,"六")==0) return 6;
else if(strcmp(s,"七")==0) return 7;
else if(strcmp(s,"八")==0) return 8;
else if(strcmp(s,"九")==0) return 9;
else if(strcmp(s,"十")==0) return 10;
}
函数二:
int calculate(char s[10],int m,int n)//将汉字增加和减少转换为+和-并进行运算
{
int k;
if(strcmp(s,"增加")==0) k=m+n;
if(strcmp(s,"减少")==0) k=m-n;
return k;
}
函数三:
char exchangeInTen(int t)//将计算结果的数字转化回汉字
{
if(t>0){
if(t==0) printf("零");
else if(t==1) printf("一");
else if(t==2) printf("三");
else if(t==4) printf("四");
else if(t==5) printf("五");
else if(t==6) printf("六");
else if(t==7) printf("七");
else if(t==8) printf("八");
else if(t==9) printf("九");
}
else if(t<0) printf("Error");
}
完整代码:
#include
#include
int changeInTen(char s[10]);
int calculate(char s[10],int m,int n);
char exchangeInTen(int t)(int t);
int main()
{
char a[10],b[10],c[10],d[10];
int x,y;
scanf("%s %s %s %s",&a,&b,&c,&d);
x=changeInTen(d);
while(1){
scanf("%s",a);
if(strcmp(a,"看看")==0){//出现“看看”时计算停止,否则一直计算下去
scanf("%s",b);
break;
}
else{
scanf("%s %s",b,c);
y=changeInTen(c);
x=calculate(b,x,y);
}
}
exchangeInTen(x);
return 0;
}
int changeInTen(char s[10])//将输入的中文转化成数字
{
if(strcmp(s,"零")==0) return 0;
else if(strcmp(s,"一")==0) return 1;
else if(strcmp(s,"二")==0 return 2;
else if(strcmp(s,"三")==0) return 3;
else if(strcmp(s,"四")==0) return 4;
else if(strcmp(s,"五")==0) return 5;
else if(strcmp(s,"六")==0) return 6;
else if(strcmp(s,"七")==0) return 7;
else if(strcmp(s,"八")==0) return 8;
else if(strcmp(s,"九")==0) return 9;
else if(strcmp(s,"十")==0) return 10;
}
int calculate(char s[10],int m,int n)//将汉字增加和减少转换为+和-并进行运算
{
int k;
if(strcmp(s,"增加")==0) k=m+n;
if(strcmp(s,"减少")==0) k=m-n;
return k;
}
char exchangeInTen(int t)//将计算结果的数字转化回汉字
{
if(t>0){
if(t==0) printf("零");
else if(t==1) printf("一");
else if(t==2) printf("三");
else if(t==4) printf("四");
else if(t==5) printf("五");
else if(t==6) printf("六");
else if(t==7) printf("七");
else if(t==8) printf("八");
else if(t==9) printf("九");
}
else if(t<0) printf("Error");
}
制作编译脚本:(看群里的讨论我选择了Windows批处理)
根据百度说明的方法,第一步:右键新建一个文本文档。
第二步:打开新建的文本文档,输入需要批处理的DOS命令。(参考了windows批处理命令总结以及Windows 批处理脚本学习教程)
第三步:右键,选择“重命名”。
第四步:后缀为“.bat”,双击处理好的批处理文件即可。
单元测试:
先写出函数一的测试代码:
#include
#include
int changeInTen(char s[10])
{
if(strcmp(s,"零")==0) return 0;
else if(strcmp(s,"一")==0) return 1;
else if(strcmp(s,"二")==0) return 2;
else if(strcmp(s,"三")==0) return 3;
else if(strcmp(s,"四")==0) return 4;
else if(strcmp(s,"五")==0) return 5;
else if(strcmp(s,"六")==0) return 6;
else if(strcmp(s,"七")==0) return 7;
else if(strcmp(s,"八")==0) return 8;
else if(strcmp(s,"九")==0) return 9;
else if(strcmp(s,"十")==0) return 10;
}
void test(char a[],int num)
{
if(changeInTen(a)==num)
printf("成功\n");
else
printf("错误\n");
}
int main()
{
test("零",0);
test("一",1);
test("二",2);
test("三",4);
test("五",8);
return 0;
}
在作业一编程题的基础上添加以下功能:
- 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,
lang 1.txt
代表我要运行1.txt这个文本中的代码。 - 假设我的
1.txt
内容如下:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
- 输入
lang 1.txt
后,命令行输出一
。
(这个看了其他大佬的作业发现了要用freopen()函数,然后我又上网参考了一下C 库函数 - freopen())
(因为贪玩这次作业开始得有点晚,做得有点仓促,完成的也很粗糙,脚本我也是完全没听过也不会做啊,所以时间都花在了制作编译脚本上,另外让我卡了很久的就是那句“gcc不是内部命令也不是可运行的程序或批处理文件”,这里真的万分感谢善良的L童鞋一步一步地教我设置path,我才能搞定它)