zoukankan      html  css  js  c++  java
  • 第一次编程作业

    这个作业属于哪个课程 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]=''; 
    	b[0]=sum[2];//将个位存放在数组b中
    	b[1]=sum[3];
    	b[2]='';
            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]='';
            b[0]=sum[0];//将十位位存放在数组b中
            b[1]=sum[1];
            b[2]='';
            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("
    ");
    					}
    					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("
    ");
    					}
    				}
    			}
    			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怎么用,一开始进行转换就是傻傻的一个个去匹配,后来网上看看别人的代码思路,然后结合了自己的理解才写了出来。所以接下来一段时间要把以前的编程语言(至少一门)的基础再次给补回来。
  • 相关阅读:
    关于Spring Test 小结
    排他思想---->tab选项卡
    对金额的格式化
    js 对多个id 的封装方法
    form表单数据封装成json格式并提交给服务器
    js技巧专题篇: 页面跳转
    对象流
    线程
    异常处理、常见异常说明
    数据库(概念、语法、DBMS、SQL语言:创建数据库、表格,添加、修改、删除数据记录)
  • 原文地址:https://www.cnblogs.com/wang295/p/12288300.html
Copyright © 2011-2022 走看看