C语言课程设计-学生成绩管理1.doc_第1页
C语言课程设计-学生成绩管理1.doc_第2页
C语言课程设计-学生成绩管理1.doc_第3页
C语言课程设计-学生成绩管理1.doc_第4页
C语言课程设计-学生成绩管理1.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

课 程 设 计 报 告课程名称 c语言课程设计 课题名称 学生成绩管理 专 业 电气自动化 班 级 学 号 姓 名 指导教师 2011年 6 月 20 日 目录封面1目录2任务书3学生成绩管理系统需求分析,概要设计,详细设计5程序调试8程序界面8附件(程序代码)10详细设计24运行与调试,参考文献24源程序25参考文献37总结心得37评分表37 湖南工程学院课 程 设 计 任 务 书课程名称 c课程设计 课 题 学生成绩管理 专业班级 电气1085 学生姓名 学 号 05 指导老师 审 批 任务书下达日期 2011 年 6 月 20 日任务完成日期 2011 年 6 月 日湖南工程学院课 程 设 计 任 务 书一设计内容:设计与开发一个学生成绩管理系统,对学生的学号、姓名、课程成绩、总分、平均成绩等信息进行管理、主要功能以下基本功能模块图1所示。主程序初始化输入显示删除查找添加计算排序退出图1 基本功能模块 二设计要求:1)设计正确,方案合理。2)界面友好,使用方便。3)程序精炼,结构清晰。4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。5)实际操作过程中遇到的问题及解决方法:设计总结及心得体会.6)上机演示。成绩评定:指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分: 平时出勤 (占10%) 系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%) 程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%) 设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。 独立完成情况(占10%)。 运行所设计的系统。三、进度安排第十九周 星期一 14:3018:00 星期二14:3018:00 星期三14:3018:00附:课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(a4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。正文总字数要求在5000字以上(不含程序原代码)。成绩管理系统1)需求分析:学生信息是存放在文件中的,所以应该提供文件的输入,输出,插入,删除等操作,在程序中需要浏览学生的信息,应提供显示,查找,排序等操作,另外还应提供键盘式选择菜单提供选择功能。2)概要设计:根据上面的需求分析,可以将这个系统大致划分为以下模块:输入模块,修改模块,删除模块,查找模块,显示模块。1.录入学生信息2显示学生信息3查找学生信息5修改学生信息4删除学生信息6统计学生信息7保存学生信息0退出系统功能选择1按学号查找0按姓名查找 1按学号修改0按姓名修改3)详细设计:1输入初始的学生信息:其中包括学生的姓名、学号,性别以及学生的语文、数学、英语和计算机等相关信息。先打印出已有学生信息disp(l)输入学号格式化学号并并检验若输入学号为0则退出系统若学号被占用,重新输入未占用的学号2. 查询模块:找到就输出此学生全部信息包括3科的成绩。查询按学号查询按成绩查询运行显示成绩3. 插入模块:其中通过学号的大小来比较的,并且以此来排序。保存插入点之前的学号,并输入学号查询该学号是否存在插入之前的节点4. 输出学生的信息以及成绩:通过学生的姓名来查看学生的3科成绩,同时也可以分别通过caverage()、maverage()、eaverage()和comaverage()来输出3科成绩的平均分数,最高和最低分数。5. 退出系统:可用一个函数exit()来实现,首先将信息保存到文件中,释放动态创建的内存空间,再退出此程序。4)程序调试:问题一:学生初始信息模块: 其中包括学生的姓名、学号、3门科目的成绩等相关信息;当正确输入存在的学生号,系统进行判断时,提示不存在此学生。解决办法及步骤:1. 一个个输出所有学生的学号,检查文件中是否有学生,发现有。2. 既然有此学生,那么检查循环判断是否有此学生的语句,发现没有错。3. 输出用于循环检查语句中的学生信息,发现乱码。4. 仔细分析乱码的原因,最后发现是变量的类型错误,错将学生类型的结构体指针变量定义为了其它类型的指针变量。问题二:查询模块:找到就输出此学生全部信息包括学生的3科成绩。当正确输入查找信息时,系统却不能够得到所要查找的学生信息以及学生的3科成绩。解决办法及步骤:1. 检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息一级学生的3科成绩。2. 检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样,我们应当仔细输入查找信息。5)程序界面:1.初始界面2.输入学生信息节点界面:3. 删除节点界面;4. 查找节点界面:1)运行与调试:调试:将图中/*/去掉在/*计算总分和均值*/上加上个运行:2)源程序 /*xuesheng.c*/*头文件(.h)*/#include stdio.h /*i/o函数*/#include stdlib.h /*其它说明*/#include string.h /*字符串函数*/#include conio.h /*屏幕操作函数*/#include mem.h /*内存操作函数*/#include ctype.h /*字符操作函数*/#include alloc.h /*动态地址分配函数*/#define n 3 /*定义常数*/typedef struct z1 /*定义数据结构*/ char no11; char name15; int scoren; float sum; float average; int order; struct z1 *next; student;/*以下是函数原型*/student *init(); /*初始化函数*/student *create(); /*创建链表*/student *delete(student *h); /*删除记录*/void print(student *h); /* 显示所有记录*/void search(student *h); /*查找*/void save(student *h); /*保存*/student *load(); /*读入记录*/void computer(student *h); /*计算总分和均分*/student *insert(student *h); /*插入记录*/void append(); /*追加记录*/student *sort(student *h); /*排序*/int menu_select(); /*菜单函数*/*主函数开始*/main() int i; student *head; /*链表定义头指针*/ head=init(); /*初始化链表*/ clrscr(); /*清屏*/ for(;) /*无限循环*/ switch(menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ /*值不同,执行的函数不同,break 不能省略*/ case 0:head=init();break; /*执行初始化*/ case 1:head=create();break; /*创建链表*/ case 2:head=delete(head);break; /*删除记录*/ case 3:print(head);break; /*显示全部记录*/ case 4:search(head);break; /*查找记录*/ case 5:save(head);break; /*保存文件*/ case 6:head=load(); break; /*读文件*/ case 7:computer(head);break; /*计算总分和均分*/ case 8:head=insert(head); break; /*插入记录*/ case 9:head=sort(head);break; /*排序*/ case 10:append();break; /*追加记录*/ case 11:exit(0); /*如菜单返回值为14程序结束*/ /*菜单函数,返回值为整数*/menu_select() char *menu=*menu*, /*定义菜单字符串数组*/ 0. init list, /*初始化*/ 1. enter list, /*输入记录*/ 2. delete a record from list, /*从表中删除记录*/ 3. print list , /*显示单链表中所有记录*/ 4. search record on name, /*按照姓名查找记录*/ 5. save the file, /*将单链表中记录保存到文件中*/ 6. load the file, /*从文件中读入记录*/ 7. compute the score, /*计算所有学生的总分和均分*/ 8. insert record to list , /*插入记录到表中*/ 9. sort to make new file, /*排序*/ 10. append record to file, /*追加记录到文件中*/ 11. quit; /*退出*/ char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ gotoxy(1,25); /*移动光标*/ printf(press any key enter menu.n); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏幕*/ gotoxy(1,1); /*移动光标*/ textcolor(yellow); /*设置文本显示颜色为黄色*/ textbackground(blue); /*设置背景颜色为蓝色*/ gotoxy(10,2); /*移动光标*/ putch(0xc9); /*输出左上角边框*/ for(i=1;i44;i+) putch(0xcd); /*输出上边框水平线*/ putch(0xbb); /*输出右上角边框 */ for(i=3;i20;i+) gotoxy(10,i);putch(0xba); /*输出左垂直线*/ gotoxy(54,i);putch(0xba); /*输出右垂直线*/ gotoxy(10,20);putch(0xc8); /*输出左上角边框*/ for(i=1;i44;i+) putch(0xcd); /*输出下边框水平线*/ putch(0xbc); /*输出右下角边框*/ window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i13;i+) /*输出主菜单数组*/ gotoxy(10,i+1); cprintf(%s,menui); textbackground(black); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ gotoxy(10,21); /*移动光标*/ do printf(n enter you choice(014):); /*在菜单窗口外显示提示信息*/ scanf(%s,s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while(c11); /*选择项不在014之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/student *init() return null;/*创建链表*/student *create() int i; int s; student *h=null,*info; /* student指向结构体的指针*/ for(;) info=(student *)malloc(sizeof(student); /*申请空间*/ if(!info) /*如果指针info为空*/ printf(nout of memory); /*输出内存溢出*/ return null; /*返回空指针*/ inputs(enter no:,info-no,11); /*输入学号并校验*/ if(info-no0=) break; /*如果学号首字符为则结束输入*/ inputs(enter name:,info-name,15); /*输入姓名,并进行校验*/ printf(please input %d score n,n); /*提示开始输入成绩*/ s=0; /*计算每个学生的总分,初值为0*/*n门课程循环n次*/*将总分保存*/*求出平均值*/for(i=0;iscorei); /*输入成绩*/ if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; /*累加各门课程成绩*/ info-sum=s; /*将总分保存*/ info-average=(float)s/n; /*求出平均值*/ info-order=0; /*未排序前此值为0*/ info-next=h; /*将头结点做为新输入结点的后继结点*/ h=info; /*新输入结点为新的头结点*/ return(h); /*返回头指针*/*输入字符串,并进行长度验证*/inputs(char *prompt, char *s, int count) char p255; do printf(prompt); /*显示提示信息*/ scanf(%s,p); /*输入字符串*/ if(strlen(p)count)printf(n too long! n); /*进行长度校验,超过count值重输入*/ while(strlen(p)count); strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/*输出链表中结点信息*/void print(student *h) int i=0; /* 统计记录条数*/ student *p; /*移动指针*/ clrscr(); /*清屏*/ p=h; /*初值为头指针*/ printf(nnn*student*n); printf(|rec|no | name | sc1| sc2| sc3| sum | ave |order|n); printf(|-|-|-|-|-|-|-|-|-|n); while(p!=null) i+; printf(|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n, i, p-no,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p-order); p=p-next; printf(*end*n);/*删除记录*/student *delete(student *h) student *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/ char s11; /*存放学号*/ clrscr(); /*清屏*/ printf(please deleted non); /*显示提示信息*/ scanf(%s,s); /*输入要删除记录的学号*/ q=p=h; /*给q和p赋初值头指针*/*当记录的学号不是要找的,或指针不为空时*/ q=p; /*将p指针值赋给q作为p的前驱指针*/ p=p-next; /*将p指针指向下一条记录*/ if(p=null) /*如果p为空,说明链表中没有该结点*/ printf(nlist no %s studentn,s); else /*p不为空,显示找到的记录信息*/ printf(*have found*n); printf(|no | name | sc1| sc2| sc3| sum | ave |order|n); printf(|-|-|-|-|-|-|-|-|n); printf(|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n, p-no, p-name,p-score0,p-score1,p-score2,p-sum, p-average,p-order); printf(*end*n); getch(); /*压任一键后,开始删除*/ if(p=h) /*如果p=h,说明被删结点是头结点*/ h=p-next; /*修改头指针指向下一条记录*/ else q-next=p-next; /*不是头指针,将p的后继结点作为q的后继结点*/ free(p); /*释放p所指结点空间*/ printf(n have deleted no %s studentn,s); printf(dont forget saven);/*提示删除后不要忘记保存文件*/ return(h); /*返回头指针*/*查找记录*/void search(student *h) student *p; /* 移动指针*/ char s15; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/ printf(please enter name for searchn); scanf(%s,s); /*输入姓名*/ p=h; /*将头指针赋给p*/ while(strcmp(p-name,s)&p!=null) /*当记录的姓名不是要找的,或指针不为空时*/ p=p-next; /*移动指针,指向下一结点*/ if(p=null) /*如果指针为空*/ printf(nlist no %s studentn,s); /*显示没有该学生*/ else /*显示找到的记录信息*/ printf(nn*havefound*n); printf(|no | name | sc1| sc2| sc3| sum | ave |order|n); printf(|-|-|-|-|-|-|-|-|n); printf(|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n, p-no,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p-order); printf(*end*n); /*插入记录*/student *insert(student *h) student *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/ char s11; /*保存插入点位置的学号*/ int s1,i; printf(please enter location before the non); scanf(%s,s); /*输入插入点学号*/ printf(nplease new recordn); /*提示输入记录信息*/ info=(student *)malloc(sizeof(student); /*申请空间*/ if(!info) printf(nout of memory); /*如没有申请到,内存溢出*/ return null; /*返回空指针*/ inputs(enter no:,info-no,11); /*输入学号*/ inputs(enter name:,info-name,15); /*输入姓名*/ printf(please input %d score n,n); /*提示输入分数*/ s1=0; /*保存新记录的总分,初值为0*/ for(i=0;iscorei); if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; /*计算总分*/ info-sum=s1; /*将总分存入新记录中*/ info-average=(float)s1/n; /*计算均分*/ info-order=0; /*名次赋值0*/ info-next=null; /*设后继指针为空*/ p=h; /*将指针赋值给p*/ q=h; /*将指针赋值给q*/ while(strcmp(p-no,s)&p!=null) /*查找插入位置*/ q=p; /*保存指针p,作为下一个p的前驱*/ p=p-next; /*将指针p后移*/ if(p=null) /*如果p指针为空,说明没有指定结点*/ if(p=h) /*同时p等于h,说明链表为空*/ h=info; /*新记录则为头结点*/ else q-next=info; /*p为空,但p不等于h,将新结点插在表尾*/ else if(p=h) /*p不为空,则找到了指定结点*/ info-next=p; /*如果p等于h,则新结点插入在第一个结点之前*/ h=info; /*新结点为新的头结点*/ else info-next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/ q-next=info; /*新结点作为q的后继结点*/ printf(n -have inserted %s student-n,info-name); printf(-dont forget save-n); /*提示存盘*/ return(h); /*返回头指针*/*保存数据到文件*/void save(student *h) file *fp; /*定义指向文件的指针*/ student *p; /* 定义移动指针*/ char outfile10; /*保存输出文件名*/ printf(enter outfile name,for example c:f1te.txt:n); /*提示文件名格式信息*/ scanf(%s,outfile); if(fp=fopen(outfile,wb)=null) /*为输出打开一个二进制文件,如没有则建立*/ printf(can not open filen); exit(1); printf(nsaving file.n); /*打开文件,提示正在保存*/ p=h; /*移动指针从头指针开始*/ while(p!=null) /*如p不为空*/ fwrite(p,sizeof(student),1,fp);/*写入一条记录*/ p=p-next; /*指针后移*/ fclose(fp); /*关闭文件*/ printf(-save success!-n); /*显示保存成功*/* 从文件读数据*/student *load() student *p,*q,*h=null; /*定义记录指针变量*/ file *fp; /* 定义指向文件的指针*/ char infile10; /*保存文件名*/ printf(enter infile name,for example c:f1te.txt:n); scanf(%s,infile); /*输入文件名*/ if(fp=fopen(infile,rb)=null) /*打开一个二进制文件,为读方式*/ printf(can not open filen); /*如不能打开,则结束程序*/ exit(1); printf(n -loading file!-n); p=(student *)malloc(sizeof(student); /*申请空间*/ if(!p) printf(out of memory!n); /*如没有申请到,则内存溢出*/ return h; /*返回空头指针*/ h=p; /*申请到空间,将其作为头指针*/ while(!feof(fp) /*循环读数据直到文件尾结束*/ if(1!=fread(p,sizeof(student),1,fp) break; /*如果没读到数据,跳出循环*/ p-next=(student *)malloc(sizeof(student); /*为下一个结点申请空间*/ if(!p-next) printf(out of memory!n); /*如没有申请到,则内存溢出*/ return h; q=p; /*保存当前结点的指针,作为下一结点的前驱*/ p=p-next; /*指针后移,新读入数据链到当前表尾*/ q-next=null; /*最后一个结点的后继指针为空*/ fclose(fp); /*关闭文件*/ printf(-you have success read data from file!-n); return h; /*返回头指针*/*追加记录到文件*/void append() file *fp; /*定义指向文件的指针*/ student *info; /*新记录指针*/ int s1,i; char infile10; /*保存文件名*/ printf(nplease new recordn); info=(student *)malloc(sizeof(student); /*申请空间*/ if(!info) printf(nout of memory); /*没有申请到,内存溢出本函数结束*/ return ; inputs(enter no:,info-no,11); /*调用inputs输入学号*/ inputs(enter name:,info-name,15); /*调用inputs输入姓名*/ printf(please input %d score n,n); /*提示输入成绩*/ s1=0; for(i=0;iscorei); /*输入成绩*/ if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; /*求总分*/ info-sum=s1; /*保存总分*/ info-average=(float)s1/n; /*求均分*/ info-order=0; /*名次初始值为0*/ info-next=null; /*将新记录后继指针赋值为空*/ printf(enter infile name,for example c:f1te.txt:n); scanf(%s,infile); /*输入文件名*/ if(fp=fopen(infile,ab)=null) /*向二进制文件尾增加数据方式打开文件*/ printf(can not open filen); /*显示不能打开*/ exit(1); /*退出程序*/ printf(n -appending record!-n); if(1!=fwrite(info,sizeof(student),1,fp) /*写文件操作*/ printf(-file write error!-n); return; /*返回*/ printf(-append sucess!-n); fclose(fp); /*关闭文件*/*排序*/student *sort(student *h) int i=0; /*保存名次*/ studen

温馨提示

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

评论

0/150

提交评论