C语言之学生管理系统.docx
《C语言之学生管理系统.docx》由会员分享,可在线阅读,更多相关《C语言之学生管理系统.docx(21页珍藏版)》请在冰点文库上搜索。
![C语言之学生管理系统.docx](https://file1.bingdoc.com/fileroot1/2023-6/11/c8ecbf26-469e-46ad-a85a-1b3b91d5b626/c8ecbf26-469e-46ad-a85a-1b3b91d5b6261.gif)
C语言之学生管理系统
流程图:
运行结果:
程序源码:
#include
#include
#include
#include
#include
#defineLENsizeof(structstudent)//求字节数运算符
structstudent
{
charname[20];
longintnum;
charsex[4];
intage;
charaddress[30];
floatscore;
structstudent*next;//链表
};//定义一个结构题
intTOTAL_NUM=0;//学生总数
structstudent*head=NULL;
voidmainmenu();//主界面
voidrecord();//记录数据
voidinsert(structstudent*stu);//插入数据
voiddisplay(structstudent*stu);//显示一个学生的信息
voiddisplayAll();//显示所有学生的信息
voidquery();//查询学生信息
voidquery_by_num();//按学号查询学生信息
voidquery_by_name();
voidreadData();//读取文件里学生的信息
voidwriteData();//向文件写入学生信息
voidfreeAll();//清空链表内容
voiddel();//删除学生信息
voidchange();//更改学生信息
voidsort();//排序
voiddevise(structstudent*p);//选择更改内容
intmain(void)
{
mainmenu();
return0;
}
//系统主菜单
voidmainmenu()
{
intchoice;
choice=-1;
readData();
printf("\t\t\t----------------------------------------------------\n");
printf("\t\t\t|欢迎使用通信工程专业学生信息管理系统|\n");
printf("\t\t\t----------------------------------------------------\n");
printf("\t\t\t本程序需要在当前目录下建立student.txt才可正常运行\n");
do
{
printf("\n\n\n");
printf("\t\t\t--------------------------------------------\n");
printf("\t\t\t通信工程专业学生信息管理系统|\n");
printf("\t\t\t--------------------------------------------\n");
printf("\t\t\t[1]----录入学生信息|\n");
printf("\t\t\t[2]----浏览学生信息|\n");
printf("\t\t\t[3]----查询学生信息|\n");
printf("\t\t\t[4]----删除学生信息|\n");
printf("\t\t\t[5]----修改学生信息|\n");
printf("\t\t\t[6]----排序|\n");
printf("\t\t\t[0]----退出系统|\n");
printf("\t\t\t--------------------------------------------\n");
printf("请输入您的选择");
scanf("%d",&choice);
switch(choice)
{
case0:
writeData();freeAll();exit(0);
case1:
record();break;
case2:
displayAll();break;
case3:
query();break;
case4:
del();break;
case5:
change();break;
case6:
sort();break;
default:
printf("\n无效选项!
");break;
}
}while(choice!
=0);
}
//录入学生信息
voidrecord()
{
structstudent*p0;
p0=(structstudent*)malloc(LEN);
printf("\t\t\t请输入学生的姓名:
");
scanf("%s",p0->name);
printf("\t\t\t请输入学生的学号:
");
scanf("%ld",&p0->num);
printf("\t\t\t请输入学生的性别:
");
scanf("%s",p0->sex);
printf("\t\t\t请输入学生的年龄:
");
scanf("%d",&p0->age);
printf("\t\t\t请输入学生的地址:
");
scanf("%s",p0->address);
printf("\t\t\t请输入学生的成绩:
");
scanf("%f",&p0->score);
insert(p0);
printf("\t\t\t该学生的信息为:
\n");
printf("\t\t\t-------------------------------------------------------------------------------\n");
printf("\t\t\t姓名\t学号\t\t年龄\t性别\t地址\t\t成绩\n");
display(p0);
}
voidinsert(structstudent*stu)
{
structstudent*p0,*p1,*p2;
p1=head;
p0=stu;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while((p0->num>p1->num)&&(p1->next!
=NULL))
{
p2=p1;p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
TOTAL_NUM++;
}
voiddisplay(structstudent*p)
{
printf("\t\t\t%s\t%ld\t\t%d\t%s\t%s\t\t%f\n",p->name,p->num,p->age,p->sex,p->address,p->score);
}
//浏览学生信息
voiddisplayAll()
{
structstudent*p;
printf("\t\t\t学生总数:
%d\n",TOTAL_NUM);
p=head;
if(head!
=NULL)
{
printf("\t\t\t姓名\t学号\t\t年龄\t性别\t地址\t\t成绩\n");
printf("\t\t\t-------------------------------------------------------------------------------\n");
do
{
display(p);
p=p->next;
}
while(p!
=NULL);
}
printf("\n");
}
voidquery()
{
intchoice;
choice=-1;
do
{
printf("\n");
printf("--------------------\n");
printf("|按学号查询请按1|\n");
printf("|按姓名查询请按2|\n");
printf("|取消请按0|\n");
printf("+--------------------+\n");
printf("请输入您的选择");
scanf("%d",&choice);
switch(choice)
{
case0:
return;
case1:
query_by_num();break;
case2:
query_by_name();break;
default:
printf("\n无效选项!
");break;
}
}
while(choice!
=0);
}
//按姓名查询学生信息
voidquery_by_name()
{
charname[20];
structstudent*p1;
printf("请输入学生的姓名");
scanf("%s",name);
if(head==NULL)
{printf("无学生记录\n");
return;
}
p1=head;
while(strcmp(name,p1->name)&&p1->next!
=NULL)
p1=p1->next;
if(!
strcmp(name,p1->name))
{
printf("\t\t\t姓名\t学号\t\t年龄\t性别\t地址\t\t成绩\n");
printf("\t\t\t-------------------------------------------------------------------------------\n");
display(p1);
}
else
printf("没有该学生记录请核对");
}
//按学号查询学生信息
voidquery_by_num()
{
intnum;
structstudent*p1;
printf("请输入学生的学号");
scanf("%ld",&num);
if(head==NULL)
{
printf("无学生记录\n");
return;
}
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
p1=p1->next;
if(num==p1->num)
{
printf("\t\t\t姓名\t学号\t\t年龄\t性别\t地址\t\t成绩\n");
printf("\t\t\t-------------------------------------------------------------------------------\n");
display(p1);
}
else
printf("\t\t\t没有该学生记录请核对");
}
//写入文件
voidwriteData()
{
FILE*fp;//文件指针
structstudent*p;
fp=fopen("1.txt","w");
if(!
fp)
{
printf("文件打开错误");
return;
}
fprintf(fp,"%d\n",TOTAL_NUM);
for(p=head;p!
=NULL;p=p->next)
{
fprintf(fp,"%s\t%ld\t%s\t%d\t%s\t%f\n",p->name,p->num,p->sex,p->age,p->address,p->score);
}
fclose(fp);
}
voidfreeAll()
{
structstudent*p1,*p2;
p1=p2=head;
while(p1)
{
p2=p1->next;
free(p1);
p1=p2;
}
}//读取文件
voidreadData()
{
FILE*fp;//文件指针
structstudent*p1,*p2;
fp=fopen("student.txt","r");
if(!
fp)
{
printf("文件打开错误");
return;
}
fscanf(fp,"%d\n",&TOTAL_NUM);
head=p1=p2=(structstudent*)malloc(LEN);
fscanf(fp,"%s\t%ld\t%s\t%d\t%s\t%f\n",p1->name,&p1->num,p1->sex,&p1->age,p1->address,&p1->score);
while(!
feof(fp))
{
p1=(structstudent*)malloc(LEN);
fscanf(fp,"%s\t%ld\t%s\t%d\t%s\t%f\n",p1->name,&p1->num,p1->sex,&p1->age,p1->address,&p1->score);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
fclose(fp);
}
//删除学生信息
voiddel()
{
structstudent*p1,*p2;
longintnum;
if(head==NULL)
{
printf("无学生记录\n");
return;
}
printf("请输入您要删除的学生的学号");
scanf("%ld",&num);
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
TOTAL_NUM--;
}
else
printf("没有该学生记录请核对\n");
}
voidsort()//排序模块。
将学生记录按学号从小到大排列。
用起泡排序算法实现
{
inti;
structstudent*ptr,*s=head,*p;
intcount=0,count1;
while(s)//统计链表结点个数
{
count++;
s=s->next;
}
for(i=1;i{
ptr=head;
p=NULL;
count1=count-i;//用来控制每轮起泡排序的终点即每次把学号最小的结点移到倒数第i个结点
while(ptr&&ptr->next&&(count1--))
{
if(ptr->score>ptr->next->score)
{
s=ptr->next;
ptr->next=s->next;
if(p==NULL)//ptr处于队头时
head=s;
else
p->next=s;
s->next=ptr;
p=s;
}
else
{
ptr=ptr->next;
if(p==NULL)//ptr处于队头时
p=head;
else
p=p->next;
}
}
}
displayAll();
return;
}
voidchange()
{
structstudent*p1,*p2;
longintnum;
if(head==NULL)
{
printf("无学生记录\n");
return;
}
printf("请输入您要修改的学生的学号");
scanf("%ld",&num);
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
{
p2=p1;p1=p1->next;
}
if(num==p1->num)
devise(p1);
else
printf("没有该学生记录请核对\n");
}
voiddevise(structstudent*p)
{
intchoice;
choice=-1;
do
{
printf("请选择您要修改的学生的信息内容\n");
printf("+----------------------+\n");
printf("|姓名请按1|\n");
printf("|学号请按2|\n");
printf("|性别请按3|\n");
printf("|年龄请按4|\n");
printf("|地址请按5|\n");
printf("|爱好请按6|\n");
printf("|取消请按0|\n");
printf("+----------------------+\n");
printf("请输入您的选择");
scanf("%d",&choice);
switch(choice)
{
case0:
return;
case1:
printf("请输入新姓名");scanf("%s",p->name);break;
case2:
printf("请输入新学号");scanf("%d",&p->num);break;
case3:
printf("请输入新性别");scanf("%s",p->sex);break;
case4:
printf("请输入新年龄");scanf("%s",&p->age);break;
case5:
printf("请输入新地址");scanf("%s",p->address);break;
case6:
printf("请输入新成绩");scanf("%f",&p->score);break;
default:
printf("\n无效选项!
");break;
}
}
while(choice!
=0);
}