2020面向对象程序设计寒假作业2 题解

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
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205013839465-692478985.png)
(2)打开仓库本地的文件夹 将代码和脚本传入仓库
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205014035330-425471386.png) ![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205014102955-676745185.png)
(3)打开网页版 github 检查文件已上传至仓库
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205014220878-1037136984.png)

#二、编程题
- **继续完成作业一的编程题。**
- **优化架构,一般要求每个函数长度不超过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 #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 函数

}

####得到了如下的测试结果
<br>
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205025004375-825357645.png)
<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>
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205025312169-1688103426.png)
<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>
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205031034601-904164639.png)
<br>
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205031109015-715642539.png)
<br>
####测试结果:
<br>
![](https://img2018.cnblogs.com/blog/1925094/202002/1925094-20200205031140458-927107060.png)
<br>
<br>

###以上就是我第二次作业的内容。
<br>
posted @ 2020-02-05 03:14  xyyuan1  阅读(213)  评论(0)    收藏  举报