2020面向对象程序设计寒假作业2 题解
2020面向对象程序设计寒假作业2 题解
| 作业描述 | 作业详情 |
|---|---|
| 这个作业属于哪个课程 | 2020福大数计面向对象程序设计 |
| 这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
| 这个作业的目标 | 1. 学习并使用git,建立github仓库 2.优化架构 3.优化命名规范 4.制作编译脚本 5.进行单元测试 6.添加功能 7.发布博客 |
| 作业正文 | 见下文 |
| 其他参考文献 | 1.Git教程 2.BAT 批处理脚本教程 3.C语言.c和.h 4.freopen()函数的使用 |
一、实践题
#### 新建一个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<stdio.h>
#include<string.h>
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
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 函数
}
####得到了如下的测试结果
<br>

<br>
####cum 函数脚本测试
<br>
include<stdio.h>
include<string.h>
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
}
<br>
####得到了如下的测试结果
<br>

<br>
<br>
##4、通过命令行读取一个文件
<br>
通过查阅资料,我知道这时应使用 freopen 函数
freopen是被包含于C标准库头文件stdio.h中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。
<br>
(1)在这里需要将主函数做一定修改
<br>
int main(int argc,char *argv[]){
if(argc!=1){
freopen(argv[1],"r",stdin);
}
-argv[1]表示在控制台输入的.txt的地址。
<br>
(2)-准备测试样例 1.txt 、2.txt。并将其与程序的cpp及exe文件放于同一目录下。
在这里我又被卡了很久很久很久很久,刚开始直接用Windows自带的记事本来书写测试样例,然后在cmd操作时总出现输入错误,换了好几种 freopen 函数的输入方法都不行
后来想起来前面脚本书写的例子 才想起来改用 ASNI 编码的形式 。
<br>

<br>

<br>
####测试结果:
<br>

<br>
<br>
###以上就是我第二次作业的内容。
<br>

浙公网安备 33010602011771号