第一次個人編程作業


這個作業屬於哪個課程 軟件工程 (福州大學至誠學院 - 計算機工程系)
這個作業要求在哪里 第一次個人編程作業
這個作業的目標 實現漢字編程
作業正文 第一次個人編程作業
其他參考文獻 本次作業查詢的資料

編程過程

  • 代碼行數: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM