这个作业属于哪个课程 | 软件工程 (福州大学至诚学院 - 计算机工程系 |
---|---|
这个作业要求在哪里 | 第一次个人编程作业 |
这个作业的目标 | 完成老师布置的编程任务并总结分析 |
作业正文 | 如下正文 |
其他参考文献 | 无 |
我的GitHub仓库地址 | JackWany |
作业要求
发布一篇随笔,使用markdown语法进行编辑。
在随笔前附上github仓库地址。
编程题目
汉字是迄今为止持续使用时间最长的文字,也是上古时期各大文字体系中唯一传承至今者,中国历代皆以汉字为主要的官方文字。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
小杨同学想到:用汉字来进行编程一定很有趣,来请你帮帮他。
编程要求
请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):
变量定义:整数 (变量名) 等于 (数字)
运算(加法):(变量名) 增加 (数字)
运算(减法):(变量名) 减少 (数字)
输出:看看 (变量名) or 看看 “(字符串内容)”
样例1
输入:
整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
输出:
九
你好,世界
样例2
输入:
整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
输出:
三
附加要求:
选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
若否则后没有任何操作使用(无)来进行填充(参考样例2)。
注意事项
输入输出采用utf-8编码,请在编码过程中注意。
数字只会出现:零一二三四五六七八九十。(此条作废,可先完成0-10的情况)
字符串输出的双引号是全角,即中文双引号。
变量类型要求只有整数,如有余力,可以自己实现更多。
测试数据会相较于样例复杂,请考虑充分需求。
不限制编程语言。
不能使用eval函数动态执行代码,或调用系统指令。
数据输入形式为交互式运行,类似于shell。
github要求
创建一个github仓库。
使用git或其他git图形应用程序(Github Desktop,TortoiseGit等)将程序代码传到仓库,commit信息遵守一定的git规范。
加入.gitignore文件和开源license。
随笔要求
要求记录包括但不限于以下内容:
记录自己的代码行数,需求分析时间,编码时间。
分解需求的思路,分解成多个模块,并阐述为什么这么分,优势在哪,可以附上代码片段。
记录不会的知识的学习过程以及修改优化的过程;可以附上资料网站。
自我发挥。
一、分析过程
首先我认为样例1和样例2无法同时实现,可能我的直觉是错了,所以下面给出了针对样例1和样例2的不同的代码段。样例2是在样例1的基础上修改的,所以简单的介绍一下样例1的代码。
需求分析
1.编程语言方面涉及较广的是C和Python,我觉得C写起来更容易些。
2.需要解决的问题有汉字字符如何转化为数字、如何匹配或识别字符串从而进行加减运算(乘除就暂时不考虑了,加减还没搞明白呢!)、输入输出字符串的顺序问题。
3.第二题在第一题的基础上哪些逻辑变化了、多行输入字符串什么时候匹配结束(判断字符串资源结束)。
4.循环条件语句、三目运算法则(如果 则 否则)。
代码模块
主要是由函数和主函数构成,包括零到十中文字符转换为数字、通过识别增加和减少返回加减运算值、大于和小于的条件转换,还有主函数包括整体字符串的输入,匹配结束,然后根据匹配的值算出结果,再根据最后的条件语句和前面的加减结果判断输出的输入的字符串部分!
至于为什么这么分?就是主函数对结果进行输出,其过程会调用其他自定义函数!优势就是代码审核的时候容易一些,比较容易找出错误并改正!
二、还有疑惑
不会的东西但是后来会了
1.大概是时间久了忘了,后来网上查了判断两个字符串是否相等的内置函数是 是strcmp(字符串1,字符串2),如果其返回值为0的话就是一样的,如果为1的话就不一样,这个主要用作判断。
2.一开始写的时候,每次结果都是错误的,由于输入的是多行有间隔的字符串,C无法自动判断结束把? 然后上网查了可以加个while循环,里面加个字符串判断end of file缩写(EOF)就是一直到匹配完输入的字符串为止。
还不会的东西
最主要的是不懂最后匹配得到结果结果判断输出的字符串,如果输入是同一段还好,但是如果是不同的测试数据,条件的结果(顺序)被限制了。
三、代码如下
//样例1
#include<stdio.h>//必备
#include<string.h>//必备
//定义整数字符串
char integer[100][100] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
int A(char a[]) {
int i;
for (i = 0; i < 11; i++) {
if (strcmp(integer[i], a) == 0) {
return i;
}
}
return 0;
}//汉字转数字
int compare(char a[], char b[], char c[]) {
int x;
x = A(a);
if (strcmp(a, "大于") == 0)
printf("%s", b);
else if (strcmp(a, "小于") == 0)
printf("%s", c);
}//本来是要给自己增加难度分两种情况 但是后面发现没用到
int figure(int n, char a[], char b[]) {
int sum;
sum = A(b);
if (strcmp(a, "增加") == 0)
return n + sum;
if (strcmp(a, "减少") == 0)
return n - sum;
return 0;
}//运算
int main() {
int outcome;
char a[100], b[100], c[100], d[100], e[100], f[100], g[100], h[100], i[100], j[100],k[100];
scanf("%s %s %s %s", a, b, c, d);
// printf("
");
outcome = A(d);
while (scanf("%s %s", b, c) != EOF) {
if (strcmp(b, "看看") != 0) {
scanf("%s", d);
outcome = figure(outcome, c, d);
} else {
scanf("%s %s %s %s %s %s %s %s %s %s",e,c,f,g,h,b,i,j,b,k);
if (outcome < A(g)) {
printf("%s
", integer[outcome]);
printf(i);
} else if (A(g) < outcome<10 ) {
printf("%s
", integer[outcome]);
printf(k);
} else if (10 < outcome < 20) {
printf("十%s
", integer[outcome - 10]);
printf(k);
}
}
}
return 0;
}
//样例2
#include<stdio.h>//必备
#include<string.h>//必备
//定义整数字符串
char integer1[100][100] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
char integer2[100][100] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
int A1(char a[]) {
int i;
for (i = 0; i < 11; i++) {
if (strcmp(integer1[i], a) == 0) {
return i;
}
}
return 0;
}//汉字转数字1year
int A2(char a[]) {
int i;
for (i = 0; i < 11; i++) {
if (strcmp(integer2[i], a) == 0) {
return i;
}
}
return 0;
}//汉字转数字2money
int compare(char a[], char b[], char c[]) {
int x;
x = A1(a);
if (strcmp(a, "大于") == 0)
printf("%s", b);
else if (strcmp(a, "小于") == 0)
printf("%s", c);
}//本来是要给自己增加难度分两种情况 但是后面发现没用到
int figure(int n, char a[], char b[]) {
int sum;
sum = A1(b);
if (strcmp(a, "增加") == 0)
return n + sum;
if (strcmp(a, "减少") == 0)
return n - sum;
return 0;
}//运算
int main() {
int outcome1, outcome2;
char a[100], b[100], c[100], d[100], e[100], f[100], g[100], h[100], j[100], k[100];
scanf("%s %s %s %s %s %s %s %s %s %s %s", a, b, c, d, a, g, c, h, b, j, k);
printf("
");
outcome1 = A1(d);
outcome2 = A2(h);
scanf("%s %s", f, g);
while (scanf("%s %s", f, g) != EOF) {
if (strcmp(f, "看看") != 0) {
scanf("%s", k);
outcome1 = figure(outcome1, j, k);
if (outcome1 > A1(d))
printf("%s", integer2[outcome2 +1]);
}
}
}
四、代码运行结果截图
样例1
样例2
五、心得体会
代码行数(包括文档注释和单元测试 : 125
需求分析时间:2.5小时左右
完成编码时间:5~6小时左右
1.最后结果比如‘’你好,世界“,最后的输出结果应该没有双引号,的确不清楚如何解决,叹息完成作业了,后期将会改善!
2.此次编程花费大量时间,也从侧面反映出自己基本语法、函数掌握得不够牢固,寒假这几天要多花花时间复习那几门编程语言!
3.虽然花了不少时间写出了代码,也得出了测试结果,但是细节过程有待改善。例如样例中的条件如果后面的条件改掉,也就是数字改掉,则必须将代码改掉,才可以运行成功!
4.接下来可以尝试用其他语言比如python,c++尝试着写同样的题目,我个人认为C语言虽然基础万能,但是有更方便快捷的语言代替它!