某班(人数<50)的C语言成绩存储在scores.txt文件中,编写一个程序,从文件读取同学成绩,然后写一个函数对成绩进行排序(需不需要注明不能用库函数),并输出成绩中位数(奇数个取中间数,偶数个取中间两数的平均数)、平均分、最高分以及最低分。
文件中数据格式:
56.0 86.5 78.0 99.0 88.0 68.5 ……
输出格式:
本次C语言成绩的中位数为:84.5,平均分:80.3,最高分:100.0,最低分:45.0。
#include <stdio.h>
#include <stdlib.h>
void sort(int a[], int size);
int main()
{
FILE *fp;
float scores[50], sum=0, avg, med; //存储成绩
int pnum=0; //人数
if((fp = fopen("./scores.txt", "r")) == NULL) //打开文件
{
printf("cannot open file\n");
return 1;
}
while(1) //读取成绩和人数
{
fscanf(fp, "%f", &scores[pnum]);
pnum++;
if (feof(fp)) break;
}
sort(scores,pnum); //排序
for(int loop = 0; loop < pnum; loop++) //求平均分
{
sum = sum + scores[loop];
}
avg = sum / pnum;
if (pnum%2==0) med = (scores[pnum/2-1]+scores[pnum/2])/2;
else med = scores[pnum/2];
printf("本次C语言成绩的中位数为:%.1f,平均分:%.1f,最高分:%.1f,最低分:%.1f。", med, avg, scores[pnum-1], scores[0]);
return 0;
}
/*
void sort(int a[], int size) //冒泡排序
{
int i, j, tmp, flag;
for(i=1; i<size; ++i)
{
flag = 0; //标记变量赋值为0
for (j = 0; j < size-i; ++j)
if (a[j]> a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = 1;
}//有交换,flag设为1
if (!flag) break;
}
}
*/
void sort(int a[], int size) //直接选择排序
{
int lh, minh, k, tmp;
for (lh = 0; lh < size-1; ++lh)
{
//找从lh到size-1之间的最小值
minh = lh;
for (k = lh; k < size; ++k)
if ( a[k] < a[minh] ) minh = k;
//将最小值交换到前面
tmp = a[lh];
a[lh] = a[minh];
a[minh] = tmp; }
}