摘要C语言是在国内外广泛使用的一种计算机语言。
C语言简洁紧凑、灵活方便、运算符丰富、适用范围大、可移植性好。
它既具有高级语言的特点,又具有汇编语言的特点。
它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
本学生选课系统主要利用C语言的数组指针和文件操作能力设计开发一个小型的选课系统,至少具有如下功能:查看课程信息、查找课程信息、增加课程信息、修改课程信息、选课等功能。
本文主要对学生选课系统来进行说明。
本程序主要考察对自定义函数的熟悉程度,本程序中主要使用到的是数组的相关操作,包括数组的输入、输出、查找、插入、删除等操作,需要对数组有比较深入的掌握。
还包括指针、函数、结构体、文件等C语言的基础知识的运用。
关键字:源代码、指针、调用函数、流程图、结构、数组。
目录第一章设计题目的内容、任务及具体要求 (1)第二章总体设计思路 (2)2.1程序功能 (2)2.2模块关系 (2)2.3总体框图 (3)第三章功能模块的具体设计 (4)3.1主函数模块的设计 (4)3.2显示课程信息模块的设计 (7)3.3查询模块模块的设计 (8)3.4增加模块的设计 (9)3.5删除模块模块的设计 (13)3.6修改模块模块的设计 (14)3.7选课模块的设计 (15)3.8显示选课情况模块的设计 (17)第四章功能模块的调试及测试 (18)4.1登陆界面和主菜单界面的显示 (18)4.2查询所有课程信息的显示结果 (19)4.3查询单个课程信息的显示结果 (19)4.4添加课程信息的显示结果 (20)4.5删除和修改课程信息的显示结果 (20)4.6选课的显示结果 (21)4.7 查询选课情况的显示结果 (22)4.8退出 (22)总结 (23)致谢 (24)参考资料: (25)附程序清单 (26)第一章设计题目的内容、任务及具体要求设计题目:学生选课系统设计内容:本程序属于非数值计算型算法设计,学生需要设计出学生选课系统所需要的基本功能,并设计简单的界面(无需图形化)。
本程序主要考察对自定义函数的熟悉程度,本程序中主要使用到的是数组的相关操作,包括数组的输入、输出、查找、插入、删除等操作,需要对数组有比较深入的掌握。
要求程序运行结果正确,程序和算法具有一定程序度的健壮性,稳定性。
设计要求:(1)通过提示菜单选择可以进行的操作。
(2)将课程的信息存入文件中,并命名为LessonInfo.txt。
(3)将选课情况信息存入文件中,并命名为SelectInfo.txt。
(4)在本系统中可以进行管理系统包含的基本操作,其中包括1)查看所有课程的信息2)输入一门课程的课程编号,从当前课程中进行查找,如果找到则显示该课程的相关信息,如果没有找到则给出提示信息3)添加一门课程的基本信息,通过输入课程编号,首先查找是否存在该课程编号的课程,如果存在则提示重新输入,否则将该课程按照顺序插入到相应位置4)删除一门课程的基本信息,通过输入课程编号,首先查找是否存在该课程编号的课程,如果存在则将该课程删除,否则给出提示信息,提示该课程不存在5)选修一门课程,需要给出学号和课程编号,如果课程编号不存在则重新输入,直到输入正确为止,并将学号和相应的课程编号存入SelectInfo.txt文件中(5)课程基本信息包括课程编号、课程名、学时和学分这些简单信息。
(6)课程信息文件中每一行存放一门课程的信息。
第二章总体设计思路2.1 程序功能此系统是简单的学生选课系统。
具体的功能包括:1)输入密码进入系统。
2)查看所有课程的信息3)输入一门课程的课程编号,从当前课程中进行查找,如果找到则显示该课程的相关信息,如果没有找到则给出提示信息4)添加一门课程的基本信息,通过输入课程编号,首先查找是否存在该课程编号的课程,如果存在则提示重新输入,否则将该课程按照顺序插入到相应位置5)删除一门课程的基本信息,通过输入课程编号,首先查找是否存在该课程编号的课程,如果存在则将该课程删除,否则给出提示信息,提示该课程不存在6)对课程信息进行修改。
7)选修一门课程,需要给出学号和课程编号,如果课程编号不存在则重新输入,直到输入正确为止,并将学号和相应的课程编号存入SelectInfo.txt文件中8)查看所选课程。
2.2 模块关系根据提示输入学号和密码进入系统。
通过主函数模块进入各个其它函数的模块,然后达到对课程信息的查看、增加、删除、修改和选课的功能,在这些模块中又调用其它小模块(如:排序模块)。
本程序主要有:主函数模块、显示课程信息模块、查询模块、增加模块、删除模块、修改模块、选课模块、显示选课情况模块等八个模块组成。
2.3总体框图先输入验证信息进入主模块,然后选择调用的模块第三章功能模块的具体设计3.1 主函数模块的设计在主函数中通过inset()函数让用户输入验证信息进入,简单菜单的制作可以利用printmenu()函数实现。
从文件中获取课程信息,并存放在定义的结构数组desk[100]中。
定义结果的源代码为struct classin{int number;char classname[10];int hours;double credit;};typedef struct classin Classin;Classin desk[100] = {0}然后将文件中的信息读入此数组中,读取函数的代码为:cfptr = fopen("LessonInfo.txt","r");while(!feof(cfptr)){fscanf(cfptr, "%d%s%d%lf", &desk[i].number, desk[i].classname, &desk[i].hours, &desk[i].credit);i++;}在后面的使用中都是调用此地址便可以对数组进行修改。
输入选择项choice,再用switch语句去调用其它函数,具体实现如下(主函数的主要代码):while(choice != 8){switch(choice){case 1:myread(desk);break;case 2:myfind(desk);break;case 3:myadd(desk);shunxu(desk);filewhite(desk);break;case 4:mydelete(desk);filewhite(desk);break;case 5:mymodify(desk);shunxu(desk);filewhite(desk);break;case 6:selection(desk, studentin);filewrite(studentin);break;case 7:output(studentin);break;default:break;}接着判断用户是否继续输入,若继续,则重新进行选择;否则,退出程序。
图3-1 inset()函数模块的流程图上图是简单的将输入学号和密码的过程提示是一遍,但实际函数中我使用的三从循环。
第一重循环是输入学号;第二重循环是判断该学会是否存在,若学号不存在便提示是再输,还是退出系统;在学号存在时进入第三重循环,输入密码(注:学号和密码是在运行此函数时从文件中读到数组里)并在数组中查找,若有和该密码相等的数组元素,就将进入系统,否则提示继续或退出.图3-2 main()函数模块的流程图在次函数中用户通过输入选项进入不同的函数模块。
当每次运行一个模块后,又进行选择。
3.2 显示课程信息模块的设计本模块的设计主要是设计被调用函数myread(Classin *wkesk),是用指针指向储存课程信息的数组,调用数组的地址。
再用循环把数组中的信息输出。
主要代码为:for(i=0; i<=N-1; i++){if(wdesk[i].hours == 0)break;printf("%-10d%-20s%-10d%-10lf\n",wdesk[i].number,wdesk[i].classname,wdesk[i].hours,wdesk[i].credit);}在此片段函数中wdesk[i].hours == 0是作为循环的结束条件之一,能提前结束该程序。
图3-3 myprintf()函数模块的流程图在上图中“课时!=0“就是上面解释的wdesk[i].hours == 0的另一形式。
3.3 查询模块模块的设计本模块是要求设计查找功能的函数myfind(Classin *wkesk),同上步将数组地址调用。
然后输入要查找的课程编号,再进行在数组中的查找。
找到就输出,否则提示重新输入或退出。
主要原代码为:printf("Please enter the class number: ");scanf("%d",&Number);printf("\n\n");for(i=0;i<=N-1;i++){if(Number == wdesk[i].number){if(wdesk[i].credit == 0.0){printf("\n\n\n\n");break;}printf("%-10s%-20s%-10s%-10s%\n","number", "classname", "hours", "credit");printf("%-10d%-20s%-10d%-10lf\n\n\n\n",wdesk[i].number,wdesk[i].classname,wdesk[i].hours,wdesk[i].credit);flag = 0;break;}}在此程序中flag是作为标准值,初始为-1,当flag改变时说明已经找到该课程,否则为找到。
在对flag赋值为-1;再做判断,看是继续查找,还是退出此函数模块。
图3-4 myfind()函数模块的流程图3.4 增加模块的设计本模块要设计被调用增加数组的函数myadd(Classin *wkesk)、排序函数shunxu (Classin *wkesk)和写入文件函数filewhite(Classin *wkesk)。
这几个函数是按先后运行的。
3.41myadd(Classin *wkesk)的介绍它主要源代码为:if(wdesk[i].hours == 0){ wdesk[i].number = nub;printf("\nPlease enter the class name: ");fflush(stdin);scanf("%s",&wdesk[i].classname);printf("Please enter the hours: ");scanf("%d",&wdesk[i].hours);printf("Please enter the credit: ");scanf("%lf",&wdesk[i].credit);}在运行此代码前,输入要增加的课程编号,然后在数组中查找,若没有,就再添加。