2019年6月11日 星期二

APCS 前置作業- zerojudge 基礎題庫 by python



zerojudge 為高師附中江其勳老師開發的程式寫作 Online Judge 網站:
https://zerojudge.tw/

進入網站後到 分類題庫>基礎題庫 有一些基礎練習連結如下:
https://zerojudge.tw/Problems?tabid=BASIC#tab00


今天要幫大家介紹如何搭配 python 做幾個基礎的練習:

話說python本身在做標準輸入時不像 c++ 一樣可以直接偵測EOF

例如:
int n;
while(scanf("%d",&n) != EOF)

{

    //...主程式...

}

上例c++程式中會不斷讀入整數給變數n直到讀到EOF為止

為了讓 python程式可以在 zerojude上順利執行,我們導入了 try....except的概念
(try的用法可參考:http://www.runoob.com/python/python-exceptions.html)

讓讀到 EOF 當作例外來觸發,觸發之後可視程式的需求進一步動作,或終止程式。

例外處理與程式除錯是另外一門藝術,讀者可以藉由下列實例體會在程式中使用try來跳過例外狀況的方便之處,並慢慢學習真正需要做程式除錯時,程式中如何妥善傳遞例外狀況。


題目1. a001: 哈囉
https://zerojudge.tw/ShowProblem?problemid=a001
while True:
    try:a=input()
    except:break #過濾掉 EOFError,讀到EOF後直接跳出迴圈
    if not a:break #輸入空字串時跳出迴圈
    print('hello,',a)

題目2. a002: 簡易加法
https://zerojudge.tw/ShowProblem?problemid=a002
while True:
    try:
        #用字串內建的 split() 函式
        #將字串做分割並將結果回傳給 a,b 
        a,b=input().split()
    except: break
    if not a:break    
    print(int(a)+int(b))

題目3. a003: 兩光法師占卜術
https://zerojudge.tw/ShowProblem?problemid=a003
R=['普通','吉','大吉']
while True:
    try:
        M,D=input().split()
    except: break
    S=(int(M)*2+int(D))%3
    print(R[S])

題目4. a004: 文文的求婚
https://zerojudge.tw/ShowProblem?problemid=a004
#西元年被4整除且不被100整除,或被400整除者即為閏年
while True:
    try:
        Y=int(input())
    except: break
    
    if (Y%4==0 and Y%100!=0)or Y%400==0 :
        print('閏年')
    else :
        print('平年')

題目5. a005: Eva 的回家作業
https://zerojudge.tw/ShowProblem?problemid=a005
n=int(input())
for i in range(n):
    L=input().split()
    #A=[int(L[0]),int(L[1]),int(L[2]),int(L[3])]
    A= list(map(int,L))#一個將 L 串列中的元素取int的簡潔方法
    
    if A[1]-A[0] == A[2]-A[1] : #等差
        A.append(A[3]+A[2]-A[1])
    else: #等比
        A.append(A[3]*int(A[2]/A[1]))
    #把 A 串列中的元素塞到空字串R裡面,並用空白字元隔開
    R=""
    for a in A:
        r=str(a) #別忘了 A中的元素已被轉換成int了,要做字串運算的話要再轉換回來
        R=R+r+" " 
    print(R.strip())#用字串內建strip函式將頭尾多餘的空白字元刪除

以上五題供大家參考,初學者有空可繼續把全部基本題都做完