說明:請寫一個程式,老師可以輸入全班的「程式設計」成績,並依總分來排名次,學生人數不超過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
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
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
跟上面大同小異==
阿瑋好,
回覆刪除剛剛想另外一題(整數分割),想得很累人,看到你寫的這題,突然覺得好親切。
你這題就是排序而已。你寫的程式是對的。
只是,
這題適合用類似「計次」排序的方式,
原先設定每個人都是第1名,然後看幾個人分數贏他,就加幾次。(同分不用加)。
這樣子只要算一次(雙迴圈),你的程式用了兩次排序(雙迴圈)。
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.你的排法和阿瑋的一樣,所以,也可以嘗試用「計次」的方式。
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
高仔好,
回覆刪除你的c(k)是多少?
你想用c陣列來記住分數,由大到小。
然後在輸出時,再去比對分數是第幾個,印出第幾名,但是,同分的話,下一名會出錯吧?
例如,1 2 3 3 5 6
你的程式會出現有第4名的吧?
你們還是沒有將你們用的例子給po上來的習慣哦,試著改改吧。這樣更清楚你的程式是否正確哦。
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
小白好,
回覆刪除1. 以下的這兩行,如果順序對調一下,程式看起來會順些。
i = i + 1
maxI = i -1
--->
maxI = i
i = i+1
2.你的程式是對的。
3.計名次的方式,可以用:
i.先假設每個人都是第一名。
ii.每輸給一個人,名次加1。
這樣是符合題意的相同分數相同名次,而且下一個分數的人,名次也會跳過去。
現在會SQL語法之後發現這個根本只要1行指令阿 哈哈
回覆刪除