/*這是幫別人做的一道作業的,其實也沒有什麼記錄的意義。<br />只不過是在做的過程中,我遇到了上一次組隊去比賽時遇到的結構體排序問題,結構體指標是不能用p++來進行移位的。。。所以要記下來。<br />*/</p><p>/*<br />某唱歌比賽決賽有5名選手入圍,<br />共有六位評委分別給每位選手打分<br />;對每個選手,去掉一個最高分和一個最低分後,<br />取剩餘的四個得分的平均值作為該選手的最後得分;<br />編程實現按選手最後得分的降序排列,<br />依此輸出選手的名次、參賽編號、姓名以及最後得分。<br />(自行設計一個合適的結構體類型,包含必要的成員)<br />*/</p><p>#include<stdio.h></p><p>#define LEN 20</p><p>typedef struct Player<br />{<br />char name[LEN] ; //名字<br />int num ;//編號<br />int position ;//名次<br />float score[6] ;//分數<br />float average ;//最終分數</p><p>} Player ;</p><p>void SetInformation(Player *p , int i) ; //設定資料<br />void SetPosition(Player *p , int i ) ;// 排序<br />void PrintPlayer(Player *p ,int i) ; //列印</p><p>int main(void)<br />{<br />Player p[5] ;<br />int i = 0 ;</p><p>for( ; i < 5 ; i++)<br />{<br />SetInformation(&p[i] , i) ;<br />printf("/n/n/n") ;<br />}</p><p>SetPosition(p,i) ;</p><p>puts("The Player List:") ;<br />for(i = 0 ; i < 5 ; i++)<br />{<br />PrintPlayer(&p[i],i) ; //結構體排序,不能用指印+1來向後移位<br />printf("/n/n") ;<br />}</p><p>return 0 ;<br />}</p><p>/*設定*/<br />void SetInformation(Player *p , int i )<br />{<br />int j = 0 ;<br />float total = 0.0;<br />float max = 0.0, min = 0.0 ;</p><p>printf("Please enter the %d Player information./n", i+1 ) ; //第一次提示輸入</p><p>printf("Please enter the name : ") ;<br />gets(p->name) ;</p><p>printf("Please enter the num : ") ;<br />scanf("%d",&(p->num)) ;</p><p>printf("Please enter the score : ") ;<br />scanf("%f",&(p->score)[j]) ; </p><p>max = min = (p->score)[j] ;<br />total += (p->score)[j] ;<br />j++ ;</p><p>while( j < 6 )<br />{<br />printf("Please enter the next score : ") ;<br />scanf("%f",&(p->score)[j]) ; </p><p>if(max < (p->score)[j])<br />{<br />max = (p->score)[j] ;<br />}<br />else if(min > (p->score)[j])<br />{<br />min = (p->score)[j] ;<br />}</p><p>total += (p->score)[j] ;</p><p>j++ ;<br />}</p><p>p->average = (total - max - min) / 4 ; //要減少最大和最小值</p><p>while(getchar() != '/n') //清除多餘的輸入<br />continue ;<br />}</p><p>/*利用冒泡排序,不過沒有設定成員的position值,設定position值留在列印那一步*/<br />void SetPosition(Player *p, int i )<br />{<br />int j = 0 ;<br />int k = 0 ;<br />Player temp ;<br />int finish = 1 ;</p><p>for(j = 0 ; j < i ; j++)<br />{<br />finish = 1 ; //如果本來就是降序的,就無需比較,用這一個來判斷<br />for(k = 0 ; k < i - j -1; k++)<br />{<br />if(p[k+1].average > p[k].average)<br />{<br />temp = p[k+1] ; //結構體整合賦值,方便,快捷<br />p[k+1] = p[k];<br />p[k] = temp ;</p><p>finish = 0 ;<br />}<br />}<br />if(1 == finish)<br />break ;<br />}<br />}</p><p>/*列印,順便設定postion值.*/<br />void PrintPlayer(Player *p ,int i)<br />{<br />p->position = i + 1 ; //這裡<br />printf("Name: ") ;<br />puts(p->name) ;</p><p>printf("Num: ") ;<br />printf("%d/n",p->num) ;</p><p>printf("Score: ") ;<br />printf("%f/n",p->average) ;</p><p>printf("Position: ") ;<br />printf("%d/n",p->position);<br />}