题目:
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
注意:
1.输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
2.数字只会出现以下 零一二三四五六七八九十 。
正文
可以把钱包看成数值变量qian,它的值为汉字数字转化成的阿拉伯数字。那么我将用strcmp函数实现汉字数字变阿拉伯数字。
由于整数的范围在0-99,为了更好实现代码,规定输入的汉字最多为两个
例如:不可以输入三十三,而应该输出三三(即把中间的十省略)。
其他数字照常输入,例如:三,十三。
代码由三部分组成:
一、主函数
int main() { int point(char num[]); void change(int a); int qian,k; char a[30], b[30], c[30], d[30],x[30],y[30],z[30]; scanf("%s%s%s%s", a, b, c, d); if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) { printf("格式错误"); return 0; } else qian = point(d); for(;;) { scanf("%s%s", x, y); if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){ change(qian); break; } if (strcmp(x, "钱包") == 0) { if (strcmp(y, "增加") == 0) { scanf("%s", z); k = point(z); qian += k; } if (strcmp(y, "减少") == 0) { scanf("%s", z); k = point(z); qian -= k; } } else printf("格式错误"); } return 0; }
主函数实现数据的输入,当输入不符合规范时,将输出'格式错误'。
二、point函数
int point(char num[]) { if (strcmp("零", num) == 0) return 0; else if (strcmp("一", num) == 0) return 1; else if (strcmp("二", num) == 0) return 2; else if (strcmp("三", num) == 0) return 3; else if (strcmp("四", num) == 0) return 4; else if (strcmp("五", num) == 0) return 5; else if (strcmp("六", num) == 0) return 6; else if (strcmp("七", num) == 0) return 7; else if (strcmp("八", num) == 0) return 8; else if (strcmp("九", num) == 0) return 9; else if (strcmp("十", num) == 0) return 10; else{ int i, a, b, c; char x[2], y[2]; for (i = 0; i < 2; i++){ x[i] = num[i]; y[i] = num[i + 2]; } if (strcmp("十", x) == 0){ a = 10; b = point(y); c = a + b; } else { a = point(x); b = point(y); c = a * 10 + b; } return c; } }
point函数实现汉字数字到阿拉伯数字的转化。
尤其是point函数最后一部分实现了两位数的转化。
else{ int i, a, b, c; char x[2], y[2]; for (i = 0; i < 2; i++){ x[i] = num[i]; y[i] = num[i + 2]; } if (strcmp("十", x) == 0){ a = 10; b = point(y); c = a + b; } else { a = point(x); b = point(y); c = a * 10 + b; } return c; }
三、change函数及exchange函数
void change(int a) { void exchange(int b); int x, y; if (a <= 10) exchange(a); else if (a > 10 && a < 20) { printf("十"); x = a % 10; exchange(x); } else if (a >= 20 && a % 10 == 0) { y = a / 10; exchange(y); printf("十"); } else { x = a / 10; exchange(x); printf("十"); y = a % 10; exchange(y); } } void exchange(int b) { if (b == 0)printf("零"); if (b == 1)printf("一"); if (b == 2)printf("二"); if (b == 3)printf("三"); if (b == 4)printf("四"); if (b == 5)printf("五"); if (b == 6)printf("六"); if (b == 7)printf("七"); if (b == 8)printf("八"); if (b == 9)printf("九"); if (b == 10)printf("十"); }
两个函数共同实现了代表钱包的qian变量的数值变成汉字,完成最终输出。
而exchange函数实为change函数的补充,使change函数更加简洁。
并且输出时应把数值分为四种情况:0到十的数字,十一到十九的数字,20到99并且是10的倍数的数字及20到99的其他数字。
完整代码
#include<stdio.h> #include<string.h> int main() { int point(char num[]); void change(int a); int qian,k; char a[30], b[30], c[30], d[30],x[30],y[30],z[30]; scanf("%s%s%s%s", a, b, c, d); if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) { printf("格式错误"); return 0; } else qian = point(d); for(;;) { scanf("%s%s", x, y); if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){ change(qian); break; } if (strcmp(x, "钱包") == 0) { if (strcmp(y, "增加") == 0) { scanf("%s", z); k = point(z); qian += k; } if (strcmp(y, "减少") == 0) { scanf("%s", z); k = point(z); qian -= k; } } else printf("格式错误"); } return 0; } int point(char num[]) { if (strcmp("零", num) == 0) return 0; else if (strcmp("一", num) == 0) return 1; else if (strcmp("二", num) == 0) return 2; else if (strcmp("三", num) == 0) return 3; else if (strcmp("四", num) == 0) return 4; else if (strcmp("五", num) == 0) return 5; else if (strcmp("六", num) == 0) return 6; else if (strcmp("七", num) == 0) return 7; else if (strcmp("八", num) == 0) return 8; else if (strcmp("九", num) == 0) return 9; else if (strcmp("十", num) == 0) return 10; else{ int i, a, b, c; char x[2], y[2]; for (i = 0; i < 2; i++){ x[i] = num[i]; y[i] = num[i + 2]; } if (strcmp("十", x) == 0){ a = 10; b = point(y); c = a + b; } else { a = point(x); b = point(y); c = a * 10 + b; } return c; } } void change(int a) { void exchange(int b); int x, y; if (a <= 10) exchange(a); else if (a > 10 && a < 20) { printf("十"); x = a % 10; exchange(x); } else if (a >= 20 && a % 10 == 0) { y = a / 10; exchange(y); printf("十"); } else { x = a / 10; exchange(x); printf("十"); y = a % 10; exchange(y); } } void exchange(int b) { if (b == 0)printf("零"); if (b == 1)printf("一"); if (b == 2)printf("二"); if (b == 3)printf("三"); if (b == 4)printf("四"); if (b == 5)printf("五"); if (b == 6)printf("六"); if (b == 7)printf("七"); if (b == 8)printf("八"); if (b == 9)printf("九"); if (b == 10)printf("十"); }
输出案例:
1.题给案例

2.当整数 钱包 等于后面的数字为两位数时


3.后面输入的数字也为两位数


发现的不足之处:
1.当钱包为负债状况,无法输出。

2.(未完待续)
疑问:
该代码在的Dev-c++中能实现,在vs中则无法编译,是为什么呢?
来源:https://www.cnblogs.com/Zenlena/p/12234572.html