#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
int number=0;
struct student
{
char name[10];//记录学生姓名
long num;//记录学生学号
float chinese;//记录语文成绩
float math;//记录数学成绩
float english;//记录英语成绩
float sum;//记录语数英总分
struct student *next;//定义结构体指针
} student1;
struct student * create (void)
{
FILE *fp;
struct student *head, *p1,*p2;
int i=0;
//打开文件
if ((fp = fopen("成绩管理.txt", "r")) = NULL)//以只读的模式打开文件
{
printf("无法打开此文件");
exit( 0);
}
//读取文件中的数据创建成链表
head = NULL ;
p1 = p2 = (struct student *)malloc(sizeof(struct student));
while (fread(p1, sizeof(struct student), 1, fp)!= 0)
{
i++;
if (i ==1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct student *)malloc( sizeof(struct student));
}
p2->next = NULL;
free(p1);
fclose(fp);
return head;
} //把文件数据读入链表
int main(void)
{
int n, flag;
void analyze ();
void save();
printf(" 学生成绩管理系统\n");
printf("***********************************\n");
printf("1 录入成绩\n");
printf("2 输出成绩\n");
printf("3 修改成绩\n");
printf("4 删除记录\n");
printf("5 统计成绩\n");
printf("6 成绩排序\n");
printf("0 退出\n");
printf("***********************************\n");
do
{
printf("\n请选择您需要的功能:");
scanf("%d", &n);
switch (n)
{
case 1:
save();
break;
case 2:
//xxxx;
break;
case 3:
//xxxx;
break;
case 4:
//xxxx;
break;
case 5:
analyze ();
break;
case 6:
//xxxx;
break;
case 0:
return 0;
}\
printf("是否需要继续操作(是:1/否:2):");
scanf("%d", &flag);
if (flag == 2)
break;
}while(1);
return 0;
}
void save()//定义函数save,录入学生成绩
{
FILE *fp;//定义文件指针
int temp=0;//定义变量temp判断是否继续循环
if((fp=fopen("成绩管理.txt","wb"))==NULL)//打开输入文件成绩管理.txt
{printf("cannot open file\n");
return;
}
do
{
printf("请依次输入:学生姓名、学号、语文成绩、数学成绩、英语成绩(用空格键隔开)\n");
scanf("%s %d %f %f %f",student1.name,&student1.num,&student1.chinese,&student1.math,&student1.english);
student1.sum=student1.chinese+student1.english+student1.math;
if(fwrite(&student1,LEN,1,fp)!=1) printf("录入失败");
number++;//统计录入的学生人数
printf("继续录入请输入1,停止录入请输入2\n");
scanf("%d",&temp);
}while(temp==1);
fclose(fp);
}
void analyze()
{
struct student *now,*next;//now为当前,next为下一个
int flag=0; //标志
int k;
float avermath=0,averchinese=0,averenglish=0,sum=0,peraver;//平均成绩
float pmath=0,pchinese=0,penglish=0;//及格人数
printf ("计算平均分和及格率请输入1,查看及格率请输入2,查看优秀学生请输入3,查看2科及以上不合格的学生请输入4\n");
scanf("%d",&k);
now=create();
if (k==1)
{
while (now !=NULL)//开始统计成绩
{
avermath=avermath+(*now).math;//数学总分
averchinese=averchinese+now->chinese;//语文总分
averenglish=averenglish+now->english;//英语总分
sum=sum+now->sum;//所有总分
now=(*now).next;
}
avermath=avermath/number;
averchinese=averchinese/number;
averenglish=averenglish/number;
sum=sum/number;
printf("数学平均分为%.1f",avermath);
printf("语文平均分为%.1f",averchinese);
printf("英语平均分为%.1f",averenglish);
printf("三科平均分为%.1f",sum);
}//计算平均分
if (k==2)
{
while (now !=NULL)//开始统计成绩
{
if (now->math>60)
pmath+=1;
if (now->chinese>60)
pchinese+=1;
if (now->english>60)
penglish+=1;
now=(*now).next;
}
printf("数学及格率为%f",pmath/number);
printf("语文及格率为%f",pchinese/number);
printf("英语及格率为%f",penglish/number);
} //计算及格率
if (k==3)
{
while (now !=NULL)//开始统计成绩
{
if ( (peraver=(now->math+now->chinese+now->english)/3) > 85)
printf("%d号%s成绩优异",now->num,now->name);
now=(*now).next;
}
}//找到平均分到达85分的优秀学生
if (k==4)
{
while (now !=NULL)//开始统计成绩
{
if (now->chinese<60)
flag=flag+1;
else if (now->math<60)
flag=flag+1;
else if (now->english<60)
flag=flag+1;
if (flag>=2)
printf ("%d号%s成绩偏差",now->num,now->name);
now=(*now).next;
}
}//找到2科及以上不合格的学生
free(now);
printf("\n");
}
save函数的作用是把数据写入数据文件
create函数的作用是把数据文件写入链表
analyze是用链表的数据进行计算
但好像输出结果都是0
> 但好像输出结果都是0
你把链表的数据都打印出来看看, 是否正确地存储了数据?