我有一項作業,我必須使用一個結構來輸入學生資訊。然后我必須將學時從大到小排序。我專注于整數排序回圈,我只是不明白為什么我的程式輸出不正確。
#include <stdlib.h>
#include <stdio.h>
struct Student {
char name[21] 。
int credits;
} s[99]。
int main()
{
int students;
int tempCred = 0;
char tempName[21] 。
printf("How many students? : ")。
scanf_s("%d"/span>, &students)。
for (int i = 0; i < students; i )
{
printf("
學生姓名?:")。)
scanf_s("%s", &s[i].name, 21) 。
printf("
信用額度被拿走了嗎?)
scanf_s("%d"/span>, &s[i].credits)。
}
for (int i = 0; i < students; i ) {
for (int j = 0; j < students; j ) {
if (s[j].credits > tempCred) {
tempCred = s[j].cred。
s[i].credits = s[j].credits。
s[j].cred = tempCred;
}
}
printf("
%d"/span>, s[i].credits)。
}
}
例如,如果我在被問及學分時輸入2、6和8,程式將輸出'8、6、8'。我對排序并不陌生,但由于某些原因,當我看這段代碼時,有些東西是沒有意義的。誰能幫我把這些整數從大到小排序?謝謝!
注意:我知道有更好的方法可以做到這一點,但我的教授讓我們嚴格使用C語言,根本沒有C 。我只是需要幫助對整數進行排序。
uj5u.com熱心網友回復:
有各種用于排序的技術。例如,冒泡排序、快速排序、插入排序,等等。最簡單的是冒泡排序 - 但它并不是最有效的。
在你的程式中,你有一個struct陣列。你已經完成了將結構插入陣列的部分,這很好。問題出在第二部分--排序。你有一個for回圈,從第一個元素(即0)開始,一直到最后一個元素(即students-1)。嵌套在這個回圈里面的是另一個for回圈--它也有同樣的范圍。
不,這是不對的。取而代之的是將第一個和第二個for回圈替換成這樣:
for (int i = 0 ; i < students-1 ; i )
{
for (int j = i 1; j < students ; j )
{
...
}
}
在這里,外層的for回圈從元素0開始,一直到最后一個元素之前的。內部for回圈從外部for回圈所存盤的下一個元素開始(即j = i 1)。因此,如果i = 0,j = 1。這個回圈一直持續到結構陣列的最后一個元素。
現在,在內部的for回圈中指定條件。在你的案例中,你希望它們按照學分的降序(從高到低)進行排序。
for (int i = 0 ; i < students-1 ; i )
{
for (int j = i 1; j < students ; j )
{
if(s[j].credits > s[i].credits) // then swap the credits.
{
tempCred = s[j].credits ;
s[j].credits = s[i].credits 。
s[i].credits = tempCred ;
}
}
}
注意,j比i大一,所以如果i=0,j=1,那么if陳述句為
如果陣列元素1中的結構所持有的信用額度大于陣列元素0中的結構所存盤的信用額度,那么...
如果條件得到滿足,這兩個結構中的信用額度將被交換。
這是一個 "泡沫排序 "的實作。請參閱這個以了解更多技術和解釋。
最后,你可以顯示學分:
for(int index = 0 ; index < students ; index )
{
printf("
%d", s[index].credits) 。
}
就像評論中很多人說的,使用除錯器。它可以幫助你追蹤你的程式的邏輯。
uj5u.com熱心網友回復:
就像@Barmar所說的,使用glibc的qsort() 函式。
這不僅比你自己寫方法要簡單,而且平均速度O(N log N)要快得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306940.html
標籤:
