学生成绩管理系统基本C语言编写.docx

上传人:b****2 文档编号:25754711 上传时间:2023-06-12 格式:DOCX 页数:24 大小:21.81KB
下载 相关 举报
学生成绩管理系统基本C语言编写.docx_第1页
第1页 / 共24页
学生成绩管理系统基本C语言编写.docx_第2页
第2页 / 共24页
学生成绩管理系统基本C语言编写.docx_第3页
第3页 / 共24页
学生成绩管理系统基本C语言编写.docx_第4页
第4页 / 共24页
学生成绩管理系统基本C语言编写.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

学生成绩管理系统基本C语言编写.docx

《学生成绩管理系统基本C语言编写.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统基本C语言编写.docx(24页珍藏版)》请在冰豆网上搜索。

学生成绩管理系统基本C语言编写.docx

学生成绩管理系统基本C语言编写

//代码版权所有,不要

#include"stdio.h"#include"stdlib.h"#include"string.h"#include"conio.h"

copy,仅供参考学习。

//标准输入输出函数库

//标准函数库

//字符串函数库

//屏幕操作函数库

 

#define

HEADER1"

***************************

学生

成绩

******************************\n\n"

#define

HEADER2"学号

姓名

计算机

数学英语

均分

名次\n\n"

#defineFORMAT"

%-10s%-10s%5d%5d%5d%5d

%.3f%4d\n"

DATA

#definep->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci

intsaveflag=0;//是否需要存盘的标志变量

//定义与学生有关的数据结构

//标记为student

//学号

//姓名//计算机成绩//数学成绩//英语成绩

//总分

//平均分

//名次

typedefstructstudent{

charnum[12];charname[15];intcgrade;intmgrade;integrade;inttotal;

floatave;intmingci;

}sqlist;

//定义每条记录或结点的数据结构,标记为:

node

typedefstructnode

{

structstudentdata;//数据域

structnode*next;//指针域

}Node,*Link;//Node为node类型的结构变量,*Link为node类型的指针变量

voidmenu()//主菜单

{

system("cls");

//调用

DOS命令,清屏

.与clrscr()功能相同

printf("

\n");

printf("

学生成绩管理信息系统主菜单\n\n");

printf("

**************************************************\n");

printf("

$

1、

添加记录

6、统计记录

$\n");

printf("

$

2、

删除记录

7、排序记录

$\n");

printf("

$

3、

查找记录

8、

保存记录

$\n");

printf("

$

4、

修改记录

9、

显示记录

$\n");

printf("

$

5、

插入信息

0、

退出系统

$\n");

printf("

************************************************

**\n");

}

voidprintheader()//格式化输出表头

{

printf(HEADER1);

printf(HEADER2);

}

voidprintdata(Node*pp)//格式化输出表中数据

{

Node*p;

p=pp;

printf(FORMAT,DATA);

}

voidWrong()//输出按键错误信息

{

printf("\n\n\n\n\n**********Error:

输入错误!

请按任意键继续!

!

**********\n");getchar();

}

voidNofind()//输出未查找此学生的信息

{printf("\n=====>未查找此学生的信息!

\n");

}

voidDisp(Linkl)//显示单链表l中存储的学生记录,内容为student结构中定义的内容

{

Node*p;

p=l->next;//l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息

if(!

p)//p==NULL,NUll在stdlib中定义为0{

printf("\n=====>无学生的记录!

\n");getchar();

return;

}

//输出表格头部

printf("\n\n");printheader();

while(p)//逐条输出链表中存储的学生信息

{

printdata(p);

p=p->next;//移动直下一个结点

}

getchar();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;//若未找到,返回一个空指针

}

//输入字符串,并进行长度验证(长度

charn[255];do

printf(notice);//显示提示信息

scanf("%s",n);//输入字符串

if(strlen(n)>lens)

printf("\n超出长度范围,重新输入!

\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("\n分数必须在0到100之间!

\n");//进行分数校验

}

while(t>100||t<0);

returnt;

}

//增加学生记录

voidAdd(Linkl)

{

Node*p,*r,*s;//实现添加操作的临时的结构体指针变量

charch,flag=0,num[12];

r=l;

s=l->next;

system("cls");

Disp(l);//先打印出已有的学生信息while(r->next!

=NULL)

r=r->next;//将指针移至于链表最末尾,准备添加记录

while

(1)//一次可输入多条记录,直至输入学号为0的记录结点添加

操作

{

while

(1)//输入学号,保证该学号没有被使用,若输入学号为0,

则退出添加记录操作

stringinput(num,12,"\n

输入学号(按“0”返回菜单!

):

");//格式化输入学号并

检验

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("=====>学号%s存在,重试?

(y/n):

",num);scanf("%c",&ch);if(ch=='y'||ch=='Y')continue;

else

return;

}

else

{break;

}

}

p=(Node*)malloc(sizeof(Node));//申请内存空间if(!

p)

{

printf("\n内存空间申请失败!

");//如没有申请到,打印提示信息return;//返回主界面

}strcpy(p->data.num,num);//将字符串num拷贝到p->data.num中

stringinput(p->data.name,15,"姓名:

");

p->data.cgrade=numberinput("计算机[0-100]:

");//输入并检验分数,分数必须在0-100之间

p->data.mgrade=numberinput("数学[0-100]:

");//输入并检验分数,分数必须在0-

100之间

p->data.egrade=numberinput("英语[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;

r->next=p;//将新建的结点加入链表尾部

p->next=NULL;//表明这是链表的尾部结点

r=p;

saveflag=1;

}

return;

}

//按学号或姓名,查询学生记录

voidQur(Linkl)

{

intselect;//1:

按学号查,2:

按姓名查,其他:

返回主界面(菜单)

charsearchinput[20];//保存用户输入的查询内容

Node*p;

if(!

l->next)//若链表为空

{

system("cls");printf("\n=====>无此学生的记录!

\n");getchar();

return;

}

system("cls");

printf("\n=====>1按学号查询=====>2按名字查询\n");

printf("请选择[1,2]:

");

scanf("%d",&select);

if(select==1)//按学号查询

{

stringinput(searchinput,12,"请输入现有学生的学号:

");p=Locate(l,searchinput,"num");//在l中查找学号为searchinput值的节点,并返回节点的指针

if(p)

{printheader();printdata(p);printf("按任意键返回!

");

getchar();

}

else

Nofind();getchar();

}

elseif(select==2)//按姓名查询

{

stringinput(searchinput,15,"请输入现有学生的姓名:

");p=Locate(l,searchinput,"name");

if(p)

{printheader();printdata(p);

printf("按任意键返回!

");getchar();

}

else

Nofind();getchar();

}

else

Wrong();

getchar();

}

//删除学生记录:

先找到保存该学生记录的节点,然后删除该节点voidDel(Linkl)

{

intsel;

Node*p,*r;

charfindmess[20];if(!

l->next)

{

system("cls");

printf("\n=====>无此学生记录!

\n");

getchar();

return;

}system("cls");

Disp(l);

printf("\n=====>1按学号删除=====>2按姓名删除\n");

printf("请选择[1,2]:

");

scanf("%d",&sel);

if(sel==1)

{

stringinput(findmess,12,"请输入现有学生的学号:

");p=Locate(l,findmess,"num");

if(p)

{

r=l;

while(r->next!

=p)

r=r->next;

r->next=p->next;//将p所指节点从链表中去除

free(p);//释放内存空间

printf("\n=====>删除成功!

\n");

getchar();saveflag=1;

}

else

Nofind();

getchar();

}

elseif(sel==2)//先按姓名查询到该记录所在的节点

{

stringinput(findmess,15,"请输入现有学生的姓名");p=Locate(l,findmess,"name");

if(p)

{

r=l;

while(r->next!

=p)

r=r->next;

r->next=p->next;

free(p);printf("\n=====>删除成功!

\n");getchar();

saveflag=1;

}

else

Nofind();getchar();

}

else

Wrong();

getchar();

//修改学生记录。

先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改

voidModify(Linkl)

{

Node*p;

charfindmess[20];if(!

l->next)

{

system("cls");

printf("\n=====>无此学生记录!

\n");getchar();

return;

}

system("cls");

printf("修改学生记录!

");

Disp(l);

stringinput(findmess,12,"请输入现有学生的学号:

");//输入并检验该学号

//查询到该节点

//若p!

=NULL,表明已经找到该

p=Locate(l,findmess,"num");

if(p)

节点

{

printf("学号:

%s,\n",p->data.num);

printf("姓名:

%s,",p->data.name);

stringinput(p->data.name,15,"输入新的姓名:

");printf("计算机:

%d,",p->data.cgrade);

p->data.cgrade=numberinput("计算机[0-100]:

");printf("数学:

%d,",p->data.mgrade);

p->data.mgrade=numberinput("数学[0-100]:

");printf("英语:

%d,",p->data.egrade);

p->data.egrade=numberinput("英语[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=====>修改成功!

\n");

Disp(l);

saveflag=1;

else

Nofind();getchar();

//插入记录:

按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。

voidInsert(Linkl)

{

Linkp,v,newinfo;//p指向插入位置,newinfo指新插入记录

charch,num[12],s[12];〃s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号

intflag=0;

v=l->next;system("cls");

Disp(l);

while

(1)

{

stringinput(s,12,"按学号查询到要插入的节点的位置:

");

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=====>学号%s存在,重试?

(y/n):

",s);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

{

continue;

}

else

{

return;

}

}

}

//以下新记录的输入操作与Add()相同stringinput(num,12,"请输入新的学号!

:

");v=l->next;

while(v)

{

if(strcmp(v->data.num,num)==0)

{printf("=====>Sorry,新学号:

'%s'已存在!

\n",num);printheader();

printdata(v);printf("\n");getchar();return;

}

v=v->next;

}

newinfo=(Node*)malloc(sizeof(Node));

if(!

newinfo)

{

printf("\n内存申请失败!

");//如没有申请到,打印提示信息return;//返回主界面

}

strcpy(newinfo->data.num,num);stringinput(newinfo->data.name,15,"姓名:

");newinfo->data.cgrade=numberinput("计算机[0-100]:

");newinfo->data.mgrade=numberinput("数学[0-100]:

");newinfo->data.egrade=numberinput("英语[0-100]:

");newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;newinfo->data.ave=(float)(newinfo->data.total/3);

newinfo->data.mingci=0;newinfo->next=NULL;

saveflag=1;//在main()有对该全局变量的判断,若为1,则进行存盘操作将指针赋值给p,

因为l中的头节点的下一个节点才实际保存着学生的记录

p=l->next;

while

(1)

{if(strcmp(p->data.num,s)==0)//在链表中插入一个节点{

newinfo->next=p->next;p->next=newinfo;break;

}

p=p->next;

}

Disp(l);

printf("\n\n");getchar();

voidTongji(Linkl)

{

Node*pm,*pe,*pc,*pt;//用于指向分数最高的节点

Node*r=l->next;

intcountc=0,countm=0,counte=0;//保存三门成绩中不及格的人数fflush(stdin);

if(!

r)

{

system("cls");

printf("\n=====>无此学生记录!

\n");

getchar();

return;

}

system("cls");

Disp(l);

pm=pe=pc=pt=r;

while(r)

{

if(r->data.cgrade<60)countc++;

if(r->data.mgrade<60)countm++;

if(r->data.egrade<60)counte++;if(r->data.cgrade>=pc->data.cgrade)pc=r;

if(r->data.mgrade>=pm->data.mgrade)pm=r;if(r->data.egrade>=pe->data.egrade)pe=r;

if(r->data.total>=pt->data.total)pt=r;r=r->next;

}

printf("\n统计结果\n");

printf("计算机不及格:

%d(人)\n",countc);

printf("数学不及格:

%d(人)\n”,countm);

printf("英语不及格:

%d(人)\n”,counte);

printf("\n");

printf("总分最高分姓名:

%s分数为:

%d\n",pt->data.name,pt->data.total);

printf("英语最高分姓名:

%s分数为:

%d\n",pe->data.name,pe->data.egrade);

printf("数学最高分姓名:

%s分数为:

%d\n",pm->data.name,pm->data.mgrade);

printf("计算机最高分姓名:

%s分数为:

%d\n",pc->data.name,pc->data.cgrade);

printf("\n\n按任意键返回!

");

getchar();

}

//利用插入排序法实现单链表的按总分字段的降序排序,从高到低voidSort(Linkl)

Linkll;

}

ll=(Node*)malloc(sizeof(Node));if(!

ll)

{

printf("\n内存申请失败!

");return;

}ll->

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

当前位置:首页 > 自然科学 > 物理

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

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