学生信息系统C代码.docx

上传人:b****3 文档编号:4626398 上传时间:2022-12-07 格式:DOCX 页数:23 大小:21.95KB
下载 相关 举报
学生信息系统C代码.docx_第1页
第1页 / 共23页
学生信息系统C代码.docx_第2页
第2页 / 共23页
学生信息系统C代码.docx_第3页
第3页 / 共23页
学生信息系统C代码.docx_第4页
第4页 / 共23页
学生信息系统C代码.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

学生信息系统C代码.docx

《学生信息系统C代码.docx》由会员分享,可在线阅读,更多相关《学生信息系统C代码.docx(23页珍藏版)》请在冰豆网上搜索。

学生信息系统C代码.docx

学生信息系统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>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1