第一次个人编程作业

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

编程过程

  • 代码行数: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]='\0';      
            if(trans(more)!=10) return 10+trans(more);//对应十一、十二等以十开头的两个汉字表达的数字
            else{
                more[0]=str[0];
                more[1]=str[1];
                more[2]='\0';
                return 10*trans(more);//对应二十、三十等以十结尾的数字
            }
    
    }
    else if(strlen(str)==6){
        more[0]=str[4];
        more[1]=str[5];
        more[2]='\0';
        less[0]=str[0];
        less[1]=str[1];
        less[2]='\0';
        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\n",chinese[sum]);
			}
			else if(sum>10&&sum<=99) 
			{
				if(sum%10==0)
				{
					printf("%s十\n",chinese[sum/10]);
				}
				else if(sum<=19)
				{
					printf("十%s\n",chinese[sum%10]);
				}
				else 
				{
					printf("%s十%s\n",chinese[sum/10],chinese[sum%10]);
				}
			}
			else if(sum<0)
			{
				int under=abs(sum);	
				printf("%s%s\n","负",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]='\0';      
            if(trans(more)!=10) return 10+trans(more);//对应十一、十二等以十开头的两个汉字表达的数字
            else{
                more[0]=str[0];
                more[1]=str[1];
                more[2]='\0';
                return 10*trans(more);//对应二十、三十等以十结尾的数字
            }
    
    }
    else if(strlen(str)==6){
        more[0]=str[4];
        more[1]=str[5];
        more[2]='\0';
        less[0]=str[0];
        less[1]=str[1];
        less[2]='\0';
        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\n",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十\n",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\n",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\n",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\n","负",chinese[under]);
							for(int j=1;j<len1-1;j+=2) {printf("%c%c",cold[j],cold[j+1]);}}
						}
				else{	
					printf("%s\n",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

posted @ 2020-02-07 12:39  水巨木  阅读(458)  评论(0编辑  收藏  举报