C++寒假第二次作业

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 寒假第二次作业要求
这个作业的目标 1)学会github的一些常规操作,例如把文件从本地仓库传到线上仓库 2)学习如何利用windows批处理编写编译脚本和测试脚本;3)优化编程题,并添加指定功能
作业正文 实践题 编程题
其他参考文献 Windows 批处理(bat)语法大全 GitHub使用指南

编程题

优化

·首先是优化命名
回顾第一次的编程题的代码,我发现,自己只使用两个字符数组,s0来储存变量,作为变量报错的模板;s则用于暂存“增加”“减少”“看看”以及零到十一系列汉字的存储。这么看来,字符数组s的存储的内容种类似乎有点繁杂,而且这样的程序阅读起来并不好理解,容易让人摸不着头脑。
因此我想,能不能分配出更多有较强针对性的字符数组,用来存储特定的关键字。比如,使用markname作为储存变量模板的数组,用于与之后变量输入位置的数组varyname作比较,以此来确定输入数据是否符合要求。用operate数组来储存“增加,减少,看看”等的操作。
对于函数名,我也做了很多修改,根据各自的功能来命名,我个人认为,虽然函数比较多,但每个都分工明确,并且比上一次的短小精悍。

#include<string.h>
void operatejudge(char operate[10],int*p);//判定操作关键词正误 
void varyjudge(char markname[10],char varyname[10],int*p); //判断变量关键词正误 
void numberjudge(char temp[10],int* p);//判断数额关键词输入正误 
int change_1(char temp[10]);//将汉字数字转为阿拉伯数字
void change_2(int sum);// 将阿拉伯数字转为汉字数字
void link(int sum);
int main()
{//用operate统一储存操作 
	char markname[10],store[10],depot[10],varyname[10],operate[10],number[10];
	int sum,flag=0,index1,index2,aid;
	char filename[10];

·优化构架(我主函数还是很长。。。。但是我其他部分的函数精简了很多(当然不是因为加到主函数上才减少的(手动狗头)))
因为除第一行的输入的格式相对固定(整数 变量名 数量)外,从第二行开始,每次要完成一行输入之前,都需要做一次初始判断,即判断每行首个关键词是“变量”还是“看看”操作。
因此我打算用一个store数组来暂存,等判断完为何种操作后,再进行下一步操作。还需要考虑的是,这一次,为了完善程序的报错功能,并且尽可能地使代码架构优化,我打算设计多个具有针对性的函数。(如先调用第一重报错函数,负责,而第二重报错函数则分为三种:判断变量输 ,判断汉字数值输入有无问题,包括输入数据过大,格式不符等等,以及判断输入操作有无定义),这样代码结构也可以更加清晰
首先是汉字数字转换成阿拉伯数字,这部分我基本没改。。。。代码还是很直接粗暴

int change_1(char temp[10])
{
	if(strcmp(temp,"零")==0) return 0;
	else if(strcmp(temp,"一")==0) return 1;
	else if(strcmp(temp,"二")==0) return 2;
	else if(strcmp(temp,"三")==0) return 3;
	else if(strcmp(temp,"四")==0) return 4;
	else if(strcmp(temp,"五")==0) return 5;
	else if(strcmp(temp,"六")==0) return 6;
	else if(strcmp(temp,"七")==0) return 7;
	else if(strcmp(temp,"八")==0) return 8;
	else if(strcmp(temp,"九")==0) return 9;
	else if(strcmp(temp,"十")==0) return 10;
	else return -1;
}

·然后是
阿拉伯数字转换成汉字数字
这一部分我相比原先删减了很多。我原先是分成三部分考虑:十以内,十一到十九,二十到九十九。现在,我在想,能不能只使用十以内的函数部分即可。因此,我决定在使用这一部分函数前,先对阿拉伯数字进行处理,两位数拆成十位和个位来分析,分别用/和%可得(这一点和上次一样)。代码如下。
主函数部分
具体实现时,我在主函数先用一个选择语句将十以内的数据和其他数据分开,十以内数据直接转换

if(sum<=10) change_2(sum);
else link(sum);

相关调用的函数
在这里我使用了一个link函数,用来帮我组织chang_2函数的调用
十以上的函数都有“十”,唯一的差别在两侧的汉字,例如,十一,二十,二十二。因此我根据这一特征,分别用if做了两次选择。

void link(int sum)
{
	if((sum/10)>1) change_2(sum/10);
	printf("十");
	if((sum%10)!=0) change_2(sum%10); 
}
void change_2(int sum)
{
	switch(sum){
	    case 0:printf("零");break;
		case 1:printf("一");break;
		case 2:printf("二");break;
		case 3:printf("三");break;
		case 4:printf("四");break;
		case 5:printf("五");break;
		case 6:printf("六");break;
		case 7:printf("七");break;
		case 8:printf("八");break;
		case 9:printf("九");break;
		case 10:printf("十");break; 		
	}
}

其他报错函数方法就比较简单了,就是字符串的比较,然后做相应的报错提示。(用到指针是之前没有考虑好,本来想作为循环中输入正确的跳出循环条件的,后面貌似也用得不是很好。到后面才发现没啥卵用。。。。会想法子去掉的。。。)
报错函数代码如下

void numberjudge(char temp[10],int* p)
{
	if(change_1(temp)==-1){
		printf("输入的数额无效\n");
		*p=0;
	}
	else *p=1;
}
void varyjudge(char markname[10],char varyname[10],int*p)
{
	if(strcmp(markname,varyname)==0) *p=1;
	else{
		printf("出现了未定义变量\n");
		*p=0;
	} 
}
void operatejudge(char operate[10],int*p)//默认不检查“看看”操作 
{
    if(strcmp(operate,"增加")==0) *p=1;
	else if(strcmp(operate,"减少")==0) *p=1;
	else{
		printf("出现了未定义操作\n");
		*p=0;
	} 
}

制作脚本

编译脚本

之前在这一部分之前查阅了很多资料,比如C Primer Plus和C++ Primer Plus,还上网找了很多,因为实在是太多陌生的东西了。我之前一直不理解制作脚本是什么意思,后面看到群里有同学在说,再加上自己也找过相关的资料,才知道应该学习windows批处理bat语法。
然后学了语法后,真正开始编写时,刚开始还是有些摸不着头脑。。。。。
因为之前学过用命令行编译C源文件,比较熟悉,所以后面还是找到了一些门路。

测试脚本

做测试脚本就跟懵逼了。。。。到后面看到助教给的示例,然后有人提醒我,测试脚本需要具有编译和运行测试的功能。当时我才突然想到其实测试脚本就比编译脚本多添加一个运行功能而已,然后我就上网查了运行文件的bat语法应该怎么写,最开始还是一直出错,后面终于成功了呜呜呜。(我好激动)

终于成功了!(下图)

添加功能

之前我考虑过重定向。。。然后后来想使用fopen等对文件I/O函数,来添加函数功能。但是我后来还是使用了重定向。
在这里需要感谢CCchaos同学,在看Ta的博文时,我知道了可以使用freopen直接实现所需的功能。不过我想,接下去可以尝试使用I/O函数来实现此功能。

posted @ 2020-02-05 22:59  枭魈  阅读(207)  评论(0编辑  收藏  举报