问题描述
- 求帮忙找问题,C语言程序
- 在一个学生成绩管理系统中,保存学生个人的成绩情况,其中包括学号,姓名,性别,5门课成绩。对所有成绩作如下处理:
(1)从键盘输入10个学生的学号,姓名,性别,5门课成绩,并计算出每个人平均成绩,全班每门课的平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stu.c”中。
(2)将上题“stu.c”文件中的学生数据,按每个人的平均分进行排序处理,将已排序的学生数据存入一个新文件“stu-sort”中。
(3)将上题已排序的学生成绩文件进行插入处理。插入一个学生的5门课成绩,程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。
#include
#include
#define SIZE 2struct 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 ij;
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%dn""stu[i].num); gets(stu[i].name); fprintf(fp%sn""stu[i].name); gets(stu[i].sex); fprintf(fp%sn""stu[i].sex); for(j = 0;j < 5;j++) scanf(""%d""&stu[i].score[j]); fprintf(fp%d %d %d %d %dn""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%fn""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 ij;
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 %fn""stu[i].aver);
stu_aver[i] = stu[i].aver;
}
for(i = 0;i < SIZE;i++)
printf(""%fn""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%dn""stu[i].num);
fprintf(fp_sort%sn""stu[i].name);
fprintf(fp_sort%sn""stu[i].sex);
fprintf(fp_sort%d %d %d %d %dn""stu[i].score[0]stu[i].score[1]stu[i].score[2]
stu[i].score[3]stu[i].score[4]);
fprintf(fp_sort%lfn""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 %fn""stu[i].aver);
//stu_aver[i] = stu[i].aver;
}
for(i = 0;i < SIZE;i++)
printf(""%fn""stu[i].aver);
printf(""%fn""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%dn""p ->num);
fprintf(fp_new%sn""p ->name);
fprintf(fp_new%sn""p ->sex);
fprintf(fp_new%d %d %d %d %dn""p ->score[0]p ->score[1]p ->score[2]
p ->score[3]p ->score[4]);
fprintf(fp_new%lfn""p ->aver);
p = p ->next;
if(p == NULL)
break;
}
fclose(fp_new);}
int main(void)
{
//FILE *fp;
//int ij;
save();
sort();
add();
return 0;
}(1)(2)问处理好像没问题了,第(3)点插入处理,输出的学生数据只有两个人的。。是不是链表链接有问题,还是别的地方出现错误。~
解决方案
只做过单片机的程序,其他的不知道
解决方案二:
说说看你有没有调试程序,你是怎么调试的。既然只输出两个人,在输出的循环上下个断点看看
解决方案三:
既然怀疑链表的建立过程,为什么不调试一下代码呢?调试的过程,个人认为比编码更重要。
解决方案四:
我想是你的输入问题,注意C语言,scanf和getchar,gets通用时,末尾换行符错误问题。
解决方案五:
没有C的环境,我其实很喜欢找错的。。。
解决方案六:
非常感谢大家的回答哈
解决方案七:
没有仔细看你的代码逻辑,看是否是 #define SIZE 2 限制了正常的输出数量。
解决方案八:
又是一个一大篇代码的!表示没时间看下去!
解决方案九:
那个SIZE是不是有问题?最好单步调试一下。
解决方案十:
可以在每次插入完成后把链表数据循环打印一下