2011年7月23日 星期六

電費系統

假設你身為一個台電工程師,你正要為 GOGO 百貨的電梯設計一套電費計算系統,來計算GOGO 百貨的電梯每天所耗的電費是多少。已知電梯所耗的電力會和它所運作的樓層成正比,但是電梯下樓比上樓要省電。所以想請你根據下面這個規則,設計一套電費計算系統。
(1) 電梯上樓時,每經過一個樓層,要花電費 20 元。
(2) 電梯下樓時,每經過一個樓層,要花電費 10 元。
(3) 你可以假設電梯停在某一個樓層時不會耗電。
舉例來說:今天有一個電梯從2 樓到8 樓再到5 樓,則所耗的電費為:從2樓到8 樓,所耗的電費是(8-2) x 20 = 120 元。電梯從8 樓到5 樓,所耗的電費是(8-5) x 10 = 30 元。所以總共花了150 元。
輸入說明 :
輸入檔中會有多筆資料,第一行是一個整數 N(1<=50),用來表示某一天中電梯所停過的樓層數。第二行是一組以空白分隔的n 個數字,分別表示電梯先後停過的樓層。 N=0 的時候,程式結束。
輸入測資中的電梯樓層最高不會超過 101 樓。
輸出說明 :
請根據電梯上下運作的樓層,計算出在一日中電梯運作所花的電費。(為了節能減碳,每日電費最高不會超過10,000 元。)
範例輸入 :
3
2 8 5
7
2 9 7 3 4 6 1
0

範例輸出 :
150
310

6 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, N
    Do

    ans = 0
    List1.Clear
    For i = 1 To N
    Input #1, X
    List1.AddItem X
    Next i

    For i = 0 To (List1.ListCount - 2)
    If Val(List1.List(i)) < Val(List1.List(i + 1)) Then
    ans = ans + UP_sub(Val(List1.List(i)), Val(List1.List(i + 1)))
    Else
    ans = ans + DOWN_sub(Val(List1.List(i)), Val(List1.List(i + 1)))
    End If
    Next i

    Print #2, ans
    Input #1, N
    Loop Until N = 0
    Close #2
    Close #1
    End
    End Sub


    Function UP_sub(A, B) '左原、右後
    UP_sub = (B - A) * 20
    End Function

    Function DOWN_sub(A, B) '左原、右後
    DOWN_sub = (A - B) * 10
    End Function

    回覆刪除
  2. 佑好,
    程式應該正確。
    **
    題目中->為了節能減碳,每日電費最高不會超過10,000 元
    是說,如果超過10000的話?會將電梯停了?
    還有,你題目中,有理這一條嗎?
    **
    哦,所以,你沒理這好玩的一條規則,結果-->0分。

    回覆刪除
  3. 熊掌好,

    所以除了超過10000這部份
    要思考他會如何運作以外,


    輸入測資中的電梯樓層最高不會超過 101 樓。
    要去做判斷嗎?

    回覆刪除
  4. Dim x
    Private Sub Form_Load()
    Me.Hide

    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, n
    If n <> 0 Then Line Input #1, x: Call Run
    Loop
    Close
    Close

    End
    End Sub


    Sub Run()
    Dim tmp#, a#, ans As Integer, s
    s = Split(x)

    For i = 0 To UBound(s)
    If tmp = 0 Then tmp = s(0)
    a = s(i)
    If a > tmp Then ans = ans + (20 * (a - tmp))
    If a < tmp Then ans = ans + (10 * (tmp - a))
    tmp = a
    Next
    Print #2, ans

    End Sub

    回覆刪除
  5. 佑好,
    根據以往的技藝競賽的規定,輸入的會是正確的,也就是說不會出現超過101層樓。
    但是,計算中,有可能超過10000元電費的,是要你去停止它的。
    (好像有些難懂的感覺,輸入是會正確的,但是,題目有些地方說那些錯誤的,那是會出現的。)
    (例如另外一題的身份証檢查,男女的號碼各為1、2,其它就出錯了,這表示你要檢查,1、2以外的錯誤。)

    回覆刪除
  6. arro好,
    原以為程式正確,
    啊,你也沒管會不會大於10000元電費的部分。
    所以,不算正確。
    改進點1:
    Call Run()
    加個()才是正確的副程式寫法。
    改進點2:
    If tmp = 0 Then tmp = s(0)
    放在迴圈中沒必要,直接在迴圈外
    tmp=s(0)
    然後,迴圈少1個。
    改進點3:
    當然你要在印出前,設定if ans> 10000 then ans=10000

    回覆刪除