題目
本題是譚浩強《C程式設計課後習題》題10.6。
題目:
将第5題stud檔案中的學生資料,按平均分進行排序處理,将已排序的學生資料存入一個新檔案stu_ sort 中。
以下是本篇文章正文内容,歡迎朋友們進行指正,一起探讨,共同進步。——來自考研路上的lwj
一、解題思路
思路:
1,定義函數readdate(stu); //從stud.txt中讀入資料。
2,定義函數sort(stu);//使用冒泡排序結構體,資料替換方面使用記憶體拷貝函數memcpy(&1,&2,拷貝大小)。
3,定義函數writedate(stu);//将資料寫入到新檔案stu_ sort 中。
4,本題主要思想就是這3步,功能實作部分請檢視下面的詳細代碼。
二、代碼部分
1.引入庫
代碼如下(示例):
2.主函數部分
代碼如下(示例):
int i, j;
typedef struct student
{
int num;
char name[20];
int score[3];
float avg;
}student;
void readdate(student stu[])
{
FILE* fp = fopen("stud.txt", "r");
if (fp == NULL)
{
printf("read stud file error!");
return -1;
}
for (i = 0; i < 5; i++)//從檔案中讀入資料
{
fscanf(fp, "%d %s %d %d %d %f", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].avg);
}
fclose(fp);
}
void sort(student stu[])
{
student tmp;
int size = sizeof(tmp);
for(i=0;i<5;i++)
for (j = i + 1; j < 5; j++)
{
if (stu[i].avg > stu[j].avg)
{
memcpy(&tmp, &stu[i], size);//記憶體拷貝函數,交換整個結構體
memcpy(&stu[i], &stu[j], size);
memcpy( &stu[j], &tmp, size);
}
}
printf("拍完序的結果為:\n");
for (i = 0; i < 5; i++)
{
printf("%d %s %d %d %d %f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].avg);
}
}
void writedate(student* stu)
{
FILE* fp = fopen("stu_ sort.txt", "w");
if (fp == NULL)
{
printf("write file error!");
return -1;
}
for (i = 0; i < 5; i++)//使用fprint函數将結構體數組stu中的資料寫入fp
{
fprintf(fp,"%d %s %d %d %d %f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].avg);
}
fclose(fp);
}
int main()
{
student stu[5];
readdate(stu); //從stud.txt中讀入資料。
sort(stu);//使用冒泡排序結構體,資料替換方面使用記憶體拷貝函數memcpy(&1,&2,拷貝大小)。
writedate(stu);//将資料寫入到新檔案stu_ sort 中。
return 0;
}
三、執行結果

輸入:
1 李文傑 88 98 100 95.333336
2 葛新龍 99 89 60 82.666664
3 皮夢通 100 20 60 60.000000
4 李瑞龍 7 60 90 52.333332
5 王炯傑 50 69 88 69.000000
輸出:
4 李瑞龍 7 60 90 52.333332
3 皮夢通 100 20 60 60.000000
5 王炯傑 50 69 88 69.000000
2 葛新龍 99 89 60 82.666664
1 李文傑 88 98 100 95.333336