嵌入式课程设计-学生信息管理系统.doc
《嵌入式课程设计-学生信息管理系统.doc》由会员分享,可在线阅读,更多相关《嵌入式课程设计-学生信息管理系统.doc(12页珍藏版)》请在咨信网上搜索。
嵌入式课程设计报告册 题目:学生信息管理系统 班级:移动三班 辅导老师:邱雅 一、软件需求分析 1、可行性分析 (1)经济可行性 ①:目前中国有越来越多的中小型企业在蓬勃发展,而现代化员工信息管理系统已经逐渐取代了传统的人工信息管理,智能化的管理系统更具有高效性可行性,所以自能管理系统将会成为或正在成为现代化公司员工信息管理的有效方式; ②:这款学生信息管理系统的价格适合所有学校消费群体,将会有很大的应用空间,满足各种学校学生管理的要求; ③:学生系信息管理系统的价格比相对于同类公司员工管理系统产品较低,同时本软件的成本低于同类产品的平均水平,具有很大的利润空间; ④:本系统的开发环境和软件环境都是当前流行的产品,本系统的软件需求都是基本的功能和应用,在现实中很容易实现。 (2)法律可行性 本软件的开发采用C语言作为软件的开发语言,没有采用同类产的代码,完全是自主开发,并按照国际上软件开发的相关规定来实现开发的; (3)技术可行性 本软件开发系统采用linux开发平台,具有很强的兼容性和扩展性,本软件的占用的内存较小大部分的硬件处理系统都可以兼容,开发语言采用国际通用的C高级编程语言具有很高的维护可行性,经过综合分析我认为现阶段我方所拥有的资源和技术人员,在技术上完全可以实现这款软件的开发,并且能高质量,快速的完成这项工作。 2、用户需求概述 用户需要一个可以简单的实现通讯录功能的简单通讯录系统,分别完成查询,增加,修改,删除的一些简单的功能要求在完成所要求功能的前提下增强与用户的互动,使软件的可操作性增强,此外还可以自愿加入一些新的功能来进行对软件的优化在优化的同时要注意软件基本功能的保障。 二、软件分析与设计 一.功能 1、创建班级 2、输出学生信息 3、按照学号录入学生成绩 4、按照班级录入学生成绩 5、按照学号修改学生成绩 6、按照班级修改学生成绩 7、按照班级统计学生的总成绩 8、按照学号查询学生成绩 9、按照班级输出不及格学生名单及科目 10、按照班级输出学生成绩单 0、退出系统 二.功能模块图: 图1 系统功能模块图 三、主要功能的实现 程序设计一般由两部分组成算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性,在学生信息管理程序中由于预计记录数比较大能够、删除、保存等外更多的情况是查询。所以选用动态链表保存数据. 1、学生信息管理 由于信息输入量比较大,需要的存储空间大,所以需要采用树的双亲表示法进行信息存储,为了方便采用以下定义。 struct student { int num; char name[20]; char sex[5]; char class[30]; int semester; char course[30]; int score[3]; struct student *next; }; struct list { int class; struct student *head; }; 2。main()主函数 程序采用模块化设计,主函数是程序的入口各模块独立。可分块调 试均由主函数控制调用控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值调用相应的各功能函数。同时设置一个断点。即当返回值为一定条件时运行break 0;函数结束程序,以免造成死循环。根据菜单的提示进行需要的操作。 图2 主函数输出界面 图3 程序总体流程图 (1)主菜单 直接利用输出函数 printf 输出字符串在屏幕上显示一个菜单并显示一个提示输入 选项输入数字,将此数字作为菜单函数的返回值返回主函数,主函数根据 这个数字调用相应的功能函数, 制作简便, 操作简单界面如图 10—2 所示: 图 4 主菜单界面 由于程序中很多地方用到了字符串输入语句会造成下一个字符不能正确读入为了 在程序调用执行了各个函数后能够清晰地看到菜单并输入新的选项。 按照所见即所得的方式直接设计输出函数输出字符串达到菜单效果将精力主要放在程序功能的实现上利用 while循环语句一直执行 scanf(”%d” ,t)语句。让用户输入 数按照整形数据形式输入然后字符串转化为数字返回主函数 。既然是数字选项为什么不用整数格式输入而要按字符串输入。再将其转换呢,如果按照整数格式输入,当用户输入了非数字字 符。例如 a 和 b 等由于类型不同将导致程序出错。所以对于不参与运算的数据表面上看是数字也应将其设为字符处理。例如电话号码,千万不要设为整数类型,程序设计技巧很多。所以读者在编程调试中应注意并仔细体会。 (2)创建班级 输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰且能直 接反映数据之间的关系,但由于 scanf 函数的特性,在输入时数据用回车分隔也是可以 的,但与界面设计不吻合界面。 由于记录并不是一次性全部输入而是随时填加和删除的,而预先开辟的空间数往往大于实际的记录数。所以程序设计为首先输入准备输入的记录数 n, 然后用while循环语句循环输信息。 图5 创建列表页面 输出学生信息 该功能的实现主要是是通过结构体数组中的链表指针进行输出 图6输出全部信息 按照学号录入学生成绩 通过头指针查找到需要录入成绩的节点,录入成绩. 按照班级录入学生成绩 按照学号修改学生成绩 按照班级修改学生成绩 按照班级统计学生的总成绩 按照学号查询学生成绩 按照班级输出不及格学生名单及科目(11)按照班级输出学生成绩单 四、程序设计 (一)先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点:①应当采用结构化程序方法编程,以增加可读性;②尽可能多加注释,以帮助理解每段程序的作用;③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能.各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理.(二)在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找.有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正.有时显示出一大片出错信息往往使人感到问题严重,无从下手.其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息.这时只要加上一个变量定义,就所有错误都消除了。(三)在改正语法错误(包括“错误(error)"和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求.有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程。事实上,当程序复杂时很难把所有的可能情况全部都试到,选择典型的临界数据作试验即可。(四)运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法: 1.将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。 2。如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查.直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。 3.也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率. 4.如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题.如有则改正之,接着修改程序。 5。有的系统还提供debug(调试)工具,跟踪程序并给出相应信息,使用更为方便,请查阅有关手册。 总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于积累经验。在程序调试过程中往往反映出一个人的水平,经验和态度。希望大家给以足够的重视。上机调试程序的目的决不是为了“验证程序的正确",而是“掌握调试的方法和技术",要学会自己找问题,这样慢慢自己就会写出错误较少的实用程序. 五、代码的实现 #include <stdio。h〉 #include 〈stdlib.h〉 #define MAXSIZE 100 struct student { int num; char name[20]; char sex[5]; char class[30]; int semester; char course[30]; int score[3]; struct student *next; }; struct list { int class; struct student *head; }; void CreatClassStudent(struct list Class[],int n)//创建班级 { char ch; int i; i = 1; struct student *head,*p,*q; head = (struct student *)malloc(sizeof(struct student)); q = p = head; while(i 〈= n) { printf("输入第%d个班级的信息:\n",i); struct student *head,*p,*q; head = (struct student *)malloc(sizeof(struct student)); Class[i].head = p = head; while(1) { printf(”输入学号:\n”); scanf(”%d",&head-〉num); printf(”输入姓名:\n"); scanf(”%s”,head—>name); head—>score[0] = 0; head-〉score[1] = 0; head-〉score[2] = 0; getchar(); printf(”是否继续?\n”); scanf(”%c”,&ch); if(ch == ’n’) break; p = (struct student *)malloc(sizeof(struct student)); head—>next = p; head = p; } head —〉next = NULL; i++; } } void print(struct list Class[],int n)//输出学生信息 按照班级输出 { struct student *p; int i=1; while(i 〈= n ) { p = Class[i].head; printf("移动%d班学生信息\n”,i); while(p != NULL) { printf("%d\t”,p—〉num); printf(”%s\t",p-〉name); printf("%d\t%d\t%d”,p—>score[0],p->score[1],p-〉score[2]); p = p—>next; printf(”\n"); } printf(”\n”); i++; } } void StudentId(struct list Class[],int n)//按照学号输入成绩 { int score1,score2,score3; int t; int key; printf(”输入学号:"); scanf(”%d”,&key); int i; i = 1; struct student *p; while(i <= n) { p = Class[i]。head; while(p != NULL) { if(p—〉num == key) { printf("输入3门成绩:”); scanf(”%d%d%d”,&score1,&score2,&score3); p—>score[0] = score1; p—〉score[1] = score2; p—〉score[2] = score3; t = 0; } p = p—>next; } i++; } if(t != 0) printf("该学号不存在!\n”); } void ClassId(struct list Class[],int n) { int i = 1; struct student *p; while(i 〈= n) { printf(”录入%d班级的成绩\n”,i); p = Class[i].head; while(p != NULL) { printf("输入学号为%d的学生成绩:”,p->num); scanf(”%d%d%d”,&p—〉score[0],&p->score[1],&p—>score[2]); p = p->next; } printf("成绩录入结束\n”); i++; } } void StudentNumberChange(struct list Class[],int n) { int i = 1; int key; int score1,score2,score3; int t; printf("请输入学号:”); scanf("%d",&key); struct student *p; while(i 〈= n) { p = Class[i].head; while(p != NULL) { if(p—〉num == key) { printf(”请输入新的成绩:”); scanf(”%d%d%d”,&score1,&score2,&score3); p—〉score[0] = score1; p-〉score[1] = score2; p—〉score[2] = score3; t = 0; } p = p—>next; } i++; } if(t != 0) { printf("该学号不存在!\n”); } } void ClassNumChange(struct list Class[],int n) { int class; int score1,score2,score3; char ch; struct student *p; printf(”输入需要修改信息的班级号%d--——%d:”,1,n); scanf("%d”,&class); p = Class[class]。head; while(p != NULL) { printf("是否要修改%d的成绩:",p—>num); getchar(); scanf("%c”,&ch); if(ch == 'n’) { p = p->next; continue; } printf(”输入新的成绩:”); scanf(”%d%d%d”,&score1,&score2,&score3); p-〉score[0] = score1; p—〉score[1] = score2; p—〉score[2] = score3; p = p->next; } } void TotalGrade(struct list Class[],int n) { int sum = 0; int average; int k; int class; printf(”输入班级号%d——---—%d\n”,1,n); scanf("%d”,&class); struct student *p; p = Class[class]。head; while(p != NULL) { sum = p—〉score[0] + p—〉score[1] + p—〉score[2]; average = sum / 3; printf(”%d的总成绩是%d平均成绩是%d\n”,p-〉num,sum,average); p = p—>next; } } void QueryResults(struct list Class[],int n) { int i = 1; int key; int t; struct student *p; printf(”请输入学号:"); scanf(”%d",&key); while(i 〈= n) { p = Class[i]。head; while(p != NULL) { if(p—>num == key) { printf(”学号为%d的学生[移动%d班]”,p—〉num,i); printf(”%d\t%d\t%d\n”,p-〉score[0],p—>score[1],p—〉score[2]); t = 0; break; } p = p—〉next; } if(t != 0) { printf(”该学生不存在于%d班\n",i); } i++; } } void NotPass(struct list Class[],int n) { int class; printf(”请输入班级号%d—--%d:",1,n); scanf(”%d”,&class); struct student *p; p = Class[class].head; printf(”%d班不及格名单\n",class); while(p != NULL) { if(p->score[0] < 60 || p—〉score[1] < 60 || p—>score[2] 〈 60) { printf(”%d\t%s\t",p—〉num,p—〉name); if(p->score[0] 〈 60) printf(”语文\t%d\t不及格\t",p-〉score[0]); if(p—〉score[1] 〈 60) printf(”线性代数\t%d\t不及格\t",p-〉score[1]); if(p—>score[2]<60) printf("英语\t%d\t不及格\t",p-〉score[2]); printf("\n”); } p = p->next; } } void Transcript(struct list Class[],int n) { int class; printf("请输入班级号:”); scanf("%d”,&class); struct student *p; p = Class[class].head; while(p != NULL) { printf(”%d\t%s\t%d\t%d\t%d\n”,p-〉num,p-〉name,p-〉score[0],p-〉score[1],p-〉score[2]); p = p—〉next; } } void menu() { printf(”0、退出系统\n”); printf("1、创建班级\n"); printf("2、输出学生信息\n"); printf(”3、按照学号录入学生成绩\n”); printf("4、按照班级录入学生成绩\n"); printf(”5、按照学号修改学生成绩\n"); printf("6、按照班级修改学生成绩\n”); printf(”7、按照班级统计学生的总成绩\n”); printf(”8、按照学号查询学生成绩\n”); printf("9、按照班级输出不及格学生名单及科目\n"); printf("10、按照班级输出学生成绩单\n”); } int main() { int n; int i; int operation; struct list Class[MAXSIZE]; Class[0]。head = NULL; Class[0]。class = —1; printf(”输入班级数量:\n”); scanf("%d”,&n); while(1) { menu(); printf("请选择操作:”); scanf(”%d”,&operation); switch(operation) { case 1:CreatClassStudent(Class,n); break; case 2:print(Class,n); break; case 3:StudentId(Class,n); break; case 4:ClassId(Class,n); break; case 5:StudentNumberChange(Class,n); break; case 6:ClassNumChange(Class,n); break; case 7:TotalGrade(Class,n); break; case 8: QueryResults(Class,n); break; case 9:NotPass(Class,n); break; case 10:Transcript(Class,n); break; case 0:exit(—1); } } return 0; } 六、参考文献 1、《嵌入式linux上的C语言编程实践》 北京亚嵌教育研究中心、韩超 电子工业出版社 2、《linux 下C语言应用编程》 杨铸 北京航空航天大学出版社 3、《linux 高级程序设计》 杨宗德 邓玉春 人民邮电出版社 七、开发环境 开发环境linux操作系统 GNU Compiler Collection程序生成工具软件- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计 学生 信息管理 系统
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文