编程题(2020面向对象程序设计第一次作业)
这个作业属于哪个课程 | 2020春福大面向对象程序设计 |
---|---|
这个作业要求在哪里 | 寒假作业1 |
这个作业的目标 | 实现白话文编程,记录学习过程,发布博客 |
作业正文 | 编程题 |
其他参考文献 | 用字符数组存汉字 |
阅读题目
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
思考及划分模块过程
从题目中我们可以看到
整数 钱包 是用来定义初始值的
等于 用来赋值
增加 减少 分别表示加和减
看看 是用来输出结果的
程序按功能划分需要分为以下几个部分
- 把输入的汉字转化成数字
- 把计算结果以汉字的形式进行输出
- 排除错误的输入
- 根据“增加”和“减少”分别进行计算
编写模块及测试样例
百度得知在中文windows操作系统下,中文默认是采用BGK字符集,每个字符占两个字节。因此char数组就可以存汉字了,且strcmp(a,b)在a,b完全相同时返回一个值0,所以可以用strcmp函数进行判断。现在我们可以写出一个判断初始值的函数。
int change(char shu[])
{
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"二")==0)
return 2;
if(strcmp(shu,"三")==0)
return 3;
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"四")==0)
return 4;
if(strcmp(shu,"五")==0)
return 5;
if(strcmp(shu,"六")==0)
return 6;
if(strcmp(shu,"七")==0)
return 7;
if(strcmp(shu,"八")==0)
return 8;
if(strcmp(shu,"九")==0)
return 9;
if(strcmp(shu,"零")==0)
return 0;
}
接下来我们需要写一个函数用来输出算好的结果(函数中只写单个数字的输出,数据保证只从0-99所以两位数的情况可以放到主函数中判断)
void change1(int num)
{
if(num==0) printf("零");
if(num==1) printf("一");
if(num==2) printf("二");
if(num==3) printf("三");
if(num==4) printf("四");
if(num==5) printf("五");
if(num==6) printf("六");
if(num==7) printf("七");
if(num==8) printf("八");
if(num==9) printf("九");
}
先来考虑怎么输入第一行。可以用四个短的字符数组分别存四个词语,并设置错误输入的特判。由于变量的名字不一定是“钱包”,所以输入第一行的时候如果变量名不是“钱包”不算错误输入,同时我们可以进行数据的初始化。下面是main函数中用于输入并检查第一行的语句。
scanf("%s %s %s %s",a,b,c,d);
if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0)
{printf("输入错误\n");
return 0;
}
num=change(d);
由于“看看”说明需要输出结果了,所以当输入“看看”时不再进入计算过程。
如果计算行输入的变量名与第一行的变量名不同,也属于输入错误。
排除这种情况后,再输入接下来的计算种类和数值。
如果计算种类与“增加”或“减少”相同,则分别进入不同的运算,如果出现“加上”“减去”这样的输入则不进入运算。
while(1)
{scanf("%s",y);
if(strcmp(y,"看看")==0) break;
if(strcmp(y,b)!=0)
{printf("输入错误\n");
return 0;
}
scanf("%s",z);
scanf("%s",x);
if(strcmp(z,"增加")==0)
num=num+change(x);
else if(strcmp(z,"减少")==0)
num=num-change(x);
else
{printf("输入错误\n");
return 0;
}
}
原来的输出部分只写了一句
change1(num);
这样可以满足样例的输入输出。
但是后来想到虽然数字只有零到九,但是多次运算可以得到大于十的数,所以要对得到的计算结果进行分类。
可以分成三类,第一类是个位数,第二类是整十的数,第三类是两位数但不是整十的数。
if(num/10==0)
change1(num);
else if(num%10==0)
{change1(num/10);
printf("十");
}
else
{change1(num/10);
printf("十");
change1(num%10);
}
这样就可以满足大于十的计算结果输出。
下面是一个检测变量名可以不用是“钱包”的样例
需要改进的地方
如果输入的数字不是个位数,那么我的程序无法判断并计算
完整代码
#include<stdio.h>
#include<string.h>
int change(char shu[])
{
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"二")==0)
return 2;
if(strcmp(shu,"三")==0)
return 3;
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"四")==0)
return 4;
if(strcmp(shu,"五")==0)
return 5;
if(strcmp(shu,"六")==0)
return 6;
if(strcmp(shu,"七")==0)
return 7;
if(strcmp(shu,"八")==0)
return 8;
if(strcmp(shu,"九")==0)
return 9;
if(strcmp(shu,"零")==0)
return 0;
}
void change1(int num)
{
if(num==0) printf("零");
if(num==1) printf("一");
if(num==2) printf("二");
if(num==3) printf("三");
if(num==4) printf("四");
if(num==5) printf("五");
if(num==6) printf("六");
if(num==7) printf("七");
if(num==8) printf("八");
if(num==9) printf("九");
}
int main()
{char a[10],b[10],c[10],d[10],y[10],z[10],x[10],m[10];
int num;
scanf("%s %s %s %s",a,b,c,d);
if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0)
{printf("输入错误\n");
return 0;
}
num=change(d);
while(1)
{scanf("%s",y);
if(strcmp(y,"看看")==0) break;
if(strcmp(y,b)!=0)
{printf("输入错误\n");
return 0;
}
scanf("%s",z);
scanf("%s",x);
if(strcmp(z,"增加")==0)
num=num+change(x);
else if(strcmp(z,"减少")==0)
num=num-change(x);
else
{printf("输入错误\n");
return 0;
}
}
scanf("%s",m);
if(num/10==0)
change1(num);
else if(num%10==0)
{change1(num/10);
printf("十");
}
else
{change1(num/10);
printf("十");
change1(num%10);
}
return 0;
}