5-3 模擬EXCEL排序 (25分)
阿新 • • 發佈:2018-12-24
Excel可以對一組紀錄按任意指定列排序。現請編寫程式實現類似功能。
輸入格式:
輸入的第一行包含兩個正整數N(≤105) 和C,其中N是紀錄的條數,C是指定排序的列號。之後有 N行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數字,保證沒有重複的學號)、姓名(不超過8位且不包含空格的字串)、成績([0, 100]內的整數)組成,相鄰屬性用1個空格隔開。
輸出格式:
在N行中輸出按要求排序後的結果,即:當C=1時,按學號遞增排序;當C=2時,按姓名的非遞減字典序排序;當C=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; }