2 mayiyougekai mayiyougekai 于 2015.06.11 13:39 提问

C语言求解决,问题描述和代码如下

在一个学生成绩管理系统中,保存学生个人的成绩情况,其中包括学号,姓名,性别,5门课成绩。对所有成绩作如下处理: (1)从键盘输入10个学生的学号,姓名,性别,5门课成绩,并计算出每个人平均成绩,全班每门课的平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stu.c”中。 (2)将上题“stu.c”文件中的学生数据,按每个人的平均分进行排序处理,将已排序的学生数据存入一个新文件“stu-sort”中。将学生数据存在文件stu.c后,读取的时候读到的第一个平均分的值老是为1

#include
#include
#define SIZE 3

struct Student
{
int num;
char name[20];
char sex[2];
int score[5];
float aver;
}stu[SIZE];

void save()
{
FILE *fp;
int i,j;
fp = fopen("stu.c","w+");

for(i = 0;i < SIZE;i++)
{
scanf("%d ",&stu[i].num);
fprintf(fp,"%d\n",stu[i].num);
gets(stu[i].name);
fprintf(fp,"%s\n",stu[i].name);
gets(stu[i].sex);
fprintf(fp,"%s\n",stu[i].sex);
for(j = 0;j < 5;j++)
scanf("%d",&stu[i].score[j]);
fprintf(fp,"%d %d %d %d %d\n",stu[i].score[0],stu[i].score[1],stu[i].score[2],
stu[i].score[3],stu[i].score[4]);
stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2] + stu[i].score[3]
+ stu[i].score[4])/5.0;
fprintf(fp,"%f\n",stu[i].aver);
}
fclose(fp);

}

void sort()
{
FILE *fp_in,*fp_sort;
int i,k,j;
float stu_aver[SIZE];
struct Student temp;
fp_in = fopen("stu.c","r+");
for(i = 0;i < SIZE;i++)
{
fscanf(fp_in,"%f",&stu[i].aver);
printf("fuck %f\n",stu[i].aver);
stu_aver[i] = stu[i].aver;
}
for(i = 0;i < SIZE;i++)
printf("%f\n",stu_aver[i]);
for(i = 0;i < SIZE - 1;i++)
{
for(j = i + 1;j < SIZE;j++)
{
k = i;
if(stu_aver[k] > stu_aver[j])
k = j;
if(k != i)
{
temp = stu[k];
stu[k] = stu[i];
stu[i] = temp;
}
}
}
fp_sort = fopen("stu-sort","w+");
for(i = 0;i < SIZE;i++)
{
fprintf(fp_sort,"%d\n",stu[i].num);
fprintf(fp_sort,"%s\n",stu[i].name);
fprintf(fp_sort,"%s\n",stu[i].sex);
fprintf(fp_sort,"%d %d %d %d %d\n",stu[i].score[0],stu[i].score[1],stu[i].score[2],
stu[i].score[3],stu[i].score[4]);
fprintf(fp_sort,"%lf\n",stu[i].aver);
}
fclose(fp_sort);
fclose(fp_in);

}

int main(void)
{
FILE *fp;
int i,j;
save();
sort();
return 0;
}

2个回答

gamefinity
gamefinity   Rxr 2015.06.11 13:48

你写的时候是学号/姓名/五项成绩/平均成绩。为什么读的时候一读就是读平均成绩?你把数据文件中的学号读成了平均成绩,第一个学号当然是1号啦。

gamefinity
gamefinity 回复fishorbird: fscanf也要先读前面几个才能轮到这个的啊。。。你不可能直接跳到那个位置的
2 年多之前 回复
fishorbird
fishorbird 回复mayiyougekai: 可以单独读出,别用fread()改用fscanf()
2 年多之前 回复
mayiyougekai
mayiyougekai 嗯嗯,好的,感谢你的回答。
2 年多之前 回复
gamefinity
gamefinity 回复mayiyougekai: 你现在的读法,是顺序文件的读取。只能根据文件内容从头到底一点一点的读,何况你对写入的数据没有规格化,所以也没有办法进行随机读取。所以即使你不用的数据,你也要读一下,当然可以读出来不使用,这个叫虚读。计算机不会代替你记住你的文本文件里那一段内容是平均成绩的,这个得你自己记住。
2 年多之前 回复
mayiyougekai
mayiyougekai 读的时候不能只把平均成绩读出来的吗?是不是得把学号/姓名/五项成绩/平均成绩全读,那为什么后来读出来的平均成绩是正确的,除了第一个
2 年多之前 回复
mayiyougekai
mayiyougekai 读的时候不能只把平均成绩读出来的吗?是不是得把学号/姓名/五项成绩/平均成绩全读,那为什么后来读出来的平均成绩是正确的,除了第一个
2 年多之前 回复
EnderSnow
EnderSnow   2015.06.13 07:43

加一个变量存储一下也许可以?

Csdn user default icon
上传中...
上传图片
插入图片