You are on page 1of 5

計算機概論第十週

主要內容:以氣泡排序法完成第八週範例成績單之排名
範例一:可連續輸入座號、國文、英文、數學分數,計算總分及平均,列印成績單。
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,某月份的銷
售量如下表:

銷售員 產品A 產品B 產品C 產品D 產品E


1 38 32 56 45 33
2 75 33 62 50 23
3 52 50 40 65 66

請撰寫程式完成下列要求,並以下表之格式顯示結果:
(1)每一位銷售員的銷售總金額。
(2)每一項產品的銷售總金額。
(3)每個銷售員業績的排名。
(4)每項產品銷售總金額的排名。

銷售員 產品A 產品B 產品C 產品D 產品E 總金額 業績排名


單價 (20) (25) (18) (22) (30)
1 38 32 56 45 33
2 75 33 62 50 23
3 52 50 40 65 66
小計
排名
Step 1: 先完成計算銷售員及各項產品之金額並顯示。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i,j;
int no[5][8]={{1,38,32,56,45,33},
{2,75,33,62,50,23},
{3,52,50,40,65,66}};
int mo[5]={20,25,18,22,30};
for(i=0;i<3;i++)
for(j=1;j<=5;j++)
no[i][6]=no[i][6]+no[i][j]*mo[j-1]; // 計算每位銷售員的銷售總金額
for(i=1;i<=5;i++)
for(j=0;j<3;j++)
no[3][i]=no[3][i]+no[j][i]*mo[i-1]; // 計算每項產品的銷售總金額
printf("銷售員\t產品A\t產品B\t產品C\t產品D\t產品E\t總金額\t業績排名\n");
printf("單價\t");
for(j=0;j<5;j++)
printf("(%d)\t",mo[j]);
printf("\n");
for(i=0;i<3;i++)
{
for(j=0;j<7;j++)
printf("%d\t",no[i][j]);
printf("\n");
}
printf("小計\t");
for(j=1;j<6;j++)
printf("%d\t",no[3][j]);
printf("\n");
system("pause");
return 0;
}
執行結果
Step 2: 再完成排序及排名。 void bsort(int a[],int idx[],int n) // 定義氣泡排序法的函數
#include <stdio.h> {
#include <stdlib.h> int i,j,temp,k;
void bsort(int a[],int idx[],int); // 定義氣泡排序法函數原型 for(i=1;i<n;i++)
int main(void)
{ {
int i,j; for(j=0;j<n-1;j++)
int no[5][8]={{1,38,32,56,45,33}, {
{2,75,33,62,50,23},
{3,52,50,40,65,66}}; if(a[j]<a[j+1]) // 由大到小排序
int mo[5]={20,25,18,22,30}; {
int sum1[3],idx1[3],sum2[5],idx2[5]; temp=a[j]; // 進行大小數的對調
for(i=0;i<3;i++) a[j]=a[j+1];
{ a[j+1]=temp;
for(j=1;j<=5;j++)
no[i][6]=no[i][6]+no[i][j]*mo[j-1]; // 計算每位銷售員的銷售總金額 k=idx[j]; // 進行次序的對調
sum1[i]=no[i][6]; // 每位銷售員的銷售總金額 idx[j]=idx[j+1];
idx1[i]=no[i][0]; // 銷售員的代號 idx[j+1]=k;
} }
bsort(sum1,idx1,3); // 銷售員的排序
for(i=0;i<3;i++) // 依據idx1的元素值填入銷售員的名次 }
no[idx1[i]-1][7]=i+1; }
for(i=1;i<=5;i++) }
{
for(j=0;j<3;j++)
no[3][i]=no[3][i]+no[j][i]*mo[i-1]; // 計算每項產品的銷售總金額
sum2[i-1]=no[3][i]; // 每項產品的銷售總金額
idx2[i-1]=i; // 每項產品的代號(A=1, B=2...)
}
bsort(sum2,idx2,5); // 產品的排序
for(i=0;i<5;i++) // 依據idx2的元素值填入產品的名次
no[4][idx2[i]]=i+1;
printf("銷售員\t產品A\t產品B\t產品C\t產品D\t產品E\t總金額\t業績排名\n");
printf("單價\t");
for(j=0;j<5;j++) // 列印單價
printf("(%d)\t",mo[j]);
printf("\n");
for(i=0;i<3;i++) // 列印主表格
{
for(j=0;j<8;j++)
printf("%4d\t",no[i][j]);
printf("\n");
}
printf("小計\t");
for(j=1;j<6;j++) // 列印產品銷售金額小計
printf("%4d\t",no[3][j]);
printf("\n");
printf("排名\t"); // 列印產品銷售排名
for(j=1;j<6;j++)
printf("%4d\t",no[4][j]);
printf("\n");
system("pause");
return 0;
}

執行結果

You might also like