C语言 成绩分析

某班(人数<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;      }
}

猜你喜欢

转载自blog.csdn.net/weixin_42145554/article/details/129255284