学生成绩排序
原创
©著作权归作者所有:来自51CTO博客作者不死鸟jgc的原创作品,请联系作者获取转载授权,否则将追究法律责任
问题
【问题描述】
某班有不超过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
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
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++;
}