Markdown在线编辑器 - www.MdEditor.com
2020面向对象程序设计寒假作业2 题解
Markdown在线编辑器 - www.MdEditor.com
作业描述 | 作业详情 |
---|---|
这个作业属于哪个课程 | 2020福大数计面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
这个作业的目标 | 1. 学习并使用git,建立github仓库 2.优化架构 3.优化命名规范 4.制作编译脚本 5.进行单元测试 6.添加功能 7.发布博客 |
作业正文 | 见下文 |
其他参考文献 | 1.Git教程 2.BAT 批处理脚本教程 3.C语言.c和.h 4.freopen()函数的使用 |
Markdown在线编辑器 - www.MdEditor.com
一、实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
我采用 githubdesktop 上传代码和测试脚本
(1)下载并进入 GitHub desktop 建立新的仓库 FZU_homework2020
(2)打开仓库本地的文件夹 将代码和脚本传入仓库
(3)打开网页版 github 检查文件已上传至仓库
二、编程题
- 继续完成作业一的编程题。
- 优化架构,一般要求每个函数长度不超过15行。
- 优化规范,尤其是命名规范。
- 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
- 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
在作业一编程题的基础上添加以下功能:通过命令行读取一个文件,然后运行这个文件。
1、优化架构
我将 exchange 函数进行优化,用数组和循环结合,避免了重复的枚举,缩小了代码量。之前的函数
int exchange(char s4[]){
if( !strcmp(s4,"零") ) return 0;
if( !strcmp(s4,"一") ) return 1;
if( !strcmp(s4,"二") ) return 2;
if( !strcmp(s4,"三") ) return 3;
if( !strcmp(s4,"四") ) return 4;
if( !strcmp(s4,"五") ) return 5;
if( !strcmp(s4,"六") ) return 6;
if( !strcmp(s4,"七") ) return 7;
if( !strcmp(s4,"八") ) return 8;
if( !strcmp(s4,"九") ) return 9;
if( !strcmp(s4,"十") ) return 10;
}
优化后
int exchange(char s4[])
{
char b[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
for(int i=0;i<=10;i++){
if( !strcmp(s4,b[i]) ) return i;
}
}
其余部分函数
cum函数 用于判断进行的运算 并据此将exchange得到的数进行正负转换 和原始数相加减。
int cum(char s3[],char s4[]){
if( !strcmp(s3,"增加") ) { return exchange(s4); }
if( !strcmp(s3,"减少") ) { return -exchange(s4); }
}
back函数用于输出 将数字转换为汉字形式 并在输出时根据数据范围进行不同格式输出。
int back(int wal){
char a[10][4]={"零","一","二","三","四","五","六","七","八","九"};
if( wal >= 10 && wal <= 99){
int x = wal%10;
wal/=10;
if(wal!=1)
printf("%s十%s",a[wal],a[x]);
else
printf("十%s",a[x]);
}
else printf("%s",a[wal]);
}
主函数
#include
#include
int main()
{
int wal = 0 ;
char s1[100],s2[100],s3[100],s4[100];
scanf("%s %s %s %s",s1,s2,s3,s4);
getchar();
if( strcmp(s1,"整数") ) { printf("输入错误。\n"); }
else wal += exchange(s4);
while(1){
scanf("%s",s2);
if( !strcmp(s2,"看看") ){
if( wal < 0 ) printf("输入错误。\n");
else back(wal);
break;
}
scanf("%s %s",s3,s4);
wal += cum(s3,s4);
}
}
2、编译脚本
根据查阅有关资料以及同学们的讨论
我才用了 notepad++ 写了类似如下图的编译脚本 并保存为 .bat 后缀
@echo off
title 函数测试脚本
g++ -o test1.exe test1.c
test1.exe
pause
del test1.exe
在操作过程中,我遇到不少问题
-.bat文件采用中文,如给控制台更改名字时,会出现奇奇怪怪的乱码。
-脚本运行时一下就结束了
经过进一步探索和借鉴
-将编码改为 ANSI 可以解决用中文出现乱码情况
-在脚本末尾加上 pause 可以阻止脚本马上结束
3、测试脚本
测试脚本需要先设计相对应的程序
我对 exchange 函数 以及 cum 函数 进行脚本测试
exchange函数脚本测试
#include
#include
int exchange(char str1[])
{
char b[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
for (int i=0;i<=10;i++){
if (!strcmp(str1,b[i])) return i;
}
}
int main(){
int x,y;
char str1[100],str2[100];
char s[10][4]={"零","一","二","三","四","五","六","七","八","九"};
while (scanf("%s",str1) != EOF){
y=exchange(str1);
if (!strcmp(str1,s[y]))
printf("pass\n");
else printf("error\n");
}
// 测试 exchange 函数
}
得到了如下的测试结果
cum 函数脚本测试
#include
#include
int cum(char str2[],int x){
if (!strcmp(str2,"增加") ) {return x;}
if (!strcmp(str2,"减少") ) {return -x;}
}
int main(){
int x,y;
char str2[100];
while (scanf("%s %d",str2,&x) != EOF){
if (strcmp(str2,"增加") && strcmp(str2,"减少")) {
printf("error\n"); continue;
}
y=cum(str2,x);
if (!strcmp(str2,"增加")){
if (y>0)
printf("%d pass\n",y);
else printf("error\n");}
else if (!strcmp(str2,"减少")){
if(y<0)
printf("%d pass\n",y);
else printf("error\n"); }
}
// 测试 cum 函数 增加 2
}
得到了如下的测试结果
4、通过命令行读取一个文件
通过查阅资料,我知道这时应使用 freopen 函数
freopen是被包含于C标准库头文件stdio.h中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。
(1)在这里需要将主函数做一定修改
int main(int argc,char *argv[]){
if(argc!=1){
freopen(argv[1],"r",stdin);
}
-argv[1]表示在控制台输入的.txt的地址。
(2)-准备测试样例 1.txt 、2.txt。并将其与程序的cpp及exe文件放于同一目录下。
在这里我又被卡了很久很久很久很久,刚开始直接用Windows自带的记事本来书写测试样例,然后在cmd操作时总出现输入错误,换了好几种 freopen 函数的输入方法都不行
后来想起来前面脚本书写的例子 才想起来改用 ASNI 编码的形式 。