题目
本题是谭浩强《C程序设计课后习题》题10.7。
题目:
将第6题已排序的学生成绩文件进行插人处理。插人一个学生的3门课程成绩,程序先计算新插人学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
1,基于第6题的意思是我们需要使用第6题的结构体类型和结果。
2,带大家看主函数部分
student newstu;//首先定义一个新学生信息
Inputdata(&newstu);//输入这个新学生的信息
student oldstu[6];
readdate(oldstu);//调用函数从上一题排好序的文件中读入5个学生数据
Insertdata(oldstu, &newstu,5);//把新数据有序地插入到老数组中
writedate(oldstu);//把含有新数据的数组写入到新文件
3,备注部分说的很清晰了,进一步看各个函数的代码即可。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
int i;
typedef struct student
{
int num;
char name[20];
int score[3];
float avg;
}student;
void Inputdata(student* stu)
{
printf("请输入新学生的信息:\n");
printf("num name s1 s2 s3\n");
scanf("%d %s %d %d %d", &(stu->num), stu->name, &(stu->score[0]), &(stu->score[1]), &(stu->score[2]));
stu->avg = (stu->score[0] + stu->score[1] + stu->score[2]) / 3.0;
}
void readdate(student stu[])
{
FILE* fp = fopen("stu_ sort.txt", "r");
if (fp == NULL)
{
printf("read stu_ sort 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 Insertdata(student* oldstu, student* newstu,int n)
{
int pos = 0;
while (pos < n)
{
if ((newstu->avg) < (oldstu[pos].avg))
break;
pos++;
}
for (i = n; i > pos; i--)
{
memcpy(&oldstu[i],&oldstu[i-1], sizeof(student));
}
memcpy(&oldstu[pos], newstu, sizeof(student));
}
void writedate(student* stu)
{
FILE* fp = fopen("stu_new_sort.txt", "w");
if (fp == NULL)
{
printf("write file error!");
return -1;
}
for (i = 0; i < 6; 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 newstu;//首先定义一个新学生信息
Inputdata(&newstu);//输入这个新学生的信息
student oldstu[6];
readdate(oldstu);//调用函数从上一题排好序的文件中读入5个学生数据
Insertdata(oldstu, &newstu,5);//把新数据有序地插入到老数组中
writedate(oldstu);//把含有新数据的数组写入到新文件
return 0;
}
三、执行结果
输入:
请输入新学生的信息:
num name s1 s2 s3
1 李杰 80 60 34
输出:
4 李瑞龙 7 60 90 52.333332
1 李杰 80 60 34 58.000000
3 皮梦通 100 20 60 60.000000
5 王炯杰 50 69 88 69.000000
2 葛新龙 99 89 60 82.666664
1 李文杰 88 98 100 95.333336