收藏 分销(赏)

C语言课程设计—学生选课系统.doc

上传人:二*** 文档编号:4555706 上传时间:2024-09-29 格式:DOC 页数:31 大小:366.76KB 下载积分:5 金币
下载 相关 举报
C语言课程设计—学生选课系统.doc_第1页
第1页 / 共31页
本文档共31页,全文阅读请下载到手机保存,查看更方便
资源描述
. 武汉理工大学华夏学院 课程设计报告书 课程名称: C课程设计 题 目: 学生选课系统程序设计 系 名: 信息工程系 专业班级: 姓 名: 学 号: 指导教师: 成 绩: 2016年 3 月 4 日 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 设计题目:学生选课系统程序设计 初始条件: 学生选课系统能提供学生选课,以及学生和课程信息管理等一系列功能。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1、任务描述 假定有n门课程,每门课程有课程编号,课程名称,课程性质,学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于15)自由选课。试设计一个选修课程系统,使之能提供以下功能: (1)系统以菜单方式工作 (2)课程信息和学生选课信息录入功能(课程信息用文件保存) (3)课程信息浏览功能 (4)查询功能 (5)按学分查询 (6)某门课程学生选修情况(可选项) 2、本课程涉及的知识点 变量的定义、输入和输出函数、结构体类型的定义、结构体数组、循环语句、选择语句,文件的操作等。 设计报告撰写格式要求: 一、课程设计说明书(或报告书)正文内容 【设计题目】例如:学生选课系统 【开发环境】硬件环境:微机系列,内存在1G以上,软件环境:Microsoft Windows XP 【开发工具】 Microsoft Visual C++ 6.0 【完成时间】 2016-2 -29-----2016.3.4 【需求分析】分析阐述用户的需要以及要实现的程序应具有什么样的功能。 【系统总体设计】 在明确了所要解决的问题后,很自然地就要提出自己解决问题的思路和方案。让读者了解方案的总体设计和关键技术。 要阐述自己的设计方案,说明为什么要选择或设计这样的方案。 具体包括:系统总的设计思路,功能模块图; 使用的设计软硬件环境和开发技术和平台等。 【系统详细设计】 在这部分中,应该具有相关关键实现技术(如使用什么库函数,使用什么循环结构等)。 【系统调试和测试】 调试:介绍设计过程中遇到的问题和解决方法。 测试:介绍如何测试系统,测试中发现的问题和解决方案。 【结束语】 这部分篇幅不大,对整个设计中做的工作、获得的成果、心得体会等做一个简单小结。 【参考文献】罗列在设计过程中查阅的文献名称 注意:参考文献罗列的格式为 资料编号•作者姓名•文献或期刊名称•出版社名称,文献的出版时间或期刊的期号 例如:文献 [1] 谭浩强.,C程序设计(第二版)[M],北京:清华大学出版社,2001年 期刊 [2] 于振海.office XP网上数据存取.计算机应用文摘[J],2003,24;69(页) 二、课程设计说明书(或报告书)正文的书写格式简介 一、 正文标题层次 正文题序层次是文章结构的框架,一般采用社会通用的论文书写形式。即章条序码统一用阿拉伯数字表示,题序层次可以分为若干级,各级号码之间加小圆点,末尾一级的后面不加小圆点,层次分级一般不超过四级为宜,示例如下: 第一级(章) 1 2 3 …… 第二级(条) 1.1 1.2… 2.1 2.2 … 3.1 3.2 … …… 第三级(条) 1.1.1 1.1.2 … 1.2.1 1.2.2… 2.1.1 2.1.2 … 2.2.1 2.2.2… 3.1.1 3.1.2 … 3.2.1 3.2.2… …… 二、表格 每个表格应有自己的表序与表题,表序与表题间空一格。 例如:表1.1 XXXX ,且表题与表序应写在表格的上方正中处。 三、插图 插图图面要整齐、美观,插图应与正文呼应,不能脱节。每幅插图应有图序与图题,图序编号要连续,图序与图题间空一格且要放在插图下方居中处。 四、公式 公式应另起一行写在稿纸的中央 时间安排: 周次 星期一 星期二 星期三 星期四 星期五 第2周 第1-4节 第3-4节 第1-4节 第1-2节 第1-4节 地点 现教221 现教221 现教221 现教221 现教221 课程设计考核及评分标准 1. 系统完成任务:50分 2. 各种技术的综合应用:10分 3、回答提问情况:20分 4. 设计报告:20分 目 录 1设计题目 1 2开发环境 1 2.1硬件环境 1 2.2软件环境 1 3 开发工具 1 4完成时间 1 5需求分析 1 6系统总体设计 2 7系统详细设计 2 7.1系统主菜单 2 7.1.1系统主菜单界面 2 7.1.2系统功能模块图 3 7.1.3系统主菜单流程图 4 7.1.4系统主菜单代码 4 7.2录入课程信息 6 7.2.1录入课程信息界面 6 7.2.2录入课程信息模块图 6 7.2.3录入课程信息流程图 7 7.2.4录入课程信息代码 7 7.3课程管理 8 7.3.1课程管理界面 8 7.3.2课程管理模块图 9 7.3.3课程管理流程图 9 7.3.4课程管理代码 10 7.4学生信息管理 12 7.4.1学生信息管理界面 12 7.4.2学生信息管理界面模块图 12 7.4.3学生信息管理流程图 12 7.4.4学生信息管理代码 13 7.5学生选课 15 7.5.1学生选课界面 15 7.5.2学生选课模块图 16 7.5.3学生选课流程图 17 7.5.4学生选课代码 18 8系统调试和测试 22 8.1调试 22 8.2测试 25 9结束语 25 10参考文献 25 精选范本 1设计题目 学生选课系统 2开发环境 2.1硬件环境 微机系列,内存在1G以上 2.2软件环境 Win7系统 3 开发工具 Microsoft Visual C++ 6.0 4完成时间 2016年2月29日—2016年3月4日 5需求分析 用户需求如下: 假定有n门课程,每门课程有课程编号,课程名称,课程性质,学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于15)自由选课。试设计一个选修课程系统。 故此,经过分析后我觉得程序应该具有以下功能: (1)系统以菜单方式工作 (2)课程信息和学生选课信息录入功能 (3)课程信息浏览功能 (4)查询功能 (5)按学分查询 6系统总体设计 系统由哪几个功能模块构成,给出功能模块图。C中模块化的工具是函数根据上面的需求分析,可以将这个系统的设计分为如下六大模块。 选课模块、按学分查找模块、按编号查找模块、查看课程模块、查看选课情况模块、课程输入模块、完成选择模块。模块图如下图1所示。 菜单选择模块 课程信息管理 管理 录入课 程信息 退出系统 学生选课 学生信息 管 理 录入学生信息 完成选择模块 图1 系统功能模块图 另外,程序用了两个结构体和五个全局变量N1,N2,kk1,kk2,kk3。五个全局变量是用来控制输入数据的循环的。两个结构体分别是课程信息结构体: struct couse//课程信息结构体 { int num1;//课程编号 char name1[20];//课程名称 char xinzhi[30];//课程性质 int ztime;//课程总学时 int stime;//授课学时 int shiyan;//实验学时 int score;//学分 long int date;//开学学期 int nelepeo;//课程已选人数 int Melepeo;//课程人数上限 struct couse * next; }; 和存储学生信息的结构体: struct student//学生信息结构体 { int num2; char name2[20]; int nelenum[50];//已选课程编号 int nelen;//已选课程数量 struct student * next; }; void Ms() { for(kk1=0;kk1<1100;kk1++) for(kk2=0;kk2<1200;kk2++) for(kk3=0;kk3<1200;kk3++); } 7系统详细设计 7.1系统主菜单 系统界面设计图包括六个选项,用户可根据自己的需求选择不同的选项。系统界面设计图如图2所示。 图2 系统界面设计图 系统模块图分为六大模块。分别是录入课程信息模块,课程信息管理模块,录入学生信息模块,学生信息管理模块,学生选课模块和退出系统模块。系统功能模块图如下图3所示。 录入课程信息 课程信息管理 录入学生信息 学生信息管理 学生选课 退出系统 主菜单 图3系统功能模块图 图3 主菜单设计模块图 当用户进入主菜单后,会显示有六个选项的界面,需要用户从1-6个选项中选择一个选项来进行操作,若所选数非1-6,则会退出系统。系统主菜单流程图如图4所示。 开始 根据n的值调用各功能模块函数 输入n,判断n是否是1-6 定义n N Y Y 调用完成 结束 图4 系统总流程图 该程序实现代码如下。 int main()//主函数 { int i; start: printf("\n\t\t\t欢迎使用学生选课系统!\n"); printf("\n"); printf("\t主菜单:\n"); printf("\t*******************************************************\n"); printf("\t* *\n"); printf("\t* 1.录入课程信息 *\n"); printf("\t* 2.课程信息管理 *\n"); printf("\t* 3.录入学生信息 *\n"); printf("\t* 4.学生信息管理 *\n"); printf("\t* 5.学生选课 *\n"); printf("\t* 6.退出系统 *\n"); printf("\t* *\n"); printf("\t*******************************************************\n"); printf("\n请输入菜单选项(1~6):"); scanf("%d",&i); if(i<1 || i>6) { printf("输入错误,请重输:\n"); goto start; } switch(i) { case 1: { system("cls"); inputc(); goto start; break; } case 2: { system("cls"); managementc(); goto start; break; } case 3: { system("cls"); inputs(); goto start; break; } case 4: { system("cls"); managements(); goto start; break; } case 5: { system("cls"); elective(); goto start; break; } case 6: { system("cls"); printf("感谢使用本系统!\n\n再见!\n"); } } return 0; } 7.2录入课程信息 录入课程信息有两个选项,录入课程和返回主菜单。录入课程信息界面设计如图5所示。 图5录入课程信息界 当用户进入录入课程后,会有两个选项,录入课程和返回主菜单。录入课程信息流程图如图6所示。 开始 Y N N 定义n n=1? n=2? 返回主菜单 录入课程 录入完成 Y 结束 图6 录入课程信息流程图 实现该功能代码如下。 void keyboardc()//录入课程子函数 { struct couse *p1,*p2; N1=0; p1=p2=(struct couse*)malloc(sizeof(struct couse)); printf("课程编号 课程名称 课程性质 总学时 授课学时 实验学时 学分 开课学期 人数上限\n"); scanf("%d%s%s%d%d%d%d%d",&p1->num1,p1->name1,&p1->xinzhi,&p1->ztime,&p1->stime,&p1->shiyan,&p1->score,&p1->date,&p1->Melepeo); p1->nelepeo=0; head1=NULL; while(p1->num1!=0) { N1=N1+1; if(N1==1)head1=p1; else p2->next=p1; p2=p1; p1=(struct couse * )malloc(sizeof(struct couse)); scanf("%d%s%s%d%d%d%d%d",&p1->num1,p1->name1,&p1->xinzhi,&p1->ztime,&p1->stime,&p1->shiyan,&p1->score,&p1->date,&p1->Melepeo); p1->nelepeo=0; } p2->next=NULL; } void inputc()//录入课程主函数 { int i; printf("\t\t\t录入课程信息\n"); printf("\n1.录入课程\n"); printf("2.返回主菜单\n"); printf("请选择(1~2):\n"); scanf("%d",&i); switch(i) { case(1):keyboardc();break; case(2):break; } } 7.3课程管理 课程管理有三个选项,新增课程,删除课程和返回主菜单。课程管理界面设计如图7所示。 图7 课程管理界面 课程管理可以选择增添或删除课程,若输入课程格式错误会显示错误,用户需要重新输入程管理流程图如图8所示。 输入课程信息 新增或删除课程 开始 N 结束 显示失败 保 存 Y 图8 课程管理流程图 实现该功能代码如下。 void delc(int num1)//课程管理子函数(删除课程) { struct couse *p1,*p2; if(head1==NULL) { printf("\n没有课程,无法删除!\n"); goto end; } p1=head1; while(num1!=p1->num1 && p1->next!=NULL) { p2=p1; p1=p1->next; } if(num1==p1->num1) { if(p1==head1) head1=p1->next; else p2->next=p1->next; printf("已删除该编号课程!\n"); N1=N1-1; } else printf("无该编号的课程!\n"); end:; } void managementc()//课程管理主函数 { struct couse * incouse; int i,num1; printf("\t\t\t课程信息管理\n"); printf("1.新增课程\n"); printf("2.删除课程\n"); printf("3.返回主菜单\n"); printf("请选择(1~3):\n"); scanf("%d",&i); switch(i) { case(1): { incouse=(struct couse *)malloc(sizeof(struct couse)); printf("课程编号 课程名称 课程性质 总学时 授课学时 实验学时 学分 开课学期 人数上限\n"); scanf("%d\n%s\n%s\n%d\n%d\n%d\n%d\n%d\n%d\n",&incouse->num1,&incouse->name1,&incouse->xinzhi,&incouse->ztime,&incouse->stime,&incouse->score,&incouse->date,&incouse->Melepeo); incouse->nelepeo=0; insertc(incouse); break; } case(2): { printf("请输入要删除课程的编号:\n"); scanf("%d",&num1); delc(num1); break; } case(3):break; } } 7.4学生信息管理 学生信息管理可选新增或删除学生信息,若都不操作则可选返回主菜单。学生信息管理界面设计如图9所示。 图9 学生信息管理界面 学生信息管理有增加和删除学生信息,若选择此项,则会提示用户输出入相关信息,若输入格式错误则会有提示错误信息,当操作完成后会退回主菜单界面。学生信息管理界面流程图如图10所示。 开始 保存信息 输入错误 输入姓名,考号 新增学生信息 或删除学生信息 退出 结束 N Y 图10 学生信息管理界面流程图 实现该功能代码如下。 void inserts(struct student * incouse)//学生信息管理子函数(填加学生信息) { struct student *p0,*p1,*p2; p1=head2; p0=incouse; if(head2==NULL) { head2=p0; p0->next=NULL; } else { while((p0->num2 > p1->num2) && (p1->next!=NULL)) { p2=p1; p1=p1->next; } if(p0->num2 <= p1->num2) { if(head2==p1) head2=p0; else p2->next=p0; p0->next=p1; } else { p1->next=p0; p0->next=NULL; } } N2=N2+1; } void dels(int num2)//学生信息管理子函数(删除学生信息) { struct student *p1,*p2; if(head2==NULL) { printf("\n没有该学生信息,无法删除!\n"); goto end; } p1=head2; while(num2!=p1->num2 && p1->next!=NULL) { p2=p1; p1=p1->next; } if(num2==p1->num2) { if(p1==head2) head2=p1->next; else p2->next=p1->next; printf("已删除该学生信息!\n"); N2=N2-1; } else printf("无该学号的学生!\n"); end:; } void managements()//学生信息管理主函数 { struct student * incouse; int i,num2; printf("\t\t\t学生信息管理\n"); printf("1.新增学生信息\n"); printf("2.删除学生信息\n"); printf("3.返回主菜单\n"); printf("请选择(1~3):\n"); scanf("%d",&i); switch(i) { case(1): { incouse=(struct student *)malloc(sizeof(struct student)); incouse->nelen=0; incouse->nelenum[0]=0; printf("学生学号\t学生姓名\n"); scanf("%d%s",&incouse->num2,incouse->name2); inserts(incouse); break; } case(2): { printf("请输入要删除学生的学号:\n"); scanf("%d",&num2); dels(num2); break; } case(3):break; } } 7.5学生选课 学生选课可以查询已选和可选课程,此外还有返回主菜单选项学生选课界面设计如图11所示。 图11 学生选课界面 进入选课选项则会提示用户输入学号然后再进行选课。若不选则可以退回主菜单。学生选课流程图如图12所示。 开始 学生选课 输入n n=1? Y 查询可选课程 输入学号 N n=2? Y 返回主菜单 查询完成 查询完成 n=3? N 输入学号 查询已选课程 N N Y 结束 图12 学生选课流程图 实现该功能代码如下。 选课程序如下。用户要选课时,查询可选课程后会提示输入所要选的课程的编号,然后程序会根据所选的课程编号将所选课程信息储存。 void elect(struct student * s)//选课 { struct couse * p; int num1,i; printf("请输入要选课的编号:\n"); scanf("%d",&num1); for(i=0;s->nelenum[i]!=0;i++); s->nelenum[i]=num1; (s->nelen)++; p=head1; while(p->num1!=num1) p=p->next; (p->nelepeo)++; } void cheak()//学生选课子函数(查询可选课程) { char e; struct couse * c; struct student * s; int num2,i,j=0,t=0; printf("请输入你的学号:"); scanf("%d",&num2); s=head2; while(s->num2!=num2 && s->next!=NULL) s=s->next; if(s->num2!=num2) { printf("不存在你的信息,请进入主菜单录入你的信息!\n"); goto end; } c=head1; printf("你的可选课程编号:\n"); while(c!=NULL) { for(t=0,i=0;s->nelenum[i]!=0;i++) { if(c->num1==s->nelenum[i]) t=1; } if(t==0 && (c->nelepeo!=c->Melepeo)) { printf("%d\n",c->num1); j++; } c=c->next; } if(j==0) { printf("你已选完所有课程,无法再多选!\n"); goto end; } printf("选课(y/n)?:\n"); getchar(); e=getchar(); i=0; while(e=='y') { elect(s); printf("继续选课(y/n)?:\n"); getchar(); e=getchar(); } end:; } 退课程序如下。首先输入要退掉课程的编号,若该课程存在,则显示退课成功,若不存在,则失败。 void back(struct student * p)//退课 { struct couse * p1; int num1,i,j; printf("请输入你要退掉的课程编号:\n"); scanf("%d",&num1); p1=head1; while(p1->num1!=num1) p1=p1->next; for(i=0;p->nelenum[i]!=num1;i++); for(j=i;p->nelenum[j]!=0;j++) p->nelenum[j]=p->nelenum[j+1]; p->nelenum[--j]=0; (p1->nelepeo)--; printf("退课成功!\n"); } 查询已选课程代码如下。首先输入学号,若系统中无记录,则会提示不存在该信息,请用户录入该信息,然后用goto语句跳转到主菜单界面。若有记录,则继续输入课程编号,若未选此课,则会提示你还没有选这个课程。 void hcheak()//学生选课子函数(查询已选课程) { char c; struct couse * p0; struct student * p; int num2,i,f=0; printf("请输入学号:\n"); scanf("%d",&num2); p=head2; while(p->num2!=num2 && p!=NULL) p=p->next; if(p==NULL) { printf("不存在你的信息,请回主菜单录入信息:\n"); goto end; } printf("已选课程编号:\n"); if(p->nelenum[0]==0) { printf("你还没选课!\n"); goto end; } for(i=0;p->nelenum[i]!=0;i++) { printf("%d\n",p->nelenum[i]); p0=head1; while(p0->num1!=p->nelenum[i]) p0=p0->next; f=f+p0->score; } printf("总学分:%d\n",f); printf("是否进行退课(y/n)?"); getchar(); c=getchar(); while(c=='y') { back(p); printf("继续退课(y/n)?"); getchar(); c=getchar(); (p->nelen)--; } end:; } 选课主界面程序如下。用printf输出界面,用switch语句选择调用对应的函数以实现选择各种情况。 void elective()//学生选课主函数 { int i; printf("\t\t\t学生选课\n"); printf("1.查询可选课程\n"); printf("2.查询已选课程\n"); printf("3.返回主菜单\n"); printf("请输入(1~3):\n"); scanf("%d",&i); switch(i) { case(1):cheak();break; case(2):hcheak();break; case(3):break; } } 8系统调试和测试 8.1调试 在调试程序的过程中,一方面遇到了一些编程序时的通病,比如经常性的漏掉了语句尾的分号,还偶尔的漏掉大括号,导致程序不能正常编译。另一方面在编写函数模块时,由于之前设计考虑得不足,会有一些功能无法实现,最后只有删掉这些无法实现的设计模块。 录入课程信息如下图13所示。 图13 录入课程信息 课程信息管理如下图14所示。 图14新增课程 删除课程如下图15所示。 图15删除课程 录入学生信息如下图16所示。 图16录入学生信息 新怎学生信息如下图17所示。 图17新增学生信息 删除学生信息如下图18所示。 图18删除学生信息 查询可选课程如下图19所示。 图19 查询可选课程 查
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服