voidOutputInformation(void);
voidDesplayInfoBystudentName(void);
voidDesplayOneNode(STUDENT*t);
voidInsertOneNode(STUDENT*t);
voidDeleteNodeBystudentNumber(void);
voidChangeMarkByName(void);
voidChangeMarkByNumber(void);
voidSaveLinkToFile(void);
voidDesplayMarkSegment(void);
voidCompositorByTotalMark(void);
intchoose;*用于接受用户的选择*
*主函数*
voidmain()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
************************************
函数功能:
从文件中读学生信息到链表中
************************************
voidReadInfoFormFile(void)
{
FILE*fp;
STUDENT*p;
fp=fopen("student.txt","r");
if(!
fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
************************************
函数功能:
显示菜单,根据用户的输入
完成相应的功能
************************************
voidDesplayMenu(void)
{
STUDENT*p;
printf("|1按班级输出学生成绩单|\n");
printf("|2按姓名查询|\n");
printf("|3增加学生|\n");
printf("|4删除学生|\n");
printf("|5按班级修改学生成绩|\n");
printf("|6按学期修改学生成绩|\n");
printf("|7保存所有学生信息|\n");
printf("|8显示不及格学生成绩|\n");
printf("|9按平均成绩排序并输出绩|\n");
printf("|10退出|\n\n");
scanf("%d",&choose);*取得用户的选择*
switch(choose)
{
case1:
OutputInformation();*显示所有学生的信息*
break;
case2:
DesplayInfoBystudentName();
break;
case3:
p=MallocNode();*先申请一个新结点*
GetInformation(p);*要求用户输入信息到新结点中*
InsertOneNode(p);*将新结点加到链表中*
break;
case4:
DeleteNodeBystudentNumber();*根据用户输入的学号删除该学生*
break;
case5:
ChangeMarkByName();*根据用户输入的姓名修改学生成绩*
break;
case6:
ChangeMarkByNumber();*根据用户输入的学号修改学生成绩*
break;
case7:
SaveLinkToFile();*保存数据*
break;
case8:
DesplayMarkSegment();*显示不及格的学生成绩*
break;
case9:
CompositorByTotalMark();*按平均成绩排序*
break;
case10:
SaveLinkToFile();*保存数据后再退出*
free(NULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';
for(i=0;i<20;i++)
p->studentName[i]='\0';
for(i=0;i<20;i++)
p->className[i]='\0';
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->next=NULL;
returnp;
}
************************************
函数功能:
取得用户输入的学生信息
************************************
voidGetInformation(STUDENT*t)
{
printf("请输入学生学号:
\n");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:
\n");
scanf("%s",t->studentName);
printf("请输入该生所在班级:
\n");
scanf("%s",t->className);
printf("请输入第1门成绩:
\n");
scanf("%f",&(t->mark1));
printf("请输入第2门成绩:
\n");
scanf("%f",&(t->mark2));
printf("请输入第3门成绩:
\n");
scanf("%f",&(t->mark3));
}
************************************
函数功能:
在链表的结尾处增加一个结点
************************************
voidInsertOneNode(STUDENT*t)
{
STUDENT*p;
p=");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在姓名为%s的学生\n",studentName);
}
************************************
函数功能:
输出一个结点的信息
************************************
voidDesplayOneNode(STUDENT*t)
{
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->className);
printf("%.2f\t",t->mark1);
printf("%.2f\t",t->mark2);
printf("%.2f\t",t->mark3);
printf("%.2f\t",t->mark1+t->mark2+t->mark3);
printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)3);
}
************************************
函数功能:
根据用户输入的学号删除该学生
************************************
voidDeleteNodeBystudentNumber(void)
{
charstudentNumber[10];
STUDENT*p,*q;
charflag=0;
printf("请输入要删除的学生学号:
");
scanf("%s",studentNumber);
p=");
return;
}
printf("成功删除\n");
}
************************************
函数功能:
显示所有学生的信息
************************************
voidOutputInformation(void)
{
STUDENT*p;
p=\n");
return;
}
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
************************************
函数功能:
根据输入的班级修改成绩
************************************
voidChangeMarkByName(void)
{
STUDENT*p;
inta;
charstudentName[20];
charflag=0;
floatmark1,mark2,mark3;
p=");
scanf("%d",&a);
printf("请输入学生姓名:
\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的第1门成绩:
\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:
\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:
\n");
scanf("%f",&mark3);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在班级为%s的学生\n",studentName);
}
************************************
函数功能:
根据输入的学期修改成绩
************************************
voidChangeMarkByNumber(void)
{
STUDENT*p;
intb;
charstudentNumber[20];
charflag=0;
floatmark1,mark2,mark3;
p=");
scanf("%d",&b);
printf("请输入学生学号:
\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的第1门成绩:
\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:
\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:
\n");
scanf("%f",&mark3);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在学期为%s的学生\n",studentNumber);
}
************************************
函数功能:
保存链表数据到文件中
************************************
voidSaveLinkToFile(void)
{
STUDENT*p;
FILE*fp;
p=\n");
return;
}
fp=fopen("student.txt","w+");
if(!
fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s%s%s%f%f%f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);
p=p->next;
}
fclose(fp);
}
************************************
函数功能:
不及格学生成绩
************************************
voidDesplayMarkSegment(void)
{
STUDENT*p;
intcount=0;
p=");
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
while(p)
{
if((6>((int)(p->mark110)))||(6>((int)(p->mark210)))||(6>((int)(p->mark310))))*只要有一科不及格就认为该生不及格*
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("不及格的学生一共有%d人\n",count);
}
************************************
函数功能:
按平均成绩排序
************************************
voidCompositorByTotalMark(void)
{
STUDENTexchange,*r,*p,*q;
r=");
return;
}
while(r)*两层while循环实现排序*
{
p=r;
q=r->next;
while(q)
{
if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))
{
strcpy(exchange.studentNumber,q->studentNumber);*先复制q结点信息到exchange*
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.className,q->className);
exchange.mark1=q->mark1;
exchange.mark2=q->mark2;
exchange.mark3=q->mark3;
strcpy(q->studentNumber,p->studentNumber);*再复制p结点信息到q*
strcpy(q->studentName,p->studentName);
strcpy(q->className,p->className);
q->mark1=p->mark1;
q->mark2=p->mark3;
q->mark3=p->mark3;
strcpy(p->studentNumber,exchange.studentNumber);*最后复制exchange结点信息到p*
strcpy(p->studentName,exchange.studentName);
strcpy(p->className,exchange.className);
p->mark1=exchange.mark1;
p->mark2=exchange.mark2;
p->mark3=exchange.mark3;
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}