学生信息系统C代码.docx
《学生信息系统C代码.docx》由会员分享,可在线阅读,更多相关《学生信息系统C代码.docx(23页珍藏版)》请在冰豆网上搜索。
![学生信息系统C代码.docx](https://file1.bdocx.com/fileroot1/2022-12/7/d7568be2-105f-43ae-8301-74c69702332e/d7568be2-105f-43ae-8301-74c69702332e1.gif)
学生信息系统C代码
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"----------------------------STUDENT----------------------------------\n"
#defineHEADER2"|number|name|Comp|Math|Eng|sum|ave|mici|\n"
#defineHEADER3"|---------------|---------------|----|----|----|--------|-------|-----|"
#defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|%4d|\n"
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci
#defineEND"---------------------------------------------------------------------\n"
intsaveflag=0。
/*是否需要存盘的标志变量*/
/*定义与学生有关的数据结构*/
typedefstructstudent/*标记为student*/
{
charnum[10]。
/*学号*/
charname[15]。
/*姓名*/
intcgrade。
/*C语言成绩*/
intmgrade。
/*数学成绩*/
integrade。
/*英语成绩*/
inttotal。
/*总分*/
floatave。
/*平均分*/
intmingci。
/*名次*/
}。
/*定义每条记录或结点的数据结构,标记为:
node*/
typedefstructnode
{
structstudentdata。
/*数据域*/
structnode*next。
/*指针域*/
}Node,*Link。
/*Node为node类型的结构变量,*Link为node类型的指针变量*/
voidmenu(>/*主菜单*/
{
system("cls">。
/*调用DOS命令,清屏.与clrscr(>功能相同*/
textcolor(10>。
/*在文本模式中选择新的字符颜色*/
gotoxy(10,5>。
/*在文本窗口中设置光标*/
cprintf("TheStudents'GradeManagementSystem\n">。
gotoxy(10,8>。
cprintf("*************************Menu********************************\n">。
gotoxy(10,9>。
cprintf("*1inputrecord2deleterecord*\n">。
gotoxy(10,10>。
cprintf("*3searchrecord4modifyrecord*\n">。
gotoxy(10,11>。
cprintf("*5insertrecord6countrecord*\n">。
gotoxy(10,12>。
cprintf("*7sortreord8saverecord*\n">。
gotoxy(10,13>。
cprintf("*9displayrecord0quitsystem*\n">。
gotoxy(10,14>。
cprintf("*************************************************************\n">。
/*cprintf(>送格式化输出至文本窗口屏幕中*/
}
voidprintheader(>/*格式化输出表头*/
{
printf(HEADER1>。
printf(HEADER2>。
printf(HEADER3>。
}
voidprintdata(Node*pp>/*格式化输出表中数据*/
{
Node*p。
p=pp。
printf(FORMAT,DATA>。
}
voidWrong(>/*输出按键错误信息*/
{
printf("\n\n\n\n\n***********Error:
inputhaswrong!
pressanykeytocontinue**********\n">。
getchar(>。
}
voidNofind(>/*输出未查找此学生的信息*/
{
printf("\n=====>Notfindthisstudent!
\n">。
}
voidDisp(Linkl>/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
{
Node*p。
p=l->next。
/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
if(!
p>/*p==NULL,NUll在stdlib中定义为0*/
{
printf("\n=====>Notstudentrecord!
\n">。
getchar(>。
return。
}
printf("\n\n">。
printheader(>。
/*输出表格头部*/
while(p>/*逐条输出链表中存储的学生信息*/
{
printdata(p>。
p=p->next。
/*移动直下一个结点*/
printf(HEADER3>。
}
getchar(>。
}
/*************************************************************
作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
findmess[]保存要查找的具体内容。
nameornum[]保存按什么查找。
在单链表l中查找。
**************************************************************/
Node*Locate(Linkl,charfindmess[],charnameornum[]>
{
Node*r。
if(strcmp(nameornum,"num">==0>/*按学号查询*/
{
r=l->next。
while(r>
{
if(strcmp(r->data.num,findmess>==0>/*若找到findmess值的学号*/
returnr。
r=r->next。
}
}
elseif(strcmp(nameornum,"name">==0>/*按姓名查询*/
{
r=l->next。
while(r>
{
if(strcmp(r->data.name,findmess>==0>/*若找到findmess值的学生姓名*/
returnr。
r=r->next。
}
}
return0。
/*若未找到,返回一个空指针*/
}
/*输入字符串,并进行长度验证(长度*/
voidstringinput(char*t,intlens,char*notice>
{
charn[255]。
do{
printf(notice>。
/*显示提示信息*/
scanf("%s",n>。
/*输入字符串*/
if(strlen(n>>lens>printf("\nexceedtherequiredlength!
\n">。
/*进行长度校验,超过lens值重新输入*/
}while(strlen(n>>lens>。
strcpy(t,n>。
/*将输入的字符串拷贝到字符串t中*/
}
/*输入分数,0<=分数<=100>*/
intnumberinput(char*notice>
{
intt=0。
do{
printf(notice>。
/*显示提示信息*/
scanf("%d",&t>。
/*输入分数*/
if(t>100||t<0>printf("\nscoremustin[0,100]!
\n">。
/*进行分数校验*/
}while(t>100||t<0>。
returnt。
}
/*增加学生记录*/
voidAdd(Linkl>
{
Node*p,*r,*s。
/*实现添加操作的临时的结构体指针变量*/
charch,flag=0,num[10]。
r=l。
s=l->next。
system("cls">。
Disp(l>。
/*先打印出已有的学生信息*/
while(r->next!
=NULL>
r=r->next。
/*将指针移至于链表最末尾,准备添加记录*/
while(1>/*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/
{
while(1>/*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/
{
stringinput(num,10,"inputnumber(press'0'returnmenu>:
">。
/*格式化输入学号并检验*/
flag=0。
if(strcmp(num,"0">==0>/*输入为0,则退出添加操作,返回主界面*/
{return。
}
s=l->next。
while(s>/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/
{
if(strcmp(s->data.num,num>==0>
{
flag=1。
break。
}
s=s->next。
}
if(flag==1>/*提示用户是否重新输入*/
{getchar(>。
printf("=====>Thenumber%sisnotexisting,tryagain?
(y/n>:
",num>。
scanf("%c",&ch>。
if(ch=='y'||ch=='Y'>
continue。
else
return。
}
else
{break。
}
}
p=(Node*>malloc(sizeof(Node>>。
/*申请内存空间*/
if(!
p>
{
printf("\nallocatememoryfailure">。
/*如没有申请到,打印提示信息*/
return。
/*返回主界面*/
}
strcpy(p->data.num,num>。
/*将字符串num拷贝到p->data.num中*/
stringinput(p->data.name,15,"Name:
">。
p->data.cgrade=numberinput("ClanguageScore[0-100]:
">。
/*输入并检验分数,分数必须在0-100之间*/
p->data.mgrade=numberinput("MathScore[0-100]:
">。
/*输入并检验分数,分数必须在0-100之间*/
p->data.egrade=numberinput("EnglishScore[0-100]:
">。
/*输入并检验分数,分数必须在0-100之间*/
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade。
/*计算总分*/
p->data.ave=(float>(p->data.total/3>。
/*计算平均分*/
p->data.mingci=0。
p->next=NULL。
/*表明这是链表的尾部结点*/
r->next=p。
/*将新建的结点加入链表尾部中*/
r=p。
saveflag=1。
}
return。
}
voidQur(Linkl>/*按学号或姓名,查询学生记录*/
{
intselect。
/*1:
按学号查,2:
按姓名查,其他:
返回主界面<菜单)*/
charsearchinput[20]。
/*保存用户输入的查询内容*/
Node*p。
if(!
l->next>/*若链表为空*/
{
system("cls">。
printf("\n=====>Nostudentrecord!
\n">。
getchar(>。
return。
}
system("cls">。
printf("\n=====>1Searchbynumber=====>2Searchbyname\n">。
printf("pleasechoice[1,2]:
">。
scanf("%d",&select>。
if(select==1>/*按学号查询*/
{
stringinput(searchinput,10,"inputtheexistingstudentnumber:
">。
p=Locate(l,searchinput,"num">。
/*在l中查找学号为searchinput值的节点,并返回节点的指针*/
if(p>/*若p!
=NULL*/
{
printheader(>。
printdata(p>。
printf(END>。
printf("pressanykeytoreturn">。
getchar(>。
}
else
Nofind(>。
getchar(>。
}
elseif(select==2>/*按姓名查询*/
{
stringinput(searchinput,15,"inputtheexistingstudentname:
">。
p=Locate(l,searchinput,"name">。
if(p>
{
printheader(>。
printdata(p>。
printf(END>。
printf("pressanykeytoreturn">。
getchar(>。
}
else
Nofind(>。
getchar(>。
}
else
Wrong(>。
getchar(>。
}
/*删除学生记录:
先找到保存该学生记录的节点,然后删除该节点*/
voidDel(Linkl>
{
intsel。
Node*p,*r。
charfindmess[20]。
if(!
l->next>
{system("cls">。
printf("\n=====>Nostudentrecord!
\n">。
getchar(>。
return。
}
system("cls">。
Disp(l>。
printf("\n=====>1Deletebynumber=====>2Deletebyname\n">。
printf("pleasechoice[1,2]:
">。
scanf("%d",&sel>。
if(sel==1>
{
stringinput(findmess,10,"inputtheexistingstudentnumber:
">。
p=Locate(l,findmess,"num">。
if(p>/*p!
=NULL*/
{
r=l。
while(r->next!
=p>
r=r->next。
r->next=p->next。
/*将p所指节点从链表中去除*/
free(p>。
/*释放内存空间*/
printf("\n=====>deletesuccess!
\n">。
getchar(>。
saveflag=1。
}
else
Nofind(>。
getchar(>。
}
elseif(sel==2>/*先按姓名查询到该记录所在的节点*/
{
stringinput(findmess,15,"inputtheexistingstudentname">。
p=Locate(l,findmess,"name">。
if(p>
{
r=l。
while(r->next!
=p>
r=r->next。
r->next=p->next。
free(p>。
printf("\n=====>deletesuccess!
\n">。
getchar(>。
saveflag=1。
}
else
Nofind(>。
getchar(>。
}
else
Wrong(>。
getchar(>。
}
/*修改学生记录。
先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/
voidModify(Linkl>
{
Node*p。
charfindmess[20]。
if(!
l->next>
{system("cls">。
printf("\n=====>Nostudentrecord!
\n">。
getchar(>。
return。
}
system("cls">。
printf("modifystudentrecorder">。
Disp(l>。
stringinput(findmess,10,"inputtheexistingstudentnumber:
">。
/*输入并检验该学号*/
p=Locate(l,findmess,"num">。
/*查询到该节点*/
if(p>/*若p!
=NULL,表明已经找到该节点*/
{
printf("Number:
%s,\n",p->data.num>。
printf("Name:
%s,",p->data.name>。
stringinput(p->data.name,15,"inputnewname:
">。
printf("Clanguagescore:
%d,",p->data.cgrade>。
p->data.cgrade=numberinput("ClanguageScore[0-100]:
">。
printf("Mathscore:
%d,",p->data.mgrade>。
p->data.mgrade=numberinput("MathScore[0-100]:
">。
printf("Englishscore:
%d,",p->data.egrade>。
p->data.egrade=numberinput("EnglishScore[0-100]:
">。
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade。
p->data.ave=(float>(p->data.total/3>。
p->data.mingci=0。
printf("\n=====>modifysuccess!
\n">。
Disp(l>。
saveflag=1。
}
else
Nofind(>。
getchar(>。
}
/*插入记录:
按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。
*/
voidInsert(Linkl>
{
Linkp,v,newinfo。
/*p指向插入位置,newinfo指新插入记录*/
charch,num[10],s[10]。
/*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/
intflag=0。
v=l->next。
system("cls">。
Disp(l>。
while(1>
{stringinput(s,10,"pleaseinputinsertlocationaftertheNumber:
">。
flag=0。
v=l->next。
while(v>/*查询该学号是否存在,flag=1表示该学号存在*/
{
if(strcmp(v->data.num,s>==0>{flag=1。
break。
}
v=v->next。
}
if(flag==1>
break。
/*若学号存在,则进行插入之前的新记录的输入操作*/
else
{getchar(>。
printf("\n=====>Thenumber%sisnotexisting,tryagain?
(y/n>:
",s>。
scanf("%c",&ch>。
if(ch=='y'||ch=='Y'>
{continue。
}
else
{return。
}
}
}
/*以下新记录的输入操作与Add(>相同*/
stringinput(num,10,"inputnewstudentNumber:
">。
v=l->next。
while(v>
{
if(strcmp(v->data.num,num>==0>
{
printf("=====>Sorry,thenewnumber:
'%s'isexisting!
\n",num>。
printheader(>。
printdata(v>。
printf("\n">。
getchar(>。
return。
}
v=v->next。
}
newinfo=(Node*>malloc(sizeof(Node>>。
if(!
newinfo>
{
printf("\nallocatememoryfailure">。
/*如没有申请到,打印提示信息*/
return。
/*返回主界面*/
}
strcpy(newinfo->data.num,num>。
stringinput(newinfo->data.name,15,"Name:
">。
newinfo->data.cgrade=numberinput("ClanguageScore[0-100]:
">。
newinfo->data.mgrade=numberinput("MathScore[0-100]:
">。
newinfo->data.egrade=numberinput("EnglishScore[0-100]:
">。
newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade。
newinfo->data.ave=(float>(newinfo->data.total/3>