1. 程式人生 > >5-3 模擬EXCEL排序 (25分)

5-3 模擬EXCEL排序 (25分)

Excel可以對一組紀錄按任意指定列排序。現請編寫程式實現類似功能。

輸入格式:

輸入的第一行包含兩個正整數NN(\le 10^5105) 和CC,其中NN是紀錄的條數,CC是指定排序的列號。之後有 NN行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數字,保證沒有重複的學號)、姓名(不超過8位且不包含空格的字串)、成績([0, 100]內的整數)組成,相鄰屬性用1個空格隔開。

輸出格式:

NN行中輸出按要求排序後的結果,即:當C=1C=1時,按學號遞增排序;當C=2C=2時,按姓名的非遞減字典序排序;當C=3C=3時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。

輸入樣例:

3 1
000007 James 85
000010 Amy 90
000001 Zoe 60

輸出樣例:

000001 Zoe 60
000007 James 85
000010 Amy 90
最開始的程式碼只有 22分  (選擇排序被嫌棄了)悲傷那麼大555555
#include<stdio.h>
#include<string.h>
struct excel{
    char id[11];//定義學生的學號
    char name[13];//定義學生的名字,按照字串型
    int grades;//成績是0-100所以用int型表示
};
struct excel sort[100005];//定義陣列的大小
/*這個是按照id進行排序,為什麼我這次用這個註釋呢!因為我喜歡(^.^)*/
void sortById(int n){
    int i=0,j=0;//你們知道我要幹什麼了吧!!!!
    struct excel cache;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(strcmp(sort[i].id,sort[j].id)>0){
             cache=sort[i];
             sort[i]=sort[j];
             sort[j]=cache;
            }
        }
    }
}
/*這個是按照name進行排序*/
void sortByName(int n){
    int i=0,j=0;//你們知道我要幹什麼了吧!!!!
    struct excel cache;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(strcmp(sort[i].name,sort[j].name)>0){
             cache=sort[i];
             sort[i]=sort[j];
             sort[j]=cache;
            }
            if(strcmp(sort[i].name,sort[j].name)==0){//如果相等按照學號的升序來
                if(strcmp(sort[i].id,sort[j].id)>0){
                    cache=sort[i];
                    sort[i]=sort[j];
                    sort[j]=cache;
                }
            }
        }
    }
}
/*這個是按照成績進行排序(為什麼有按照成績排序這個東西啊!莫名的憂傷(寶寶不開心了!!))*/
void sortByGrades(int n){
    int i=0,j=0;//你們知道我要幹什麼了吧!!!!
    struct excel cache;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(sort[i].grades>sort[j].grades){
             cache=sort[i];
             sort[i]=sort[j];
             sort[j]=cache;
            }
            if(sort[i].grades==sort[j].grades){//如果相等按照學號的升序來
                if(strcmp(sort[i].id,sort[j].id)>0){
                    cache=sort[i];
                    sort[i]=sort[j];
                    sort[j]=cache;
                }
            }
        }
    }
}
int main(){


    int num=6,j=0;//定義一個用來記錄學號的計數器
    int n,c;//定義一個用來存放多少行的n,和一個用來指定按照什麼排序的c
    scanf("%d%d",&n,&c);
    int i=0;//定義我們的老朋友計數器i,初始化0
    if(n==0){
        return 0;//沒有行返回0
    }
    while(n--){//y依次輸入學號,名字,和成績
        scanf("%s %s %d",&sort[i].id,&sort[i].name,&sort[i].grades);
        i++;//計數器加一
    }
    n=i;//讓n恢復成原來的樣子,好像這句話在哪裡見過,應該是魔法小櫻。。。。。。。。
    switch(c){//這裡用switch,你不喜歡的話就自己換成if語句,反正我就用這個,你能把我怎麼滴
    case 1:sortById(n);break;
    case 2:sortByName(n);break;
    case 3:sortByGrades(n);break;
    default:
    break;
    }
    i=0;//計數器再次賦值為0
    n--;//最後一個不能有換行符
    while(n--){
        printf("%s %s %d\n",sort[i].id,sort[i].name,sort[i].grades);//列印輸出
        i++;//計數器加一
    }
    printf("%s %s %d",sort[i].id,sort[i].name,sort[i].grades);//列印最後一個沒有換行符的資料
    return 0;
}
下面是滿分的程式碼用的是c++因為我不怎麼會快排所有隻好用了c++的自帶函式sort
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;//必須寫這個不然sort會丟擲異常
struct excel{
    char id[11];//定義學生的學號
    char name[13];//定義學生的名字,按照字串型
    int grades;//成績是0-100所以用int型表示
};
struct excel strl[100005];//定義陣列的大小
/*這個是按照id進行排序,為什麼我這次用這個註釋呢!因為我喜歡(^.^)*/
int sortById(struct excel one,struct excel two){
    return strcmp(one.id,two.id)<0;
}
/*這個是按照name進行排序*/
int sortByName(struct excel one,struct excel two){
    if(strcmp(one.name,two.name)==0){//到兩個名字一樣的時候
        return strcmp(one.id,two.id)<0;//返回id按照的是升序
    }
    else return strcmp(one.name,two.name)<0;//返回按照名字升序
}
/*這個是按照成績進行排序(為什麼有按照成績排序這個東西啊!莫名的憂傷(寶寶不開心了!!))*/
int sortByGrades(struct excel one,struct excel two){
    if(one.grades==two.grades){//到兩個成績一樣的時候
        return strcmp(one.id,two.id)<0;//返回id按照的是升序
    }
    else return one.grades<two.grades;//返回按照成績升序
}
int main(){


    int num=6,j=0;//定義一個用來記錄學號的計數器
    int n,c;//定義一個用來存放多少行的n,和一個用來指定按照什麼排序的c
    scanf("%d%d",&n,&c);
    int i=0;//定義我們的老朋友計數器i,初始化0
    if(n==0){
        return 0;//沒有行返回0
    }
    while(n--){//y依次輸入學號,名字,和成績
        scanf("%s %s %d",&strl[i].id,&strl[i].name,&strl[i].grades);
        i++;//計數器加一
    }
    n=i;//讓n恢復成原來的樣子,好像這句話在哪裡見過,應該是魔法小櫻。。。。。。。。
    switch(c){//這裡用switch,你不喜歡的話就自己換成if語句,反正我就用這個,你能把我怎麼滴
    case 1:sort(strl,strl+n,sortById);//由於我不怎麼會快排所以這裡就直接用sort
    break;
    case 2:sort(strl,strl+n,sortByName);
    break;
    case 3:sort(strl,strl+n,sortByGrades);
    break;
    default:
    break;
    }
    i=0;//計數器再次賦值為0
    n--;//最後一個不能有換行符
    while(n--){
        printf("%s %s %d\n",strl[i].id,strl[i].name,strl[i].grades);//列印輸出
        i++;//計數器加一
    }
    printf("%s %s %d",strl[i].id,strl[i].name,strl[i].grades);//列印最後一個沒有換行符的資料
    return 0;
}