学生成绩管理系统
请大家帮帮忙,运行出来会有很多其他字,而且输入学生姓名,会出现不存在#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
typedef struct STUDENT
{
char studentNumber[10];/*学生学号*/
char studentName[20];/*学生姓名*/
char studentAge[10];/*学生年龄*/
char studentSex[10];/*学生性别*/
char courseNumber[10];/*课程号*/
char courseName[20];/*课程名*/
char courseTeacherName[20];/*任课老师*/
float courseMark;/*成绩*/
struct STUDENT *next;
}STUDENT;
STUDENT *headLink;/*链表表头指针*/
/*以下是函数声明*/
void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
STUDENT *MallocNode(void);
void GetInformation(STUDENT *t);
void OutputInformation(void);
void DesplayInfoBystudentName(void);
void DesplayOneNode(STUDENT *t);
void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber(void);
void ChangeMarkBycourseNumber(void);
void ChangeMarkBystudentNumber(void);
void SaveLinkToFile(void);
void DesplayMarkSegment(void);
void CompositorByTotalMark(void);
int choose;/*用于接受用户的选择*/
/*主函数*/
void main()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
/*函数功能:从文件中读学生信息到链表中*/
void ReadInfoFormFile(void)
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%s%s%f",p->studentNumber,p->studentName,p->studentAge,p->studentSex,p->courseNumber,p->courseName,p->courseTeacherName,p->courseMark)>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
/*函数功能:显示菜单,根据用户的输入完成相应的功能*/
void DesplayMenu(void)
{
STUDENT *p;
printf("-------请选择相应功能------------\n\n");
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)
{
case 1:
OutputInformation();/*显示所有学生的信息*/
break;
case 2:
DesplayInfoBystudentName();
break;
case 3:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case 4:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case 5:
ChangeMarkBycourseNumber();/*根据用户输入的课程号修改学生成绩*/
break;
case 6:
ChangeMarkBystudentNumber();/*根据用户输入的学号修改学生成绩*/
break;
case 7:
SaveLinkToFile();/*保存数据*/
break;
case 8:
DesplayMarkSegment();/*显示不及格的学生成绩*/
break;
case 9:
CompositorByTotalMark();/*按平均成绩排序*/
break;
case 10:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
break;
default:
break;
}
DesplayMenu();/*递归调用*/
}
/*函数功能:建立链表表头*/
void CreateHeadLink(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
/*函数功能:申请一个新结点,并将其初始化*/
STUDENT *MallocNode(void)
{
STUDENT *p;
int i;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return 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->courseNumber[i]='\0';
p->courseMark=0.0;
p->next=NULL;
return p;
}
/*函数功能:取得用户输入的学生信息*/
void GetInformation(STUDENT *t)
{
printf("请输入学生学号:\n");
scanf("%s",t->studentNumber);
printf("请输入学生年龄:\n");
scanf("%s",t->studentAge);
printf("请输入学生性别:\n");
scanf("%s",t->studentSex);
printf("请输入学生姓名:\n");
scanf("%s",t->studentName);
printf("请输入该生所学课程号:\n");
scanf("%s",t->courseNumber);
printf("请输入该生学习课程名:\n");
scanf("%f",&(t->courseName));
printf("请输入该生学习该课程的任课老师:\n");
scanf("%f",&(t->courseTeacherName));
printf("请输入成绩:\n");
scanf("%f",&(t->courseMark));
;
}
/*函数功能:在链表的结尾处增加一个结点*/
void InsertOneNode(STUDENT *t)
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/*函数功能:根据用户输入的学生姓名显示该学生的信息*/
void DesplayInfoBystudentName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
p=headLink->next;
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学号\t姓名\t年龄\t性别\t课程号\t课程名\t任课老师\t成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/*函数功能:输出一个结点的信息*/
void DesplayOneNode(STUDENT *t)
{
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->studentAge);
printf("%s\t",t->studentSex);
printf("%s\t",t->courseNumber);
printf("%s\t",t->courseName);
printf("%s\t",t->courseTeacherName);
printf("%.2f\t",t->courseMark);
printf("\n");
}
/*函数功能:根据用户输入的学号删除该学生*/
void DeleteNodeBystudentNumber(void)
{
char studentNumber[10];
STUDENT *p,*q;
char flag=0;
printf("请输入要删除的学生学号:");
scanf("%s",studentNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->studentNumber,studentNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("不存在该学号的学生\n");
return;
}
printf("成功删除\n");
}
/*函数功能:显示所有学生的信息*/
void OutputInformation(void)
{
STUDENT *p;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
printf("学号\t姓名\t年龄\t性别\t课程号\t课程名\t任课老师\t成绩\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/*函数功能:根据输入的课程号修改成绩*/
void ChangeMarkBycourseNumber(void)
{
STUDENT *p;
int a;
char studentName[20];
char flag=0;
float courseMark;
p=headLink->next;
printf("请输入学生课程号:\n");
scanf("%d",&a);
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的成绩:\n");
scanf("%f",&courseMark);
p->courseMark=courseMark;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在课程号为 %s 的学生\n",studentName);
}
/*函数功能:根据输入的学号修改成绩*/
void ChangeMarkBystudentNumber(void)
{
STUDENT *p;
char studentNumber[20];
char flag=0;
float courseMark;
p=headLink->next;
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的成绩:\n");
scanf("%f",&courseMark);
p->courseMark=courseMark;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
}
/*函数功能:保存链表数据到文件中*/
void SaveLinkToFile(void)
{
STUDENT *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s%s%s%s%s%s%f",p->studentNumber,p->studentName,p->studentAge,p->studentSex,p->courseNumber,p->courseName,p->courseTeacherName,p->courseMark);
p=p->next;
}
fclose(fp);
}
/*函数功能:不及格学生成绩*/
void DesplayMarkSegment(void)
{
STUDENT *p;
int count=0;
p=headLink->next;
printf("60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t年龄\t性别\t课程号\t课程名\t任课老师\t成绩\n\n");
while(p)
{
if((6>((int)(p->courseMark/10))))/*只要有一科不及格就认为该生不及格*/
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("不及格的学生一共有%d人\n",count);
}
/*
函数功能:按平均成绩排序
*/
void CompositorByTotalMark(void)
{
STUDENT exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("现在还没学生信息,请先输入学生信息\n");
return;
}
while(r)/*两层while循环实现排序*/
{
p=r;
q=r->next;
while(q)
{
if((q->courseMark)>(p->courseMark))
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.courseNumber,q->courseNumber);
exchange.courseMark=q->courseMark;
strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
strcpy(q->studentName,p->studentName);
strcpy(q->courseNumber,p->courseNumber);
q->courseMark=p->courseMark;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
strcpy(p->studentName,exchange.studentName);
strcpy(p->courseNumber,exchange.courseNumber);
p->courseMark=exchange.courseMark;
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}
这是TXT文件
101 NJ 18 女 123456 高等数学 李华 89
102 HU 19 女 123455 英语 陆林 89
103 FG 19 男 123456 高等数学 李华 87
104 HL 18 男 123455 英语 陆林 84
105 PL 17 女 123457 概率论 高明 89
106 HK 18 女 123457 概率论 高明 98
107 TT 19 男 123457 概率论 高明 89
108 BH 16 男 123457 概率论 高明 68
109 FG 17 男 123455 英语 陆林 87
110 HJ 19 女 123456 高等数学 李华 91
111 SK 18 女 123456 高等数学 李华 78
112 ET 17 女 123456 高等数学 李华 56
113 DF 16 男 123455 英语 陆林 58
114 NX 15 女 123455 英语 陆林 54
115 HY 18 男 123567 大学物理 林波 98
116 TY 18 男 123567 大学物理 林波 56
117 DR 19 女 123567 大学物理 林波 45
118 GH 18 女 123789 体育 开凯 48
119 FG 18 男 123789 体育 开凯 85
120 VY 17 男 123289 化学 吴寒冰 52
121 MJ 17 女 123289 化学 吴寒冰 68
122 QK 18 男 123457 概率论 高明 65
123 JK 18 女 123457 概率论 高明 54
124 RS 17 男 123456 高等数学 李华 52
125 DT 20 男 123455 英语 陆林 53