1、学生成绩标准管理系统C语言/*创建*/*显示*/*排序*/*删除*/*查找/*&new表示返/*保存*/*读取*/*如菜单返回值为9switch(menu_select()case l:head=create();break;case 2:print(head);break;case 3:head=sort(head);break;case 4:head=delete(head);break;case 5:search(head);break; */case 6:head=insert(head,&new);break; 回地址*/case 7:save(head);break;case 8:
2、head=load(); break;case 9:exit(0);则程序结束*/*初始化函数*/STUDENT *init()(return NULL;/*返回空指针*/*菜单选择函数*/menu_select()int n;struct date d;/*定义时间结构体*/getdate(&d);/*读取系统日期并把它放到结构体d中*/printfC*按任意键进入主菜单”);/*按任意键进入主菜单*/getch();/*从键盘读取一个字符,但不显示于屏幕*/clrscr();/*清屏*/printf(Hntt学生成绩管理系统n”);printf(Hnt制作者:潍坊科技学院07级计算机应用(
3、4).* . V V f , ! Tw ! rjw rli! rlw Tw r ! rjw Tw ! ! rli T! rliejw rlwkJ*7#Ki*kJ*,,*X*.*g*.,.*.*.,.*.,.m );printf(ntt欢迎进入n”);班杨坤n”);prjntf( * IV! ELlU * * *2*2*2* ,、输入学生成绩记录n”);printf(nttt2.显示学生成绩n”);printf(Mttt3.排序n”);printf(nttt4.删除记录n”);按姓名查询成绩n”);插入记录n”);退出n”);. a*2*1* 1*2*1* *2* V V, V * Jw !*J
4、 JwJJw.川V , /*显示当前系统日期printf(ntttt%d%d%dnn,);*/do(printf(unttt 请选择项目(19):);scanf(H%dH,&n);while(n9);必如果选择项不在19之间则重输*/return(n);/*返回选择项,主函数根据该数调用相应的函数*/*输入函数*/STUDENT *create()(int i,s;STUDENT *head=NULL,*p; /* */clrscr();for(;)(p=(STUDENT *)malloc(LEN); /*开辟一个新的单元*/if(!p)/*如果指针p为空*/(printf(Hn内存己满!”)
5、;/*输出内存溢出*/return (head);/*返回头指针,下同*/)printf(”输入学号(按*输入结束);scanf(n%sM,p-num);if(p-numO=,*t) break;/*如果学号首字符为0则结束输入*/printf(”输入姓名:”);scanf(M %sH,p-name);printf(n请输入成绩n”);/*提示开始输入成绩*/s=();/*计算每个学生的总分,初值为0*/for(i=0;iv3;i+)/*3 门课程循环 3 次*/(do(printf(n 成绩 %d:n,i+l);scanf(H %d,&p-scorei);/*确保成绩/*确保成绩if(p-s
6、coreiscorei100)在0100之间*/printf(”请输入0100之间的数n”);while(p-scoreiscorei100);s=s+p-scorei;/* 累加各门成绩*/p-sum=s;p-sum=s;/*将总分保存*/p-average=(float)s/3;将s转换成float型,再求平均值*/p-order=0;0*/p-next=head;输入结点的后继结点*/head=p;新的头结点*/return(head);/*显示全部记录函数*/p-average=(float)s/3;将s转换成float型,再求平均值*/p-order=0;0*/p-next=head
7、;输入结点的后继结点*/head=p;新的头结点*/return(head);/*显示全部记录函数*/*先用强制类型转换/*未排序前此值为/*将头结点做为新/*新输入结点为void print(STUDENT *head)int i=0;/*统计记录条数*/STUDENT *p;/*移动指针*/clrscr();p=head;p=head;/*初值为头指针*/printf(n* 学 生 成 绩 表*、!,)printf(Mn”);printf(H|记录号|学号 | 姓名 | 语文I英语I高数I总分I平均分I排名W);printf(M);while(p!=NULL)(i+;printf(M| %
8、d |%s|%sI %d | %d | %d | %d | %fI %d , p-num,p-name,p-score0,p-scorel,p-score2,p-sum, p-average,p-order);p=p-next;)printf(M?* ! ?* &*?* *S*! *?* *! ?*?* *!*! ?* % t f X/*排序函数*/STUDENT *sort(STUDENT *head)int i=0;STUDENT *pl产p2,*t,*temp; temp=head-next;指的下一个结点作头指针*/head-next=NULL;表的头结点*/while(temp!=N
9、ULL)进行排序*/(t=temp; temp=temp-next; pl=head;头指针开始*/p2=head;pl的前驱,初值为头指针*/*保存名次*/*定义临时指针*/*将原表的头指针所/*第一个结点为新/*当原表不为空时,/*取原表的头结点*/*原表头结点指针后移*/*设定移动指针pl,从/*设定移动指针p2做为/*作成绩平均分比较*/p2=pl;/*待排序点值小,则新表指针后移*/pl=pl-next;)if(pl=p2)/*pl=p2,说明待排序点值大,应排在首位*/(t-next=pl;/*待排序点的后继为p*/head=t;/*新头结点为待排序点*/else/*待排序点应插入
10、在中间某个位置p2和pl之间,如p为空则是尾部*/(t-next=pl;/*t 的后继是 pl*/p2-next=t;/*p2 的后继是 t*/)pl=head;/*已排好序的头指针赋给pl,准备填写名次*/*结点序号*/*将结点序号赋值给名次*/*指针后移*/*排序成功*/i+; pl-order=i; pl=pl-next;)printf(”排序成功n”); return (head);)/*删除记录函数*/STUDENT *delete(STUDENT *head)(int n=0;STUDENT *pl,*p2;/*pl为查找到要删除的结点指针,p2为其前驱指针*/char c,s6;
11、/*s6用来存放学号,c用来输入字母*/clrscr();printf(”请输入要删除的学生的学号:”);scanf(n%sM,s);pl=p2=head;/*给pl和p2赋初值头指针*/vvhile(strcmp(pl-num,s) & pl != NULL)/*当记录的学号不是要找的,或指针不为空时*/p2=pl;pl的前驱指针*/*将pl指针值赋给p2作为pl=pl-next;/*将pl指针指向下一条记录*/if(strcmp(pl-num,s)=O)/*学号找到了*/f ./ ,,2*2*9*I* V , rjw ej jw rjw rj Jw rji rj|w rjw rj rjw
12、rjw rjwrjw rjwrjwrjw rjw信息如下*n”);printf(Mn”);printf(”| 学号 | 姓名 |语文I英语I高数I总分I平均分I排名);printf(M);printf(H|%s|%s| %d| %d | %d | %d | %f | %d ,pl-num,pl-name,pl-score0,pl-scorel,pl-score2,pl -sum,pl-average,pl-order);printf(HnM);一、设计目的进一步加深、巩固学生所学专业课程(C语言)的基本 理论知识,理论联系实际,进一步培养学生综合分析问题和解 决问题的能力。掌握运用C语言独立地
13、编写、调试应用程序和 进行其它相关设计的技能,充分发挥广大同学的潜力,使他们 通过本次课程设计而得到全面的锻炼。二、系统分析随着科学技术的不断发展,对人们的工作水平要求也越来 越高,然而计算机就成了帮助人们解决这个问题的工具,熟练 的运用计算机,它能为人们解决许多工作上的难题。对与一个 管理人员来说,快而迅速的了解各种信息是很关键的。使用计 算机在C语言环境下编写相关的管理系统就能达到对相关信 息的录入、显示;对记录的查询极其修改等目的。同时,这个 系统与*管理系统都有相似之处。基于同样的C语言环境, 对其提供的头文件*h (的不同组合,能为我们解决许许 多多的问题,因此,用它来编写成绩管理管
14、理系统是可行的。三、成绩管理系统主要功能1. 输入记录2. 用指定格式显示全部记录3. 根据姓名查找记录4. 根据姓名删除记录printf(printf(f fkJ* * *$ * *2* *!* * 2* *1* *1*2* *t* *?* *2* ejw riw rj rj ej rj ; rj rjw rlw elw erw rjw 5w rjw rjw 卜 next;/*把第二个结点地址赋予head*/elsep2-next=pl-next;/* 否则将一下结点地址赋给前一结点地址*/n=n-l;printf(Mn 学号s 已删除 nM,s);printf(”请保存nM);break;
15、/*删除后就跳出循环*/else/*找不到该结点*/printf(Hn没有找到该生nM);return(head);)/*查找记录函数*/void search(STUDENT *head)STUDENT *p;/*移动指针*/char s5;/*存放姓名用的字符数组*/clrscr();printf(”请输入要查找的姓名n”);scanf(H%sn,s);p=head; /*将头指针赋给p*/ vvhile(strcmp(p-name,s) & p != NULL)/*当记录的姓名不是要找的,或指针不为空时*/p=p-next;/*移动指针,指向下一结点*/if(p!=NULL)/*如果指针
16、不为空*/&* *TT*T* *Tw Jw T* 7%T*T T#T TwT Tw*2* *2*3*!* 2* *2* A *2* !*!* ?, *2* !* * *2* *2* !* *2* !*2* !* *num,p-name,p-score0,p-scorel,p-score2,p-sum, p-average,p-order);printf(M-n“);printf(M 5jC ?jc 5jC num);printf(”输入姓名:”); scanf(M %sM,new-name);printf(H请输入成绩n”);suml=O;/*保存新记录的总分,初值为0*/for(i=0;iv
17、3;i+)(do(printf(n 成绩 %d:n,i+l);scanf(H %dH,&new-scorei); if(new-scorei100|new-scoreiscorei100|new-scoreiscorei;/* 累加各门成绩*/ne w-sum=sum 1;/*将总分存入新记录中*/new-average=(float)suml/3;new-order=0;if(head=NULL)/*原来的链表是空表*/(head=pO;pO-next=NULL; /*使 pO 指向的结 点作为头结点*/ elsevvhile(pO-averageaverage)&(pl-next!=NUL
18、L)p2=pl;/*使p2指向刚才pl指向的结点*/pl=pl-next; /*pl 后移一个结点*/if(p()-average=pl-average)if(head=pl)head=pO;/* 插到原来第一个结点之前*/else p2-next=p0;/*插到 p2 指向的结点之后*/pO-next=pl;else(pl-next=pO;pO-next=NULL; /* 插到最后的结点之后*/n=n+l; /*结点数加1*/head=sort(head);/*调用排序的函数,将学生成绩重新排序*/printf(nn 学生s 记录已插入nH,new-name);printf(n 请保存 n”
19、);return(head);/*保存数据到文件函数*/void save(STUDENT *head)FILE *fp;STUDENT *p;FILE *fp;STUDENT *p;/*定义指向文件的指针*/*定义移动指针*/char outfile10;printf(n请输入要保存文件名称例如c:scorenH);scanf(H%sM,outfile);if(fp=fopen(outfile,nwbH)=NULL) /* 为输出打开一个二进制文件,为只写方式*/(printf(”无法保存到文件!请检查路径是否正确!n”); return;/*若打不开则返回菜单*/)printf(Mn 正在
20、保存n”);p=head;/*移动指针从头指针开始*/while(p!=NULL)/*如 p 不为空*/fwrite(p,LEN,l,fp);/* 写入一条记录 */p=p-next;/* 指针后移*/)fclose(fp);/* 关闭文件*/printf(”保存成功!iT);/*从文件读数据函数*/STUDENT *load()(STUDENT *pl,*p2,*head=NULL;/*定义记录指针变量*/FILE*fp;/*定义指向文件的指针*/char infile10;printf(n请输入读取文件名称例如c:scorenM);scanf(H %sn,infile);if(fp=fop
21、en(infile,nrbH)=NULL)/* 打开一个二进制文件,为只读方式*/(printf(”打开失败!请检查路径是否正确!); return(head);printf(nn 正在打开!n”);pl=(STUDENT *)malloc(LEN);/*开辟一个新单元*/if(!pl)(printf(”没有存储!iT);return(head);head=pl;head=pl;/*申请到空间,将其作为头指针*/while(!feof(fp)while(!feof(fp)/*循环读数据直到文件尾结束*/if(fread(pl,LEN,l,fp)!=l) break; /*如果没读到数 据,跳出
22、循环*/pl-next=(STUDENT *)malloc(LEN); /*为下一个结点开辟空间*/if(!pl-next)(printf(”没有存储!);return (head);p2=pl;/*使p2指向刚才pl指向的结点*/pl=pl-next;/*指针后移,新读入数据链到当前表尾*/p2-next=NULL; /*最后一个结点的后继指针为空*/fclose(fp);printf(M已成功读取!n”);return (head);5. 保存记录到文件6. 按序号显示记录7. 按姓名由小到大的顺序排序四、系统框图开始输出界面选择操作4 Ah4 Ah;4b-:/h:止结束左冬X/Ep右泠甘
23、口皿|咚退出系统M耳诠挡n坨时ir5Izl+Zn六、界面设计此系统界面采用图形和数字化菜单设计。主界面设计如下:*9 *! *f* * *1* ?* *al?*?*T*T* T*T* TwT* #7w TT* TT* Jw T T*T* TW TT T*T*TT* JW *TJ* T* Tw T#7W T*T 私 , *2*Jw T* g* zw *T* 7* Tw w Tw 1* 7 7* Tw g* T* Jw T* Jw9 . ., . rj J . .,X. . 丫.1. 输入学生成绩记录2. 显示学生成绩3. 排序4. 删除记录5. 按姓名查询成绩6. 插入记录7. 保存8. 读取9
24、. 退出六、用到的头文件及自定义的函数1、头文件#include #include#include/* 其它说明*/#include/*字符串函数*/#include/*内存操作函数*/#include/*字符操作函数*/#include/*动态地址分配函数*/2、自定义的功能函数TUDENT*init();/* 初始化函数 */int menu_select();/*菜单函数*/STUDENT *create();必创建链表*/void print(STUDENT *head);/* 显示全部记录函数*/void search(STUDENT *head);/*查找记录函数*/STUDENT
25、 *delete(STUDENT *head);/*删除记录函数*/STUDENT *sort(STUDENT *head);/*排序函数*/STUDENT *insert(STUDENT*head,STUDENT*new);/*插入记录函数*/void save(STUDENT *head);/*保存文件函数STUDENT *load();/*读文件函数*/有关函数的具体定义以及用法此处不再啰嗦,参看F面的程序代码。#include #include#include#include/*其它说明*/#include/*字符串函数#include/*内存操作函数*/#include/*字符操作函
26、数*/#include/*动态地址分配函数*/#deflne LEN sizeof(STUDENT)typedef struct stu/*定义结构体数组用于缓存数据*/(char num6;char name10;int score3;int sum;float average;int order;struct stu *next;/*链表*/JSTUDENT;/*函数原型*/STUDENT *init();/* 初始化函数*/int menu_select(); /*菜单函数*/STUDENT *create();/*创建链表*/void print(STUDENT *head); /*
27、显示全部记录函数*/ void search(STUDENT *head);/*查找记录函数*/STUDENT *delete(STUDENT *head);/*删除记录函数*/STUDENT *sort(STUDENT *head);/*排序函数*/STUDENT *insert(STUDENT *head,STUDENT *new);/*插入记录函数*/void save(STUDENT *head);/*保存文件函数*/STUDENT *load();/*读文件函数*/*主函数界面*/void main()(STUDENT *head,new;head=init();/*链表初始化,使head的值为NULL*/for(;)/*循环无限次*/