1、C 语言课程设计报告学生选修课系统设计一、设计目的当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息系统的环境。计算机的最到好处的于利用它能够进行信息管理,使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好学生选课信息而设计的。数据处理手工操作,工作量大,出错率高,出错后不易更改,造成了时间上的浪费。基于这个问题,我认为有必要建立一个学生选课系统,使学生选课信息管理工作规范化、系统化、程序化
2、,避免学生选课管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改选课情况。二、题目说明假定有 n 门课程,每门课程都有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于 60)自由选课。试设计一选修课程系统,使之能提供一下功能:(1) 系统以菜单方式工作;(2) 课程信息和学生信息的录入功能(课程信息有文件保 存)-输入;(3) 课程信息浏览功能-输出;(4) 查询功能(至少一种查询方式)-算法;(5) 按学分查询;(6) 某门课程学生选修情况(可选项)。提示数据结构可用结构体,包括课程和选秀两个结构体,
3、其中课程结构体包括课程编号、课程名称、课程性质、总学时、授课学时、实验或上机学时、学分、开课学期。选修结构体成员包括学号,课程编号,该结构体的建立主要是为了查询某门课程学生选修情况.。三、数据结构设计C 语言课程设计报告1本系统的实现,全部采用链表这种数据结构,用链表实现课程的查找、添加、删除、课程的选修、追加选修的课程,课程信息采用结构体这种数据结构。typedef struct subjectsint num; /课程编号char name20; /课程名称char kind10; /课程性质int stime; /总学时int ttime; /授课学时int etime; /实验或上机学
4、时int score; /学分int term; /开课学期struct subjects *next;SUB;SUB *head=NULL;四、程序分析现代的社会是信息化的社会,信息无所不在。在生产领域、流通领域、各个部门每天都和信息打交道,如何处理如此多的信息成为了一个重要的课题。学生在学期开始选课是教学活动中的一个重要环节,该环节如果能管理好,它不仅能加快学生的选课速度,也提高了整个活动的效率。大学一般都有上千名学生,每学期开始学生都要选课,因而产生了大量的课程信息。考虑到用户使用的方便和处理的信息量系统要完成录入,保存,查询,修改和删除课程信息的各种过程,能打印出课程信息表。对象:系统
5、的主要使用对象是需要选课的学生。学生在选课是要察看各个课程的详细信息,还要选择一些感兴趣的课程,需要生成课表,在发现课程有冲突后能够修改先前选择的信息。需要随学生选课的变化,计算相应的总学分。在全部选定后,打印报表。系统还需要管理员来查看和修改学生的总体选课情况课程信息和学生信息。五、程序设计大纲2主 模 块管理员模块 学生模块浏览课程查询课程添加课程删除课程浏览所有课程查询课程信息选择选修课程浏览我选修的课程删除错选的课程C 语言课程设计报告3六、模块设计(一) 主函数,头文件及结构体声明主函数设计地比较简洁,只是提供一个主菜单,switch 语句将整个程序分为两个大的功能模块:进入选课系统
6、选择序号进行选课进入下一层程序#include “stdio.h“#include “string.h“#include “stdlib.h“#include“malloc.h“void prin1();void choose();typedef struct subjects /课程结构体int num; /课程编号char name20; /课程名称char kind10; /课程性质int stime; /总学时int ttime; /授课学时int etime; /实验或上机学时int score; /学分int term; /开课学期struct subjects *next;SUB
7、;SUB *head=NULL;int main()int n,w=1;dosystem(“cls“); puts(“nntt*MENU*nn“);4puts(“tttt1.以管理员身份登录n“);puts(“tttt2.以学生身份登录n“);puts(“tttt3.退出“);puts(“nntt*n“);printf(“Chiose your number(1-3): bb“);scanf(“%d“,switch(n)case 1:Mangers() ;break;case 2:Students();break;case 3:w=0;break;default:;while(w=1);ret
8、urn 0;(二) 管理员功能模块管理员的功能一共有四个功能:浏览,查询,添加,删除课程,运用字符串处理函数处理密码的问题,用一个 switch 语句实现函数的调用:管理员登录菜单输入密码进 行 码 匹 对 验 证进入管理员界面i=3i0按任意键退出是 否否是C 语言课程设计报告5程序void Mangers()int n,w=1,flag=0,i=3;char s8;char password7=“1“;doprintf(“nnEnter password:“);scanf(“%s“,s);if(!strcmp(s,password) /进行密码匹配验证flag=1;break;elsepr
9、intf(“nnError! You only have %d times! Enter again:n“,i-1);i-; while(i0);if(!flag)printf(“you have Enter 3 times!“); /输入密码超过了 3 次!exit(0); /自动退出dosystem(“cls“);puts(“nntt*管理员菜单*nn“);puts(“tttt1-浏览课程 n“);puts(“tttt2-查询课程 n“);puts(“tttt3-添加课程 n“);puts(“tttt4-删除课程 n“);puts(“tttt5-返回主菜单 “);puts(“nntt*n“
10、);printf(“Chiose your number(1-5): bb“);scanf(“%d“,switch(n)6case 1:prin();break;case 2:search();break;case 3:insert();savefile();break;case 4:del();savefile();break;case 5:return;default:; while(w=1);void Students()int n,w=1;dosystem(“cls“);puts(“nntt*学生菜单*nn“);puts(“tttt1-浏览所有课程 n“);puts(“tttt2-查询
11、课程信息 n“);puts(“tttt3-选择选修课程 n“);puts(“tttt4-浏览我选修的课程 n“);puts(“tttt5-删除错选课程 n“);puts(“tttt6-返回主菜单 “);puts(“nntt*n“);printf(“Chiose your number(1-6): bb“);scanf(“%d“,switch(n)case 1:prin();break;case 2:search();break;case 3:choose();break;case 4:prin1();break;case 5:del();savefile1();break;case 6:ret
12、urn;default:; while(w=1);C 语言课程设计报告7(三) 学生功能菜单学生功能菜单包括六个功能:浏览课程,查询课程,选修课程,浏览我所选修的课程,添加选修课程,删除错选的课程,也是用到 switch 语句来调用函数:程序void Students() /学生登录菜单int n,w=1;dosystem(“cls“);puts(“nntt*学生菜单*nn“);puts(“tttt1-浏览所有课程 n“);puts(“tttt2-查询课程信息 n“);puts(“tttt3-选择选修课程 n“);puts(“tttt4-浏览我选修的课程 n“);puts(“tttt5-删除错
13、选课程 n“);puts(“tttt6-返回主菜单 “);puts(“nntt*n“);printf(“Chiose your number(1-6): bb“);学生登录菜单按 1-6 数字键进入各选项1、浏览所有课程2、查询课程信息3、选择选修课程4、浏览我选修的课程5、删除错选课程6、返回主菜单进入所选目标8scanf(“%d“,switch(n)case 1:prin();break;case 2:search();break;case 3:choose();break;case 4:prin1();break;case 5:del();savefile1();break;case 6
14、:return;default:; while(w=1);(四) 创建链表模块C 语言课程设计报告9创建链表输入选修课程信息(num,name,kind,stime,ttime,etime,score,term)Num!=0p=(SUB *)malloc(size);p-num=num;strcpy(p-name,name);strcpy(p-kind,kind);p-stime=stime;p-ttime=ttime;p-etime=etime;p-score=score;p-term=term;Head=NULLHead=pTail-next=p;Tail=p;Tail-next=NULL
15、;Return head;创建完成Scanf(num,name,kind,是是否否10程序SUB *create_form() /创建链表 SUB *head,*tail,*p;int num,stime,ttime;int etime,score,term;char name20,kind10;int size=sizeof(SUB);head=tail=NULL;printf(“输入选修课程信息:n“);scanf(“%d%s%s%d%d%d%d%d“,while(num!=0)p=(SUB *)malloc(size);p-num=num;strcpy(p-name,name);strc
16、py(p-kind,kind);p-stime=stime;p-ttime=ttime;p-etime=etime;p-score=score;p-term=term;if(head=NULL)head=p;elsetail-next=p;tail=p;scanf(“%d%s%s%d%d%d%d%d“,tail-next=NULL;return head;C 语言课程设计报告11浏览所有课程SUB *ptr;head=NULL;readfile();Head=NULLPrintf(NO RECORDS);Return;输出课程信息是 否(五) 浏览模块浏览模块主要用管理员中的“浏览课程” 和学
17、生功能中的 “浏览所有所有课程”,将所有的课程信息输出,即将 all_sub.txt 文件里面的内容全部输出:12程序void prin() /浏览所有课程SUB *ptr;head=NULL;readfile();if(head=NULL)printf(“nnt*NO RECORDS!*n“);return;printf(“课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n“);for(ptr=head;ptr;ptr=ptr-next)printf(“%5d%12s%9s%9d%9d%11d%11d%7dn“,ptr-num,ptr-name,ptr-kind
18、,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term);system(“pause“);void prin1() /浏览所有已选修课程SUB *ptr;FILE *fp;if(fp=fopen(“3.txt“,“r“)=NULL)printf(“Cannot open file.n“);choose();printf(“课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n“);while(!feof(fp)ptr=(SUB*)malloc(sizeof(SUB);fscanf(fp,“%d%s%s%d%d%d%d%dn“
19、,printf(“%5d%12s%9s%9d%9d%11d%11d%7dn“,ptr-num,ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term);system(“pause“);C 语言课程设计报告13(六) 查询模块查询模块主要用于管理员功能中的“查询课程” 和学生功能模块中的 “查询所有课程”,查询模块共分为三个查询方法:按课程名称查找,按课程性质查找和按学分查找 switch 语句中,每一个 case 语句就是一中查询方法:课程信息查询按 1-4 数字键进入各选项1、按课程名称查找2、按课程性质查找3、按
20、学分查找4、退出查找进入所选目标程序void search() /课程信息查询int a,num;int t=1;char type10,min10;SUB *ptr;L1:system(“cls“);printf(“nntt*请选择查询方式*n“);printf(“nttt1-按课程名称查找n“);printf(“nttt2-按课程性质查找n“);printf(“nttt3-按学分查找n“);printf(“nttt4-退出查找n“);printf(“nntt*n“);printf(“nnChiose your number(1-4): bb“);scanf(“%d“,switch(a)14
21、case 1:printf(“请输入要查找的课程的名称:“);scanf(“%s“,min);printf(“课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n“);for(ptr=head;ptr;ptr=ptr-next)if(strcmp(min,ptr-name)=0)printf(“%5d%12s%9s%9d%9d%11d%11d%7dn“,ptr-num,ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term);t=0;if(t) printf(“tn 未找到!n“);t=1
22、;system(“pause“);goto L1;case 2:printf(“请输入要查找的课程的性质:“);scanf(“%s“,type);printf(“课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n“);for(ptr=head;ptr;ptr=ptr-next)if(strcmp(type,ptr-kind)=0)printf(“%5d%12s%9s%9d%9d%11d%11d%7dn“,ptr-num,ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term);t=0;i
23、f(t) printf(“tn 未找到!n“);t=1;system(“pause“);goto L1;case 3:printf(“输入要查找的课程的学分:“);scanf(“%d“,printf(“课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n“);for(ptr=head;ptr;ptr=ptr-next)if(ptr-score=num)printf(“%5d%12s%9s%9d%9d%11d%11d%7dn“,ptr-num,ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-t
24、erm);C 语言课程设计报告15t=0;if(t) printf(“nt 未找到!n“);t=1;system(“pause“);goto L1;case 4:break;t=0;if(t) printf(“nt 未找到!n“);t=1;system(“pause“);goto L1;case 4:break; /退出查找(七) 插入链表模块插入链表操作主要用于添加课程,在整个课程信息中加入一些新课程,它在添加模块中被调用:16插入链表模块SUB *p1,*p2;p1=subj;head=NULLhead=p1;head-next=NULL; p2=head;p2;p2=p2-nextp2-
25、next=NULLp2-next=subj;subj-next=NULL;break;eturn head;是否否否是是程序void *myInsert(SUB *subj) /链表插入操作 SUB *ptr,*ptr2;ptr=subj;if(head=NULL)head=ptr;head-next=NULL;elsefor(ptr2=head;ptr2;ptr2=ptr2-next)C 语言课程设计报告17if(ptr2-next=NULL)ptr2-next=subj;subj-next=NULL;break;return head;(八) 添加模块添加模块主要用于增加课程信息,采用链表
26、的操作:插入课程信息SUB *ptr,*subj;int size=sizeof(SUB);char ch,ch1;ch!=0输入(课程信息、课程编号、课程名称、课程性质、总学分、授课学分、实践或上机学时)ch1=getchar();ch=getchar();Return head;myInsert(subj);printf(“nn 继续插入请按回车 C语言课程设计报告n“);printf(“n 结束添加课程按 0 “)是 否18程序void *insert() /插入课程信息 SUB *ptr,*subj;int size=sizeof(SUB);char ch,ch1;while(ch!=
27、0)subj=(SUB *)malloc(size);ptr=subj;printf(“输入要插入的课程信息:n“);printf(“ntt 请 输 入 课 程 编 号 :“);scanf(“%d“, printf(“ntt 请 输 入 课 程 名 称 :“);scanf(“%s“, printf(“ntt 请 输 入 课 程 性 质 :“);scanf(“%s“, printf(“ntt 请输入总学时:“);scanf(“%d“,printf(“ntt 请输入授课学时:“);scanf(“%d“,printf(“ntt 请输入实践或上机学时:“);scanf(“%d“,printf(“ntt
28、 请输入学分:“);scanf(“%d“,printf(“ntt 请输入开课学期:“);scanf(“%d“,myInsert(subj);printf(“nn 继续插入请按回车 n“);printf(“n 结束添加课程按 0: bb“);ch1=getchar(); /*将回车键赋给 CH1,否则 subj-term 输完后输入的回车键会赋给 CH,因此用 CH1 填补。*/ch=getchar();return head;(九) 删除模块删除模块主要用于管理员删除课程信息学生删除自己的选课,全部采用删除链表中的某一个节点的操作:C 语言课程设计报告19删除选修课程SUB *p1,*p2;c
29、har ch,ch1;int numprintf(输入想要删除的课程编号);scanf(“%d“,进行编号查找并删除printf(“n 继续删除请按回车n“);printf(“n 结束删除课程按 0: “);20程序void *del() /删除课程-SUB *p1,*p2;char ch,ch1;int num;while(ch!=0)printf(“输入想要删除的课程编号: bbbbb“);scanf(“%d“,if(head-num=num)p2=head;head=head-next;free(p2);if(head=NULL)return NULL;p1=head;p2=head-n
30、ext;while(p2)if(p2-num=num)p1-next=p2-next;free(p2);else p1=p2;p2=p1-next;printf(“n 继续删除请按回车n“);printf(“n 结束删除课程按 0: bb“);ch1=getchar(); /将回车键赋给 CH1,否则 num 输完后再输入的回车键会赋给 CH,因此用 CH1 填补。ch=getchar();return head;system(“pause“);C 语言课程设计报告21(十) 选修课程模块选修课程模块采用插入链表的操作:选新课程printf(“输入要选修的课程的编号n“);printf(“如果
31、确认输入完要选修的课程的编号,请输入 0“);程序对输入的信息进行查找判断printf(“选修成功! n“)printf(“n 以上信息全部保存在my_sub.txt中n“)程序void choose() /选新课程SUB *p,*q;int a5;22int num,total=0,i=0,j;printf(“输入要选修的课程的编号,编号之间以空格分开n“);scanf(“%d“,printf(“如果确认输入完要选修的课程的编号,请输入 0: bb“);while(num!=0)for(p=head;p;p=p-next)if(p-num=num)total=total+p-score;ai
32、=num;i+;scanf(“%d“,if(totalnext)if(q-num=aj)fprintf(fp,“%5d%12s%9s%9d%9d%11d%11d%7dn“,q-num,q-name,q-kind,q-stime,q-ttime,q-etime,q-score,q-term);fclose(fp);printf(“ttn*选修成功!*n“);printf(“n 您选修的课程总学分为%d, 课程分别为:n“,total);printf(“n 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n“);for(j=0;jnext)if(q-num=aj)pr
33、intf(“%5d%12s%9s%9d%9d%11d%11d%7dn“,q-num,q-name,q-kind,q-stime,q-ttime,q-etime,q-score,q-term);printf(“n 以上信息全部保存在my_sub.txt 中n“);system(“pause“);C 语言课程设计报告23(十一) 读取文件模块读取文件模块是用来读出文件内容,并将内容输出到内存中,当输入文件名时,就能打开指定的文件,当输入 all_sub.txt 时,打开所有课程信息的文件,当输入 my_sub.txt 时,就是浏览学生选修的课程信息。读取文件printf(“请输入课程信息所在的文件
34、名称:“);!feof(fp)c=fgetc(fp)=n!feof(fp)newSub=(SUB*)malloc(sizeof(SUB);fscanf(fp,myInsert(newSub);fclose(fp);程序void readfile() /阅读文件 void *myInsert(SUB*);SUB *newSub; /新课程int num,stime,ttime,etime;24int score,term;char c,name20,kind10,fname20;FILE *fp;fp=fopen(“2.txt“,“r“);while(!feof(fp)newSub=(SUB*)
35、malloc(sizeof(SUB);fscanf(fp,“%d%s%s%d%d%d%d%dn“,myInsert(newSub);fclose(fp);(十二) 保存文件模块保存文件模块共分为两个子程序,分别是将修改的信息保存到 all_sub.txt和 my_sub.txt 文件中:程序void savefile() /保存文件 SUB *p;FILE *fp;fp=fopen(“2.txt“,“w“);if(fp=NULL)exit(0);printf(“课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n“);for(p=head;p;p=p-next)fp
36、rintf(fp,“%5d%12s%9s%9d%9d%11d%11d%7dn“,p-num,p-name,p-kind,p-stime,p-ttime,p-etime,p-score,p-term);fclose(fp);printf(“创建后的信息已放入2.txt文件中n“);system(“pause“);void savefile1() /保存文件 SUB *p;FILE *fp;fp=fopen(“3.txt“,“w“);if(fp=NULL)exit(0);for(p=head;p;p=p-next)fprintf(fp,“%5d%12s%9s%9d%9d%11d%11d%7dn“,
37、p-num,p-name,p-kind,p-stime,p-ttime,p-etime,p-score,p-term);fclose(fp);printf(“创建后的信息已放入3.txt文件中n“);system(“pause“); 保存文件系统进行检测所要保存的文件fprintf(fp,“课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n“);p=head;p;p=p-nextfprintf(fp,“%5d%12s%9s%9d%9d%11d%11d%7dn“,p-num,p-name,p-kind,p-stime,p-ttime,p-etime,p-score,p-term);fclose(fp);printf(“创建后的信息已放入all_sub.txt文件中n“);system(“pause“);C 语言课程设计报告25七、上机操作26开始运行管理员界面C 语言课程设计报告27课程输入模块管理员浏览模块28管理员课程查询模块管理员添加模块C 语言课程设计报告29管理员删除模块学生界面