2010年2月25日 星期四

2010/02/22 學生成績的排名次

說明:請寫一個程式,老師可以輸入全班的「程式設計」成績,並依總分來排名次,學生人數不超過50人。
輸入格式:依學號輸入學科「程式設計」的成績1-50比。 學號與成績已1個空白隔開
輸出格式:輸入之資料排名表,依學號的順序輸出,同分者名次必須相同,第二行起為學生學號、成績與名次,各以七個空白隔開。
輸入範例:
1 56
2 88
3 44
4 44
5 22

輸出:
學號   程式設計   名次
1           56             2
2           88             1
3           44             3
4           44             3

9 則留言:

  1. Dim nn(50), mm(50), hh(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Print #2, "學號 程式設計 名次"
    n = 1
    k = 1
    While Not EOF(1)
    Input #1, nn(n), mm(n)
    n = n + 1
    Wend
    n = n - 1
    For i = 1 To n - 1
    hh(i) = i
    For j = i To n
    If mm(i) < mm(j) Then
    change mm(i), mm(j)
    change nn(i), nn(j)
    End If
    Next j
    Next i
    hh(1) = 1
    For i = 2 To n
    If mm(i) = mm(i - 1) Then
    hh(i) = k
    Else
    hh(i) = k + 1
    End If
    k = k + 1
    Next i
    For i = 1 To n - 1
    For j = i To n
    If nn(i) > nn(j) Then
    change mm(i), mm(j)
    change nn(i), nn(j)
    change hh(i), hh(j)
    End If
    Next j
    Next i
    For i = 1 To n
    Print #2, nn(i) & " " & mm(i) & " " & hh(i)
    Next i
    Close #1
    Close #2
    End Sub
    Public Sub change(a, b)
    q = a
    a = b
    b = q
    End Sub

    回覆刪除
  2. Private Sub Form_Load()
    Print "學號 程式設計 名次"
    Dim id(50), grade(50), rank(50) As Integer

    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    x = 0
    Do Until EOF(1)
    Input #1, id(x + 1), grade(x + 1)
    x = x + 1
    Loop
    For i = 1 To x - 1
    For j = i To x
    If grade(i) < grade(j) Then
    zxc grade(i), grade(j)
    zxc id(i), id(j)
    End If
    Next j
    Next i
    For i = 1 To x
    If grade(i) = grade(i - 1) Then
    rank(i) = rank(i - 1)
    Else
    rank(i) = i
    End If
    Next i
    For i = 1 To x
    For j = i To x
    If id(i) > id(j) Then
    zxc grade(i), grade(j)
    zxc id(i), id(j)
    zxc rank(i), rank(j)
    End If
    Next j
    Print id(i) & Space(7) & grade(i) & Space(7) & rank(i)
    Next i
    Close #1
    Close #2
    End Sub
    Public Sub zxc(a, b)
    c = a
    a = b
    b = c
    End Sub
    跟上面大同小異==

    回覆刪除
  3. 阿瑋好,
    剛剛想另外一題(整數分割),想得很累人,看到你寫的這題,突然覺得好親切。
    你這題就是排序而已。你寫的程式是對的。
    只是,
    這題適合用類似「計次」排序的方式,
    原先設定每個人都是第1名,然後看幾個人分數贏他,就加幾次。(同分不用加)。
    這樣子只要算一次(雙迴圈),你的程式用了兩次排序(雙迴圈)。

    回覆刪除
  4. Y揚好,
    1.你的print都沒有進檔案吧。
    2.
    x = 0
Do Until EOF(1)
Input #1, id(x + 1), grade(x + 1)
x = x + 1
Loop
    可更改成-->
    x = 0
Do Until EOF(1)
    x = x + 1
Input #1, id(x ), grade(x)
Loop
    意思一樣,但是比較清楚。
    3.你的排法和阿瑋的一樣,所以,也可以嘗試用「計次」的方式。

    回覆刪除
  5. Dim a(50), b(50), c(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "/in.txt" For Input As #1
    ii = 0
    jj = 0
    Do While Not EOF(1)
    Input #1, a(ii), b(ii)
    n = b(ii)
    For k = 0 To jj
    If c(k) < n Then change n, c(k): jj = jj + 1
    If c(k) = n Then Exit For
    Next k
    ii = ii + 1
    Loop
    Close #1
    Open App.Path & "/out.txt" For Output As #2
    Print #2, "學號 程式設計 名次"
    For i = 0 To ii - 1
    Print #2, a(i) & Space(7) & b(i) & Space(7);
    For k = 0 To jj
    If b(i) = c(k) Then Print #2, k + 1: Exit For
    Next k
    Next i
    Close #2
    End Sub

    Public Sub change(x, y)
    z = x
    x = y
    y = z
    End Sub

    回覆刪除
  6. 高仔好,
    你的c(k)是多少?
    你想用c陣列來記住分數,由大到小。
    然後在輸出時,再去比對分數是第幾個,印出第幾名,但是,同分的話,下一名會出錯吧?
    例如,1 2 3 3 5 6
    你的程式會出現有第4名的吧?
    你們還是沒有將你們用的例子給po上來的習慣哦,試著改改吧。這樣更清楚你的程式是否正確哦。

    回覆刪除
  7. Dim x(50) As Integer
    Dim num(50) As Integer
    Dim ans(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    i = 1
    Do While Not EOF(1)
    Input #1, nnn, xxx
    num(i) = Val(nnn)
    x(i) = Val(xxx)
    i = i + 1
    MaxI = i - 1
    Loop
    For i = 1 To MaxI
    ans(i) = MaxI
    Next i
    For i = 1 To MaxI
    For j = 1 To MaxI
    If x(i) > x(j) Then ans(i) = ans(i) - 1
    If x(i) = x(j) And num(i) <> num(j) Then ans(i) = ans(i) - 1
    Next j
    Next i
    Close #1
    Open App.Path & "\out.txt" For Output As #1
    Print #1, "學號 程式設計 名次"
    For i = 1 To MaxI
    Print #1, num(i) & " " & x(i) & " " & ans(i)
    Next i
    Close #1
    End Sub

    回覆刪除
  8. 小白好,
    1. 以下的這兩行,如果順序對調一下,程式看起來會順些。
    i = i + 1
    maxI = i -1
    --->
    maxI = i
    i = i+1

    2.你的程式是對的。
    3.計名次的方式,可以用:
    i.先假設每個人都是第一名。
    ii.每輸給一個人,名次加1。

    這樣是符合題意的相同分數相同名次,而且下一個分數的人,名次也會跳過去。

    回覆刪除
  9. 現在會SQL語法之後發現這個根本只要1行指令阿 哈哈

    回覆刪除