学生选修课程系统设计

学生选修课程系统设计
假定有 n 门课程,每门课程有课程编号、课程名称、课程性质、总学时、 授课学时、实验或商机学时、血粉、开课学期等信息,学生可按要求(如总 学 分 不 得 少 于 60) 自 由 选 课 。

1、 要 求 :
试设计一个选修课程系统,使之能提供以下功能: ( 1) 系 统 以 菜 单 方 式 工 作 。 ( 2) 课 程 信 息 和 学 生 选 课 信 息 输 入 功 能( 课 程 信 息 用 文 件 保 存 )— — 输 入。 ( 3) 课 程 信 息 浏 览 功 能 — — 输 出 。 ( 4) 查 询 功 能 ( 至 少 一 种 查 询 方 式 ) — — 算 法 。 ( 5) 按 学 分 查 询 。 ( 6) 某 门 课 程 学 生 选 修 情 况 ( 可 选 项 ) 。

2、 分 析 :
由 于 题 目 要 求 将 学 生 的 选 课 信 息 用 结 构 体 形 式 输 入 ,并 写 入 文 件 中 ,所 以 应提供文件的输入输出等操作:在过程中需有浏览、插入、修改、查找、删 除学生选课信息等操作,顾应分别建立个功能模块;另外还应提供键盘式选 择菜单实现程序运行。

3、 总 体 设 计 :
根据题目要求,可以将系统分为六个模块: 1) 系统以菜单方式工作模块; 2) 课程信息与学生选课信息录入功能模块; 3) 课程信息浏览功能模块; 4) 查询模块; 5) 按学分查询模块; 6) 某些课程学生选修情况模块。

1

工资信息管理系统

系 统 以 菜 单 方

课 信 与 生 课

程 息 学 选 信

课 程 信 息 浏 览 功 能 模块

查 询 模 块

按 学 分 查 询 模 块

某 课 学 选 情

些 程 生 修 况

式 工 作 模 块

息 录

模块

入 功 能 模 块

4 详细设计:
#include <std io.h> #include < std lib .h> #include <string. h> typedef struct sub jec ts { in t nu m; char na me [20]; char kind [10 ]; in t stime ; in t ttime; in t etime ; in t score ; in t term; struct subje cts *nex t; }SUB; SUB *cre ate_ form() { SUB *head , *tail, *p ; in t nu m,s time, ttime; in t etime, score,term; char na me [20],kind[1 0]; in t size=size of(SUB); head=ta il=NU LL;

主流程图:
开始

显示一系列功能选择

判断

N

结束

2

prin tf("输 入 选 修 课 程 信 息 :\n "); scanf("%d %s %s %d %d %d %d %d ",&nu m, &name, &k ind,&stime, &ttime, &eti me,&score ,&term); wh ile(nu m!=0){ p=(SUB *)malloc (size); p ->nu m=n u m; strcp y(p -> na me, na me); strcp y(p -> kind ,kind ); p ->stime=stime ; p -> ttime=ttime; p ->etime=e time; p ->score=score ; p -> term= te rm; if(head==NULL) head=p ; else tail ->nex t=p ; tail=p; scanf("%d %s %s %d %d %d %d %d ",&nu m, &name, &k ind,&s time, &ttime, &eti me,&score ,&term); } tail->nex t=NULL; return head ; } vo id savefile(SUB *hea d) { SUB *p ; FILE *fp ; fp=fope n("subje cts. tx t", "w");

开始

输出

写入文件并储存

输入

结束

3

fprintf(fp, " 课 程 编 号 课程名称 上机学时 学分 开 课 学 期 \n "); for(p=head ;p ;p=p ->ne xt)

课程性质

总学时

授课学时

实验或

fprintf(fp, "%5d%12s%9s%9d%9d %11d%11d%7d \n ",p -> nu m,p -> name, p ->kind,p -> stime ,p -> ttime ,p ->e time,p ->score,p ->term); fclose(fp ); } vo id savefileadd (SUB *he ad) { SUB *p ; FILE *fp ; fp=fope n("subje ctsad d.tx t", "w"); fprin tf(fp ," 课 程 编 号 课程名称 上机学时 学分 开 课 学 期 \n "); for(p=head ;p ;p=p ->ne xt)

课程性质

总学时

授课学时

实验或

fprintf(fp, "%5d%12s%9s%9d%9d %11d%11d%7d \n ",p -> nu m,p -> name, p ->kind,p -> stime ,p -> ttime ,p ->e time,p ->score,p ->term); fclose(fp ); } vo id savefilede l(SUB *head) { SUB *p ; FILE *fp ; fp=fope n("subje ctsde l.tx t", "w"); fprin tf(fp ," 课 程 编 号 课程名称 上机学时 学分 开 课 学 期 \n "); for(p=head ;p ;p=p ->ne xt)

课程性质

总学时

授课学时

实验或

fprintf(fp, "%5d%12s%9s%9d%9d %11d%11d%7d \n ",p -> nu m,p -> name, p ->kind,p -> stime ,p -> ttime ,p ->e time,p ->score,p ->term); fclose(fp ); }

4

vo id p rin (SUB *head) { SUB *p tr; if(head==NULL){ prin tf("没 有 此 门 课 程 记 录 !\n "); retu rn; } printf(" 课 程 编 号 课程名称 课程性质 机学时 学分 开 课 学 期 \n "); for(p tr=head ;p tr;p tr=p tr ->nex t)

总学时

授课学时

实践或上

prin tf("%5d %12s% 9 s%9d%9d%11d%11d%7d \n",p tr->nu m,ptr->n ame, ptr->kin d, ptr->stime,p tr->ttime, p tr->etime,p tr-> sco re,p tr-> term); } vo id search(SUB *head ) { in t a,n u m; in t t=1; char typ e[10 ]; char ch= 'a ',ch1 ; SUB *p tr; 开始

打开文件查看学生选课信息

1

判断查询方法

2

按 课 程 性 质 查 输入

按学分查

结束

while(ch!= ' '){ prin tf( "若 要 按 课 程 性 质 查 找 请 输 入 1 , 若 要 按 学 分 查 找 请 输 入 2 :\n "); scanf("%d ", &a); switch (a){ case 1 :prin tf("请 输 入 要 查 找 的 课 程 的 性 质 :\n "); scan f("%s", type); p rintf(" 课 程 编 号 课程名称 课程性质 总学时 授课学时 实践或 上机学时 学分 开 课 学 期 \n "); for(p tr=head ;p tr;ptr=ptr ->nex t) if(strc mp (type,p tr->k ind )==0){

5

prin tf("%5d %12s%9 s%9d%9d%11d%11d%7d \n",p tr->nu m,ptr->n ame, ptr->kin d, ptr->stime,p tr->ttime, p tr->etime,p tr-> sco re,p tr-> term); t=0 ; } if(t) prin tf("未 找 到 !\n "); t=1 ; b reak ; case 2 :prin tf("输 入 要 查 找 的 课 程 的 学 分 \n "); scan f("%d ",&nu m); p rintf(" 课 程 编 号 课程名称 课程性质 总学时 授课学时 实践或 上机学时 学分 开 课 学 期 \n "); for(p tr=head ;p tr;ptr=ptr ->nex t) if(p tr->sc ore==nu m){ prin tf("%5d %12s%9 s%9d%9d%11d%11d%7d \n",p tr->nu m,ptr->n ame, ptr->kin d, ptr->stime,p tr->ttime, p tr->etime,p tr-> sco re,p tr-> term); t=0 ; } if(t) prin tf("未 找 到 !\n "); t=1 ; } prin tf("继 续 查 找 请 按 回 车 键 , 结 束 请 按 空 格 键 :\n "); ch1=getchar(); // 将 回 车 键 赋 给 CH1, 否 则 CASE 里 面 最 后 输 入 的 回 车 键 会 赋 给 CH, 因 此 用 CH1 填 补 。 ch=getc har(); } } SUB *in sert(SUB *hea d) { SUB *p tr, *p tr2, *su b j; in t size=size of(SUB); char ch= 'a ',ch1 ; wh ile(ch != ' '){ sub j=(SUB *)malloc (size); ptr=sub j; printf(" 输 入 要 插 入 的 课 程 信 息 :\n "); scanf("%d%s%s%d%d %d%d%d ", &sub j ->nu m,subj ->name,sub j ->k ind ,&sub j ->st ime, &sub j -> ttime,&sub j ->e time,&sub j ->sco re, &sub j ->term);

6

if(head==NULL){ head=p tr; head -> next=NULL; } e lse { for(ptr2= head;p tr2 ;p tr2=p tr2 ->n ext) if(p tr2 ->next==NULL){ ptr2 ->next=sub j; sub j ->next=NULL; break ; } } prin tf("继 续 插 入 请 按 回 车 , 结 束 请 按 空 格 :\n "); ch1=ge tcha r(); // 将 回 车 键 赋 给 CH1, 否 则 subj-> te rm 输 完 后 输 入 的 回 车 键 会 赋 给 CH, 因 此 用 CH1 填 补 。 ch=ge tchar(); } return head ; } SUB *del(SUB *head) { SUB *p1, *p 2; char ch= 'a ',ch1 ; in t nu m; wh ile(ch != ' '){ prin tf( "输 入 想 要 删 除 的 课 程 编 号 :\n "); scanf("%d ",&nu m); if(head ->n u m==nu m){ p2=head ; head=head -> ne xt; free(p2 ); } if(head==NULL) re turn NU LL; p1=head ; p2=head ->nex t;

7

while(p2){ if(p2 ->nu m==nu m){ p1 ->n ext=p2 ->next; free (p2); } e lse p1=p2; p2=p1 ->n ext; } prin tf("继 续 删 除 请 按 回 车 , 结 束 请 按 空 格 :\n "); ch1=ge tcha r(); // 将 回 车 键 赋 给 CH1 , 否 则 nu m 输 完 后 再 输 入 的 回 车 键 会 赋 给 CH, 因 此 用 CH1 填 补 。 ch=ge tcha r(); 开始 } return head ; } 输入、选课 vo id cho ose (SUB *he a d)
判断是否是要选的课程

N

选定、输出

{ SUB *p, *q ; 结束 in t a[5]; in t nu m,tota l=0, i=0,j; printf("输 入 要 选 修 的 课 程 的 编 号 , 编 号 之 间 以 空 格 分 开 , 输 完 后 以 0 结 束 \n "); scanf("%d ", &nu m); wh ile(nu m!=0){ fo r(p=he ad;p ;p=p ->n ext) if(p ->nu m==nu m){ to ta l=to ta l+p ->sc ore; a[i]=nu m; i++; } scan f("%d ",&nu m); } if(total<60 ) prin tf(" 选 修 总 学 分 未 达 到 60, 选 修 失 败 !\n ");

8

else { prin tf("选 修 成 功 !\n "); prin tf("您 选 修 的 课 程 为 :\n "); for(j=0;j<i;j++) fo r(q=head ;q ;q=q ->ne xt) if(q ->nu m==a[j])

printf("%s ",q ->n a me); printf("\n "); prin tf("************* ********** ******* ** ***\n "); prin tf("************* ***************** ** *** \n "); prin tf("************* ***************** ** *** \n "); prin tf("************* ***************** ** *** \n "); } } vo id main () { SUB *head=c rea te_ fo rm(); savefile (head ); prin(he ad); search(h ead); head=in ser t(head ); //注 意 此 处 的 必 要 性 函 数 insert 的 的 返 回 值 重 新 赋 给 head! savefilead d(hea d); printf("修 改 后 的 信 息 为 :\n "); prin(he ad); head=de l(h ea d); //注 意 此 处 的 必 要 性 , 数 del 的 的 返 回 值 重 新 赋 给 head! savefilede l(head ); printf("修 改 后 的 课 程 信 息 为 :\n "); prin(he ad); choose (head ); }

9

运行结果:
输入选修课程信息: 1 maths bx 15 14 0 25 1 2 Entg bx 15 14 0 25 1 3 hh xx 10 8 2 15 1 4 bb xx 25 14 0 35 1 0 gg xx 12 10 0 10 1 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 1 maths bx 15 14 0 2 Entg bx 15 14 0 3 hh xx 10 8 2 4 bb xx 25 14 0 若要按课程性质查找请输入 1,若要按学分查找请输入 2: 1 请输入要查找的课程的性质: bx 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 1 maths bx 15 14 0 2 Entg bx 15 14 0 继续查找请按回车键,结束请按空格键:

学分 开课学期 25 1 25 1 15 1 35 1

学分 开课学期 25 1 25 1

若要按课程性质查找请输入 1,若要按学分查找请输入 2: 2 输入要查找的课程的学分 15 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期 3 hh xx 10 8 2 15 1 继续查找请按回车键,结束请按空格键:

课程设计体会:
通过学习和练习 C 程序的设计基础,学习到了很多关于 C 的知识。在这次学习过程中, 毫无疑问的遇到了很多困惑、疑问,难免心情沮丧,失去耐心,信心受挫,但同学的帮助, 老师的解惑和自己的坚持。终于做了出来。看着这一页页的程序,我感受到了成功的喜悦。 用一句话来形容一下这几天就是:苦并快乐着。

10





首先得感谢邵阳学院为我们提供的这一次有实际意义的机会。过这次的学 习使我们又学到了很多书本上没有的东西,加强了我们自己动手的能。同样要感 谢的还有负责这次课程设计的指导老师们,没有他们的认真负责的指导,我们的 任务可能会举步维艰,正是有了老师的及时指导我们才能顺利的完成这次的任 务。 一样要感谢的是这次我的合作伙伴们,没有他们的坚持与负责我们同样难以 完成一次的课题设计。所以我得再一次真挚的感谢他们,应为有了上面学校,老 师,同学的帮助我才能完成这次课程设。在此感谢所有帮助过我们的人。

11


相关文档

学生选修课程系统设计1
学生选修课程系统设计说明书
学生选修课程系统设计报告
最新学生选修课程系统设计
学生选修课程系统设计题目
c语言课程设计 学生选修课程系统设计
学生选修课程系统设计—C语言课程设计
学生选修课程C语言系统设计课程设计报告
c语言学生选修课程系统设计
学生选修课程C语言系统设计课程设计报告2
电脑版