p=p->next
i,xz,n,c,xm[9],xh[10],st*p,*q
p=head
if(p->next!
=NULL)
T
F
值2
值3
其他
输入xzswitch(xz)
值1:
输入学号
while(p->next!
=NULL&&strcmp(xh,p->next->num)!
=0)
p=p->next
输入姓名
while(p->next!
=NULL&&strcmp(xm,p->next->name)!
=0)
p=p->next
输入序号
输出错误
q=p->next
if(q==NULL)
T
F
输出未找到数据
确认是否删除数据,p->next=q->next,free(q)
VI、scorein()函数模块
VII、change()函数模块
VIII、load()函数模块
*fpfn[12]*head,*p,*q
从文件中进行导入
if((fp=fopen(fn,"rb"))==NULL)
T
F
输出打开文件时发生错误并退出
while(!
feof(fp))
if(fread(p,sizeof(stud),1,fp)==1)
T
F
p->next=q->nextq->next=p;q=p
IX、save()函数模块
X、mima()函数模块
inname[8]name1[21]password1[21]flag1flag2,输入用户名,密码
for(i=0;i<20;)
*(password1+i)=getch()
if(*(password1+i)=='\b')
T
F
if(i>0)
T
F
i--输出“退格”
输出“空格退格”
continue
if(*(password1+i)=='\r')
T
F
break
i++printf("*")
*(password1+i)='\0'flag2=strcmp(password,password1)
if(flag1==0&&flag2==0)
T
F
登陆成功
登陆失败
六、程序源代码
#include
#include
#include
#include
#include
typedefstructst
{
charnum[10],name[9],bclass[11];//学号、、班级
floatscore1,score2,score;//平时成绩、期末成绩、总评成绩
structst*next;
}stud;
intxuanze();//选择学生或教师
charmenu1();//教师选单
charmenu2();//学生选单
voidmima();//密码函数
stud*load();//导入
stud*search(stud*,int*);//查询
voidsave(stud*);//导出
voidscorein(stud*);//成绩录入
voidinsert(stud*);//插入
voiddeletel(stud*);//删除
voidchange(stud*);//修改
voidbrowse(stud*);//浏览
//**************************************
intmain(void)
{
charchoice1,choice,c;
inti;
stud*head,*p;
head=(stud*)malloc(sizeof(stud));//准备好表头
head->next=NULL;
loop:
choice1=xuanze();//进入选择系统
if(choice1==1)
{
mima();//密码函数
while
(1)
{
choice=menu1();//教师系统的表头
switch(choice)
{
case'1':
system("cls");
printf("浏览成绩情况。
\n");
browse(head);
getchar();
break;
case'2':
system("cls");
printf("插入学生成绩。
\n");
insert(head);
break;
case'3':
system("cls");
printf("查询学生成绩。
\n");
p=search(head,&i);
if(p!
=NULL)//输出数据
{printf("%2d%10s%8s%10s",i,p->num,p->name,p->bclass);
printf("%5.1f%5.1f%5.1f",p->score1,p->score2,p->score);
}
elseprintf("未找到!
");
break;
case'4':
system("cls");
printf("删除学生记录。
\n");
deletel(head);break;
case'5':
system("cls");
printf("学生成绩录入。
\n");
scorein(head);break;
case'6':
system("cls");
printf("修改学生记录。
\n");
change(head);break;
case'7':
system("cls");
printf("从文件中将成绩情况导入链表。
\n");
head=load();break;
case'8':
system("cls");
printf("将链表中成绩情况保存到文件。
\n");
save(head);break;
case'9':
system("cls");
printf("系统初始化。
\n");
head=(stud*)malloc(sizeof(stud));
head->next=NULL;
printf("%d%d\n",head,head->next);
break;
case'0':
system("cls");
printf("返回上一级\n");
printf("是否保存当前数据到文件?
(Y/N):
");
c=toupper(getchar());getchar();
if(c=='Y')
save(head);
else
{
system("cls");
gotoloop;
}
break;
default:
printf("输入错误!
");
}
if(choice=='0')break;
printf("\n按任意键继续......!
");
getchar();
}
}
if(choice1==2)//学生系统的表头
{
while
(1)
{
choice=menu2();
switch(choice)
{
case'1':
system("cls");
printf("浏览成绩情况。
\n");
browse(head);
getchar();
break;
case'2':
system("cls");
printf("查询学生成绩。
\n");
p=search(head,&i);
if(p!
=NULL)//输出数据
{printf("%2d%10s%8s%10s",i,p->num,p->name,p->bclass);
printf("%5.1f%5.1f%5.1f",p->score1,p->score2,p->score);
}
elseprintf("未找到!
");
break;
case'3':
system("cls");
gotoloop;
default:
printf("输入错误!
");
}
if(choice=='3')break;
printf("\n按任意键继续......!
");
getchar();
}
}
if(choice1==3)
printf("Goodbay!
");
exit(0);
}
//***********************************************
intxuanze()
{
intchoice;
system("color21");
printf("你好!
请选择入口:
\n");
printf("1.老师入口\n2.学生入口\n3.退出系统\n请选择:
");
scanf("%d",&choice);
fflush(stdin);
returnchoice;
}
charmenu1()//教师表头
{
charc;
system("cls");
system("color31");
printf("\n\n\n\n\n\n=======成绩管理系统========\n");
printf("--------------\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("0.返回上一级\n");
printf("\n\n请选择。
。
。
。
。
。
。
\n\n\n\n");
c=getchar();getchar();
returnc;
}
charmenu2()//学生表头
{
charc;
system("cls");
system("color34");
printf("\n\n\n\n\n\n=======成绩管理系统========\n");
printf("--------------\n");
printf("1.浏览成绩情况\n");
printf("2.查询学生成绩\n");
printf("3.返回上一级\n");
printf("\n\n请选择。
。
。
。
。
。
。
\n\n\n\n");
c=getchar();getchar();
returnc;
}
voidbrowse(stud*head)
{
//将链表中各个结点数据依次输出
inti=0;
stud*p;//工作指针
p=head->next;//指向首结点
printf("序号学号班级平时成绩期末成绩总评成绩\n");
while(p!
=NULL)//指针不空
{
printf("%2d%-10s%-8s%-10s",++i,p->num,p->name,p->bclass);
printf("%5.1f%5.1f%5.1f\n",p->score1,p->score2,p->score);
p=p->next;//工作指针p移动
}
}
//*****************************
voidinsert(stud*head)
{
//插入新结点,并使链表各结点按学号升序排列
charan,xh[10],xm[9],bc[11];
stud*p,*q;
do
{
p=head;
printf("请输入学生的学号、、班级:
\n");
gets(xh);
gets(xm);
gets(bc);//输入数据
if(!
strcmp(xh,"0000"))
return;//以“0000“作为结束标记
while((p->next!
=NULL)&&(strcmp(xh,p->next->num)>=0))
p=p->next;//查找新结点的插入位置
q=(stud*)malloc(sizeof(stud));//生成新结点由q指向
strcpy(q->num,xh);//把数据送入新结点
strcpy(q->name,xm);
strcpy(q->bclass,bc);
q->next=p->next;p->next=q;//吧新结点插入链表
printf("继续吗?
");
an=toupper(getchar());
getchar();
}
while(an=='Y');
}
//****************************
stud*search(stud*head,int*i)
{//在链表中按或学号进行查找
intxz;
charxh[10],xm[9];
stud*p;//工作指针
p=head->next;
*i=1;
//指向首结点
printf("1.按查找0.按学号查找\n");
scanf("%d",&xz);
getchar();
if(xz)
{
printf("请输入学生:
\n");
gets(xm);//输入
while(p!
=NULL&&strcmp(xm,p->name)!
=0)//按查找
{
p->next;
(*i)++;
}
}
else
{
printf("请输入学生:
\n");
gets(xh);//输入学号
while(p!
=NULL&&strcmp(xh,p->num)!
=0)//按学号查找
{p=p->next;(*i)++;}
}
returnp;
}
//*******************************
voiddeletel(structst*head)
{//删除结点
inti,xz,n;
charc,xm[9],xh[10];
structst*p,*q;//工作指针
p=head;//指针p指向头结点
if(p->next!
=NULL)
{printf("1.按学号删除2.按删除3.按序号删除\n");
scanf("%d",&xz);
switch(xz)
{
case1:
printf("请输入学生学号:
\n");
getchar();
gets(xh);//输入学号
while(p->next!
=NULL&&strcmp(xh,p->next->num)!
=0)
//按学号查找
p=p->next;
break;
case2:
printf("请输入学生:
\n");
getchar();
gets(xm);//输入
while(p->next!
=NULL&&strcmp(xm,p->next->name)!
=0)//按学号查找
p=p->next;
break;
case3:
printf("请输入序号:
\n");i=1;
scanf("%d",&n);
getchar();//输入序号
while(p->next!
=NULL&&i{
p=p->next;
i++;
}
break;
default:
printf("选择错误!
\n");
return;
}
q=p->next;//指针q指向p的直接后继
if(q==NULL)
{
printf("未找到指定结点,没有执行删除!
\n");
return;
}
printf("%-10s%-8s请确认(Y/N)",q->num,q->name);
c=getchar();
getchar();
if(tolower(c)=='y')
{
p->next=q->next;//把结点从链表中删除
free(q);
return;//释放q所指的结点
}
}
printf("无结点可删除!
\n");
}
//***********************************
voidscorein(stud*head)
{//依次给链表中各结点的数据录入成绩
inti=0;
intps,qm;
stud*p;//工作指针
p=head->next;//指向首结点
printf("请输入平时成绩在总评成绩中所占的百分比:
\n");
scanf("%d",&ps);
qm=100-ps;
while(p!
=NULL)
{
printf("%2d%10s%8s%10s\n",++i,p->num,p->name,p->bclass);
printf("平时成绩期末成绩:
");
scanf("%f%f",&p->score1,&p->score2);//录入平时成绩和期末成绩
p->score=p->score1*ps/100+p->score2*qm/100;//计算出总评成绩
printf("%5.1f\t%5.1f\t%5.1f\n",p->score1,p->score2,p->score);
p=p->next;//工作指针p移动
}
getchar();
}
//*********************************
voidchange(stud*head)
{