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

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系)
    这个作业要求在哪里 第一次个人编程作业
    这个作业的目标 实现汉字编程
    作业正文 第一次个人编程作业
    其他参考文献 本次作业查询的资料

    编程过程

    • 代码行数:162
    • 需求分析时间:1h
    • 编码时间:3h

    要求

    • 编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作

    存在的问题

    • 没有考虑负数的情况
    • 代码不够精细,很多重复代码
    • 在尝试书写十以上代码时,未考虑到一个汉字是占用2byte(已解决)
    • 在编写的时候,对于输入文字的循环存在问题,知识的遗忘,忘记了scanf()!=EOF的用法(通过查阅资料解决)

    思路

    • 编程语言:C
    • 在判断要执行的功能时,找到需要完成功能的特点
    • 范例一,"看看"是其输入的特点,所以在if语句判断时可以判断字符数组的内容与"看看"是否相匹配,若匹配在执行所需的功能
    • 范例二,"如果"是其输入的特点,所以在if语句判断时可以判断字符数组的内容与"如果"是否相匹配,若匹配则执行所需的功能
    • 去除引号应考虑汉字占用的空间大小,一个汉字2byte
    • 求大于十小于九十九的数字时,找到特点拆分输入的字符数组,再进行操作

    代码

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    int trans(char str[])
    {
        if(strcmp("零",str)==0)return 0;
        if(strcmp("一",str)==0)return 1;
        if(strcmp("二",str)==0)return 2;
        if(strcmp("三",str)==0)return 3;
        if(strcmp("四",str)==0)return 4;
        if(strcmp("五",str)==0)return 5;
        if(strcmp("六",str)==0)return 6;
        if(strcmp("七",str)==0)return 7;
        if(strcmp("八",str)==0)return 8;
        if(strcmp("九",str)==0)return 9;
        if(strcmp("十",str)==0)return 10;
    }
    int jud(char str[]){
        char more[10],less[10];
        if(strlen(str)==2){return trans(str); //对应零一二等单个汉字表达的数字
        }
        else if(strlen(str)==4){
            more[0]=str[2];
            more[1]=str[3];
            more[2]='';      
                if(trans(more)!=10) return 10+trans(more);//对应十一、十二等以十开头的两个汉字表达的数字
                else{
                    more[0]=str[0];
                    more[1]=str[1];
                    more[2]='';
                    return 10*trans(more);//对应二十、三十等以十结尾的数字
                }
        
        }
        else if(strlen(str)==6){
            more[0]=str[4];
            more[1]=str[5];
            more[2]='';
            less[0]=str[0];
            less[1]=str[1];
            less[2]='';
            return trans(more)+trans(less)*10;//对应“几十几”类型的数字
        }
    }
    int main(){
    	char *chinese[11]={"零","一","二","三","四","五","六","七","八","九","十"};
    	char name[200],verb[200],numb[200],oper[200],name1[200],toint[200],name3[200];
    	char a[20],b[20],numb2[20],d[20],word[100],e[20],f[20],cold[100],name2[100],numb3[20];
    	char age[200],money[200];
    	int sum,sum2,sum3;//sum表示第二题年龄,sum2表示零花钱
    	scanf("%s",toint);
    	scanf("%s %s %s",name,verb,numb);
    	sum=jud(numb);
    	while(scanf("%s",name1)!=EOF)
    	{	
    		if(strcmp(name1,toint)==0)//判断是否是第二题
    		{
    			scanf("%s %s %s",name3,verb,numb3);
    			sum2=jud(numb3);
    		}
    		else if(strcmp(name1,name)==0){//加减法运算+-+-+-+-+-+-+-+-+-+-+-++-+-+-
    			scanf("%s",oper);
    			if(strcmp(oper,"增加")==0){
    				scanf("%s",numb);
    				sum3=jud(numb);
    				sum+=sum3;}
    			else if(strcmp(oper,"减少")==0){
    				scanf("%s",numb);	
    				sum3=jud(numb);
    				sum-=sum3;
    			}
    		}
    		else if(strcmp(name1,"看看")==0)
    		{
    			scanf("%s",name);
    			if(sum>=0&&sum<=10)
    			{
    				printf("%s
    ",chinese[sum]);
    			}
    			else if(sum>10&&sum<=99) 
    			{
    				if(sum%10==0)
    				{
    					printf("%s十
    ",chinese[sum/10]);
    				}
    				else if(sum<=19)
    				{
    					printf("十%s
    ",chinese[sum%10]);
    				}
    				else 
    				{
    					printf("%s十%s
    ",chinese[sum/10],chinese[sum%10]);
    				}
    			}
    			else if(sum<0)
    			{
    				int under=abs(sum);	
    				printf("%s%s
    ","负",chinese[under]);
    			}//scanf("%s %s %s %s %s %s %s %s %s",name,b,numb2,d,name2,word,e,f,cold);
    		}
    		else if(strcmp(name1,"如果")==0)//用于判断是否符合第二题
    		{	
    			scanf("%s %s %s %s %s %s %s %s %s",age,b,numb2,d,money,word,e,f,cold);
    			int lasttmp=jud(numb2);
    			int len=strlen(word);
    			int len1=strlen(cold);
    			if(strcmp(age,name)==0&&strcmp(money,"看看")==0)
    			{
    				if(sum>=lasttmp)
    				{
    					for (int i=1;i<len-1; i+=2) {printf("%c%c",word[i],word[i+1]);}//去除双引号
    				}
    				else if(sum<lasttmp)
    				{
    					for(int j=1;j<len1-1;j+=2) {printf("%c%c",cold[j],cold[j+1]);}//去除双引号*/
    				}	
    			}
    			else if(strcmp(b,"大于")==0)
    			{
    				scanf("%s %s",a,age);	
    				int z=jud(numb2);
    				int k=jud(e);
    				if(sum>z)//第二题sum表示年龄,sum2零花钱
    				{
    					int	x=sum2+k;
    					printf("%s",chinese[x]);
    				}
    				else
    				{
    					int t=jud(numb3);
    					printf("%s",chinese[sum2]);
    				}
    			}
    			else if(strcmp(b,"小于")==0)
    			{
    				scanf("%s %s",a,age);	
    				int z=jud(numb2);
    				int k=jud(e);
    				if(sum>z)//第二题sum表示年龄,sum2零花钱
    				{
    					int	x=sum2-k;
    					printf("%s",chinese[x]);
    				}
    				else
    				{
    					int t=jud(numb3);
    					printf("%s",chinese[sum2]);
    				}
    			}
    		}
    	}
    	return 0;
    }
    

    测试样例

    • 输入样例1
    整数 气温 等于 十
    气温 减少 三
    气温 增加 二
    看看 气温
    如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
    
    • 输出:
    • 测试样例(大于十小于九十九的数字):
    整数 小区楼层高度 等于 五十六
    小区楼层高度 减少 二十六
    小区楼层高度 增加 三十
    看看 小区楼层高度
    如果 小区楼层高度 大于 二十 则 看看 “好高啊” 否则 看看 “够住就行了”
    
    • 输出:
    • 输入样例2
    整数 小杨年龄 等于 八
    整数 小杨零花钱 等于 二
    小杨年龄 增加 一
    如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
    看看 小杨零花钱
    
    • 输出

    源代码1:github

    改进

    • 实现负数的判定
    • 简化了代码,减少代码重复带来的资源浪费,用外接函数的形式实现

    修改后的代码

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    int trans(char str[])
    {
        if(strcmp("零",str)==0)return 0;
        if(strcmp("一",str)==0)return 1;
        if(strcmp("二",str)==0)return 2;
        if(strcmp("三",str)==0)return 3;
        if(strcmp("四",str)==0)return 4;
        if(strcmp("五",str)==0)return 5;
        if(strcmp("六",str)==0)return 6;
        if(strcmp("七",str)==0)return 7;
        if(strcmp("八",str)==0)return 8;
        if(strcmp("九",str)==0)return 9;
        if(strcmp("十",str)==0)return 10;
    }
    int jud(char str[]){
        char more[10],less[10];
        if(strlen(str)==2){return trans(str); //对应零一二等单个汉字表达的数字
        }
        else if(strlen(str)==4){
            more[0]=str[2];
            more[1]=str[3];
            more[2]='';      
                if(trans(more)!=10) return 10+trans(more);//对应十一、十二等以十开头的两个汉字表达的数字
                else{
                    more[0]=str[0];
                    more[1]=str[1];
                    more[2]='';
                    return 10*trans(more);//对应二十、三十等以十结尾的数字
                }
        
        }
        else if(strlen(str)==6){
            more[0]=str[4];
            more[1]=str[5];
            more[2]='';
            less[0]=str[0];
            less[1]=str[1];
            less[2]='';
            return trans(more)+trans(less)*10;//对应“几十几”类型的数字
        }
    }
    int main(){
    	char *chinese[11]={"零","一","二","三","四","五","六","七","八","九","十"};
    	char name[200],verb[200],numb[200],oper[200],name1[200],toint[200],name3[200];
    	char a[20],b[20],numb2[20],d[20],word[100],e[20],f[20],cold[100],name2[100],numb3[20];
    	char age[200],money[200];
    	int sum,sum2,sum3;//sum表示第二题年龄,sum2表示零花钱
    	scanf("%s",toint);
    	scanf("%s %s %s",name,verb,numb);
    	sum=jud(numb);
    	while(scanf("%s",name1)!=EOF)
    	{	
    		if(strcmp(name1,toint)==0)//判断是否是第二题
    		{
    			scanf("%s %s %s",name3,verb,numb3);
    			sum2=jud(numb3);
    		}
    		if(strcmp(name1,name)==0){//加减法运算+-+-+-+-+-+-+-+-+-+-+-++-+-+-
    			scanf("%s",oper);
    			if(strcmp(oper,"增加")==0){
    				scanf("%s",numb);
    				sum3=jud(numb);
    				sum+=sum3;}
    			if(strcmp(oper,"减少")==0){
    				scanf("%s",numb);	
    				if(strlen(numb)==2)
    				{
    					sum3=jud(numb);
    					sum-=sum3;
    				}//printf("%s",chinese[sum]);
    			}
    		}
    		else if(strcmp(name1,"看看")==0)
    		{
    			int lasttmp;
    			scanf("%s",name);
    			lasttmp=trans(numb2);
    			int len=strlen(word);
    			int len1=strlen(cold);
    			{
    				if(sum>=lasttmp)
    				{	if(sum>=0&&sum<=10){
    					printf("%s
    ",chinese[sum]);
    					scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
    					for (int i=1;i<len-1; i+=2) {printf("%c%c",word[i],word[i+1]);}	//去除双引号
    					}
    					else {
    					if(sum%10==0){
    						printf("%s十
    ",chinese[sum/10]);
    						scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
    						for (int i=1;i<len-1; i+=2) {printf("%c%c",word[i],word[i+1]);}//去除双引号
    					}
    					else if(sum<=19){
    						printf("十%s
    ",chinese[sum%10]);
    						scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
    						for (int i=1;i<len-1; i+=2) {printf("%c%c",word[i],word[i+1]);}//去除双引号
    					}
    					else {
    						printf("%s十%s
    ",chinese[sum/10],chinese[sum%10]);
    						scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
    						for (int i=1;i<len-1; i+=2) {printf("%c%c",word[i],word[i+1]);}//去除双引号
    					}
    				}}
    				else if(sum<lasttmp){
    						if(sum<0)
    						{
    							int under=abs(sum);	
    							printf("%s%s
    ","负",chinese[under]);
    							for(int j=1;j<len1-1;j+=2) {printf("%c%c",cold[j],cold[j+1]);}}
    						}
    				else{	
    					printf("%s
    ",chinese[sum]);for(int j=1;j<len1-1;j+=2) {printf("%c%c",cold[j],cold[j+1]);}}//去除双引号
    			}
    			}
    		else if(strcmp(name1,"如果")==0)//用于判断是否符合第二题
    		{	
    			scanf("%s %s %s %s %s %s %s %s %s",age,b,numb2,d,money,word,e,f,cold);
    			scanf("%s %s",a,age);
    			if(strcmp(a,"看看")==0)
    			{	int z=jud(numb2);
    				if(sum>z)//第二题sum表示年龄,sum2零花钱
    				{
    					int	x=sum2+1;
    					printf("%s",chinese[x]);
    				}
    				else{
    					int t=jud(numb3);
    					printf("%s",chinese[sum2]);}
    			}
    		}
    	}
    	return 0;
    }
    
    

    测试样例

    整数 气温 等于 八
    气温 减少 九
    看看 气温
    如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
    

    源代码2:github

  • 相关阅读:
    struts2文件上传大小限制问题
    kindeditor使用方法
    ajaxFileUpload SyntaxError: syntax error
    Attempted to lock an already-locked dir异常解决方法
    Simditor图片上传
    心理学
    Vue.JS
    SQL Server 日常维护经典应用
    12 个 JS 技巧
    Linq to js
  • 原文地址:https://www.cnblogs.com/10672661cdq/p/12264112.html
Copyright © 2011-2022 走看看