选课系统报告.docx
《选课系统报告.docx》由会员分享,可在线阅读,更多相关《选课系统报告.docx(41页珍藏版)》请在冰点文库上搜索。
选课系统报告
程序设计报告
专业:
班级:
学号:
姓 名:
指导教师:
成 绩:
计算机工程学院
2014年6月
一、题目:
名称、内容......................................2
二、解题的基本思路.........................................2
三、设计方案
功能模块框图...........................................3
程序流程图等...........................................3
四、算法设计
算法描述...............................................9
实现方法...............................................9
详细流程图.............................................10
五、程序调试
调试过程与步骤.........................................15
发现的问题............................................16
解决的办法............................................17
六、测试
运行程序..............................................17
输入测试数据..........................................18
判断是否达到预期目的..................................19
注:
1.测试数据要有典型意义
2.要注意临界值的选取
3.注意测试数据的广泛性和普适性
七、总结
收获与体会............................................20
有实际内容,忌空洞无物
忌千篇一律,400字左右。
八、附录:
源代码(含注释)...................................21
一、题目名称、内容
(学生选课管理系统设计)(第32组)
假定有n门课程,每门课程的信息包括:
课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。
试设计一选修课程系统,实现以下功能:
1.课程信息录入(课程信息用文件保存,并可在电脑中直接查找并打开该文件)
2.课程信息浏览
3.课程信息查询
(1)按学分查询
(2)按课程性质查询
4.学生选修课程
学生输入学号和姓名后可进行选课。
5.统计学生选课情况
二、解题的基本思路
C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的图形界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。
使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。
使我们体会到自身知识和能力能在实际中的应用和发挥。
不但可以激发创新意识,同时,还可以开发创造能力、培养沟通能力。
这次学生选修课系统管理设计时间虽然仅有一个星期,但确实使我受益非浅。
通过学生选修课系统管理设计我丰富了计算机操作经验,更加深了对C语言的了解,熟悉了其环境,更增强了对MicrosoftVisualC++6.0的使用技巧。
C语言是在国内外广泛使用的一种计算机语言。
语言功能丰富、表达能力强、使用灵活方便、既具有高级语言的优点,又具有低级语言的许多特点,适合编写系统软件。
同时,我觉得C语言应该是操作和理论相结合的课程,在不断地编写中去思考,两者是不可分割的。
我们在编写一个较大的程序时应该把它分开成几个小程序来看,这样会容易得多。
比如说,这次的选课系统,将系统分为录入、浏览、查询、选课、统计、退出系统六个阶段。
通过主函数调用各个函数,层次清晰,一眼明了,同时。
为了满足多种查询的方式,将查询函数分为两个部分,按照学分查询和按照课程性质查询,这样可以避免错误。
最后,我觉得我所编出的程序的最大的优点就是输入错误后,有个重新输入的步骤,这样避免有人误选数字,而导致程序结束。
同时,在程序中用printf输出如“欢迎进入”、“谢谢使用”等的敬语,更具有人性化,亲人美观的界面可以让选课者赏心悦目。
同时,程序中的换行等,都可以保持界面不至于太过拥挤,大方简约。
3、设计方案,功能模块框图与程序流程图等
(1)设计方案:
通过主函数调用各个函数实现其功能,并逐步进行优化
(2)
录
入
课
程
信息
查
询
课
程
信
息
进
入
选
课
操
作
统
计
选
课
情
况
浏
览
课
程
信
息
将课程信息输入文件中
浏览文件中的课程信息
按照学分查询课程信息
按照课程性质查询
课程
输入学号姓名进行选课
从选课文件中统计信息
主函数
开始
本系统的功能模块如图所示
(3)主要功能模块:
1.主函数:
构造voidmain(),实现调用各个功能模块:
学生选课系统执行主流程如图所示,先执行主函数中显示菜单函数,通过循环和按键操作来执行相应的操作。
按键的有效键值为0~5之间的任意数值,其他按键为无效输入,会提示“输入错误,请重新输入”,同时,再次用scanf创造再次输入的机会。
各个按键的执行功能为:
“1”:
录入选修课课程信,调用函数luru();
“2”:
浏览录入的课程信息,调用函数liulan();
“3”:
查询课程信息,调用函数chaxun();
“4”:
进入选课操作,调用函数chaxun();
“5”:
统计选课信息,调用函数tongji();
“0”:
退出系统;
intmain()
{
intn;
intmenu();
intf1();
intluru();
intliulan();
intchaxun();
intxuanke();
inttongji();
printf("\n*********************************************");
printf("\n\n**********欢迎进入学生选课系统!
**********");
menu();
printf("\n");
printf("*******************theend*********************\n");
printf("\n*********************************************");
printf("\n\n请先选择1进行课程信息录入:
");
scanf("%d",&n);
for(;n>5||n<0;)
{
printf("\n输入错误!
请重新输入!
\n");
scanf("%d",&n);
}
while(n>0&&n<6)
{
switch(n)
{
case1:
luru();break;
case2:
liulan();break;
case3:
chaxun();break;
case4:
xuanke();break;
case5:
tongji();break;
}
scanf("%d",&n);
for(;n>5||n<0;)
{
printf("\n\n");
printf("\n输入错误!
请重新输入!
\n");
scanf("%d",&n);
}
system("cls");
}
if(n==0)
{
printf("\n\n\n\n\n\n\n");
printf("**********谢谢使用!
**********\n");
printf("\n\n\n\n\n");
}
exit(0);
return0;
}
2.定义menu函数,f1函数方便调用函数
函数功能及实现:
此函数为输出菜单,进入系统后提示可根据供选择的项目进行后续操作。
intmenu()
{
intn;
printf("\n\n\n\n");
printf("1.录入课程信息\n\n");
printf("2.浏览课程信息\n\n");
printf("3.查询课程信息\n\n");
printf("4.进入选课操作\n\n");
printf("5.统计选课情况\n\n");
printf("0.退出选课系统\n\n");
return0;
}
3.定义课程、选课结构体变量
structcourse
{
intnum;
charname[20];
charkind[20];
intttime,mark,term;
}c;
structstudent
{
intsnum;
intcnum;
charcnam[20];
charsnam[20];
}s[500];
4.定义录入函数,课程信息
函数功能及实现:
此函数录入课程信息,在查询、浏览、进入选课,查看选课信息等函数之前。
定义指向文件的指针变量*fp,课程信息结构体c通过fopen函数建立文件”course.txt”,后输入录入课程的门数,打印表头,通过for循环,用scanf函数从屏幕读取课程信息,并通过fprintf函数将课程信息录入到文件“course.txt”中,最后输出主菜单,返回主程序。
intluru()
{
FILE*fp;
structcoursec;
intcount;
inti;
if((fp=fopen("D:
//course.txt","w"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
printf("\n请输入选择的课程门数:
");
scanf("%d",&count);
printf("\n\n\n");
f1();
for(i=0;i{
scanf("%d%s%s%d%d%d",&c.num,c.name,c.kind,&c.ttime,&c.mark,&c.term);
fprintf(fp,"%d\t%s\t%s\t%d\t%d\t%d\t",c.num,c.name,c.kind,c.ttime,c.mark,c.term);
}
fclose(fp);
printf("\n录入成功!
\n\n");
menu();
return0;
}
5.定义浏览函数,浏览录入的课程信息
函数功能及实现:
此函数先定义指向文件的指针*fp,课程结构体变量c,通过if语句判断文件是否存在,在调用函数f1(),输出表头信息,通过for循环并使用fscanf函数将文件中的课程信息读出并通过printf打印到屏幕上,再通过fclose函数关闭文件。
intliulan()//浏览函数
{
inti=0;
FILE*fp;
structcoursec;
if((fp=fopen("D:
//course.txt","r"))==NULL)
{
printf("\ncannotopencourse!
\n");
exit(0);
}
f1();
while(!
feof(fp)&&i{fscanf(fp,"%d%s%s%d%d%d",&c.num,c.name,c.kind,&c.ttime,&c.mark,&c.term);
printf("%7d%11s%10s%9d%9d%8d\n",c.num,c.name,c.kind,c.ttime,c.mark,c.term);
i++;
}
fclose(fp);
menu();
return0;
}
6.定义查询函数,按照学分和课程性质查询
函数功能及实现:
先定义学生结构体变量s,打印相关可供选择的选项,通过scanf函数读取输入字符,打印表头,再使用if语句进行相关选择。
如果数“1”,则是按学分查询课程,符合第一个if语句,输入想要查询的学分,程序通过for循环从文件中读取课程信息,并通过printf函数输出满足要求的课程信息;如选择“2”,符合第二个if语句,则按照课程性质查询,输入课程性质,程序通过for循环从文件中读取课程信息,并通过printf函数输出满足要求的课程信息;如输入“3”,符合第二个if语句,则按照课程名称查询,输入要课程名称,程序通过for循环从文件中读取课程信息,并通过printf函数输出满足要求的课程信息;查询完成后通过fclose函数关闭文件,打印主菜单,返回主函数。
intchaxun()
{
FILE*fp;
structcoursec;
intscore;
intb,i=0;
charkind[20];
printf("\n1.按学分查询\n");
printf("\n2.按课程性质查询");
printf("请选择查询方式\n\n输入选项数字:
");
scanf("%d",&b);
for(;b<1||b>2;)
{
printf("\n输入错误!
请重新输入!
\n");
scanf("%d",&b);
}
if(b==1)
{
printf("\n输入你要查询的学分:
");
scanf("%d",&score);
if((fp=fopen("D:
//course.txt","r"))==NULL)
{
printf("\ncannotopencourse!
\n");
exit(0);
}
f1();
while(!
feof(fp)&&i{
fscanf(fp,"%d%s%s%d%d%d",&c.num,c.name,c.kind,&c.ttime,&c.mark,&c.term);
if(c.mark==score)
printf("%7d%11s%10s%9d%9d%8d\n",c.num,c.name,c.kind,c.ttime,c.mark,c.term);
i++;
}
}
elseif(b==2)
{
printf("\n\n输入你要查询的课程性质:
");
scanf("%s",kind);
if((fp=fopen("D:
//course.txt","r"))==NULL)//打开文件"course.txt"
{
printf("\ncannotopencourse!
\n");
}
f1();
while(!
feof(fp)&&i{
fscanf(fp,"%d%s%s%d%d%d",&c.num,c.name,c.kind,&c.ttime,&c.mark,&c.term);
if(strcmp(c.kind,kind)==0)
printf("%7d%11s%10s%9d%9d%8d\n",c.num,c.name,c.kind,c.ttime,c.mark,c.term);
i++;
}
}
else
{
printf("输入错误!
");
exit
(1);
}
fclose(fp);
menu();
return0;
}
7.定义选课函数,进入选课操作
函数功能及实现:
进入此函数可进行自由选课,首先定义了学生结构体变量s,和课程结构体变量c。
选课学生输入自己的学号和要选的课程,通过for循环打开文件并找到所要选择的课程,通过break跳出循环,关闭课程文件“course.txt”并将学生选课信息存入文件“student.txt”中。
打印菜单信息,返回主函数。
intxuanke()
{
intt=0,flag;
inti;
/*structcoursec;
FILE*fp;
do
{
printf("\n请输入学号姓名课程编号及课程名称:
");
scanf("%d%s%d%s",&s[t].snum,s[t].snam,&s[t].cnum,s[t].cnam);
if((fp=fopen("D:
//course.txt","r"))==NULL)//打开文件"course.txt"
{
printf("\ncannotopencourse!
\n");
exit(0);
}
while(!
feof(fp))
{
fscanf(fp,"%d%s%s%d%d%d",&c.num,c.name,c.kind,&c.ttime,&c.mark,&c.term);
if((s[t].cnum==c.num)&&(s[t].cnam==c.name))
t++;
break;
}fclose(fp);
printf("\n是否继续,是1,否0\n");
scanf("%d",&flag);
if((fp=fopen("D:
//student.txt","a+"))==NULL)
{
printf("\ncannotopenstudent!
\n");
exit(0);
}
for(i=0;ifprintf(fp,"%d\t%s\t%d\t%s\t\n",s[t].snum,s[t].snam,s[t].cnum,s[t].cnam);
fclose(fp);
}while(flag);
printf("\n*********恭喜选课成功!
*********\n");
menu();
return0;
}
8.定义统计函数,统计学生选课信息
函数功能及实现:
此函数为查看选修课被选择的情况。
定义了变量total为了统计选课人数,通过if语句判断是否存在文件“student.txt”,通过for循环打印出所有已选课学生的学号、选课课程编号和所选课程的名称,通过计数变量total输出已选课的人数信息。
然后打印菜单,返回主函数。
inttongji()//统计函数
{
inttotal=0;
intt,i=0;
FILE*fp;
if((fp=fopen("D:
//student.txt","r"))==NULL)
{
printf("\ncannotopenstudent!
\n");
exit(0);
}
printf("\n学号姓名课程编号及课程名称\n");
while(!
feof(fp))
{
fscanf(fp,"%d%s%d%s\n",&s[i].snum,s[i].snam,&s[i].cnum,s[i].cnam);
total++;
i++;
}
t=i;
for(i=0;iprintf("%5d%6s%7d%10s\n",s[i].snum,s[i].snam,s[i].cnum,s[i].cnam);
printf("\n选课学生总人数为:
%d人",total);
fclose(fp);
menu();
return0;
}
4、算法设计
(1)主函数的设计
对于主函数,通过选择操作所对应的数字,进入相应的操作,同时,在选择序号数字错误时,有提示“输入错误,请重新输入”,然后,从键盘上重新输入一个数字,继续进行相应的操作。
(注:
输入的数字要在0~5之内)
算法设计如下:
S1:
从键盘上输入一个0~5的数字,进入相应的操作
S2:
如果选择序号1,则进入课程信息录入操作
S3:
如果选择序号2,则进入浏览课程信息操作
S4:
如果选择序号3,则进入查询课程信息操作
S5:
如果选择序号4,则进入学生选择课程操作
S6:
如果选择序号5,则进入统计选课情况操作
S7:
如果选择序号0,则退出学生选课管理系统
S8:
如果选择除0~5的其他操作,则提示“输入错误,请重新输入”
然后返回S1
具体流程图如下:
主函数
结束
进行相应的操作
是否
继续
开始
输入0~5相应的操作对应的数字
是
否
(2)录入函数的设计
对于录入函数,就是在D盘建立一个“course.txt”文件,然后通过scanf从键盘上输入课程信息,再通过fprintf将输入的信息保存在文件中,关闭文件。
算法设计如下:
S1:
在D盘建立“course.txt”文件
S2:
提示让学生输入选课门数
S3:
从键盘上输入课程信息并保存
S4:
当指针指向文件尾部,返回S3
具体流程图如下:
结束
(3)浏览函数的设计
对于浏览函数,通过fscanf读取文件中的课程信息,然后再通过printf将信息输出
算法设计如下:
S1:
打开“course.txt”文件
S2:
读取文件中的信息
S3:
输出信息
S4:
当指针未指向文件尾部,返回S2
具体流程图如下:
否
结束
读取课程信息
是否指向尾部
开始
打开文件
是
输出课程信息
(4)查询函数的设计
对于查询函数,输入1或2选择查询方式,如果不是,则重新输入。
对于不同方式的查询,如果输入的方式与文件中有相符的,则输出查询结果
算法设计如下:
S1:
选择查询方式
S2:
如果方式是学分查询,输入想查询的学分,打开文件,未指向文件尾部,如果文件中存在,则输出查询结果
S3:
如果方式是课程性质查询,输入想查询的课程性质,打开文件,未指向文件尾部,读取文件信息,如果文件中存在,则输出查询结果
S4:
如果方式数字不存在,则退出查询
具体流程图如下:
是否指向尾部
数字不正确
开始
输出课程信息
否
是
按学分查询
按
课程性质
选择查询方式
只显示课程编号、课程名称信息,不显示结果
打开文件读取
输出课程信息
打开文件读取
是否存在信息
是否存在信息