这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzzcxy/SE |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283 |
这个作业的目标 | 制作一个简易的中文语言编译器 |
作业正文 | |
其他参考文献 | https://jingyan.baidu.com/article/c843ea0ba1110d77921e4a7e.html |
- 代码行数:120
- 分析时间:>2h
- 编码时间:>6h
编程题目
汉字是迄今为止持续使用时间最长的文字,也是上古时期各大文字体系中唯一传承至今者,中国历代皆以汉字为主要的官方文字。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
小杨同学想到:用汉字来进行编程一定很有趣,来请你帮帮他。
编程要求
请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):
变量定义:整数 (变量名) 等于 (数字)
运算(加法):(变量名) 增加 (数字)
运算(减法):(变量名) 减少 (数字)
输出:看看 (变量名) or 看看 “(字符串内容)”
附加要求:
- 选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
若否则后没有任何操作使用(无)来进行填充(参考样例2)。
注意事项
1、输入输出采用utf-8编码,请在编码过程中注意。
2、数字只会出现:零一二三四五六七八九十。(此条作废,可先完成0-10的情况)
3、字符串输出的双引号是全角,即中文双引号。
4、变量类型要求只有整数,如有余力,可以自己实现更多。
5、测试数据会相较于样例复杂,请考虑充分需求。
6、不限制编程语言。
7、不能使用eval函数动态执行代码,或调用系统指令。
8、数据输入形式为交互式运行,类似于shell。
现有思路
刚看到题目开始感觉无从下手,参考大一时c语言让我们自己做一个简易的计算器时的思路,单单把汉字转数字和数字转汉字应该不难。认为输入输出的地方会比较棘手,C语言和java的知识都搁置太久了,选择用比较熟悉的python来试着写。
部分代码(独立功能)
将汉字数字转换为阿拉伯数字
def HantoNum(y):
if y=='零':
return 0
elif y=='一':
return 1
elif y=='二':
return 2
elif y=='三':
return 3
elif y=='四':
return 4
elif y=='五':
return 5
elif y=='六':
return 6
elif y=='七':
return 7
elif y=='八':
return 8
elif y=='九':
return 9
elif y=='十':
return 10
else:
return "error"
将阿拉伯数字转换为汉字数字
def NumtoHan(z):
if z==1:
return '一'
elif z==2:
return '二'
elif z==3:
return '三'
elif z==4:
return '四'
elif z==5:
return '五'
elif z==6:
return '六'
elif z==7:
return '七'
elif z==8:
return '八'
elif z==9:
return '九'
elif z==10:
return '十'
else:
return 'error'
然后问题就来了,思考初始定义,循坏,输出类型什么的,感觉判断条件对我来讲会很困难。
想到用列表s[]来存储 变量定义这个过程中的 s[0]整数 s[1]变量名 s[2]等于 s[3]数字 这四个变量
输入部分的代码
str = input()
s = str.split()
这是考虑到s接收第一句的内容,“气温 减少 三/气温 增加 二”是否要用新的列表来接收时就会陷入混乱。
“看看 气温”这一句可以写成
if s[0] == '看看':
NumtoHan()
print(s[3])
如果用一个新的列表d去接收最后一句'如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”'
在d中单个词语的顺序为 0如果 1气温 2大于 3八 4则 5看看 6“你好,世界” 7否则 8看看 9“冻死我了”
if d[0]=="如果":
if d[2] == "大于":
if s[3]>d[3]:
print("“你好,世界”")
else:
print("冻死我了")
目前数据只支持0-9,而且“气温 增加或减少”句型的句子只有一个列表接受,不能在一次测试中多次加减。