课程设计(论文)学生选修系统论文.doc
.1 需求分析1.1课题要解决的问题系统以菜单方式工作,因而要提供键盘式选择菜单以实现功能选择;由于课程信息要用文件保存,因而要提供文件的输入输出操作;由于要浏览信息,所以要提供显示功能;要实现查询功能,故要提供查找操作。1.2要求,限制条件及预期的功能整个系统可以设计为信息输入模块、信息查询模块以及信息浏览模块。数据结构采用结构体,这里采用课程信息结构体和学生选课信息结构体。从键盘输入课程信息和学生信息,写入文件。分屏显示课程信息,每屏10条课程记录,按任意键继续。从文件中读数据,然后再显示。学生查询课程信息并选课,将选课信息存入文件。通过菜单选择查询字段,可以按照课程编号、课程名称、课程性质、开课学期、学分对课程信息文件进行查找,查找算法可以选择基本查找、二分查找等算法。可以通过菜单选择课程编号,在学生选课信息文件中查询该课程学生选修情况。2 总体设计思路2.1总体构思学生选修系统需要进入登陆页面,选修课程,管理选修课程(删除,添加,修改等)2.2使用知识及大概实现想法2.2.1使用知识标准化输入输出,输入输出的格式控制,数组的应用,函数的使用,判断、循环等语句使用,字符串比较,程序模块化,文件的基本操作(建立文件,写文件等),分屏显示,清屏。2.2.2大概是实现想法建立首页面显示,信息输入,显示选修信息,查询单课选修信息,添加选修课程信息,删除选修课程信息,修改选修课程信息,学生学修课程信息,显示学生选修信息九大模块。分每个模块实现其功能主模板显示选修信息查询单课选修信息添加选修课程信息删除选修课程信息修改选修课程信息学生学修课程信息显示学生选修信息退出信息输入 图2-1 总流程图3 详细设计3.1主函数模块 首先创建文件,输入课程信息,将课程信息读入文件,其次再用switch语句实现八个模块的调用,再从八个大模块中运用几个小模块事项操作目的。if(cfptr=fopen("LessonInfo.txt","r")=NULL)printf("the file cant't be openedn");printf("You should enter the class information!n");mywrite(desk);else i=0;while(!feof(cfptr)fscanf(cfptr,"%s%s%s%d%d%d%f%d",deski.courseCode,deski.courseName,deski.courseType,&deski.totalPeriod,&deski.classPeriod,&deski.experiPeriod,&deski.creditHour,&deski.term);i+;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.2信息输入模块3.2.1设计函数:int inset(),无参数,实现登录功能。登陆页面进入退出输入学号,密码错误 正确 图3-1 insect函数流程图3.2.2设计思路及代码首先建立第一个文件,之后创建登录页面。if(tp=fopen("password.txt","r")=NULL)printf("The password is miss!n");printf("Please register first");tp=fopen("password.txt","w");printf("Please enter your student number: ");scanf("%d",&ai);printf("Please enter the password: ");scanf("%d",&bi);printf("nnregister success!nn");fprintf(tp,"%dt%dn",ai,bi);fclose(tp);printf("enter any key to continue.n");fflush(stdin);scanf("%c",&x);system("cls");使用ifelse判断语句,判断是否存在学号,再用for循环逐个筛选,查看密码是否相符。3.3显示选修信息模板3.3.1设计函数:void myread(Classin *wdesk),参数Classin结构体指针,实现选修功能。开始j<100 否是Tperiod!=0 否j+=5i<j+10 是 i+ 否结束图3-2 myread函数流程图3.3.2设计思路及代码两个for循环的嵌套,第一个for循环实现所有科目输出,当总课时为0时,跳出循环;第二个for循环实现分屏显示课程信息,每屏10条课程记录,按任意键继续。从文件中读数据,然后再显示。 for(j=0;j<N;j+=10)printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-5sn","Code","Name","Type","Period","tPeriod","ePeriod","cHour","term");for(i=j;i<j+10;i+)if(wdeski.totalPeriod=0)break;printf("%-10s%-10s%-10s%-10d%-10d%-10d%-10.2lf%-5dn",wdeski.courseCo de,wdeski.courseName,wdeski.courseType,wdeski.totalPeriod,wdeski.classPeriod,wdeski.experiPeriod,wdeski.creditHour,wdeski.term);printf("please enter any key to nex");fflush(stdin);scanf("%c",&k);system("cls");if(wdeski.totalPeriod=0)break;3.4查询单科信息模块3.4.1设计函数:void myfind(Classin *wdesk),参数Classin结构体指针,实现查询功能开始j<100Tperiod!=0否 是课程号相同否 是输出课程,是否继续是 结束否 图3-3 myfind函数流程图3.4.2设计思路及代码:使用for循环逐个筛选,使用strcmp函数实现字符串比较 for(i=0;i<=N-1;i+)if(strcmp(Number,wdeski.courseCode)=0)if(wdeski.totalPeriod=0.0)printf("nnn");break;printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-5sn","Code","Name","Type","tPeriod","cPeriod","ePeriod","cHour","term");printf("%-10s%-10s%-10s%-10d%-10d%-10d%-10.2f%-5dn",wdeski.courseCode,wdeski.courseName,wdeski.courseType,wdeski.totalPeriod,wdeski.classPeriod,wdeski.experiPeriod,wdeski.creditHour,wdeski.term);flag=0;break;if(flag=-1)printf("The classe is not existn");3.5增加选修信息模块3.5.1设计函数:void myadd(Classin *wdesk),参数Classin结构体指针,实现添加功能。 void shunxu(Classin *wdesk),参数Classin结构体指针,实现排序功能。 void filewhite(Classin *wdesk),参数Classin结构体指针,实现数据写入文件功能。开始输入原来是否存在课程否 是添加课程 是否再输入是 退出图3-4 myadd函数流程图开始计算课程总数比较两科,前者小于后者否 是 是互换两科目比较完成否 是退出图3-5 shunxu函数流程图开始打开文件总课时为0是否i<100否 是将数组写入文件i+关闭文件结束图3-6 filewhite函数流程图3.5.2设计思想及代码使用for语句看是否有相同课程,利用ifelse若没有,再利用数组增加课程信息;若有则显示“此课程存在”信息。在使用for循环和strcmp函数根据课程编号对课程进行排序。之后利用文件将课程读入,在文件中使用“w”将之前所有的课程信息覆盖,避免重复。(增加课程信息中的)for(i=0;i<=N-1;i+) if(strcmp(nub,wdeski.courseCode)=0) printf("The courseCode is exist!n"); printf("Enter other key to continue(enter * to the menu).nn"); fflush(stdin); scanf("%c",&m); break; /*存在所输课程信息*/ if(wdeski.totalPeriod=0) strcpy(wdeski.courseCode,nub); printf("Please enter the courseName:"); scanf("%s",wdeski.courseName); printf("Please enter the courseType:"); scanf("%s",wdeski.courseType); printf("Plese enter the totalPeriod:"); scanf("%d",&wdeski.totalPeriod); printf("Plese enter the classPeriod:"); scanf("%d",&wdeski.classPeriod); printf("Plese enter the experiPeriod:"); scanf("%d",&wdeski.experiPeriod); printf("Plese enter the creditHour:"); scanf("%f",&wdeski.creditHour); printf("Plese enter the term:"); scanf("%d",&wdeski.term); printf("nAdd successful!nPlease enter a new class number(enter * to the menu).n"); fflush(stdin); scanf("%c",&m); printf("nn"); filewhite(wdesk); break; /*增加课程信息*/(排序中的)while(wdeskk+.totalPeriod!=0);/*计算有多少课程门课程的信息*/for(i=1;i<k-1;i+) for(j=0;j<=k-2;j+) if(strcmp(wdeskj.courseCode,wdeskj+1.courseCode)<0) if(wdeskj+1.totalPeriod=0) break;/*排列到尾是时结束*/ temp=wdeskj+1; wdeskj+1=wdeskj; wdeskj=temp; /*交换*/ (将课程信息写入文件中的)do if(wstudentini.stuNo=0)break; fprintf(sfptr,"%dt",wstudentini.stuNo); if(wstudentini.courseCode='0') fprintf(sfptr,"n"); break; fprintf(sfptr,"%st",wstudentini.courseCode); i+;while(i<50);3.6删除选修信息模块3.6.1设计函数void mydelete(Classin *wdesk),参数Classin结构体指针,实现删除功能void filewrite(Selectin *wstudentin),参数Classin结构体指针,实现写入文件功能。开始输入原课程中是否存在 否是删除课程是否继续是退出否图3-7 mydelete函数流程图3.6.2设计思路及代码 调用指针对数组进行修改,利用ai=ai+1,及数组后面的数将前面的覆盖来实现删除的目的 dofor(i=0;i<=N-1;i+)if(wdeski.courseCode=0)break;if(strcmp(nub,wdeski.courseCode)=0)flag=0;for(j=i;j<=N-2;j+)wdeskj=wdeskj+1;/*将找到的课程删除*/if(wdeskj+1.totalPeriod=0)break;printf("Delete success.n");break;if(flag=-1)printf("The class is not exist.n");3.7修改选修信息模板3.7.1设计函数:void mymodify(Classin *wdesk),参数Classin结构体指针,实现选修功能。开始输入存在此课程否是修改继续是 是退出图3-8 mymodify函数流程图3.7.2设计思路及代码:同myfind函数一样,先对其进行查找,然后再对找出的科目逐项修改,再读入文件 for(i=0;i<=N-1;i+)if(strcmp(Number,wdeski.courseCode)=0)if(wdeski.totalPeriod=0.0)printf("nnnn");break;printf("Please enter the courseName:");scanf("%s",wdeski.courseName);printf("Please enter the courseType:");scanf("%s",wdeski.courseType);printf("Plese enter the totalPeriod:");scanf("%d",&wdeski.totalPeriod);printf("Plese enter the classPeriod:");scanf("%d",&wdeski.classPeriod);printf("Plese enter the experiPeriod:");scanf("%d",&wdeski.experiPeriod);printf("Plese enter the creditHour:");scanf("%lf",&wdeski.creditHour);printf("Plese enter the term:");scanf("%d",&wdeski.term);flag=0;break;3.8学生选修课程模块3.8.1设计函数:void selection(Classin *wdesk,Selectin *wstudentin) void filewrite(Selectin *wstudentin)开始输入学号输入课程课程存在否是选课成功继续是否退出 图3-9 selection函数流程图3.8.2设计思路及代码 输入学号和课程,strcmp函数查看课程是否存在,再将学号和课程读入文件 dofor(j=0;j<=N-1;j+)if(strcmp(a,wdeskj.courseCode)=0)flag=0;strcpy(wstudentini.courseCode,a);break;/*寻找课程*/if(flag=-1)printf("nThe courseCode is not exist!n");printf("Enter any key to select again(enter * to menu).n");fflush(stdin);scanf("%c",&m);/*不存在课程信息*/if(flag=0)printf("nnSelect is successful!n");printf("You select %sn",wdeskj.courseCode);flag=-1; /*将标识初始化*/printf("Enter any key to select again.(enter * to end)nn");fflush(stdin);scanf("%c",&m);/*将课程编号读入数组*/if(m!='*')strcpy(a,viewin(a,wdesk);/*继续选课*/while(m!='*')3.9输出选修信息模块3.9.1设计函数:void output(Selectin *wstudentin),参数Classin结构体指针,实现输出功能。i<50i=0开始 否 是课时为0是 否i+结束图3-10 output函数流程图3.9.2设计思路及代码 逐个筛选及输出 if(wstudentini.stuNo=0)printf("You have not selected class!nPlease select first.n");elseprintf("%stt%sn","stuNo","courseCode");for(i=0;i<50;i+)if(wstudentini.stuNo=0)printf("n");break;printf("%dtt",wstudentini.stuNo);if(wstudentini.courseCode='0')break;printf("%st",wstudentini.courseCode);printf("n");4 调试与测试4.1登陆页面,输入信息后登陆: 图4-1 登陆页面4.2进入主模板,在其中八个功能中选择任一个:图4-2 显示页面4.4选择“1”,分屏显示全部课程信息:图4-3 分屏页面1图4-4 分屏页面24.5选择“2”,查找单科课程:4.6选择“3”,添加选修信息图4-5 添加信息页面4.7选择“4”,删除选修信息:图4-6 删除页面4.8选择“5”,修改选修信息:图4-7 修改页面4.9选择“6”,选修课程图4-8 选课页面4.10选择“10”,输出结果图4-9 输出页面5 总结程序最终能实现基本的操作目的,但是还有很多的不足之处,存在许多的漏洞,不能处理每种突发状况,页面展示的也不够完美。在最开始看到题目时的不知所措,通过学习书中的知识和分析网上的代码及实现结果,最后将程序完成。在这其中,我了解到了一些系统最基本的实现方法,和通过代码实现智能化的选择。认识到通过简单的筛选,数组,函数等最基本的知识就能实现复杂的程序,只需通过模块化,化整为零,逐个解决。参考文献1 王挺.C+程序设计(第二版).北京:清华大学出版社,20102 谭浩强.C语言程序设计.北京:清华大学出版社,2008.附 录选修系统代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 100struct classinchar courseCode10; /课程编号char courseName20; /课程名称char courseType10; /课程类别int totalPeriod; /总学时int classPeriod; /授课学时int experiPeriod; /上机学时float creditHour; /学分int term; /开课学期; /课程信息结构体typedef struct classin Classin;/*定义课程信息结构*/struct selectinint stuNo; /学号;char courseCode10; /课程编号; /学生选课信息结构体typedef struct selectin Selectin;/*定义选课信息结构*/int inset();void waiting();char* viewin(char Number,Classin *wdesk);void mywrite(Classin *wdesk);void filewhite(Classin *wdesk);void printmenu();void myread(Classin *wdesk);void myadd(Classin *wdesk);void myprintf(Classin *wdesk);void mydelete(Classin *wdesk);void mymodify(Classin *wdesk);void selection(Classin *wdesk,Selectin *wstudentin);void filewrite(Selectin *wstudentin);void shunxu(Classin *wdesk);void output(Selectin *wstudentin);void myfind(Classin *wdesk);int main()char m='0'int choice=0;int i;Classin deskN=0;Selectin studentin50=0;FILE *cfptr;waiting();if(!inset()choice=8;if(cfptr=fopen("LessonInfo.txt","r")=NULL)printf("the file cant't be openedn");printf("You should enter the class information!n");mywrite(desk);else i=0;while(!feof(cfptr)fscanf(cfptr,"%s%s%s%d%d%d%f%d",deski.courseCode,deski.courseName,deski.courseType,&deski.totalPeriod,&deski.classPeriod,&deski.experiPeriod,&deski.creditHour,&deski.term);i+;/*将文件中的课程信息读入数组*/fclose(cfptr);if(choice!=8)dosystem("cls");printmenu();printf("Please select:");scanf("%d",&choice);system("cls");if(choice<1|choice>8)printf("Incorrect entered.n");printf("Enter any key to continue.nn");fflush(stdin);scanf("%c",&m);while(choice<1|choice>8);system("cls");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;/*对各种操作进行选择*/if(choice!=8)system("cls");printmenu();printf("Please select:");scanf("%d",&choice);system("cls");return 0;/*进入操作系统*/int inset()FILE *tp,*sp;int i=0,j=0;int num=-1,password,flag=0;int a50,b50;int k=0,c100;char m='0',x;if(tp=fopen("password.txt","r")=NULL)printf("The password is miss!n");printf("Please register first");tp=fopen("password.txt","w");printf("Please enter your student number: ");scanf("%d",&ai);printf("Please enter the password: ");scanf("%d",&bi);printf("nnregister success!nn");fprintf(tp,"%dt%dn",ai,bi);fclose(tp);printf("e