求帮忙找问题,C语言程序

在一个学生成绩管理系统中,保存学生个人的成绩情况,其中包括学号,姓名,性别,5门课成绩。对所有成绩作如下处理:

(1)从键盘输入10个学生的学号,姓名,性别,5门课成绩,并计算出每个人平均成绩,全班每门课的平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stu.c”中。

(2)将上题“stu.c”文件中的学生数据,按每个人的平均分进行排序处理,将已排序的学生数据存入一个新文件“stu-sort”中。

(3)将上题已排序的学生成绩文件进行插入处理。插入一个学生的5门课成绩,程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。

#include
#include
#define SIZE 2

struct Student
{
int num;
char name[20];
char sex[2];
int score[5];
float aver;
struct Student *next;
}stu[SIZE],*head,*p,*q;

void save()
{
FILE *fp;
int i,j;
fp = fopen("stu.c","w+");
head = p = (struct Student *)malloc(sizeof(struct Student));
head ->next = &stu[0];
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);
    if(i <= SIZE - 2)
        stu[i].next = &stu[i + 1];
    else
        stu[i].next = NULL;
}
fclose(fp);

}

void sort()
{
FILE *fp_in,*fp_sort;
int i,j;
float stu_aver[SIZE];
struct Student temp;
fp_in = fopen("stu.c","r+");
for(i = 0;i < SIZE;i++)
{
fscanf(fp_in,"%d%f",&stu[i].num,&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 = 0;j < SIZE - 1 - i;j++)
{
if(stu[j].aver > stu[j + 1].aver)
{
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = 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);
}

void add()
{
FILE *fp_new,*fp_in;
int i;
head ->next = &stu[0];
q = (struct Student *)malloc(sizeof(struct Student));
scanf("%d ",&(q ->num));
gets(q ->name);
gets(q ->sex);
for(i = 0;i < 5;i++)
scanf("%d",&(q ->score[i]));
q ->aver = (q ->score[0] +q ->score[1] + q ->score[2] +q ->score[3]
+ q ->score[4])/5.0;
fp_in = fopen("stu-sort","r+");
for(i = 0;i < SIZE;i++)
{
fscanf(fp_in,"%d%f",&stu[i].num,&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[i].aver);
printf("%f\n",q ->aver);
p = head;
if(q ->aver <= stu[0].aver)
{
p ->next = q;
q ->next = &stu[0];
}
else if(q ->aver >= stu[SIZE - 1].aver)
{
stu[SIZE - 1].next = q;
q ->next = NULL;
}
else
{
for(i = 0;i < SIZE - 1;i++)
{
if((q ->aver > stu[i].aver) && (q ->aver < stu[i + 1].aver))
{
stu[i].next = q;
q ->next = &stu[i + 1];
}
}
}
fclose(fp_in);
fp_new = fopen("new","w+");
p = head ->next;
for(;;)
{
fprintf(fp_new,"%d\n",p ->num);
fprintf(fp_new,"%s\n",p ->name);
fprintf(fp_new,"%s\n",p ->sex);
fprintf(fp_new,"%d %d %d %d %d\n",p ->score[0],p ->score[1],p ->score[2],
p ->score[3],p ->score[4]);
fprintf(fp_new,"%lf\n",p ->aver);
p = p ->next;
if(p == NULL)
break;
}
fclose(fp_new);

}

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

(1)(2)问处理好像没问题了,第(3)点插入处理,输出的学生数据只有两个人的。。是不是链表链接有问题,还是别的地方出现错误。~

c

13个回答

只做过单片机的程序,其他的不知道

91program
91program 既然怀疑,为什么不单步调试一下链表建立的过程?
大约 5 年之前 回复

说说看你有没有调试程序,你是怎么调试的。既然只输出两个人,在输出的循环上下个断点看看

既然怀疑链表的建立过程,为什么不调试一下代码呢?调试的过程,个人认为比编码更重要。

mayiyougekai
mayiyougekai 嗯嗯,后来试了下,果然是链表连接的时候出错了。
大约 5 年之前 回复

我想是你的输入问题,注意C语言,scanf和getchar,gets通用时,末尾换行符错误问题。

没有C的环境,我其实很喜欢找错的。。。

非常感谢大家的回答哈

没有仔细看你的代码逻辑,看是否是 #define SIZE 2 限制了正常的输出数量。

又是一个一大篇代码的!表示没时间看下去!

那个SIZE是不是有问题?最好单步调试一下。

可以在每次插入完成后把链表数据循环打印一下

共13条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问