第一次编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/SE
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283
作业目标 1、学习使用github    2、复习编程语言
作业正文 https://github.com/211706129/wang295
其他参考文献 如何建立github仓库:https://jingyan.baidu.com/article/c843ea0ba1110d77921e4a7e.html

编程题目

汉字是迄今为止持续使用时间最长的文字,也是上古时期各大文字体系中唯一传承至今者,中国历代皆以汉字为主要的官方文字。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?小杨同学想到:用汉字来进行编程一定很有趣,来请你帮帮他。

编程要求

请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):

  • 变量定义:整数 (变量名) 等于 (数字)
  • 运算(加法):(变量名) 增加 (数字)
  • 运算(减法):(变量名) 减少 (数字)
  • 输出:看看 (变量名) or 看看 “(字符串内容)”

附加要求:

  • 选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
  • 若否则后没有任何操作使用(无)来进行填充(参考样例2)。

注意事项:

  • 输入输出采用utf-8编码,请在编码过程中注意。
  • 数字只会出现:零一二三四五六七八九十。(此条作废,可先完成0-10的情况)
  • 字符串输出的双引号是全角,即中文双引号。
  • 变量类型要求只有整数,如有余力,可以自己实现更多。
  • 测试数据会相较于样例复杂,请考虑充分需求。
  • 不限制编程语言。
  • 不能使用eval函数动态执行代码,或调用系统指令。
  • 数据输入形式为交互式运行,类似于shell。

记录:

代码行数 151行
需求分析时间 一边写一边分析,差不多2-3小时
编码时间 一天多

分析:

  • 汉字和数字之间的转换
  • 变量的判断
  • 对“如果”与“看看”之间的判断
  • 去除引号的字符串输出

代码分解:

  • 将汉字转换成数字:
int hz(char a[]){//进行汉字->数字转变
	if (strcmp(a,"零") == 0) return 0;
	if (strcmp(a,"一") == 0) return 1;
	if (strcmp(a,"二") == 0) return 2;
	if (strcmp(a,"三") == 0) return 3;
	if (strcmp(a,"四") == 0) return 4;
	if (strcmp(a,"五") == 0) return 5;
	if (strcmp(a,"六") == 0) return 6;
	if (strcmp(a,"七") == 0) return 7;
	if (strcmp(a,"八") == 0) return 8;
	if (strcmp(a,"九") == 0) return 9;
	if (strcmp(a,"十") == 0) return 10;
}

int hanzi(char sum[])//将汉字变成数字
{	
	char a[10],b[10];
	if(strlen(sum)==2){
	    return	hz(sum);//零到十的数字		 
    }
    else if(strlen(sum)==4){
        a[0]=sum[0];//将十位存放在数组a中
        a[1]=sum[1];
        a[2]='\0'; 
	b[0]=sum[2];//将个位存放在数组b中
	b[1]=sum[3];
	b[2]='\0';
        if(hanzi(a)==10) 
	    return hz(b)+10;//十到二十之间的数字,十一,十二
        else
            return 10*hz(a);//二位整数(如:20,30)
    }
    else if(strlen(sum)==6){
        a[0]=sum[4];//将个位存放在数组a中
        a[1]=sum[5];
        a[2]='\0';
        b[0]=sum[0];//将十位位存放在数组b中
        b[1]=sum[1];
        b[2]='\0';
        return hz(a)+hz(b)*10;//二十以上,九十九以下的数字,例如三十二
    }
}

这样写可以大量的减少代码,不需要去一个一个匹配,只要定义两个数组,将输入的数字拆分成个位数存在两个数组中,然后去匹配。

  • 将数字转换成汉字
void shuzi(int sum)//将数字变成汉字
{
	int a,b;
	if(sum<20)
		sz(sum);			
	else{
		a=sum/10;//等于十位数
		sz(a);
		printf("十");
		if(sum%10!=0){//判断是不是整数
			b=sum%10;//等于个位数
			sz(b);
		}		
	}
}

void sz(int sum){//进行数字->汉字转变
	if(sum<=10){	
		if(sum==0) printf("零");
		else if(sum==1) printf("一");
		else if(sum==2) printf("二");
		else if(sum==3) printf("三");
		else if(sum==4) printf("四");
		else if(sum==5) printf("五");
		else if(sum==6) printf("六");
		else if(sum==7) printf("七");
		else if(sum==8) printf("八");
		else if(sum==9) printf("九");
		else if(sum==10) printf("十");
	}
	if(sum>10 && sum <20){
		if(sum==11) printf("十一");
		else if(sum==12) printf("十二");
		else if(sum==13) printf("十三");
		else if(sum==14) printf("十四");
		else if(sum==15) printf("十五");
		else if(sum==16) printf("十六");
		else if(sum==17) printf("十七");
		else if(sum==18) printf("十八");
		else if(sum==19) printf("十九");
	}
}

因为数字比较特殊,20之前和之后是不一样的,所以以20来分段,20之前进行匹配,之后再分整十和不是整十来进行拆分。以20拆分可以减少大量的代码和判断

  • 主函数:
int main()
{
    int sum, temp,i;
    char a[100], b[10],c[10],d[10],e[100],f[10]; //a[10]用来暂存汉字,b[10]存储变量
    scanf("%s",a);
    scanf("%s",b);//用于储存代表变量的汉字,如钱包,银行卡之类的 
	//printf("%s",b);
	if (strcmp(a,"等于") != 0){
		scanf("%s",a);//判断是否是“等于”,是退出判断,不是继续
	}
    scanf("%s",a);//赋初值	
    sum = hanzi(a);//将赋初值用hanzi函数用于汉字转为数字 
	while(scanf("%s",a)!=EOF){
        if(strcmp(a,b)==0){ 
            scanf("%s",c);
			if(strcmp(c,"增加")==0){
				scanf("%s",c);
				temp=hanzi(c);
				sum=sum+temp;
			}              
            if(strcmp(c,"减少")==0){
				scanf("%s",c);
				temp=hanzi(c);
				sum=sum-temp;
            }
			if(sum<0 || sum>99)
				printf("超出范围");
        } 
		else if(strcmp(a,"如果")==0){
			scanf("%s",a);
			if(strcmp(a,b)==0){
				scanf("%s",c);
				if(strcmp(c,"大于")==0){
					scanf("%s",c);
					temp=hanzi(c);
					scanf("%s %s %s",c,d,e);
					if(sum>temp){
						for(i=1;i<strlen(e)-2;i=i+2)
							printf("%c%c",e[i],e[i+1]);
						printf("\n");
					}
					else{
						scanf("%s %s %s",c,d,e);
						for(i=1;i<strlen(e)-2;i=i+2)
							printf("%c%c",e[i],e[i+1]);
						printf("\n");
					}
				}
			}
			else
				printf("没有此变量");
		}
		if(strcmp(a,"看看")==0){
			scanf("%s",c);
			if(strcmp(c,b)==0)
				shuzi(sum);
        }
    }
	return 0;
}

主函数里面只用了一个while循环去进行运算,减少了多余函数。还运用一个for循环巧妙去除了引号

测试:

目前还存在的问题:

1、目前代码还不能支持多个变量问题
2、只考虑到整数0~99之间的数
3、目变化的类型还只是整数

心得体会:

    突然写代码作业,有一点不适应了,主要是以前学习的语言差不多都忘了,导致编程起来很困难。每次都需要去查阅大量的知识点,比如什么strcmp怎么用,一开始进行转换就是傻傻的一个个去匹配,后来网上看看别人的代码思路,然后结合了自己的理解才写了出来。所以接下来一段时间要把以前的编程语言(至少一门)的基础再次给补回来。
posted @ 2020-02-09 19:07  wang295  阅读(146)  评论(0编辑  收藏