学生成绩排序

问题

【问题描述】
某班有不超过200名的学生,从文件中输入某班学生成绩,对输入成绩按由高到低进行排序,并输出到另一个文件中。
【输入形式】
从文件scorelist.in中读入学生成绩,学生成绩以整数形式按行存放。注意,学生成绩数目不确定。
【输出形式】
将排序结果按行写到文件sorelist.out中。
【样例输入】
若文件scorelist.in中有如下成绩:
58
75
62
86
98
【样例输出】
程序运行结束后文件scorelist.out中内容为:
98
86
75
62
58

算法分析

思路一
问题可以分解为如下几步:
在这里插入图片描述

对学生成绩排序可以有多种方式。

思路二
每读入一个数据,就将其加到一个有序数据集中的相应位置上,无需最后排序。其具体算法如下:
  1.设整型数组scorelist存放排序后成绩,n为其中学生成绩个数,初始n为0;
  2.分别以读和写方式打开文件scorelist.in和scorelist.out;
  3.while 读文件中还有成绩时,读入一个成绩到score
    将score插入到有序数组scorelist中相应位置;
  4.输出数组scorelist到写文件中;
  5.关闭读写文件;

算法实现

思路一

#include <stdio.h>
#define NUM 200
int n = 0;
int readList(int array[ ]);
void sortArray(int array[ ], int n);
void writeList(int array[ ], int n);
int main()
{
    int scorelist[NUM], n;
    n = readList(scorelist);
    sortArray(scorelist, n);
    writeList(scorelist, n);
    return 0;
}
int readList(int array[ ])
{
    FILE *in;
    int n=0;
    if((in = fopen("scorelist.in","r")) == NULL){
        printf("Cann't open file scorelist.in!\n");
        exit(1);
     }
     while(fscanf(in,"%d",&scorelist[n] )>0)
        n++;
    fclose(in);
    return n;
}
void writeList(int array[ ], int n)
{
    FILE *out;
    int I;
    if((out = fopen("scorelist.out","w")) == NULL){
        printf("Cann't open file scorelist.out!\n");
        exit(1);
     }
     for(i=0; i<n; i++)
         fprintf(out, "%d\n",array[i]);
    fclose(out);
}
//选择排序实现
void sortArray(int array[], int n)
{
    int i,j,tmp, index;
    for(i=0; i<n; i++) {
        index = i;
        for (j=i; j<n; j++) 
            if(array[index] < array[j])
                index = j;
        tmp = array[i];
        array[i] = array[index];
        array[index] = tmp;
        
    }
} 
/** 冒泡排序实现
void sortArray(int array[], int n)
{
    int i, j, tmp;
    for(i=0; i<n; i++)
        for(j=i; j<n; j++){
            if(array[i] < array[j]){
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
}
**/

思路二

//c4_2b.c
#include <stdio.h>
#define NUM 200
int n = 0;
void insertData(int array[], int data);
int main()
{
     int scorelist[NUM],score, i;
     FILE *in, *out;
     if((in = fopen("scorelist.in","r")) == NULL){
		 printf("Cann't open file scorelist.in!\n");
		 return 1;
     }
     if((out = fopen("scorelist.out","w")) == NULL){
		 printf("Cann't open file scorelist.out!\n");
		 return 1;
     }
     while(fscanf(in,"%d",&score )>0)
		insertData(scorelist, score);
    for(i=0; i<n; i++)
    		fprintf(out, "%d\n",scorelist[i]);
    fclose(in); fclose(out);
    return 0;
}
void insertData( int array[ ], int data )
{
	int  i, j;
	for( i=0; i<n; i++ )
		if(data>array[i])
			break;
	for( j=n; j>i; j-- )
		array[j] = array[j-1];
	array[i]=data;
	n++;
}

发布了140 篇原创文章 · 获赞 149 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章