| 這個作業屬於哪個課程 | 軟件工程(福州大學至誠學院計算機工程系) |
|---|---|
| 這個作業要求在哪里 | 第一次編程作業要求 |
| 這個作業的目標 | 用漢字寫編程語言 |
| 作業正文 | 正文如下 |
| 其他參考文獻 | 沒有 |
| 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("無")
個人體會
最后的看看函數,等於函數,增加函數,減少函數都有參考田碩同學的代碼,其他函數部分為自己想的,經過這次之后深刻體會到自己編碼能力的不足
