这个作业属于哪个课程 | 软件工程(福州大学至诚学院计算机工程系) |
---|---|
这个作业要求在哪里 | 第一次编程作业要求 |
这个作业的目标 | 用汉字写编程语言 |
作业正文 | 正文如下 |
其他参考文献 | 没有 |
GITHUB仓库 | https://github.com/zZYLinda/zhuyunlin |
作业要求
发布一篇随笔,使用markdown语法进行编辑。
在随笔前附上github仓库地址
编程题目
汉字是迄今为止持续使用时间最长的文字,也是上古时期各大文字体系中唯一传承至今者,中国历代皆以汉字为主要的官方文字。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
小杨同学想到:用汉字来进行编程一定很有趣,来请你帮帮他。
编程要求
请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):
变量定义:整数 (变量名) 等于 (数字)
运算(加法):(变量名) 增加 (数字)
运算(减法):(变量名) 减少 (数字)
输出:看看 (变量名) or 看看 “(字符串内容)”
附加要求:
选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
若否则后没有任何操作使用(无)来进行填充(参考样例2)。
注意事项
输入输出采用utf-8编码,请在编码过程中注意。
数字只会出现:零一二三四五六七八九十。(此条作废,可先完成0-10的情况)
字符串输出的双引号是全角,即中文双引号。
变量类型要求只有整数,如有余力,可以自己实现更多。
测试数据会相较于样例复杂,请考虑充分需求。
不限制编程语言。
不能使用eval函数动态执行代码,或调用系统指令。
数据输入形式为交互式运行,类似于shell。
编码
内容 | |
---|---|
代码行数 | 442 |
需求分析时间 | 大概3-4小时 |
编码时间 | 我是用很多零零散散时间才全部完成的,估计编码时间就两个半小时 |
代码部分
#这道题目用汉字来做加减法,刚开始有思路的就是如何把汉字转化为数字,我把他们分为几部分,第一类是0-9和100,
#这几个比较特殊,我打算采用一个函数来完成,通过某种判断条件运行这个函数
def a(a):#不含十的汉字转数字
if (a == '零'):
return 0
if (a == '一'):
return 1
if (a == '二'):
return 2
if (a == '三'):
return 3
if (a == '四'):
return 4
if (a == '五'):
return 5
if (a == '六'):
return 6
if (a == '七'):
return 7
if (a == '八'):
return 8
if (a == '九'):
return 9
if (a == '一百'):
return 100
#第二类,就是都含有“十”这个字,所以我想到了用分离
#我只需要提取出来十,以十为界限
def b(b):#含十的汉字转文字
if (len(b)!=3):
if (b == '十'):
return 10
if (b == '二十'):
return 20
if (b == '三十'):
return 30
if (b == '四十'):
return 40
if (b == '五十'):
return 50
if (b == '六十'):
return 60
if (b == '七十'):
return 70
if (b == '八十'):
return 80
if (b == '九十'):
return 90
else:
a=b.split('十')
if (a[0] == '一'):
c=10
if (a[0] == '二'):
c=20
if (a[0] == '三'):
c=30
if (a[0] == '四'):
c=40
if (a[0] == '五'):
c=50
if (a[0] == '六'):
c=60
if (a[0] == '七'):
c=70
if (a[0] == '八'):
c=80
if (a[0] == '九'):
c=90
if (a[1] == '一'):
d=1
if (a[1] == '二'):
d=2
if (a[1] == '三'):
d=3
if (a[1] == '四'):
d=4
if (a[1] == '五'):
d=5
if (a[1] == '六'):
d=6
if (a[1] == '七'):
d=7
if (a[1] == '八'):
d=8
if (a[1] == '九'):
d=9
return c+d
#除了汉字转数字,查看时,也要用数字来转成汉字
def c(a):#十以内数字转汉字
if (a == 0):
return '零'
if (a == 1):
return '一'
if (a == 2):
return '二'
if (a == 3):
return '三'
if (a == 4):
return '四'
if (a == 5):
return '五'
if (a == 6):
return '六'
if (a == 7):
return '七'
if (a == 8):
return '八'
if (a == 9):
return '九'
def d(a):#十到一百的数字转汉字
if a%10==0:
if (a/10 == 1):
return '十'
if (a/10 == 2):
return '二十'
if (a/10 == 3):
return '三十'
if (a/10 == 4):
return '四十'
if (a/10 == 5):
return '五十'
if (a/10 == 6):
return '六十'
if (a/10 == 7):
return '七十'
if (a/10 == 8):
return '八十'
if (a/10 == 9):
return '九十'
if (a/10 == 10):
return '一百'
else:
b=a//10
c=a%10
if (b == 1):
e='十'
if (b == 2):
e = '二十'
if (b == 3):
e = '三十'
if (b == 4):
e = '四十'
if (b == 5):
e = '五十'
if (b == 6):
e = '六十'
if (b == 7):
e = '七十'
if (b == 8):
e = '八十'
if (b == 9):
e = '九十'
if (c == 1):
f = '一'
if (c == 2):
f = '二'
if (c == 3):
f = '三'
if (c == 4):
f = '四'
if (c == 5):
f = '五'
if (c == 6):
f = '六'
if (c == 7):
f = '七'
if (c == 8):
f = '八'
if (c == 9):
f = '九'
g=e+f
return g
#之后想了很久才开始写主题函数,中间请教了田硕同学,写一个输入函数,由于案例二有两个需要同时使用,所以要写一个数组,用来存放不同的计算过程
h=''#还要有一个字符串来存放变量名
#我用一个无限while循环来输入,当输入结束的时候停止循环
import numpy as np
def star():
a =np.zeros(100)#数组,用于存储不同计算过程
while (1):
str = input("请输入:");#循环输入指令,当输入的 结束 的时候结束循环
if (str=='结束'):
break;
else:
e(str,a)#此处跳转一个判断函数,用来执行输入语句
star()
#输入一句话,就要去执行,我在开始函数中跳转了一个判断函数
def e(str,a):#对最开始语句的判断来执行相应的函数
s=str.split(" ")
if (len(s)<=2):
if (s[0]=='看看'):
kk(str,a)
else:
print("命令不成立!")
else:
if (s[2]=='等于'):
dy(str,a)
elif (s[1]=='增加'):
zj(s,a)
elif (s[1]=='减少'):
js(s,a)
elif (s[0]=='如果'):
rg(str,a)
else:
print("命令不成立!")
#这个函数是写 看看 钱包这种语句的,是查询作用
def kk(str,a):
s=str.split(" ")
global h
if (h.find(s[1])==-1):#没有创建变量
print("没有创建相应的变量")
else:#创建过变量
kankan(str,a)
def kankan(str,a):#看看 (变量名)的输出判断
s=str.split(' ')
if (a[h.find(s[1])]>10):#若大于10则进行一种转换函数
print(d(a[h.find(s[1])]))
else:
print(c(a[h.find(s[1])]))
#整数 气温 等于 十
def dy(str,a):#为不同变量寻找相应位置
s=str.split(" ")
global h
if (h.find(s[1])==-1):#没有创建变量
h=h+s[1]
chushi(str,a)
else:#创建过变量
chushi(str,a)
def chushi(str,a):#初始化
s=str.split(' ')
if (len(s[3].split('十'))==1):#判定初始时是否含有'十'
a[h.find(s[1])]=a(s[3])
if(len(s[3].split('十'))==2):
a[h.find(s[1])]=b(s[3])
def zj(s,a):
global h
if (h.find(s[0])==-1):#没有创建变量
print("没有创建相应的变量")
else:#创建过变量
jiajian(s,a)
def jiajian(s,a):#调用
a[h.find(s[0])]=yss(s,a)
def yss(s,a):#运算 百以内的加减
if (s[1] == '增加'):
if (len(s[2].split('十'))==1):#判断
return a[h.find(s[0])]+a(s[2])
if(len(s[2].split('十'))==2):
return a[h.find(s[0])]+b(s[2])
if (s[1] == '减少'):
if (len(s[2].split('十'))==1):#判断
return a[h.find(s[0])]-a(s[2])
if(len(s[2].split('十'))==2):
return a[h.find(s[0])]-b(s[2])
def rg(str,a):
s=str.split(" ")
global h
if (h.find(s[1])==-1):#没有创建变量
print("没有创建相应的变量")
else:#创建过变量
rgg(str,a)
def rgg(str,a):#自定义判断语句
s=str.split(" ")
if (s[2]=='大于'):
if (len(s[3].split('十'))==1):#判定初始时是否含有'十'
if(a[h.find(s[1])]>=a(s[3])):
if (s[5]=='看看'):
q=s[6].replace('”','')
q=q.replace('“','')
print(q)
else:
zj(s[5:8],a)
else:
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
ptirnt("无")
if(len(s[3].split('十'))==2):
if(a[h.find(s[1])]>=b(s[3])):
if (s[5]=='看看'):
q=s[6].replace('”','')
q=q.replace('“','')
print(q)
else:
zj(s[5:8],a)
else:
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
ptirnt("无")
if (s[2]=='小于'):
if (len(s[3].split('十'))==1):#判定初始时是否含有'十'
if(a[h.find(s[1])]<a(s[3])):
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
zj(s[5:8],a)
else:
if (s[5]=='看看'):
q=s[6].replace('”','')
q=q.replace('“','')
print(q)
else:
ptirnt("无")
if(len(s[3].split('十'))==2):
if(a[h.find(s[1])]<b(s[3])):
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
zj(s[5:8],a)
else:
if (s[5]=='看看'):
q=s[6].replace('”','')
q=q.replace('“','')
print(q)
else:
ptirnt("无")
个人体会
最后的看看函数,等于函数,增加函数,减少函数都有参考田硕同学的代码,其他函数部分为自己想的,经过这次之后深刻体会到自己编码能力的不足