学生成绩管理系统基本C语言编写_第1页
学生成绩管理系统基本C语言编写_第2页
学生成绩管理系统基本C语言编写_第3页
学生成绩管理系统基本C语言编写_第4页
学生成绩管理系统基本C语言编写_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/代码版权所有,不要copy,仅供参考学习。#include "stdio.h"/标准输入输出函数库#include "stdlib.h"/标准函数库#include "string.h"/字符串函数库#include "conio.h"/屏幕操作函数库#define HEADER1 " *学生成绩信息* nn"#define HEADER2 " 学 号 姓名 计算机 数学 英语 总 分 平均分 名次 nn"#define FORMAT " %-10s %-10s

2、%5d %5d %5d %5d %.3f %4d n"#define DATA p->data.num,p->,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingciint saveflag=0;/是否需要存盘的标志变量/定义与学生有关的数据结构typedef struct student/标记为student char num12;/学号char name15;/姓名int cgrade;/计算机成绩i

3、nt mgrade;/数学成绩int egrade;/英语成绩int total;/总分float ave;/平均分int mingci;/名次sqlist; /定义每条记录或结点的数据结构,标记为:nodetypedef struct nodestruct student data;/数据域struct node *next;/指针域Node,*Link;/Node为node类型的结构变量,*Link为node类型的指针变量void menu()/主菜单system("cls");/调用DOS命令,清屏.与clrscr()功能相同printf(" n"

4、);printf(" 学生成绩管理信息系统主菜单 nn");printf(" *n");printf(" $ 1、 添加记录 6、 统计记录 $n");printf(" $ 2、 删除记录 7、 排序记录 $n");printf(" $ 3、 查找记录 8、 保存记录 $n");printf(" $ 4、 修改记录 9、 显示记录 $n"); printf(" $ 5、 插入信息 0、 退出系统 $n");printf(" *n");v

5、oid printheader() /格式化输出表头printf(HEADER1);printf(HEADER2);void printdata(Node *pp) /格式化输出表中数据Node* p;p=pp;printf(FORMAT,DATA);void Wrong()/输出按键错误信息printf("nnnnn*Error:输入错误!请按任意键继续!*n");getchar();void Nofind()/输出未查找此学生的信息printf("n=>未查找此学生的信息!n");void Disp(Link l)/显示单链表l中存储的学生记录

6、,内容为student结构中定义的内容Node *p;p=l->next;/l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息if(!p)/p=NULL,NUll在stdlib中定义为0printf("n=>无学生的记录!n");getchar();return;printf("nn");printheader();/输出表格头部while(p)/逐条输出链表中存储的学生信息printdata(p);p=p->next;/移动直下一个结点getchar();getchar();/*作用:用于定位链

7、表中符合要求的节点,并返回指向该节点的指针参数:findmess保存要查找的具体内容; nameornum保存按什么查找;在单链表l中查找;*/Node* Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(nameornum,"num")=0)/按学号查询r=l->next;while(r)if(strcmp(r->data.num,findmess)=0)/若找到findmess值的学号return r;r=r->next;else if(strcmp(nameornum,"

8、;name")=0)/按姓名查询r=l->next;while(r) if(strcmp(r->,findmess)=0) /若找到findmess值的学生姓名return r; r=r->next;return 0; /若未找到,返回一个空指针/输入字符串,并进行长度验证(长度<lens)void stringinput(char *t,int lens,char *notice) char n255; do printf(notice);/显示提示信息 scanf("%s",n);/输入字符串 if(strlen(n)

9、>lens) printf("n 超出长度范围,重新输入! n"); /进行长度校验,超过lens值重新输入 while(strlen(n)>lens);strcpy(t,n);/将输入的字符串拷贝到字符串t中/输入分数,0<分数<100)int numberinput(char *notice)int t=0;do printf(notice);/显示提示信息 scanf("%d",&t);/输入分数 if(t>100 | t<0) printf("n 分数必须在0到100之间! n");

10、 /进行分数校验while(t>100 | t<0);return t;/增加学生记录void Add(Link l)Node *p,*r,*s;/实现添加操作的临时的结构体指针变量char ch,flag=0,num12;r=l;s=l->next;system("cls");Disp(l);/先打印出已有的学生信息while(r->next!=NULL)r=r->next;/将指针移至于链表最末尾,准备添加记录while(1)/一次可输入多条记录,直至输入学号为0的记录结点添加操作while(1)/输入学号,保证该学号没有被使用,若输入学号

11、为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("=>

12、学号 %s 存在,重试?(y/n):",num);scanf("%c",&ch);if(ch='y'|ch='Y')continue;elsereturn; else break;p=(Node *)malloc(sizeof(Node);/申请内存空间if(!p) printf("n 内存空间申请失败! "); /如没有申请到,打印提示信息 return ;/返回主界面 strcpy(p->data.num,num);/将字符串num拷贝到p->data.num中stringinput(p-

13、>,15,"姓名:");p->data.cgrade=numberinput("计算机0-100:");/输入并检验分数,分数必须在0100之间p->data.mgrade=numberinput("数学0-100:");/输入并检验分数,分数必须在0100之间p->data.egrade=numberinput("英语0-100:");/输入并检验分数,分数必须在0100之间p->data.total=p->data.egrade+p->data.cgr

14、ade+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 ;/按学号或姓名,查询学生记录void Qur(Link l)int select;/1:按学号查,2:按姓名查,其他:返回主界面(菜单)char searchinput20;/保存用户输入的查询内容Node *p;if(!l->next)/若链

15、表为空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,sea

16、rchinput,"num");/在l中查找学号为searchinput值的节点,并返回节点的指针if(p) printheader(); printdata(p); printf("按任意键返回!"); getchar();else Nofind(); getchar();else if(select=2)/按姓名查询stringinput(searchinput,15,"请输入现有学生的姓名:");p=Locate(l,searchinput,"name");if(p) printheader(); print

17、data(p); printf("按任意键返回!"); getchar();else Nofind(); getchar();elseWrong();getchar();/删除学生记录:先找到保存该学生记录的节点,然后删除该节点void Del(Link l)int sel;Node *p,*r;char findmess20;if(!l->next) system("cls");printf("n=>无此学生记录!n");getchar();return;system("cls");Disp(l);p

18、rintf("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);/释放内存空间

19、printf("n=>删除成功!n"); getchar(); saveflag=1;else Nofind(); getchar();else if(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&

20、quot;); getchar(); saveflag=1;else Nofind(); getchar();elseWrong();getchar();/修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改void Modify(Link l)Node *p;char findmess20;if(!l->next)system("cls");printf("n=>无此学生记录!n");getchar();return;system("cls");printf("修改学生记录!&q

21、uot;);Disp(l);stringinput(findmess,12,"请输入现有学生的学号:");/输入并检验该学号p=Locate(l,findmess,"num");/查询到该节点if(p)/若p!=NULL,表明已经找到该节点printf("学号:%s,n",p->data.num);printf("姓名:%s,",p->);stringinput(p->,15,"输入新的姓名:");printf("计算机:%d,&q

22、uot;,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.e

23、grade+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;elseNofind();getchar();/插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。void Insert(Link l)Link p,v,newinfo;/p指向插入位置,newinfo指新插入记录char ch,num12,s12;/s保存插入

24、点位置之前的学号,num保存输入的新记录的学号int flag=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()

25、;printf("n=>学号 %s 存在,重试?(y/n):",s);scanf("%c",&ch);if(ch='y'|ch='Y')continue;elsereturn;/以下新记录的输入操作与Add()相同stringinput(num,12,"请输入新的学号! :");v=l->next;while(v) if(strcmp(v->data.num,num)=0) printf("=>Sorry,新学号:'%s' 已存在 !n"

26、;,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->,15,"姓名:");newinfo->data

27、.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.

28、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("nn"); getch

29、ar();/统计该班的总分第一名和单科第一,和各科不及格人数void Tongji(Link l)Node *pm,*pe,*pc,*pt;/用于指向分数最高的节点Node *r=l->next;int countc=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)i

30、f(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)

31、 pt=r;r=r->next;printf("n-统计结果-n");printf("计算机 不及格:%d (人)n",countc);printf("数学 不及格:%d (人)n",countm);printf("英语 不及格:%d (人)n",counte);printf("-n");printf("总分最高分 姓名:%s 分数为:%dn",pt->,pt->data.total);printf("英语最高分 姓名:%s 分数

32、为:%dn",pe->,pe->data.egrade);printf("数学最高分 姓名:%s 分数为:%dn",pm->,pm->data.mgrade);printf("计算机最高分 姓名:%s 分数为:%dn",pc->,pc->data.cgrade);printf("nn按任意键返回!");getchar();/利用插入排序法实现单链表的按总分字段的降序排序,从高到低void Sort(Link l)Link ll;Node

33、 *p,*rr,*s;int i=0;if(l->next=NULL) system("cls");printf("n=>无此学生记录!n");getchar();return ;ll=(Node*)malloc(sizeof(Node);/用于创建新的节点if(!ll) printf("n 内存申请失败! ");/如没有申请到,打印提示信息 return ;/返回主界面 ll->next=NULL;system("cls");Disp(l);/显示排序前的所有学生记录p=l->next;w

34、hile(p) s=(Node*)malloc(sizeof(Node);/新建节点用于保存从原链表中取出的节点信息if(!s) printf("n 内存申请失败! ");/如没有申请到,打印提示信息 return ;/返回主界面 s->data=p->data;/填数据域s->next=NULL;/指针域为空rr=ll;/rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置while(rr->next!=NULL && rr->next->data.total>=p->

35、data.total)rr=rr->next;/指针移至总分比p所指的节点的总分小的节点位置if(rr->next=NULL)/若新链表ll中的所有节点的总分值都比p->data.total大时,就将p所指节点加入链表尾部rr->next=s;else/否则将该节点插入至第一个总分字段比它小的节点的前面 s->next=rr->next; rr->next=s; p=p->next;/原链表中的指针下移一个节点 l->next=ll->next; /ll中存储是的已排序的链表的头指针 p=l->next; /已排好序的头指针赋给

36、p,准备填写名次 while(p!=NULL)/当p不为空时,进行下列操作 i+;/结点序号 p->data.mingci=i; /将名次赋值 p=p->next;/指针后移 Disp(l);saveflag=1;printf("n =>排序完成!n");/数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时, 会提示用户存盘void Save(Link l)FILE* fp;Node *p;int count=0;fp=fopen("c:student","wb");/以只写方式打开二进制文件if(fp=

37、NULL)/打开文件失败printf("n=>打开文件失败!n");getchar();return ;p=l->next;while(p)if(fwrite(p,sizeof(Node),1,fp)=1)/每次写一条记录或一个节点信息至文件p=p->next;count+;else break;if(count>0)getchar();printf("nnnnn=>保存文件完成,总体保存的记录是:%dn",count);getchar();saveflag=0;elsesystem("cls");printf("连接为空,没有保存学生的记录!n");getchar();fclose(fp);/关闭此文件void main()Link l;/定义链表FILE *fp;/文件指针int select; /保存选择结果变量char ch;/保存(y,Y,n,N)in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论