cin>>choose;
}
Menu();
}
4.主程序
#include
#include
#include
#include
#include
usingnamespacestd;
typedefstructSTUDENT
{
charstudentNumber[10];/*学生学号*/
charstudentName[20];/*学生姓名*/
charclassName[20];/*班级名称*/
floatmark1;/*第1门成绩*/
floatmark2;/*第2门成绩*/
floatmark3;/*第3门成绩*/
structSTUDENT*next;
}STUDENT;
STUDENT*headLink;/*链表表头指针*/
voidReadInfoFormFile(void);/*以下是函数声明*/
voidDesplayMenu(void);
voidCreateHeadLink(void);
STUDENT*MallocNode(void);
voidGetInformation(STUDENT*t);
voidOutputInformation(void);
voidDesplayInfoBystudentNumber(void);
voidDesplayOneNode(STUDENT*t);
voidInsertOneNode(STUDENT*t);
voidDeleteNodeBystudentNumber(void);
voidChangeMarkByNumber(void);
voidSaveLinkToFile(void);
voidDesplayMarkSegment(void);
voidCompositorByTotalMark(void);
intchoose;/*用于接受用户的选择*/
voidyonghudenglu(void);
voidputong(void);
voidpass(void);
voidmain()/*主函数*/
{
CreateHeadLink();
ReadInfoFormFile();
yonghudenglu();
DesplayMenu();
}
voidyonghudenglu(void)
{
cout<<"****************MUNE***************\n\n";
cout<<"*用户登陆*\n";
cout<<"*1管理员登陆*\n";
cout<<"*2普通用户登陆*\n";
cout<<"*3退出*\n";
cout<<"****************END******************\n";
puts("pleaseinputyourchoose(1~3)");
cin>>choose;
switch(choose)
{
case1:
DesplayMenu();
getch();
break;
case2:
putong();
getch();
break;
case3:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
exit
(1);
break;
default:
break;
}
system("cls");
DesplayMenu();/*递归调用*/
}
/************************************
函数功能:
从文件中读学生信息到链表中
************************************/
voidReadInfoFormFile(void)
{
FILE*fp;
STUDENT*p;
fp=fopen("c:
\\snow.txt","rb");
if(!
fp)
{
cout<<"文件不存在\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;
cout<<"****************MUNE***************\n\n";
cout<<"*1显示所有学生的信息*\n";
cout<<"*2按学号查询*\n";
cout<<"*3增加学生*\n";
cout<<"*4删除学生*\n";
cout<<"*5按学号修改学生成绩*\n";
cout<<"*6保存所有学生信息*\n";
cout<<"*7显示优秀和不及格学生成绩*\n";
cout<<"*8排序结果并输出绩*\n";
cout<<"*0退出*\n";
puts("****************END******************\n");
puts("pleaseinputyourchoose(0~8)");
cin>>choose;/*取得用户的选择*/
switch(choose)
{
case1:
OutputInformation();/*显示所有学生的信息*/
getch();
break;
case2:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/
getch();
break;
case3:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case4:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
getch();
break;
case5:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
getch();
break;
case6:
SaveLinkToFile();/*保存数据*/
break;
case7:
DesplayMarkSegment();/*显示各分数段的学生成绩*/
getch();
break;
case8:
CompositorByTotalMark();
getch();
break;
case0:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
exit
(1);
break;
default:
break;
}
system("cls");
DesplayMenu();/*递归调用*/
}
/************************************
函数功能:
建立链表表头
************************************/
voidputong(void)
{
cout<<"****************MUNE***************\n\n";
cout<<"*1显示所有学生的信息*\n";
cout<<"*2按学号查询*\n";
cout<<"*3按学号修改学生成绩*\n";
cout<<"*4显示优秀和不及格学生成绩*\n";
cout<<"*5排序结果并输出绩*\n";
cout<<"*0退出*\n";
puts("****************END******************\n");
puts("pleaseinputyourchoose(0~5)");
cin>>choose;/*取得用户的选择*/
switch(choose)
{
case1:
OutputInformation();/*显示所有学生的信息*/
getch();
break;
case2:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/
getch();
break;
case3:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
getch();
break;
case4:
DesplayMarkSegment();/*显示各分数段的学生成绩*/
getch();
break;
case5:
CompositorByTotalMark();
getch();
break;
case0:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
exit
(1);
break;
default:
break;
}
}
voidCreateHeadLink(void)
{
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
5.系统实现
(主要负责模块的核心实现代码)
/************************************
管理员登录/密码修改
************************************/
voidmanager:
:
enter()//修改密码
{
}
stringgetPW(charpwCh='*')
{
constintlength=18;//最大密码长度=18
charpass[length]={0};
for(inti=0;i{
pass[i]=getch();
if(pass[i]=='\r')
{
pass[i]=0;
cout<returnstring(pass);
}
cout<}
cout<returnstring(pass);
}
//登录函数
intmanager:
:
pass()
{
stringpass1,pass2,pass3;
inti=0;
ifstreamfin("D:
\\code.txt");
if(!
fin)
{
system("cls");
do
{
system("cls");
stringpass("123");
cout<cout<<"\t\t"<cout<"<cout<"<cout<";
if(!
pare(getPW()))
{
choose_face2();
return0;
}
else
{
cout<\n"<system("pause");
i++;////错误次数计数
}
}while(i<3);
if(i==3)
{
cout<"<exit(0);
}
}
fin>>pass2;//从文件里读密码
pass3=pass2;
do
{
system("cls");
cout<cout<"<cout<"<cout<";
if(!
pare(getPW()))
{
choose_face2();
return0;
}
else
{
cout<\n"<system("pause");
i++;////错误次数计数
}
}while(i<3);
if(i==3)
{
cout<"<exit(0);
}
return0;
}
/************************************
函数功能:
根据输入的学号修改成绩
************************************/
voidChangeMarkByNumber(void)
{
STUDENT*p;
charstudentNumber[20];
charflag=0;
floatmark1,mark2,mark3;
p=headLink->next;
printf("请输入学生学号:
\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
cout<<"请输入新的第1门成绩:
\n";
cin>>mark1;
cout<<"请输入新的第2门成绩:
\n";
cin>>mark2;
cout<<"请输入新的第3门成绩:
\n";
cin>>mark3;
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
cout<<"修改成功\n";
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在学号为%s的学生\n",studentNumber);
}
/************************************
函数功能:
显示优秀和不及格学生成绩
************************************/
voidDesplayMarkSegment(void)
{
STUDENT*p;
intcount=0;
p=headLink->next;
cout<<"有一门60分以下(不及格)的学生成绩如下:
\n";
cout<<"学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n";
while(p)
{
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
cout<<"不及格的学生一共有%d人\n",count;
p=headLink->next;
cout<<"成绩优秀的学生成绩如下:
";
cout<<"学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n";
count=0;
while(p)
{
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10))))
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
cout<<"成绩优秀的学生一共有%d人\n",count;
}
/************************************
函数功能:
按总成绩排序
************************************/
voidCompositorByTotalMark(void)
{
STUDENTexchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息\n";
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->class