这个作业要求在哪里 |
第一次个人编程作业 |
这个作业的目标 |
实现汉字编程 |
作业正文 |
第一次个人编程作业 |
其他参考文献 |
本次作业查询的资料 |
编程过程
- 代码行数:162
- 需求分析时间:1h
- 编码时间:3h
要求
- 编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作
存在的问题
- 没有考虑负数的情况
- 代码不够精细,很多重复代码
- 在尝试书写十以上代码时,未考虑到一个汉字是占用2byte(已解决)
- 在编写的时候,对于输入文字的循环存在问题,知识的遗忘,忘记了scanf()!=EOF的用法(通过查阅资料解决)
思路
- 编程语言:C
- 在判断要执行的功能时,找到需要完成功能的特点
- 范例一,"看看"是其输入的特点,所以在if语句判断时可以判断字符数组的内容与"看看"是否相匹配,若匹配在执行所需的功能
- 范例二,"如果"是其输入的特点,所以在if语句判断时可以判断字符数组的内容与"如果"是否相匹配,若匹配则执行所需的功能
- 去除引号应考虑汉字占用的空间大小,一个汉字2byte
- 求大于十小于九十九的数字时,找到特点拆分输入的字符数组,再进行操作
代码
#include
#include
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 main(){
char *chinese[11]={"零","一","二","三","四","五","六","七","八","九","十"};
char name[200],verb[200],numb[200],oper[200],name1[200],toint[200],name3[200],more[10],less[10];
char a[20],b[20],numb2[20],d[20],word[100],e[20],f[20],cold[100],name2[100];
char age[200],money[200];
int sum,sum2,sum3;//sum表示第二题年龄,sum2表示零花钱
scanf("%s",toint);
scanf("%s %s %s",name,verb,numb);
if(strlen(numb)==2){
sum=trans(numb); //零到十的数字
}
else if(strlen(numb)==4){
more[0]=numb[2];
more[1]=numb[3];
more[2]='\0';
if(sum!=10) {sum=trans(more)+10;}//十开头的数字
else{
more[0]=numb[0];
more[1]=numb[1];
more[2]='\0';
sum=10*trans(more);//整十数字
}
}
else if(strlen(numb)==6){
more[0]=numb[4];
more[1]=numb[5];
more[2]='\0';
less[0]=numb[0];
less[1]=numb[1];
less[2]='\0';
sum=trans(more)+trans(less)*10;//二十以上,九十九以下的数字
}
while(scanf("%s",name1)!=EOF)
{
if(strcmp(name1,toint)==0)//判断是否是第二题
{
scanf("%s %s %s",name3,verb,numb);
sum2=trans(numb);
}
if(strcmp(name1,name)==0){//加减法运算+-+-+-+-+-+-+-+-+-+-+-++-+-+-
scanf("%s",oper);
if(strcmp(oper,"增加")==0){scanf("%s",numb);
if(strlen(numb)==2){
sum3=trans(numb); //零到十的数字
}
else if(strlen(numb)==4){
more[0]=numb[2];
more[1]=numb[3];
more[2]='\0';
if(sum!=10) {sum3=trans(more)+10;}//十开头的数字
else{
more[0]=numb[0];
more[1]=numb[1];
more[2]='\0';
sum3=10*trans(more);//整十数字
}
}
else if(strlen(numb)==6){
more[0]=numb[4];
more[1]=numb[5];
more[2]='\0';
less[0]=numb[0];
less[1]=numb[1];
less[2]='\0';
sum3=trans(more)+trans(less)*10;//二十以上,九十九以下的数字
}
sum+=sum3;}
if(strcmp(oper,"减少")==0){scanf("%s",numb); if(strlen(numb)==2){
sum3=trans(numb); //零到十的数字
}
else if(strlen(numb)==4){
more[0]=numb[2];
more[1]=numb[3];
more[2]='\0';
if(sum!=10) {sum3=trans(more)+10;}//十开头的数字
else{
more[0]=numb[0];
more[1]=numb[1];
more[2]='\0';
sum3=10*trans(more);//整十数字
}
}
else if(strlen(numb)==6){
more[0]=numb[4];
more[1]=numb[5];
more[2]='\0';
less[0]=numb[0];
less[1]=numb[1];
less[2]='\0';
sum3=trans(more)+trans(less)*10;//二十以上,九十九以下的数字
}
sum-=sum3;}
//printf("%s",chinese[sum]);
}
else if(strcmp(name1,"看看")==0)
{
int lasttmp;
scanf("%s",name);
scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
lasttmp=trans(numb2);
int len=strlen(word);
int len1=strlen(cold);
//if(lasttmp<=10)
{
if(sum>=lasttmp)
{
if(sum>=0&&sum<=10){
printf("%s\n",chinese[sum]);for (int i=1;i8)//第二题sum表示年龄,sum2零花钱
{
int x=sum2+1;
printf("%s",chinese[x]);
}
}
}
}
return 0;
}
测试样例
整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
- 输出:
- 测试样例(大于十小于九十九的数字):
整数 小区楼层高度 等于 五十六
小区楼层高度 减少 二十六
小区楼层高度 增加 三十
看看 小区楼层高度
如果 小区楼层高度 大于 二十 则 看看 “好高啊” 否则 看看 “够住就行了”
- 输出:
- 输入样例2:
整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
- 输出
源代码1:github
改进
- 实现负数的判定
- 简化了代码,减少代码重复带来的资源浪费,用外接函数的形式实现
修改后的代码
#include
#include
#include
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];
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,numb);
sum2=trans(numb);
}
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);
scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
lasttmp=trans(numb2);
int len=strlen(word);
int len1=strlen(cold);
{
if(sum>=lasttmp)
{ if(sum>=0&&sum<=10){
printf("%s\n",chinese[sum]);for (int i=1;i8)//第二题sum表示年龄,sum2零花钱
{
int x=sum2+1;
printf("%s",chinese[x]);
}
}
}
}
return 0;
}
测试样例
整数 气温 等于 八
气温 减少 九
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
源代码2:github