这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzzcxy/SE |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283 |
这个作业的目标 | 制作一个简易的中文语言编译器 |
作业正文 | 如下 |
其他参考文献 | 如下 |
GitHub地址:https://github.com/BlueNeet/Software_engineering_Coursework
编码过程中的消耗
- 记录自己的代码行数:199行
- 需求分析时间:1个小时
- 编码时间:1天
思路分析
先把程序执行分为两个部分,一个是直接执行代码,另一个则是先判断后执行代码。直接执行的有赋值类型、运算类型、输出类型。需要判断的类型虽然判断后也是进行一样的过程,但由于需要进一步分解提取出代码故独立出来。一共写了六个自定义函数,分别是汉字转整型、整型转汉字、输出、则内的各种运算、否则内的各种运算。输出(看看)花了我很多时间去修正,是因为split分割出来的字符串的[0]是一个空内容,导致按照正常情况写的代码没有正常运行。还有汉字数组不能很好的不支持“==",于是我采用了字典的方法来保存内容。还有各种异常情况:除以0、输出未定义的变量、运行不存在的功能、想要加减乘除一个非数字等问题。有些问题只能写个异常来解决。
代码
def chtoint(y):
global temp
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:
print("数字有问题")
return "errorx"
def inttoch(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:
print("数字有问题")
def printo(charr):
try:
print(inttoch(strings[charr[1]]))
except KeyError:
if charr[1][0]=="“":
tekst=charr[1]
tekst=tekst.strip('“')
tekst=tekst.strip('”')
print(tekst)
else:
print("未初始化该量")
return error
def firstrslt(ze):
if ze[1]=="看看":
ze[0]=ze[1]
ze[1]=ze[2]
printo(ze)
elif ze[1]=="无":
return 0
elif ze[2]=="增加":
change=chtoint(ze[3])
if change!="errorx":
strings[ze[1]]=strings[ze[1]]+change
elif ze[2]=="减少":
change=chtoint(ze[3])
if change!="errorx":
strings[ze[1]]=strings[ze[1]]-change
elif ze[2]=="乘以" or ze[2]=="除以":
change=chtoint(ze[3])
if ze[2]=="乘以":
if change!="errorx":
strings[ze[1]]=strings[ze[1]]*change
else:
if change==0:
print("分母不可为零")
else:
if change!="errorx":
strings[ze[1]]=strings[ze[1]]/change
else:
print("则里的动作错误")
def secrslt(fouze):
if fouze[1]=="看看":
fouze[0]=fouze[1]
fouze[1]=fouze[2]
printo(fouze)
elif fouze[1]=="无":
return
elif fouze[2]=="增加":
change=chtoint(fouze[3])
if change!="errorx":
strings[fouze[1]]=strings[fouze[1]]+change
elif fouze[2]=="减少":
change=chtoint(fouze[3])
if change!="errorx":
strings[fouze[1]]=strings[fouze[1]]-change
elif fouze[2]=="乘以" or fouze[2]=="除以":
change=chtoint(fouze[3])
if fouze[2]=="乘以":
if change!="errorx":
strings[fouze[1]]=strings[fouze[1]]*change
else:
if change==0:
print("分母不可为零")
else:
if change!="errorx":
strings[fouze[1]]=strings[fouze[1]]/change
else:
print("否则里的动作错误")
def ChParser():
text=input()
charr=text.split(" ")
if text=="":
return
elif len(charr)<3 and charr[0]!="看看":
print("无此命令!!!")
elif charr[0]=="整数" and charr[2]=="等于":
strings[charr[1] ]=chtoint(charr[3])
elif charr[0]=="看看":
printo(charr)
elif charr[1]=="增加" or charr[1]=="减少":
change=chtoint(charr[2])
if charr[1]=="增加" and change!="errorx":
strings[charr[0]]=strings[charr[0]]+change
elif charr[1]=="减少" and change!="errorx":
strings[charr[0]]=strings[charr[0]]-change
elif charr[1]=="乘以" or charr[1]=="除以":
change=chtoint(charr[2])
if charr[1]=="乘以":
strings[charr[0]]=strings[charr[0]]*change
else:
if change==0:
print("分母不可为零")
else:
strings[charr[0]]=strings[charr[0]]/change
elif charr[0]=="如果" and charr[2]=="大于":
kuchi=text.split("则",1)
sentence=kuchi[1].split("否则")
ze=sentence[0].split(" ")
fouze=sentence[1].split(" ")
if strings[charr[1]]>chtoint(charr[3]):
firstrslt(ze)
else:
secrslt(fouze)
elif charr[0]=="如果" and charr[2]=="小于":
kuchi=text.split("则",1)
sentence=kuchi[1].split("否则")
ze=sentence[0].split(" ")
fouze=sentence[1].split(" ")
if strings[charr[1]]<chtoint(charr[3]):
firstrslt(ze)
else:
secrslt(fouze)
elif charr[0]=="如果" and charr[2]=="等于":
kuchi=text.split("则",1)
sentence=kuchi[1].split("否则")
ze=sentence[0].split(" ")
fouze=sentence[1].split(" ")
if strings[charr[1]]==chtoint(charr[3]):
firstrslt(ze)
else:
secrslt(fouze)
elif charr[0]=="如果" and charr[2]=="不等于":
kuchi=text.split("则",1)
sentence=kuchi[1].split("否则")
ze=sentence[0].split(" ")
fouze=sentence[1].split(" ")
if strings[charr[1]]!=chtoint(charr[3]):
firstrslt(ze)
else:
secrslt(fouze)
else:
print("无此命令!!!")
if __name__=="__main__":
strings={}
while True:
ChParser()
测试
-
样例1
- 输入
整数 气温 等于 十 气温 减少 三 气温 增加 二 看看 气温 如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
- 输出
- 输入
-
样例2
- 输入
整数 小杨年龄 等于 八 整数 小杨零花钱 等于 二 小杨年龄 增加 一 如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无 看看 小杨零花钱
- 输出
- 输入
-
样例3
- 输入
整数 气温 等于 十 气温 减少 三 气温 减少 四 看看 气温 如果 气温 等于 三 则 气温 除以 三 否则 气温 乘以 三 看看 气温
- 输出
- 输入
参考
由于python课程学的不深加上已经学了快2年了,所以我重新简要的去学习了一下python