学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(40页珍藏版)》请在冰点文库上搜索。
学生成绩管理系统
#include
#include
#include
#include//引用头文件
structA
{
intnum;
charname[20];
intscore[3];
structA*next;
};//声明学生成绩结构体变量
/*声明学生成绩管理系统各函数*/
voidAadd(charfilename[20]);//声明学生成绩管理系统添加功能函数
voidAdel(charfilename[20]);//声明学生成绩管理系统删除功能函数
voidAchange(charfilename[20]);//声明学生成绩管理系统修改功能函数
voidAsearch(charfilename[20]);//声明学生成绩管理系统查找功能函数
voidAsave(structA*pt,charfilename[20]);//声明学生成绩管理系统文件保存函数
voidEND();//声明结束函数
structA*Acreate();//声明学生成绩管理系统新建函数
structA*Aread(charfilename[20]);//声明学生成绩管理系统文件输出函数
/*定义结束函数*/
voidEND()
{
printf("###############################################################################\n");
printf("##\n");
printf("#谢谢您的使用,欢迎下次使用,再见!
#\n");
printf("##\n");
printf("###############################################################################\n");
}
/*定义学生成绩管理系统新建函数*/
structA*Acreate()
{
structA*p,*q,*head;
inta=0;charch;
p=q=(structA*)malloc(sizeof(structA));//开辟一个新单元
head=NULL;
printf("学号:
");
scanf("%d",&p->num);//输入第一个学生的学号
printf("姓名:
");
scanf("%s",p->name);//输入第一个学生的姓名
getchar();
printf("高数成绩:
\n");
scanf("%d",&p->score[0]);
printf("英语成绩:
\n");
scanf("%d",&p->score[1]);
printf("数据结构成绩:
\n");
scanf("%d",&p->score[2]);
printf("是否继续?
Y.是N(其它任意键).否");
scanf("%c",&ch);
getchar();
if(ch=='Y')
{
while(ch=='Y')
{
a=a+1;
if(a==1)
head=p;
else
q->next=p;//使p指向q的下一结点
q=p;
p=(structA*)malloc(sizeof(structA));//开辟一个新单元
printf("学号:
");
scanf("%d",&p->num);
printf("姓名:
");
scanf("%s",p->name);
getchar();
printf("高数成绩:
\n");
scanf("%d",&p->score[0]);
printf("英语成绩:
\n");
scanf("%d",&p->score[1]);
printf("数据结构成绩:
\n");
scanf("%d",&p->score[2]);
printf("是否继续?
Y.是N(其它任意键).否");
scanf("%c",&ch);
}
p->next=NULL;
q->next=p;
}
else
{
p->next=NULL;
head=p;
}
return(head);
}
/*定义学生成绩管理系统函数*/
intmain()
{
charch,filename[20];
while
(1)
{
printf("###############################################################################\n");
printf("##\n");
printf("#欢迎您使用学生成绩管理系统!
#\n");
printf("##\n");
printf("#欢迎您使用以下功能:
#\n");
printf("##\n");
printf("#A.添加B.删除#\n");
printf("##\n");
printf("#C.修改D.查找#\n");
printf("##\n");
printf("#E.保存F.退出#\n");
printf("##\n");
printf("##\n");
printf("##\n");
printf("###############################################################################\n");
printf("请您选择您所需要的功能:
");
scanf("%c",&ch);
getchar();
if(ch!
='A'&&ch!
='B'&&ch!
='C'&&ch!
='D'&&ch!
='E'&&ch!
='F')
printf("对不起,您输入有误,请重试。
\n");
else
{
if(ch=='F')
{
END();
return0;
}//退出使用
else
printf("请您输入所用文件名:
");
scanf("%s",filename);
getchar();
switch(ch)
{
case'A':
Aadd(filename);break;//选择学生成绩添加功能
case'B':
Adel(filename);break;//选择学生成绩删除功能
case'C':
Achange(filename);break;//选择学生成绩修改功能
case'D':
Asearch(filename);break;//选择学生成绩查找功能
case'E':
Asave(Acreate(),filename);break;//选择学生成绩保存功能
}
}
}
}
/*定义学生成绩管理系统文件保存函数*/
voidAsave(structA*pt,charfilename[20])
{
FILE*fp;
if((fp=fopen(filename,"a"))==NULL)//新建并打开文件
{
printf("对不起,无法打开此文件\n");//无法打开此文件
exit(0);
}
while(pt!
=NULL)//如果存在就输入文件保存
{
if(fwrite(pt,sizeof(structA),1,fp)!
=1)
printf("对不起,文件输入错误\n");
pt=pt->next;//使pt指向下一个结点
}
fclose(fp);//关闭fp所指的文件
}
/*定义学生成绩管理系统添加函数*/
voidAadd(charfilename[20])
{
structA*pt,*p;
pt=Acreate();
FILE*fp;
if((fp=fopen(filename,"ab"))==NULL)//打开文件出错
fp=fopen(filename,"wb");//如果原文件不存在,就新建
while(pt!
=NULL)//如果存在就输入文件保存
{
if(fwrite(pt,sizeof(structA),1,fp)!
=1)
printf("对不起,文件输入错误\n");
pt=pt->next;
}
fclose(fp);//关闭文件
p=Aread(filename);
free(p);//释放P所指的内存区
Asave(pt,filename);
}
/*定义学生成绩管理系统文件输出函数*/
structA*Aread(charfilename[20])
{
FILE*fp;//定义一个指向文件的指针变量fp
inti;
structA*head,*p,*q;
head=NULL;//头指针为空地址
if((fp=fopen(filename,"rb"))==NULL)//打开文件出错
{
printf("对不起,无法打开此文件\n");//无法打开此文件
exit(0);
}
printf("当前系统学生成绩内容如下:
\n");
p=q=(structA*)malloc(sizeof(structA));//把p和q分配为与structA相同字节的存储区
fread(p,sizeof(structA),1,fp);//从fp指向的文件读入一组数据
for(i=0;!
feof(fp);i++)//如果未遇到fp文件的结束标志
{
printf("学号:
%-20d姓名:
%-20s高数成绩:
%-10d英语成绩:
%-10d数据结构成绩:
%-10d\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
q=p;
p=(structA*)malloc(sizeof(structA));//开辟相同字节的存储区
fread(p,sizeof(structA),1,fp);//从fp指向的文件中再次读入一组数据
q->next=p;//使p指向下一个结点
if(i==0)head=q;//使q的地址成为头指针
i++;
}
q->next=NULL;//使q的下一个结点为空地址
return(head);
}
/*定义学生成绩管理系统删除功能函数*/
voidAdel(charfilename[20])
{
charch,name[20];
inta;
structA*pt,*p,*q,*head;
inti=0,flag=0;//判断是非的标志
do
{
i=0;
head=NULL;//头指针为空地址
p=q=(structA*)malloc(sizeof(structA));//开辟p和q空间的起始地址
p=Aread(filename);
head=p;//p的空间地址为头指针
printf("请您选择:
A.按学号操作B.按姓名操作C.按高数成绩操作D.按英语成绩操作E.按数据结构成绩操作");
scanf("%c",&ch);//键盘输入选择键
getchar();
switch(ch)
{
case'A':
{
printf("请输入您要删除学生的学号:
");//按学号操作
scanf("%d",&a);//输入学生学号
while(p!
=NULL)//指针p的地址不为空地址
{
if(a==p->num)//若指针p指向的学号与a相等
{
flag=1;//继续循环
if(i==0)
{
head=p->next;//p的下一个结点的地址为头指针
p=head;
}
else
{
q->next=p->next;//使p的下一个结点指向q的下一个结点
free(p);//释放p所指的内存区
p=q->next;//使q的下一个结点指向p
}
}
else
{
q=p;//指针变量p的地址赋予指针p
p=q->next;//使q的下一个结点指向p
}
i++;
}
if(flag==0)
printf("对不起,您要查找的内容不存在。
\n");
else
{
Asave(head,filename);//存储此文件
flag=0;//跳出循环
}
}
break;//提前终止循环,跳出switch语句
case'B':
{
printf("请输入您要删除学生的姓名:
");//按姓名操作
scanf("%s",name);
getchar();
while(p!
=NULL)//指针p的地址不为空地址
{
if(strcmp(p->name,name)==0)//比较指针p指向的成员姓名与输入姓名
{
flag=1;
if(i==0)
{
head=p->next;//p的下一个结点赋予头指针
p=head;//再将头指针赋予指针变量p
}
else
{
q->next=p->next;//使p的下一个结点指向q的下一个结点
free(p);//释放p所指的内存区
p=q->next;//使q的下一个结点指向p
}
}
else
{
q=p;
p=q->next;//使q的下一个结点指向p
}
i++;
}
if(flag==0)
{
printf("对不起,您要查找的内容不存在。
\n");
}
else
{
Asave(head,filename);//存储此头文件
flag=0;
}
}
break;//提前终止循环,跳出switch语句
case'C':
{
printf("请输入您要删除学生的高数成绩:
");//按高数成绩操作
scanf("%d",&a);
while(p!
=NULL)//指针p的地址不为空地址
{
if(a==p->score[0])//若输入成绩a等于p指向的高数成绩
{
flag=1;
if(i==0)
{
head=p->next;//使p下一个结点成为头指针
p=head;//再将头指针赋予指针变量p
}
else
{
q->next=p->next;//使p的下一个结点指向q的下一个结点
free(p);//释放p所指的内存区
p=q->next;//使q的下一个结点指向p
}
}
else
{
q=p;
p=q->next;//使q的下一个结点指向p
}
i++;
}
if(flag==0)
{
printf("对不起,您要查找的内容不存在。
\n");
}
else
{
Asave(head,filename);//存储此文件
flag=0;
}
}
break;//提前终止循环,跳出switch语句
case'D':
{
printf("请输入您要删除学生的英语成绩:
");//按英语成绩操作
scanf("%d",&a);
while(p!
=NULL)//当指针p的地址不为空地址时
{
if(a==p->score[1])//若输入成绩a等于p指向的英语成绩
{
flag=1;
if(i==0)
{
head=p->next;//使p指向的下一个结点引为头指针
p=head;//将头指针赋予指针p
}
else
{
q->next=p->next;//使p的下一个结点指向q的下一个结点
free(p);//释放p所指的内存区
p=q->next;}//使q的下一个结点指向p
}
else
{
q=p;//指针p的地址赋予指针q
p=q->next;//使q的下一个结点指向p
}
i++;
}
if(flag==0)
{
printf("对不起,您要查找的内容不存在。
\n");
}
else
{
Asave(head,filename);//存储此文件
flag=0;
}
}
break;//提前终止循环,跳出switch语句
case'E':
{
printf("请输入您要删除学生的数据结构成绩:
");//按数据结构成绩操作
scanf("%d",a);
while(p!
=NULL)//当指针p的地址不为空地址时
{
if(a==p->score[2])//若输入成绩a等于p指向的数据结构成绩
{
flag=1;
if(i==0)
{
head=p->next;//将p的下一个结点引为头指针
p=head;//再将头指针赋予指针变量p
}
else
{
q->next=p->next;//使p的下一个结点指向q的下一个结点
free(p);//释放p所指的内存区
p=q->next;//使q的下一个结点指向p
}
}
else
{
q=p;//将指针p的地址赋予指针q的地址
p=q->next;//使q的下一个结点指向p
}
i++;
}
if(flag==0)
{
printf("对不起,您要查找的内容不存在。
\n");
}
else
{
Asave(head,filename);//存储此文件
flag=0;
}
}
break;//提前终止循环,跳出switch语句
default:
//若上面所有条件都不成立,则运行以下程序
printf("对不起,您输入有误。
\n");
}
printf("是否继续?
Y.是N(其它任意键).否\n");
scanf("%c",&ch);
getchar();
}
while(ch=='Y');//当选择Y时
pt=Aread(filename);//输出文件pt
free(pt);//释放pt所指的存储区
}
/*定义学生成绩管理系统修改功能函数*/
voidAchange(charfilename[20])
{
charch,name[20];
inta;
structA*pt,*p,*head;
intflag;
do
{
flag=0;
p=(structA*)malloc(sizeof(structA));
p=Aread(filename);
head=p;
printf("请您选择:
A.按学号操作B.按姓名操作C.按高数成绩操作D.按英语成绩操作E.按数据结构成绩操作");
scanf("%c",&ch);
getchar();
switch(ch)
{
case'A':
{
printf("请输入您要修改学生的学号:
");//按学号操作
scanf("%d",&a);
getchar();
while(p!
=NULL)
{
if(a==p->num)
{
flag=1;
printf("学生原始信息:
\n");
printf("学号:
%d\n",p->num);
printf("姓名:
%s\n",p->name);
printf("高数成绩:
%d\n",p->score[0]);
printf("英语成绩:
%d\n",p->score[1]);
printf("数据结构成绩:
%d\n",p->score[2]);
printf("是否修改学号?
Y.是N(其它任意键).否");
scanf("%c",&ch);
getchar();
if(ch=='Y')
{
printf("请输入修改后的学号:
");
scanf("%d",&p->num);
getchar();
}
printf("是否修改姓名?
Y.是N(其它任意键).否");
scanf("%c",&ch);
getchar();
if(ch=='Y')
{
printf("请输入修改后的姓名:
");
scanf("%s",&p->name);
getchar();
}
printf("是否修改高数成绩?
Y.是N(其它任意键).否");
scanf("%c",&ch);
getchar();
if(ch=='Y')
{
printf("请输入修改后高数成绩:
");
scanf("%d",&p->score[0]);
}
printf("是否修改英语成绩?
Y.是N(其它任意键).否");
scanf("%c",&ch);
getchar();
if(ch=='Y')
{
printf("请输入修改后的英语成绩:
");
scanf("%d",&p->score[1]);
}
printf