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

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c语言编写螺旋矩阵!
【问题描述】输出下面的n(3≤n≤19)阶螺旋矩阵。输入n(=10),输出如下左图所示的螺旋矩阵。输入-n(=-10),输出如下右图所示的螺旋矩阵。1   2   3   4   5   6   7   8   9  10 36  37  38  39  40  41  42  43  44  11 35  64  65  66  67  68  69  70  45  12...
数据结构 C语言 队列 迷宫问题
【问题描述】 以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【任务要求】 实现队列求解迷宫从入口到出口的最短通路。 【测试数据】 迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。 #include<Stdio.h> #include<stdlib.h> #incl
oj1954: C语言实验——for循环打印图形(循环结构)
问题描述:通过使用双重for循环语句,打印下列图形(N =4):    *   ***  ***** *******  *****   ***    * 作者:何知令 发表时间:2017年2月19日 输入:N 输出:    *   ***  ***** *******  *****   ***    * 代码: 知识点总结:循
2738:实数加法
 2738:实数加法 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个实数相加的和。 题目中输入输出里出现的浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Q
Josephus问题的一个C语言程序
Josephus问题的一个C语言程序问题描述:n个人围坐一圈,从第一个人开始报数“1,2,3,4….m,数到m的人出局,然后下一个人从1开始继续,这样直到最后一个人为胜利者,输出胜利者是第几个人。函数功能:功能:josep函数,输入成员数n和停止数m,返回最后留下的人的编号。代码:以下代码在VS2012平台创建:#include<stdio.h> #include<stdlib.h> int jos
山东理工大学ACM平台题答案关于C语言 1238 求数列的和
求数列的和 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。 输入 输入数据有多组,每组占一行,由两个整数n(n 输出 对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。 示例输入 81
贪心算法求解背包问题
问题:给定n个物品和一个容量为C的背包,物品i的重量为w 其价值为v。背包问题就是如何如何选择背包的物品,使装入背包中的物品的总价值是最大的,注意和0/1背包问题的区别,在背包问题中可以将某种物品的一部分装入背包,不可以重复装入。但是在0/1背包问题中,只有装入或者不装入两种结果。#include using namespace std; int KanpSack(int w[],int v[],
C语言通过递归调用函数解决求阶乘和ACKERMAN函数问题
输入整型n(n>=0),输出n! #include<stdio.h> int fac(int n) { int sum; if(n==1||n==0) sum=1; else sum=n*fac(n-1); return sum; } int main() { int n; scanf("%d",&n); printf("%d",fac(n))
C语言计算凸多边形的面积代码
【问题描述】 给出平面上一组顶点的坐标,计算出它们所围成的凸多边形的面积. 输入数据表示了如图所示的四边形。其面积为5.00。 评分标准: 本程序允许使用数学库函数,如果你的输出与标准答案相差不超过0.02则得满分。 【输入形式】 从标准输入读取N(3≤N≤15)行,每行两个数字(由空格隔开),分别表示该点的X、Y坐标(0≤X,Y≤32767)。所有点的坐标互不相同,且按顺时针次序给出。 【输出形式】 向标准输出打印一个浮点数,是该多边形的面积。该浮点数保留两位小数。 【输入样例】 3 3 3 0 1 0 1 2 【输出样例】 5.00
算法精解-C语言描述 递归和尾递归 (图解+实例)
递归是一种强大的方法,它允许一个对象以其自身更小的形式来定义自己。 让我们来观察一下自然界中出现的递归现象:蕨类植物的叶子,每片叶子叶脉中的小分支都是整片叶子的较小缩影;又或者两个反光的物体,相互映射对方渐远的影像。这样的例子使我们明白,尽管大自然的力量是强大的,在许多方面它那种出乎意料的简洁更让我们觉得优美。同样的道理也可以用在递归算法上,从很多方面来说递归算法都是简洁而优美的,而且非常强大。