學生成績排序

問題

【問題描述】
某班有不超過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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章