問題
【問題描述】
某班有不超過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++;
}