編程過程
- 代碼行數: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;
}
測試樣例
整數 氣溫 等於 十
氣溫 減少 三
氣溫 增加 二
看看 氣溫
如果 氣溫 大於 八 則 看看 “你好,世界” 否則 看看 “凍死我了”
- 輸出:

- 測試樣例(大於十小於九十九的數字):
整數 小區樓層高度 等於 五十六
小區樓層高度 減少 二十六
小區樓層高度 增加 三十
看看 小區樓層高度
如果 小區樓層高度 大於 二十 則 看看 “好高啊” 否則 看看 “夠住就行了”
- 輸出:

- 輸入樣例2:
整數 小楊年齡 等於 八
整數 小楊零花錢 等於 二
小楊年齡 增加 一
如果 小楊年齡 大於 八 則 小楊零花錢 增加 一 否則 無
看看 小楊零花錢
- 輸出

改進
- 實現負數的判定
- 簡化了代碼,減少代碼重復帶來的資源浪費,用外接函數的形式實現
修改后的代碼
#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;
}
測試樣例
整數 氣溫 等於 八
氣溫 減少 九
看看 氣溫
如果 氣溫 大於 八 則 看看 “你好,世界” 否則 看看 “凍死我了”
