寒假作业2

这个作业属于哪个课程 <2020面向对象程序设计张栋班>
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1.建立GitHub仓库,并把编程题代码与脚本上传到仓库里 2.优化上次编程题,并编写测试脚本,添加功能让它能够读取TXT文档
作业正文 ....
其他参考文献 main函数参数解析, Windows(bat)常用命令教程
实践题
=======
作业要求:

新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
请使用.gitignore文件忽略不要上传的文件。用法自行百度。

作业过程

由于不知道为甚么,GitHub下载不了

我只能在网站里面上传我的文件了

编程题

作业要求:

1.继续完成作业一的编程题。
2.优化架构,一般要求每个函数长度不超过15行。
3.优化规范,尤其是命名规范。
4.制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
5.进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
6.在作业一编程题的基础上添加以下功能:
7.通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。

作业过程

1.继续完善编程题功能

前一次作业中,由于时间以及能力问题,有一些问题没有解决:1.输入增加或减少的数量不能超过10。2.上次不会用函数,导致代码长度特别长且繁琐。3.编程习惯不好,各部分没有分层,导致代码很不好看。
因此我把我的代码功能大概分成了三个部分,分别由三个函数实现。
第一个函数int f1(char b[])

int f1(char b[])/*个位数汉字转数字*/ 
{
	int t;
 if(strcmp(b,"零")==0)
 t=0;
 else if(strcmp(b,"一")==0)
 t=1;
 else if(strcmp(b,"二")==0)
 t=2;
 else if(strcmp(b,"三")==0)
 t=3;
 else if(strcmp(b,"四")==0)
 t=4;
 else if(strcmp(b,"五")==0)
 t=5;
 else if(strcmp(b,"六")==0)
 t=6;
 else if(strcmp(b,"七")==0)
 t=7;
 else if(strcmp(b,"八")==0)
 t=8;
 else if(strcmp(b,"九")==0)
 t=9;
 else if(strcmp(b,"十")==0)
 t=10;
 return t;
}

这个函数实现了个位数字汉字转阿拉伯数字用于增加或者减少计算,以及作为下一个函数f2两位数的汉字转阿拉伯数字的基础

int f2(char d[])/*零到九十九汉字转数字*/ 
{
	char a[100];
	int l;
	if(strlen(d)==2)
	    l=f1(d);
	else if(strlen(d)==4)
	{
   	    a[0]=d[0];
        a[1]=d[1];
    	a[2]='\0';
	    if(strcmp(a,"十")!=0)
		{
	     l=f1(a)*10;
		}
		else
	{
    	a[0]=d[2];
    	a[1]=d[3];
    	a[2]='\0';
	{
	    l=f1(a)+10;
	}
	}
	}
	else
	{
		a[0]=d[0];
		a[1]=d[1];
		a[2]='\0';
		{
		 l=f1(a)*10;
		}
		a[0]=d[4];
		a[1]=d[5];
		a[2]='\0';
		{
		 l=l+f1(a);
		}
	}
	 return l;
}

这个功能是这次作业新加入的,我发现一个汉字占两个字节的空间,并以此为依据,将输入分为三种情况:1.输入只有一个汉字2.输入为两个汉字3.输入为三个汉字。其中输入为一个汉字的情况就是阿拉伯数字0到10的情况,输入为两个汉字要细分为两种情况考虑一种是整十的数,一种是十到二十的数,其他情况就是输入为三个汉字的情况
第三个函数f3的功能是把数字转化成汉字

void f3(int t)/*数字转汉字*/ 
{if(t==0)
  printf("零");
 if(t==1)
  printf("一");
 if(t==2)
  printf("二");
 if(t==3)
  printf("三");
 if(t==4)
  printf("四");
 if(t==5)
  printf("五");
 if(t==6)
  printf("六");
 if(t==7)
  printf("七");
 if(t==8)
  printf("八");
 if(t==9)
  printf("九"); 
}

由于零到九十九的表达都只用到零到十这十一个汉字,因此只要把零到十进行转化就行,总代吗如下

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int f1(char b[])/*个位数汉字转数字*/ 
{
	int t;
 if(strcmp(b,"零")==0)
 t=0;
 else if(strcmp(b,"一")==0)
 t=1;
 else if(strcmp(b,"二")==0)
 t=2;
 else if(strcmp(b,"三")==0)
 t=3;
 else if(strcmp(b,"四")==0)
 t=4;
 else if(strcmp(b,"五")==0)
 t=5;
 else if(strcmp(b,"六")==0)
 t=6;
 else if(strcmp(b,"七")==0)
 t=7;
 else if(strcmp(b,"八")==0)
 t=8;
 else if(strcmp(b,"九")==0)
 t=9;
 else if(strcmp(b,"十")==0)
 t=10;
 return t;
}
int f2(char d[])/*零到九十九汉字转数字*/ 
{
	char a[100];
	int l;
	if(strlen(d)==2)
	    l=f1(d);
	else if(strlen(d)==4)
	{
   	    a[0]=d[0];
        a[1]=d[1];
    	a[2]='\0';
	    if(strcmp(a,"十")!=0)
		{
	     l=f1(a)*10;
		}
		else
	{
    	a[0]=d[2];
    	a[1]=d[3];
    	a[2]='\0';
	{
	    l=f1(a)+10;
	}
	}
	}
	else
	{
		a[0]=d[0];
		a[1]=d[1];
		a[2]='\0';
		{
		 l=f1(a)*10;
		}
		a[0]=d[4];
		a[1]=d[5];
		a[2]='\0';
		{
		 l=l+f1(a);
		}
	}
	 return l;
}
void f3(int t)/*数字转汉字*/ 
{if(t==0)
  printf("零");
 if(t==1)
  printf("一");
 if(t==2)
  printf("二");
 if(t==3)
  printf("三");
 if(t==4)
  printf("四");
 if(t==5)
  printf("五");
 if(t==6)
  printf("六");
 if(t==7)
  printf("七");
 if(t==8)
  printf("八");
 if(t==9)
  printf("九"); 
}
int main(int argc,char *argv[])
{
	char a[20],b[5],c[5],d[5],e[5],f[5];
	int t,t1,t2,n,i,l;
	if(argc!=1)
	{ 
     freopen(argv[1],"r",stdin);
  	} 
	scanf("%s%s%s%s",e,a,f,b);
	
	t=f2(b);
	for(i=0;;i++)
	{
		 scanf("%s",b);
	 	if(strcmp(b,"看看")==0)
		{
		 scanf("%s",c);
		 break; 
		}
		else
		{
			scanf("%s",c);
				if(strcmp(c,"增加")==0)
				{
				scanf("%s",d);
	 			t=t+f2(d);
				}
				else 
				{
				scanf("%s",d);
	 			t=t-f2(d);
				}
		}
	} 
	if(t/10==0)
	f3(t);
	else
	{
	t2=t%10;
	t1=t/10;
		if(t1==1)
			{
			printf("十");
			f3(t2);
			}
		else if(t2==0)
			{
			f3(t1);
			printf("十");
			}
		else
			{
			f3(t1);
			printf("十");
			f3(t2);
			}
	}
	return 0;
 }  

至于编译脚本,对于我来说,我还得先解决一下上次作业中我编译C语言程序的时候无法找到stdio.h的情况,我重新检查了下我的环境变量配置,已经确定我的include与lib还有vc里的bin都有设置进去,我觉得可能是我当时下载vs2019的时候没有下载好,导致头文件丢失,所以我最后放弃了使用vs里边cl.exe这个编译器,我就想试试以前使用的Dev c++里面的编译器,我就照猫画虎,把Dev c++里面的include与lib还有bin设置进去,再进行编译,而这个编译器编译成功并不会显示任何东西,我以为编译失败了,退出后发现文件夹中居然出现了我要的可执行文件,这说明编译成功了。。。。然后我就用Windows的批处理写了一个编译的脚本,期初一直不知道怎么写,看了下同学们的作业,大概知道怎么回事,也写了一个

运行后可以生成exe文件

然后进行单元测试,我写了个测试脚本测试了f1跟f2那两个有返回值的函数,随便选取几个数进行测试

这是脚本内容

里面测试脚本.cpp内容

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int f1(char b[])/*个位数汉字转数字*/ 
{int t;
if(strcmp(b,"零")==0)
 t=0;
 else if(strcmp(b,"一")==0)
t=1;
 else if(strcmp(b,"二")==0)
 t=2;
 else if(strcmp(b,"三")==0)
 t=3;
 else if(strcmp(b,"四")==0)
 t=4;
 else if(strcmp(b,"五")==0)
 t=5;
 else if(strcmp(b,"六")==0)
 t=6;
 else if(strcmp(b,"七")==0)
 t=7;
 else if(strcmp(b,"八")==0)
 t=8;
 else if(strcmp(b,"九")==0)
t=9;
else if(strcmp(b,"十")==0)
t=10;
 return t;
}
int f2(char d[])/*零到九十九汉字转数字*/ 
{
	char a[100];
	int l;
		if(strlen(d)==2)
	l=f1(d);
	else if(strlen(d)==4)
	{
   	    a[0]=d[0];
        a[1]=d[1];
    	a[2]='\0';
	    if(strcmp(a,"十")!=0){
	   l=f1(a)*10;
	}else
	{
    	a[0]=d[2];
    	a[1]=d[3];
    	a[2]='\0';
	{
	    l=f1(a)+10;
	}
	}
	}
	else
	{a[0]=d[0];a[1]=d[1];a[2]='\0';
	{l=f1(a)*10;
	}
	a[0]=d[4];a[1]=d[5];a[2]='\0';
	{
	l=l+f1(a);
	}}
	 return l;
}
int main()
{
	char b[10],a[10];
	int i,n=10,c[10]={0,5,10,11,15,20,27,35,90,99};
	
	freopen("C:\\Users\\86151\\Desktop\\编程作业\\test2.txt","r",stdin);
	for(i=1;i<n;i++)
	{
		scanf("%s",b);
		if(f2(b)==c[i-1])
		printf("测试通过\n\n"); 
		else
		printf("测试失败\n\n");
	}
	return 0;
 } 

然后就是添加功能让这个程序可以读取TXT文档中的内容,参考了其他同学的作业,知道要学习freopen的用法,百度看,用法要么写的零零星星,要么太多专有名词根本看不懂,然后去找了其他同学的参考文献,总算知道怎么一回事了,
只要在main函数里加int argc,char *argv[]这两个变量就可以用freopen了,然后写了两个测试用的txt
然后用cmd进行测试

posted @ 2020-02-05 15:31  ask2  阅读(196)  评论(0)    收藏  举报