成績排序是常有的需求,現在就來用c++實現一下
/1.需求/
1.輸入的第一行資料是學生的總數n,正整數,不會超過int的範圍。
2.接下來n行格式是:學生名稱 學生語文成績 學生數學成績 學生英語成績
3.輸出有n行,格式是:排名 學生名 學生總成績
4.輸出按排名公升序排列,排名根據總成績計算。
我們來分析一下這個需求,首先儲存資料我們肯定需要陣列,而這個陣列的長度不定,需要讓使用者來定義,學生名稱、學生成績的資料型別不同,需要乙個「可以同時盛放多個型別的復合型別」,排序就根據我們之前講過的氣泡排序來排序。
/2.讓使用者定義長度的陣列/
之前講過普通陣列的定義方式:
型別 名稱[長度] =
有些時候,長度是乙個不確定的值,這時候我們就需要使用變長陣列來實現,注意,像下面的第二條語句是非法的:
型別 * 名稱 = new 型別[不確定長度]// 型別 名稱[不確定長度] = 使用陣列delete 名稱
new用於申請一些記憶體空間並返回他們的位址,*代表指標,它指向這塊位址,注意!new必須和delete配對!
我們先定義乙個用於存放學生資料的可變長陣列:
#include using namespace std;int main()
由於???這個資料型別必須要能儲存多種型別的資料,所以我們要學習一種新的資料結構——結構體。
/2.結構體/
結構體的定義簡直不要太簡單:
struct 結構體名;
比如需要乙個student結構體就可以這樣定義:
struct student;
裡面可以儲存int型別的三個成績和string型別的名字。
string型別和char型別一樣,都表示字串,不過string包含在string標頭檔案裡且沒有長度限制。
那麼如何建立乙個結構體變數呢?很簡單:
結構體名 變數名 = ;
比如給student建立乙個變數piggy,name為piggy,三門分數全部為100
student piggy = ;
那麼如何訪問結構體裡的資料呢?很簡單,只需要用成員操作符 . 就可以了:
cout << piggy.name << ' ' << piggy.chinese << ' ' << piggy.math << ' ' << piggy.english;
這樣就輸出:
piggy 100 100 100
記住,定義了乙個結構體之後,要是使用這個結構體,就把這個結構體的名字當成乙個型別就好了,定義結構體陣列的格式如下:
普通陣列:結構體名 名稱[長度] = ,...}變長陣列:結構體名 * 名稱 = new 結構體名[不確定長度]
這樣就可以把上面的問號補充完整了:
student * stu = new student[n];
/3.逐個讀取資料/
int n; cin >> n; student * stu = new student[n]; string na; int c,m,e; for (int i=0;i cin >> na >> c >> m >> e; stu[i].name = na; stu[i].chinese = c; stu[i].math = m; stu[i].english = e; }
在8-11行,我們動態更改了結構體(陣列裡的結構體)變數,格式如下:
結構體(陣列裡的結構體)變數名.屬性名 = 值
/4.排序資料/
根據我們之前講到過的演算法,寫出排序**:
for (int i = 0;i-1;i++) } }
接下來輸入資料會輸出相應排名
今天你學廢了嗎
C 結構體排序
在c 中,對結構體的排序方式比c語言豐富的多。在c語言中,我們主要是通過qsort進行排序操作 拋開手寫排序演算法不說 在c 中,有乙個十分強大的排序函式sort,他的內部綜合了許多種排序演算法,因此非常高效。並且,用它來對結構體排序也十分方便。先貼一段示例 1 include 2 include ...
C語言結構體和結構體排序
結構體 結構體是一種構造資料型別 構造資料型別包括 陣列型別 結構體型別 共用體型別 定義 把不同的資料組合成乙個整體。結構體的一般形式struct 結構體名稱 struct是關鍵字 不要忘記這裡的分號定義結構體的三種方法 第一種 先定義結構體型別,在定義變數名 struct student str...
C 結構體陣列排序
c 中的結構體排序,最常用到的應該就是對結構體的某乙個元素進行排序,其他元素與被排序元素關聯 比如這樣的結構體 typedef struct studentstudent score 3 代表三門成績,0 math,1 chinese,2 english typedef struct student...