1. 程式人生 > 其它 >【結構體】小白看過來:基礎篇-簡單結構題的使用(成績排序)

【結構體】小白看過來:基礎篇-簡單結構題的使用(成績排序)

技術標籤:題解基礎知識c++c語言

結構體~Struct

前言:我們在程式碼編寫過程中經常遇到一些需要將某些擁有共同性質的元素表示出來,但是如果每個元素都需要編寫一次這些重複的性質的時候,程式碼就會變得冗長,因此我們選擇採用一種特殊的資料型別:結構體

題目描述:
成績排序[結構體的使用]
建立一個結構體,讀入並儲存 n 個學生的考試資訊,每個學生的資訊包括學號,姓名和考試分數。然後對學生的分數進行排序(由高到低),若分數相同則按學號排序(由小到大)。最後按照“學號 姓名 成績”的格式逐行列印成績表(可參考Sample Input和Sample Output)。

Sample Input


4
1 a 90
2 b 80
3 c 90
4 d 100

Sample Output
4 d 100
1 a 90
3 c 90
2 b 80

注意:
1、學號的範圍是1-- n 且 n < 100;

2、學生的姓名由一個字母字串表示(長度不大於10);

3、分數約定為0–100的整數;

4、儲存結構可自由選擇;

5、輸出的每一行最後都帶換行符。

題解:

首先建立一個結構體

struct gradeTable//將成員變數建立起來
{
	int studentID;
	char name[20];
	int grade;
}stu[100], t;//定義struct gradeTable型別的陣列和變數

排序的核心

scanf
("%d", &n); for(i = 0; i < n; ++i) { scanf("%d%s%d", &stu[i].studentID, stu[i].name, &stu[i].grade); } //用 陣列名.成員變數 來訪問所需要的成員變數,這裡我們用陣列來存放n位學生的資訊 for (i = 0; i < n-1; i++) for (j = i+1; j < n; j++)//將第i個與其之後的所有元素進行比較 if (stu[i].grade < stu[j].grade ||
(stu[i].grade == stu[j].grade&&stu[i].studentID > stu[j].studentID)) { t = stu[i];//這裡的t是中間變數 stu[i] = stu[j]; stu[j] = t; }

完整程式碼如下:

#include<stdio.h>
#include<stdlib.h>

struct gradeTable
{
	int studentID;
	char name[20];
	int grade;
}stu[100], t;

int main()
{
	int n;
	int i, j;
	scanf("%d", &n);
	for(i = 0; i < n; ++i)
	{
		scanf("%d%s%d", &stu[i].studentID, stu[i].name, &stu[i].grade);
	}
	
	for (i = 0; i < n-1; i++) 
		for (j = i+1; j < n; j++)
			if (stu[i].grade < stu[j].grade || 
				(stu[i].grade == stu[j].grade&&stu[i].studentID > stu[j].studentID)) {
				t = stu[i];
				stu[i] = stu[j];
				stu[j] = t;
			} 
	
	for(i = 0; i < n; ++i)
	{
		printf("%d %s %d\n", stu[i].studentID, stu[i].name, stu[i].grade);
	}
	
	return 0;
}

注意:用陣列存放成員變數的時候,我舉個例子,有三名學生A,B,C,有三個成員變數:性別,年齡,姓名。
定義一個struct student stu[3]這樣的一個數組,那麼stu[0]存放的是學生A的性別,年齡,姓名,stu[1]存放的是學生B的性別,年齡,姓名。以此類推。這對初學者理解結構體陣列有著很大的幫助!