编程题
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
注意:
输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。
分析需求
编写出来的程序要能够满足变量的定义,做基本的加减法,并输出结果,全过程使用汉字。
本题使用c语言进行编写
开始coding
既然说是完全由汉字操作,首先要知道怎么存取汉字吧,理论上用字符数组是可以存取的,一个汉字占两个基本单位,再加上一个 ,一共是三个基本单位
代码如下
const char shu[11][3] = { "零","一", "二","三","四","五","六","七","八","九","十" };
const char kankan[10] = "看看 钱包";
const char yuan[16] = "整数 钱包 等于 ";
const char jia[11] = "钱包 增加 ";
const char jian[11] = "钱包 减少 ";
//对基本的汉字进行定义
接下来就要考虑如何将汉字数字与数字之间相互转化的问题了,数字转汉字相对简单,恰好对应着二位字符数组的下标,而汉字转数字我这里编写了一个find函数,用遍历的方式去查找(主要是没有查gbk码emmmmmm)
代码如下
int find(char zhao[3]) {
for (int i = 0; i < 11; i++) {
if (strcmp(zhao, shu[i]) == 0) return i;
}
return -1;//如果异常则抛出-1
}
然后就开始思考怎么样分模块编写了,由题意可知一共需要四个模块:
1.初始定义模块
2.查看余额模块
3.加法模块
4.减法模块
代码如下
while (1) {
char a[20],b[20],c[20],d[20],temp[3];
gets_s(a);
int len = strlen(a);
strcpy_s(b, a);
strcpy_s(c, a);
strcpy_s(d, a);
b[15] = ' ';
c[10] = ' ';
d[10] = ' ';
//定义钱包初始数额
if (strcmp(b, yuan) == 0) {
//printf("1");
temp[0] = a[15];
temp[1] = a[16];
temp[2] = ' ';
if (find(temp) != -1) {
money = find(temp);
continue;
}
else {
printf("非法输入
");//异常处理
continue;
}
}
//看看钱包的余额
else if (strcmp(c,kankan) == 0) {
puts(shu[money]);
break;
}
//对余额进行加法操作
else if (strcmp(d, jia) == 0) {
//printf("3");
temp[0] = a[10];
temp[1] = a[11];
temp[2] = ' ';
if (find(temp) != -1) {
money += find(temp);
continue;
}
else {
printf("非法输入
");//异常处理
continue;
}
}
//对余额进行减法操作
else if (strcmp(d, jian) == 0) {
//printf("4");
temp[0] = a[10];
temp[1] = a[11];
temp[2] = ' ';
if (find(temp) != -1) {
money -= find(temp);
continue;
}
else {
printf("非法输入
");//异常处理
continue;
}
}
//异常处理
else {
printf("非法输入
");
continue;
}
}
这样就完成了所有的模块,也包括基本的异常处理。
完整代码如下
#include <stdio.h>
#include <string.h>
int find(char zhao[3]);
const char shu[11][3] = { "零","一", "二","三","四","五","六","七","八","九","十" };
//对基本的汉字进行定义
int main() {
int money = 0;
const char kankan[10] = "看看 钱包";
const char yuan[16] = "整数 钱包 等于 ";
const char jia[11] = "钱包 增加 ";
const char jian[11] = "钱包 减少 ";
while (1) {
char a[20],b[20],c[20],d[20],temp[3];
gets_s(a);
int len = strlen(a);
strcpy_s(b, a);
strcpy_s(c, a);
strcpy_s(d, a);
b[15] = ' ';
c[10] = ' ';
d[10] = ' ';
//定义钱包初始数额
if (strcmp(b, yuan) == 0) {
//printf("1");
temp[0] = a[15];
temp[1] = a[16];
temp[2] = ' ';
if (find(temp) != -1) {
money = find(temp);
continue;
}
else {
printf("非法输入
");//异常处理
continue;
}
}
//看看钱包的余额
else if (strcmp(c,kankan) == 0) {
puts(shu[money]);
break;
}
//对余额进行加法操作
else if (strcmp(d, jia) == 0) {
//printf("3");
temp[0] = a[10];
temp[1] = a[11];
temp[2] = ' ';
if (find(temp) != -1) {
money += find(temp);
continue;
}
else {
printf("非法输入
");//异常处理
continue;
}
}
//对余额进行减法操作
else if (strcmp(d, jian) == 0) {
//printf("4");
temp[0] = a[10];
temp[1] = a[11];
temp[2] = ' ';
if (find(temp) != -1) {
money -= find(temp);
continue;
}
else {
printf("非法输入
");//异常处理
continue;
}
}
//异常处理
else {
printf("非法输入
");
continue;
}
}
return 0;
}
int find(char zhao[3]) {
for (int i = 0; i < 11; i++) {
if (strcmp(zhao, shu[i]) == 0) return i;
}
return -1;//如果异常则抛出-1
}
样例测试
思考
因为本题的要求相对简单,句法也相对固定,所以用字符串对应下标的位置就可以很轻松的找到数字的位置,判断出要执行的操作。而如果操作指令更加复杂可能就不那么容易了。
本题我只写出了零到十基本的数位操作,而没有涉及到十位以上的数字,如果数字再增加用遍历效率就会很低,可能需要分位操作,当然最好要知道gbk码啦,这样还是会方便一些