第一次个人编程作业
这个作业属于哪个课程 | 软件工程 (福州大学至诚学院 - 计算机工程系) |
---|---|
这个作业要求在哪里 | 第一次个人编程作业 |
这个作业的目标 | 通过代码实现可以使用中文进行简单的编程计算 |
作业正文 | ... |
其他参考文献 | ... |
github仓库地址:https://github.com/211706127/- |
编程题目:
汉字是迄今为止持续使用时间最长的文字,也是上古时期各大文字体系中唯一传承至今者,中国历代皆以汉字为主要的官方文字。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
小杨同学想到:用汉字来进行编程一定很有趣,来请你帮帮他。编程要求:
请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):
变量定义:整数 (变量名) 等于 (数字)
运算(加法):(变量名) 增加 (数字)
运算(减法):(变量名) 减少 (数字)
输出:看看 (变量名) or 看看 “(字符串内容)”
附加要求:
选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
若否则后没有任何操作使用(无)来进行填充(参考样例2)。样例:
样例1
样例2数据:
代码行数:541行 时间:三天(代码时间大概一天半)
代码:
因为要处理多个变量的问题,所以我创建了一个字符串Z用来存放不同的变量名,每次有新的变量名时都会加入的z中
然后通过z.find(变量名)的方式来判断是否创建过变量名,然后在通过创建的数组a来在变量名相应的位置存储数字
a[变量名在z中的位置]=变量的数
这样每个变量名就有对应的存储位置,可以多个变量名进行运算而互不干扰
z=''#初始一个字符串用于存放不同的变量名
开始()#当输入 结束 时结束循环
import numpy as np
def 开始():
a =np.zeros(100)#设置一个长度为100的全为0的数组,用以存储不同变量的不同数量
q=0
while q==0:
str = input("请输入:");#循环输入指令,当输入的 结束 的时候结束循环
if (str=='结束'):
break;
else:
panduan(str,a)#将指令输入到判断指令处
#用一个while循环来输入,当输入结束的时候停止循环
def panduan(str,a):#对最开始语句的判断来执行相应的函数
s=str.split(" ")#对空格进行分片
if (len(s)<=2):#当分片后小于等于两个时
if (s[0]=='看看'):#判断第一个词是否是 看看
kankanpan(str,a)#进入相应的判断函数
else:
print("指令不成立!")
else:
if (s[2]=='等于'):#指令为等于
if(s[3].find('负')!=-1):#数字中出现负
print('设置数字不能为负!')
else:
bianliang(str,a)
elif (s[1]=='增加'):#指令为增加
if(s[2].find('负')!=-1):
print('设置数字不能为负!')
else:
zengliang(s,a)
elif (s[1]=='减少'):#指令为减少
if(s[2].find('负')!=-1):
print('设置数字不能为负!')
else:
zengliang(s,a)
elif (s[0]=='如果'):#指令中有如果
if(s[3].find('负')!=-1):
print('设置数字不能为负!')
else:
teshupan(str,a)
else:#若都不存在则指令不成立
print("指令不成立!")
def kankanpan(str,a):
s=str.split(" ")
global z
if (z.find(s[1])==-1):#判断z中有没有变量名
print("没有创建相应的变量")
else:#创建过变量
kankan(str,a)
由于不同变量名的判断是后期加入,所以直接创建了一个函数来进行连接,后面会有多次进行连接,用函数分块的方法可以更好的加入新的判断关系,可以更清晰的理解函数的作用
def kankan(str,a):#看看 (变量名)的输出判断
s=str.split(' ')
if (a[z.find(s[1])]>20):#若大于20则进行一种转换函数
print(hanzibai(a[z.find(s[1])]))
else:
print(hanzi(a[z.find(s[1])]))
def bianliang(str,a):#为不同变量寻找相应位置
s=str.split(" ")
global z
if (z.find(s[1])==-1):#没有创建变量
z=z+s[1]#在z中加入变量名
chushi(str,a)
else:#创建过变量,更改对应的数
chushi(str,a)
通过z+s[1]的方式记录变量名
def chushi(str,a):#初始化一个全局变量
s=str.split(' ')
if (len(s[3].split('十'))==1):#判定初始时是否含有'十'
a[z.find(s[1])]=shuzi(s[3])#将对应的数字放到数组中变量在z中对应的位置 a【变量名在z中的位置】=变量的数
if(len(s[3].split('十'))==2):
a[z.find(s[1])]=shuzibai(s[3])
def zengliang(s,a):
global z
if (z.find(s[0])==-1):#判断z中有没有变量名
print("没有创建相应的变量")
else:#创建过变量
jiajian(s,a)
因为有些变量名不适合出现负数 如:钱包、年龄 所以统一处理不出现负数,出算负数为错误
def jiajian(s,a):#对加减函数的调用
if(fuhao(s,a)<0):#对计算结果进行判断,为负数不输出
print('得数为负,错误!')
else:
a[z.find(s[0])]=fuhao(s,a)#将结果放入对应位置
由于计算范围为一百以内的加减,所以只要分辨出含十的数和不含十的数进行不同方式的转化为数字就可以
def fuhao(s,a):#增加和减少的运算 这里只有百以内的加减
if (s[1] == '增加'):#判断是增加还是减少
if (len(s[2].split('十'))==1):#判定初始时是否含有'十'
return a[z.find(s[0])]+shuzi(s[2])
if(len(s[2].split('十'))==2):
return a[z.find(s[0])]+shuzibai(s[2])
if (s[1] == '减少'):
if (len(s[2].split('十'))==1):#判定初始时是否含有'十'
return a[z.find(s[0])]-shuzi(s[2])
if(len(s[2].split('十'))==2):
return a[z.find(s[0])]-shuzibai(s[2])
对附加指令的判断 以出现 如果 为特点判定,同时若没有创建变量则不能执行指令
def teshupan(str,a):#当出现 如果 时进行变量是否存在的判断
s=str.split(" ")
global z
if (z.find(s[1])==-1):#没有创建变量,在z中找不到相同的变量名
print("没有创建相应的变量")
else:#创建过变量
teshu(str,a)
在 如果 后边还有两种不同的指令方式 如:
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
def teshu(str,a):#自定义判断语句
s=str.split(" ")
if (s[2]=='大于'):#指令关键词 大于
if (len(s[3].split('十'))==1):#判定初始时是否含有'十'
if(a[z.find(s[1])]>=shuzi(s[3])):
if (s[5]=='看看'):#当句子中有‘看看’时说明是一种判断语句
q=s[6].replace('”','')
q=q.replace('“','')#去除双引号
print(q)
else:#没有 看看 说明是另一种指令
zengliang(s[5:8],a)#进行加减运算
else:
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
print("无")
if(len(s[3].split('十'))==2):
if(a[z.find(s[1])]>=shuzibai(s[3])):
if (s[5]=='看看'):
q=s[6].replace('”','')
q=q.replace('“','')
print(q)
else:
zengliang(s[5:8],a)
else:
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
print("无")
if (s[2]=='小于'):
if (len(s[3].split('十'))==1):#判定初始时是否含有'十'
if(a[z.find(s[1])]<shuzi(s[3])):
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
zengliang(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[z.find(s[1])]<shuzibai(s[3])):
if (s[5]=='看看'):
q=s[9].replace('”','')
q=q.replace('“','')
print(q)
else:
zengliang(s[5:8],a)
else:
if (s[5]=='看看'):
q=s[6].replace('”','')
q=q.replace('“','')
print(q)
else:
ptirnt("无")
由于 九、十一、二十一、一百 在字符上是有不同的所以,根据不同的情况要有不同的转换方式
def shuzibai(s):#含十的汉字转文字
if (len(s)!=3):
if (s == '十'):
return 10
if (s == '十一'):
return 11
if (s == '十二'):
return 12
if (s == '十三'):
return 13
if (s == '十四'):
return 14
if (s == '十五'):
return 15
if (s == '十六'):
return 16
if (s == '十七'):
return 17
if (s == '十八'):
return 18
if (s == '十九'):
return 19
if (s == '二十'):
return 20
if (s == '三十'):
return 30
if (s == '四十'):
return 40
if (s == '五十'):
return 50
if (s == '六十'):
return 60
if (s == '七十'):
return 70
if (s == '八十'):
return 80
if (s == '九十'):
return 90
else:
a=s.split('十')#对长度为3的字符串进行分词,分为十位和个位,对应数字相加
if (a[0] == '二'):
z=20
if (a[0] == '三'):
z=30
if (a[0] == '四'):
z=40
if (a[0] == '五'):
z=50
if (a[0] == '六'):
z=60
if (a[0] == '七'):
z=70
if (a[0] == '八'):
z=80
if (a[0] == '九'):
z=90
if (a[1] == '一'):
x=1
if (a[1] == '二'):
x=2
if (a[1] == '三'):
x=3
if (a[1] == '四'):
x=4
if (a[1] == '五'):
x=5
if (a[1] == '六'):
x=6
if (a[1] == '七'):
x=7
if (a[1] == '八'):
x=8
if (a[1] == '九'):
x=9
return z+x
def shuzi(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 hanzi(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 '九'
if (a == 10):
return '十'
if (a == 11):
return '十一'
if (a == 12):
return '十二'
if (a == 13):
return '十三'
if (a == 14):
return '十四'
if (a == 15):
return '十五'
if (a == 16):
return '十六'
if (a == 17):
return '十七'
if (a == 18):
return '十八'
if (a == 19):
return '十九'
if (a == 20):
return '二十'
def hanzibai(a):#二十到一百的数字转汉字
if a%10==0:#对应整十整百
if (a/10 == 10):
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 '九十'
else:
s=a//10#python中//才能得到整数部分
d=a%10#分别对应个位和十位
if (s == 2):
z = '二十'
if (s == 3):
z = '三十'
if (s == 4):
z = '四十'
if (s == 5):
z = '五十'
if (s == 6):
z = '六十'
if (s == 7):
z = '七十'
if (s == 8):
z = '八十'
if (s == 9):
z = '九十'
if (d == 1):
x = '一'
if (d == 2):
x = '二'
if (d == 3):
x = '三'
if (d == 4):
x = '四'
if (d == 5):
x = '五'
if (d == 6):
x = '六'
if (d == 7):
x = '七'
if (d == 8):
x = '八'
if (d == 9):
x = '九'
c=z+x
return c