Professional Documents
Culture Documents
主要內容:以氣泡排序法完成第八週範例成績單之排名
範例一:可連續輸入座號、國文、英文、數學分數,計算總分及平均,列印成績單。
Step 1: 先完成資料輸入及顯示
#include <stdio.h>
#include <stdlib.h>
#define sub_no 7 // 定義常數(欄位數量,座號、國文、英文、數學、總分、平均、排名)
int main(void)
{
int n,i,j;
printf("請輸入學生人數:");
scanf("%d",&n);
float no[n][sub_no];
for(i=0;i<n;i++)
{
printf("請依序輸入座號及國文、英文、數學的分數(請以逗點圈隔):");
scanf("%f,%f,%f,%f",&no[i][0],&no[i][1],&no[i][2],&no[i][3]);
no[i][4]=no[i][1]+no[i][2]+no[i][3];
no[i][5]=no[i][4]/3;
}
printf("座號\t國文\t英文\t數學\t總分\t平均\t排名\n");
for(i=0;i<n;i++)
{
for(j=0;j<sub_no-2;j++)
printf("%3.0f\t",no[i][j]);
printf("%5.2f\n",no[i][sub_no-2]);
}
system("pause");
return 0;
}
執行結果
Step 2: 再完成氣泡排序法依總分由大到小排序,並填入排名。
#include <stdio.h>
#include <stdlib.h>
#define sub_no 7 // 定義常數(欄位數量,座號、國文、英文、數學、總分、平均、排名)
void bsort(int a[],int idx[],int); // 定義氣泡排序法函數原型
int main(void)
{
int n,i,j;
printf("請輸入學生人數:");
scanf("%d",&n);
float no[n][sub_no];
int sum[n],idx[n];
for(i=0;i<n;i++)
{
printf("請依序輸入座號及國文、英文、數學的分數(請以逗點圈隔):");
scanf("%f,%f,%f,%f",&no[i][0],&no[i][1],&no[i][2],&no[i][3]);
no[i][4]=no[i][1]+no[i][2]+no[i][3];
no[i][5]=no[i][4]/3;
sum[i]=no[i][4]; // 以總分進行排序
idx[i]=no[i][0]; // 座號
}
bsort(sum,idx,n); // 傳遞引數到氣泡排序法函數進行排序
for(i=0;i<n;i++) // 依據idx的元素值填入名次
no[idx[i]-1][sub_no-1]=i+1;
printf("座號\t國文\t英文\t數學\t總分\t平均\t排名\n");
for(i=0;i<n;i++)
{
for(j=0;j<sub_no-2;j++)
printf(“%3.0f\t”,no[i][j]); // 列印座號、各科成績及總分
printf(“%5.2f”,no[i][sub_no-2]); // 列印平均
printf(“\t%3.0f\n”,no[i][sub_no-1]); // 列印排名
}
system("pause");
return 0;
}
void bsort(int a[],int idx[],int n) // 定義氣泡排序法的函數
{
int i,j,temp,k;
for(i=1;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j]<a[j+1]) // 由大到小排序
{
temp=a[j]; // 進行大小數的對調
a[j]=a[j+1];
a[j+1]=temp; 執行結果
k=idx[j]; // 進行次序的對調
idx[j]=idx[j+1];
idx[j+1]=k;
}
}
}
}
範例二:假設某公司有5種產品A、B、C、D及E,單價分別為20、25、18、22及30元,該公司有3位銷售員1、2及3,某月份的銷
售量如下表:
請撰寫程式完成下列要求,並以下表之格式顯示結果:
(1)每一位銷售員的銷售總金額。
(2)每一項產品的銷售總金額。
(3)每個銷售員業績的排名。
(4)每項產品銷售總金額的排名。
執行結果