7-5 實驗11_3_結構排序 (100分)
阿新 • • 發佈:2021-01-03
有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);
}
}