1. 程式人生 > 其它 >7-5 實驗11_3_結構排序 (100分)

7-5 實驗11_3_結構排序 (100分)

技術標籤:練習c語言

有n名學生,每個學生的屬性包括姓名與總成績。已知學生的姓名與總成績,你的任務是將學生的資訊按照以下方式排序:首先比較總成績,總成績高的在前面,總成績低的在後面,當總成績相同時,你要比較學生的姓名,姓名字典序小的同學在前面,姓名字典序大的同學在後面(ASCII碼順序)。n的範圍是1—100;學生的姓名中只能包含大小寫字母,不會超過20個字元;總成績為整數。
要求:在本題中,你要設計一個結構來儲存學生的資訊。在此結構中,需要有一個字元陣列來儲存姓名,一個整型變數儲存總成績。 輸入與輸出要求:輸出:。。

輸入格式:
首先輸入一個正整數n,代表學生的數量,1<=n<=100;每名學生的資訊按照姓名、總成績的順序輸入(空格分開),每名學生資訊佔一行。具體格式見樣例。

輸出格式:
n名學生的資訊,姓名佔一行,總成績佔一行,輸出順序要按照題目的要求,每名同學的資訊後都再輸出一個空行。 注意:每名同學的資訊後都再輸出一個空行。
輸入樣例:
4
AlbertEinstein 1328
GeorgeWalkerBush 860
LiuMengmeng 1475
BillGates 1328
輸出樣例:
Name:LiuMengmeng
total:1475
Name:AlbertEinstein
total:1328
Name:BillGates
total:1328
Name:GeorgeWalkerBush
total:860

#include<stdio.h>
#include<string.h> struct student{ char name[21]; int grade; }; void swap(struct student *s1,struct student *s2){ struct student tmp; tmp=*s1; *s1=*s2; *s2=tmp; } main(){ int n; scanf("%d",&n); getchar(); struct student s1[n],*tmp,*t1,*t2; int i,j; for(i=0;i<n;
i++){ scanf("%s%d",s1[i].name,&s1[i].grade); }//輸入 for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++){ if(s1[j].grade<s1[j+1].grade){ swap(&s1[j],&s1[j+1]); }else if(s1[j].grade==s1[j+1].grade){ if(strcmp(s1[j].name,s1[j+1].name)>0){ swap(&s1[j],&s1[j+1]); } } } }//排序 for(i=0;i<n;i++){ printf("Name:%s\n",s1[i].name); printf("total:%d\n\n",s1[i].grade); } }