ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:258.79KB ,
资源ID:5759459      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5759459.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(学生管理系统 C语言.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

学生管理系统 C语言.docx

1、学生管理系统 C语言C语言程序设计课程设计报告设计题目:学生成绩管理系统学 号 201230283151 班 级12级电信信息三班姓 名 王自钊 完成方式:(单选)自我评分:(单选) 独立完成 优秀参考他人工作的基础上完成 良好 在他人的帮助下完成 中等 完整拷贝他人成果 及格 不及格2013年5月18日设计任务:C语言课程设计任务书3题目:学生成绩管理系统功能:学生成绩管理系统,每个学生是一个记录,包括学号,姓名,性别,3门课程成绩。系统要求实现以下功能:1、信息录入:录入学生成绩信息(包括学生学号、姓名、各门课程的成绩等);2、信息查询:输入学号,查询学生各门课程的成绩,并显示。3、排序:

2、按各门课程的成绩平均分进行排序,并显示。4、信息删除与修改输入学号,删除该学生的成绩信息。分步实施:1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数。2、建立一个文件,将每位学生的信息写入文件中并能显示于屏幕上。3、完成上述信息查询(学生学号、姓名等)、排序、信息删除与修改功能。要求:1、用C语言实现程序设计;2、利用结构体数组实现学生信息的数据结构设计;3、系统的各个功能模块要求用函数的形式实现;4、界面友好(良好的人机交互),程序加必要的注释。一、 总体设计1. 程序总体设计1) 主操作界面与次级操作界面2) 学生信息成绩录入功能3) 学生信息成绩查询功能4) 学生信息成绩

3、修改模块5) 学生信息成绩删除功能6) 输出系统内全部信息功能7) 各科平均分排序功能2. 数据结构typedef float ElemType;typedef struct NodeType/*本程序使用的结构体,具体成员在下面注释*/ unsigned long Num;/学号 char name15;/学生姓名 ElemType course3;/学生三门科目的成绩 ElemType average;/学生三门科目成绩平均分 char Sex3;/学生性别 struct NodeType *next;/指向下一个结构体的指针NodeType,*LinkList;/结点和指针类型3. 函数

4、原型声明的说明void MakeNode(LinkList &q);/分配由L指向的元素为e,后继为空的结点void Initlist(List &L);/初始化链表void Insert(List &L,LinkList q,LinkList s); /在指针q所指元素后插入s指针所指向的元素void Clear(List &L);/清空链表(系统重置)void Append(List &L,LinkList s);/在线性链表尾部插入一个结点svoid Readin(List &L);/从文件中读入数据void SearchStu(List L);/按学号查找信息并显示void Print

5、fall(List L);/输出所有学生的成绩信息到屏幕void Insertstu(List &L);/插入一个学生的成绩信息void FwriteStu(List L);/保存学生数据信息void Change(List L,LinkList p);/修改学生信息void Changeclear(LinkList p);/修改操作中的清屏void Stucopy(LinkList p,LinkList q);/结点复制void Alter(List L);/按学号修改信息void Delete (List L);/按学号删除信息void rank(List L);/各科平均分排序void

6、sysclear();/操作完成后清屏并返回主菜单void table();/输出信息时的表头int Locate(List L,unsigned long e,LinkList &p);/按学号定位4. 流程图二、 详细设计输出p指向结点内所有信息到屏幕调用sysclear()清屏返回主菜单是否重新输入学号e?重新输入ep=p.nextp.num=e?p.next=NULL?从主菜单接受指令输入学号e,定义结点指针p,p=L.head1. 查找void SearchStu(List L) N N Y Y N 输出p指向结点内所有信息到屏幕调用sysclear()清屏并返回主菜单是否重新输入学

7、号e?重新输入e“是否确认删除Y or N”从主菜单接受指令输入学号e,定义结点指针p,q,q=L.head,p=q.nextq=q.nextp=q.nextp.num=e?p.next=NULL?p-next=q-next; L.len-;free(q); FwriteStu(L);调用sysclear()清屏返回主菜单2删除void Delete (List L); N N Y Y Y N N Y 从主菜单接受指令3.修改输入学号e,定义结点指针p,q,q=L.headq=q.nextp.next=NULL?p.num=e?重新输入e是否重新输入学号e?输出p指向结点内所有信息到屏幕“是否

8、确认要修改Y or N”调用sysclear()清屏并返回主菜单Stucopy(p,q);将p数据复制到q中调用Change( L, p) c=0Stucopy(q,p);free(q); FwriteStu(L);free(q); FwriteStu(L);保存修改?返回主菜单scanf(%d,&p-Num)scanf(%s,&p-name)scanf(%f,&p-course0)scanf(%s,&p-Sex)scanf(%f,&p-course1)scanf(%f,&p-course2)c=0?c=1?c=2?c=3?c=4?c=5?c=6?Input cint c/操作数char k/

9、操作字符显示修改菜单 三、 测试及调试1. 测试中出现的部分问题及解决方法1.1 计算各门科目平均分并排序输出时发生错误原语句如下:for(p=L.head;i0;i-,p=p-next) sum1=p-course0+sum1; sum2=p-course1+sum2; sum3=p-course2+sum3; 测试方案:在计算和的同时将结点中各成绩数据输出到屏幕测试语句:for(p=L.head;i0;i-,p=p-next)printf(%.1f %.1f %.1fn, ,p-course0,p-course1,p-course2); sum1=p-course0+sum1; sum2=

10、p-course1+sum2; sum3=p-course2+sum3; 经过排查,发现循环开始时p直接指向头结点,而头结点本身只作为链表地址指示,不储存学社成绩信息,其中数据为随机数,尤其引发逻辑错误。解决方案:直接将结点指针p指向头结点的下一个结点.修改后语句如下: for(p=L.head-next;i0;i-,p=p-next) sum1=p-course0+sum1; sum2=p-course1+sum2; sum3=p-course2+sum3; 修改后输出正确结果: 1.2由语法错误引起在执行修改和删除功能时程序停止运作原错误语句: printf(n请输入相应的操作:);sca

11、nf(%d,c);虽然只是缺少了一个符号,但却引起了整个程序的奔溃。解决方案:上网搜索相似错误案例,得知原因之一可能为变量赋值时出错而引起,随检查相关函数的变量赋值语句,成功发现错误,加上“&”后程序运作正常。 1.3修改后选择“不保存修改”,但此次运行中显示信息时为修改后信息错误原因:在最初设计函数时将“保存修改”的执行语句设计为FwriteStu(List L),即修改后学生数据信息读入文件中,而“不保存修改”的执行语句为空,即只是不将修改后的信息读入文件中,这样,在第二次运行程序时将读入没有修改的信息,但是,若在此次运行中输出这些信息到屏幕时,将输出已修改的信息。解决方案:在进入修改操作

12、时在定义一个结点指针q,并为其开辟空间,用于储存被修改结点p的原信息。相关源代码: LinkList q;/保存原信息的结点 q=(LinkList)malloc(sizeof(NodeType); Stucopy(p,q);/将p的数据拷贝到q中 在文件末尾改为: printf(n!你将要退出操作,是否确认修改?Y or N!n); getchar(); scanf(%c,&k); if(k=Y) FwriteStu(L);/输出成绩信息到文件中 else Stucopy(q,p); /将q的数据拷贝到p中,即恢复数据 free(q);2. 主要程序运行结果1.开始运行(主菜单)2.学生信息

13、录入3.学生信息查询输出信息界面4.修改查询确认界面修改界面当前信息显示与修改同步5.各科平均分排序6.删除7.输出全部学生信息四、小结这是我第一次独自编写一个较复杂的程序,在刚开始时本想完全独立完成,但是由于目前能力有限和经验不足,进度缓慢,而且错漏百出,遂找来了一个例子作为参考,但主要核心代码都有自己编写,完成后程序与参考作品有较大差异,个人认为自己的程序在某些方面上优于参考作品,例如,参考作品没有清屏功能,每次操作的输出都堆加到屏幕上,有累赘感,而我的作品除了信息录入功能外每个操作的结果都会独立于主菜单之外显示,更加人性化,但与参考作品相比我的不足也不少,例如,没有保护设置,任何人都能进

14、入系统中进行操作,缺乏安全性。本来此次作业我能做得更好,但是由于自己没有合理分配时间,导致由于此次大作业的时间并不多,所以程序的功能只是在满足基本要求添加了另外一个功能,虽然本来设计了不少附加功能但都没有时间成功实现,例如,按学生名字查询(并修改或删除)成绩信息,考虑到姓名相同而导致无法全部输出的可能性此功能并非必需,学号虽然原则上不会重复但当学号输入错误时,例如由于输入字符导致学号为负值,无法通过学号进行修改和删除,只能通过系统重置来消除错误。在程序测试和调试中出现的错误也令我有不少收获,例如前面提到的“由语法错误引起在执行修改和删除功能时程序停止运作”,一个小小的“&”符号的缺失就能让一个

15、五百多行的程序崩溃,让我认识到什么叫做“细节决定成败”,让我认识到“从小事做起”确实是很有道理的,认识到从今往后要做事要脚踏实地。本次作业也让我认识到了对Office word办公软件的熟练运用的重要性,作业报告中要求我们画流程图,由于对word 2007中形状插入功能不熟悉,导致在此花费了不少时间,同时我也认识到word 2007的功能或许完善但操作起来却不够人性化,毕竟世界上没有完美的程序,这着驱使人们去创造更好的程序。看到自己付出汗水完成的程序正常的运行那种感觉非常不错,看到自己的付出有相应的回报,确实令人欣慰。附件:主要源程序代码头文件:#include #include #inclu

16、de colorConsole.h#include #include #include #include #include #define un nnnnnnnnnnnnnnnnnnn typedef float ElemType;typedef struct NodeType unsigned long Num;/学号 char name15;/学生姓名 ElemType course3;/学生成绩 ElemType average;/学生各科平均分 char Sex3;/学生性别 struct NodeType *next;/指向下一个结构体的指针NodeType,*LinkList;/结

17、点和指针类型typedef struct LinkList head,tail;/链表的头尾指针 int len;/记录学生是个数List;/链表类型-主函数-#include头文件啊喵.hvoid main() List L; Initlist(L); Readin(L); char c=a; int i;/操作数 system(title 学生成绩管理系统); system(color 9a); HANDLE handle; handle=initiate(); WORD wColors1; wColors0=FOREGROUND_RED|FOREGROUND_INTENSITY|BACK

18、GROUND_BLUE; textout(handle,16,2,wColors,1,学生成绩管理系统); textout(handle,20,5,wColors,1, 1.录入学生成绩信息 );textout(handle,20,7,wColors,1, 2.查寻学生成绩信息 );textout(handle,20,9,wColors,1, 3.修改学生成绩信息 );textout(handle,20,11,wColors,1, 4.各科成绩平均分排序 );textout(handle,20,13,wColors,1, 5.删除学生成绩信息 );textout(handle,20,15,wC

19、olors,1, 6.显示所有学生成绩 );textout(handle,20,17,wColors,1, 0.退出成绩管理系统 ); printf(un); printf(请输入你想要进行操作对应的数字:); scanf(%d,&i); while(i!=0) switch(i) case 1: Insertstu(L); FwriteStu(L); sysclear(); break;case 2: SearchStu(L); sysclear(); break; case 3: Alter(L); sysclear(); break; case 4: rank(L); sysclear(

20、); break; case 5: Delete (L); sysclear(); break; case 6: Printfall(L); sysclear(); break; default: printf(!输入指令错误!); sysclear(); break; printf(请输入下一步操作指示:); scanf(%d,&i); if(i=0) Clear(L); printf(您已安全退出程序n);-各种函数-void MakeNode(LinkList &q)/分配由L指向的元素为e,后继为空的结点 q=(LinkList)malloc(sizeof(NodeType); if(

21、!q) printf(ERRORn); else printf(n学号:); scanf(%d,&q-Num); printf(n姓名:); scanf(%s,&q-name); getchar(); printf(n性别:); scanf(%s,&q-Sex); printf(n科目1成绩:); scanf(%f,&q-course0); printf(n科目2成绩:); scanf(%f,&q-course1); printf(n科目3成绩:); scanf(%f,&q-course2); q-average=(q-course1+q-course2+q-course0)/3.00;/计算

22、平均分/ q-next=NULL;void Stucopy(LinkList p,LinkList q)/结点复制 q-Num=p-Num; strcpy(q-name,p-name); strcpy(q-Sex,p-Sex); q-course0=p-course0; q-course1=p-course1; q-course2=p-course2; q-next=p-next;void Initlist(List &L)/初始化链表 L.tail=L.head=(LinkList)malloc(sizeof(NodeType); L.head-next=L.tail-next=NULL;

23、L.len=0;void Insert(List &L,LinkList q,LinkList s) /在指针q所指元素后插入s指针所指向的元素 if(L.head&q&s) s-next=q-next; q-next=s; if(L.tail=q) L.tail=s;/如果q刚好等于尾指针,则将尾指针移动到最后一个元素的指针s处/ L.len+; printf(已录入n); void Clear(List &L)/清空链表,也是系统重置 LinkList s,m; s=L.head-next; while(s!=NULL) m=s-next; free(s); s=m; L.tail=L.h

24、ead; L.head-next=NULL; L.tail-next=NULL; L.len=0; printf (OKn);void Append(List &L,LinkList s)/在线性链表尾部插入一个结点s if(L.head&s) if(L.tail!=L.head) L.tail-next=s;/头结点不等于尾结点,在后面插入s/ else L.head-next=s;/头结点等于尾结点,在头结点后插入s/ L.tail=s;L.len+;/把尾指针移动到线性链表最后一个元素s,链表长度加1int Locate(List L,unsigned long e,LinkList &

25、p)/按学号定位 LinkList pre; if(L.head) pre=L.head; p=pre-next;/pre指向*p的前驱,p指向第一个元素结点 while(p&p-Numnext; if(p&p-Num=e) return 1;/带回与e相等的元素的结点 else p=pre; return 1; /带回第一个比e大的元素的结点 else return 0;void Readin(List &L)/从文件中读入数据 FILE *stu; LinkList p; if(stu=fopen(学生成绩信息.txt,r+)=NULL) printf(抱歉!读入失败n); while(!

26、feof(stu) p=(LinkList)malloc(sizeof(NodeType);p-next=NULL;fscanf(stu,%d %s %s %f %f %f %fn,&p-Num,&p-name,&p-Sex,&p-course0,&p-course1,&p-course2,&p-average); Append(L,p); fclose(stu);void FwriteStu(List L)/保存学生数据信息 LinkList p; FILE *stu; char filename20=学生成绩信息.txt; if(stu=fopen(filename,w+)=NULL) printf(文件创建失败n); exit(0); fseek(stu,0,0); for(p=L.head-next;p!=NULL;p=p-next) fprintf(stu,%d %s %s %.2f %.2f %.2f %.2fn,p-Num,p-name,p-Sex,p-course0,p-course1,p-course2,p-average); fclose(stu);void Insertstu(List &L)/插入一个学生的成绩信息 LinkList p,q; MakeNode(p); if(Locate(L,p-Num,q) Insert(L,q,p);

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

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