void order(struct stu arr[], int n) {
struct stu temp;
int i, j;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - 1 - i; j++)
if (arr[j].score[3] > arr[j+1].score[3]) { // 比較平均分
temp = arr[j]; // 結構體整體指派
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
演算法:標準冒泡排序,外層控制輪數,內層相鄰比較交換,大值沉底。
比較鍵:score[3](平均分)。
交換單位:整個結構體(姓名、學號、三科分、平均分一次交換)。
void output(struct stu arr[], int n) {
int i, j;
printf("********************TABLE********************\n");
printf("------------------------------------------------\n");
printf("| %10s | %8s | %7s | %7s | %7s | %7s |\n",
"Name", "Number", "English", "Math", "Physics", "Average");
printf("------------------------------------------------\n");
for (i = 0; i < n; i++) {
printf("| %10s | %8ld |", arr[i].name, arr[i].number);
for (j = 0; j < 4; j++)
printf(" %7.2f |", arr[i].score[j]);
printf("\n------------------------------------------------\n");
}
}
格式控制:
%10s:姓名寬度 10 右對齊%8ld:學號寬度 8%7.2f:分數寬度 7、小數 2 位|、橫線構建表格視覺
void out_row(struct stu arr[], int n) {
float row[4] = {0};
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < n; j++)
row[i] += arr[j].score[i];
row[i] /= n;
}
printf("|%19c|", ' ');
for (i = 0; i < 4; i++)
printf(" %7.2f |", row[i]);
printf("\n------------------------------------------------\n");
}
統計邏輯:
row[0]:英文平均 = Σ英文分 / nrow[1]:數學平均row[2]:物理平均row[3]:總平均 = Σ各生平均 / n(等價於三科平均之平均)輸出時首欄留空 %19c 對齊表格。
#include
#include
struct stu {
char name[20];
long number;
float score[4];
};
void input(struct stu[], int);
void aver(struct stu[], int);
void order(struct stu[], int);
void output(struct stu[], int);
void out_row(struct stu[], int);
main() {
struct stu stud[4];
input(stud, 4);
aver(stud, 4);
order(stud, 4);
output(stud, 4);
out_row(stud, 4);
}
void input(struct stu arr[], int n) {
int i, j;
char temp[30];
for (i = 0; i < n; i++) {
printf("\nInput Name,Number,English,Math,Physics\n");
gets(arr[i].name);
gets(temp);
arr[i].number = atol(temp);
for (j = 0; j < 3; j++) {
gets(temp);
arr[i].score[j] = atof(temp);
}
}
}
void aver(struct stu arr[], int n) {
int i, j;
for (i = 0; i < n; i++) {
arr[i].score[3] = 0;
for (j = 0; j < 3; j++)
arr[i].score[3] += arr[i].score[j];
arr[i].score[3] /= 3;
}
}
| 技術點 | 說明 | 程式碼位置 |
|---|---|---|
| 結構體陣列宣告 | struct stu stud[4] | main() |
| 平均分內嵌結構體 | score[3] 存平均,便於排序比較 | struct 定義 + aver() |
| 字串輸入轉型 | gets + atol/atof 處理異質成員 | input() |
| 結構體整體指派 | temp = arr[j] 交換所有成員 | order() |
| 陣列參數退化為指標 | 形參 struct stu arr[] 不需指定大小 | 所有函數參數 |
| 雙重迴圈冒泡排序 | O(n²) 簡單穩定,適合小資料量 | order() |
| 欄位統計轉置思維 | row[i] = Σarr[j].score[i] / n | out_row() |
| 格式化表格輸出 | printf 寬度精度控制對齊 | output(), out_row() |
for(i=0;i → I 應為 i(大小寫) input() 中外層 i、內層 j,避免重用 iatol/atof 需 #include scanf("%s", arr) 或 printf("%s", arr),必須逐成員score[3](平均),而非單科分數qsort() 庫函數排序(需撰寫比較函數)malloc + realloc)fwrite/fread 二進位或 fprintf/fscanf 文字)