本程式模擬某小組 C++ 程式設計課程的成績統計,功能包含:輸入學生人數與各科成績、計算總分、平均分、標準差(樣本標準差)、最高分與最低分並列出對應學號(索引)。
total()、average()、deviation()、max_min() 四個函數。採用樣本標準差公式:dev = sqrt( Σ(grade[i] - ave)² / (n - 1) ),需引入 <math.h> 使用 sqrt()。
先遍歷一次找出最大/最小值,再遍歷第二次記錄所有等於極值的索引,最後格式化輸出(以逗號分隔)。
/* 程式標頭註解 */
#include <stdio.h>
#include <math.h>
float total(float grade[], int num);
float average(float sum, int num);
float deviation(float grade[], float ave, int num);
void max_min(float grade[], int num);
int main()
{
int i, num;
float sum, ave, dev;
float grade[100];
printf("您班上有人?嘻嘻嘻共有:");
scanf("%d", &num);
printf("\n");
for(i = 0; i < num; i++)
{
printf("輸入第%2d位同學的成績(按ENTER進入):", i);
scanf("%f", &grade[i]);
}
sum = total(grade, num);
printf("\n總成績為:%0.2f\n", sum);
ave = average(sum, num);
printf("\n平均分為:%0.2f\n", ave);
dev = deviation(grade, ave, num);
printf("\n標準差為:%0.2f\n\n", dev);
max_min(grade, num);
return 0;
}
float total(float grade[], int num)
{
int i;
float sum = 0.0;
for(i = 0; i < num; i++) sum += grade[i];
return sum;
}
float average(float sum, int num)
{
return sum / num;
}
float deviation(float grade[], float ave, int num)
{
int i;
float s = 0.0;
for(i = 0; i < num; i++) s += (grade[i] - ave) * (grade[i] - ave);
return sqrt(s / (num - 1));
}
void max_min(float grade[], int num)
{
int i, j = 0, l = 0;
int max_num[100], min_num[100];
float max, min;
max = min = grade[0];
for(i = 0; i < num; i++)
{
if(max < grade[i]) max = grade[i];
if(min > grade[i]) min = grade[i];
}
for(i = 0; i < num; i++)
{
if(max == grade[i]) max_num[j++] = i;
if(min == grade[i]) min_num[l++] = i;
}
printf("最高分為:%0.2f\n", max);
printf("最高分的學號有:");
for(i = 0; i < j; i++)
{
printf("%d", max_num[i]);
if(i < j - 1) printf(",");
}
printf("\n\n");
printf("最低分為:%0.2f\n", min);
printf("最低分的學號有:");
for(i = 0; i < l; i++)
{
printf("%d", min_num[i]);
if(i < l - 1) printf(",");
}
printf("\n");
}

malloc) 替代固定大小陣列。