C语言程序设计报告书.docx
- 文档编号:5403864
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:29
- 大小:213.53KB
C语言程序设计报告书.docx
《C语言程序设计报告书.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告书.docx(29页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告书
《程序设计综合训练》
设 计 报 告
专业:
信息管理与信息系统
班级:
学号:
姓 名:
指导教师:
陈明霞
成 绩:
计算机工程学院
2014年2月
目录
一、题目名称、内容。
二、解题的基本思路。
三、设计方案:
功能模块框图与程序流程图等。
四、算法设计:
算法描述、实现方法、详细流程图等。
五、程序调试:
调试过程与步骤,发现的问题,解决的办法等。
六、测试:
运行程序,输入测试数据,判断是否达到预期目的。
测试数据要有典型意义,要注意临界值的选取,注意测试数据的广泛性和普适性。
七、总结:
收获与体会,有实际内容,忌空洞无物,忌千篇一律,400字左右。
八、附录:
源代码(含注释)。
一、题目名称、内容。
学生选课管理系统设计
假定有n门课程,每门课程的信息包括:
课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。
试设计一选修课程系统,实现以下功能:
1.课程信息录入(课程信息用文件保存,并可在电脑中直接查找并打开该文件)
2.课程信息浏览
3.课程信息查询
(1)按学分查询
(2)按课程性质查询
4.学生选修课程
学生输入学号和姓名后可进行选课。
5.统计学生选课情况
二、解题的基本思路。
本程序功能模块根据程序设计的需求,综合程序的实用性、智能化得考虑,将程序划分为5个模块分别编写。
三、设计方案:
功能模块框图与程序流程图等。
3.1五个模块分别为:
(1)浏览课程信息模块
(2)查询课程信息模块
(3)进入系统进行选课模块
(4)选课情况统计模块
(5)录入选课信息模块
3.2主函数的流程设计:
学生选课系统执行主流程如图所示,先执行主函数
中显示菜单函数,通过循环和按键操作来执行相应的操作。
按键的有效键值为0~5之间的任意数值,其他按键为无效
输入。
各个按键的执行功能为:
“1”:
浏览已录入的选修课课程信息调用函数,browser();
“2”:
通过不同的方式查找记录,调用函数search();
“3”:
进入系统进行选课,调用函数xuan_ke();
“4”:
查看课程已选情况,调用函数xuanke_information();
“5”:
录入选修课信息,调用函数input();
“0”:
退出系统;
四、算法设计:
算法描述、实现方法、详细流程图等。
4.1程序中定义的数据类型
4.1,1定义与课程有关的结构体
structcourse
{
intnum;/*课程编号*/
charname[20];/*课程名称*/
charkind[10];/*课程性质*/
inttaltime,ttime,etime,mark,term;/*课程时间,学分,
开课信息等*/
};
4.1.2定义与学生有关的结构体
structstudent
{
intsnum;/*学生学号*/
intcnum;/*所选课程编号*/
charcname[20];/*所选课程名称*/
};
4.2每个函数的过程详解
4.2.1voidf1();
函数原型:
voidf1();
函数源程序:
voidf1()/*常用函数2*/
{printf("\n课程编号课程名称课程性质授课学时实验或上机学时总学时学分开课学期:
\n");}
函数功能及实现:
此函数仅包含输出语句,在课程信息输出之前调用此函数,打印出表头信息
4.2.2voidmenu();
函数原型:
voidmenu()
函数源程序:
voidmenu()/*主菜单*/
{
Printf(“\n\n\n”);
printf("欢迎使用学生选课系统!
\n");
printf("**************************************\n");
printf("*1-浏览选课信息2-查询选课信息*\n");
printf("*3-进入选课操作4-选课情况统计*\n");
printf("*5-录入选课信息0-退出选课系统*\n");
printf("**************************************\n");
printf("请选择输入选项编号(请先选择5进行课程信息录入):
");
}
函数功能及实现:
此函数为输出菜单,进入系统后提示可根据供选择的项目进行后续操作。
4.2.3voidbrowser();
函数原型:
voidbrowser();
函数源程序:
/*浏览选课信息*/
voidbrowser()
{
FILE*fp;/*定义指向文件的指针*/
structcoursec;/*定义课程结构体变量c*/
if((fp=fopen("course.txt","r"))==NULL)
{
printf("\nCannotopencourse!
\n");
}
f1();
for(;!
feof(fp);)/*直到文件结束*/
{fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.ttime,&c.etime,&c.taltime,&c.mark,&c.term);/*将课程信息写入文件*/
printf("%5d%12s%9s%9d%12d%12d%8d%9d\n",c.num,c.name,c.kind,c.ttime,c.etime,c.taltime,c.mark,c.term);/*格式化输出*/
}
fclose(fp);/*关闭文件*/
menu();
}
函数功能及实现:
此函数先定义指向文件的指针*fp,课程结构体变量c,通过if语句判断文件是否存在,在调用函数f1(),输出表头信息,通过for循环并使用fscanf函数将文件中的课程信息读出并通过printf打印到屏幕上,再通过fclose函数关闭文件。
4.2.4voidsearch();
函数原型:
voidsearch();
函数源程序:
/*查询选课信息*/
voidsearch()
{
FILE*fp;/*定义文件指针变量*/
structcoursec;/*定义学生结构体变量c*/
intscore;
charkind[10];
charname[20];
intb;
/*输入需要的查询课程信息的方式*/
printf("\n1.按学分查询\n\n");
printf("\n2.按课程性质查询\n\n");
printf("\n3.按课程名称查询\n\n");
printf("请选择查询方式,输入选项数字:
");
scanf("%d",&b);
for(;b<1||b>3;)
{printf("输入错误,请重新输入!
");
scanf("%d",&b);}
/*按学分查询*/
if(b==1)
{
printf("\n请输入您要查询的学分:
");
scanf("%d",&score);
if((fp=fopen("course.txt","r"))==NULL)
printf("\nCannotopencourse!
\n");
f1();
for(;!
feof(fp);)
{
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.ttime,&c.etime,&c.taltime,&c.mark,&c.term);
if(c.mark==score)
printf("%5d%12s%9s%9d%12d%13d%8d%9d\n",c.num,c.name,c.kind,c.ttime,c.etime,c.taltime,c.mark,c.term);
}
}
/*按课程细致查询*/
elseif(b==2)
{printf("\n请输入您要查询的课程性质:
");
scanf("%s",&kind);
if((fp=fopen("course.txt","r"))==NULL)
printf("\nCannotopencourse!
\n");
f1();
for(;!
feof(fp);)
{
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.ttime,&c.etime,&c.taltime,&c.mark,&c.term);
if(strcmp(c.kind,kind)==0)
printf("%5d%12s%9s%9d%9d%11d%11d%11d\n",c.num,c.name,c.kind,c.ttime,c.etime,c.taltime,c.mark,c.term);
}
}
/*按课程名称查询*/
elseif(b==3)
{
printf("\n请输入课程名称:
");
scanf("%s",&name);
if((fp=fopen("course.txt","r"))==NULL)
printf("\nCannotopencourse!
\n");
f1();
for(;!
feof(fp);)
{
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.ttime,&c.etime,&c.taltime,&c.mark,&c.term);
if(strcmp(c.name,name)==0)
printf("%5d%12s%9s%9d%9d%11d%11d%11d\n",c.num,c.name,c.kind,c.ttime,c.etime,c.taltime,c.mark,c.term);
}
}
else{
printf("输入错误!
");
exit
(1);
}
fclose(fp);
menu();/*调用menu函数*/
}
函数功能及实现:
先定义学生结构体变量s,打印相关可供选择的选项,通过scanf函数读取输入字符,打印表头,再使用if语句进行相关选择。
如果数“1”,则是按学分查询课程,符合第一个if语句,输入想要查询的学分,程序通过for循环从文件中读取课程信息,并通过printf函数输出满足要求的课程信息;如选择“2”,符合第二个if语句,则按照课程性质查询,输入课程性质,程序通过for循环从文件中读取课程信息,并通过printf函数输出满足要求的课程信息;如输入“3”,符合第二个if语句,则按照课程名称查询,输入要课程名称,程序通过for循环从文件中读取课程信息,并通过printf函数输出满足要求的课程信息;查询完成后通过fclose函数关闭文件,打印主菜单,返回主函数。
4.2.5voidxuan_ke();
函数原型:
voidxuan_ke()
函数源程序:
/*进入选课操作*/
voidxuan_ke()
{
structstudents;/*定义学生结构体变量s*/
structcoursec;/*定义课程结构体变量c*/
FILE*fp;/*定义文件指针变量*/
printf("\n请输入您的学号及您要选择的课程编号(用空格分开):
");
scanf("%d%d",&s.snum,&um);
if((fp=fopen("course.txt","r"))==NULL)/*打开选课记录文件"course.txt"*/
{
printf("\nCannotopencourse!
\n");
}
for(;!
feof(fp);)
{fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.ttime,&c.etime,&c.taltime,&c.mark,&c.term);
if(um==c.num)
break;
}
fclose(fp);/*关闭选课记录文件"course.txt"*/
if((fp=fopen("student.txt","a+"))==NULL)
{
printf("\nCannotopenstudent!
\n");
}/*将学生选课信息输入student.txt文件*/
fprintf(fp,"%d%d%s\n",s.snum,um,c.name);
fclose(fp);
printf("\n恭喜您选课成功!
\n");
menu();
}
函数功能及实现:
进入此函数可进行自由选课,首先定义了学生结构体变量s,和课程结构体变量c。
选课学生输入自己的学号和要选的课程,通过for循环打开文件并找到所要选择的课程,通过break跳出循环,关闭课程文件“course.txt”并将学生选课信息存入文件“student.txt”中,关闭文件。
打印菜单信息,返回主函数。
4.2.6voidxuanke_information();
函数原型:
voidinformation();
函数源程序:
/*选课情况统计*/
voidxuanke_information()
{
inttotal=0;/*人数统计变量*/
FILE*fp;
structstudents;
if((fp=fopen("student.txt","r"))==NULL)/*打开选课记录文件"student.txt"*/
{
printf("\nCannotopenstudent!
\n");
}
printf("\n学号课程编号课程名称\n");
for(;!
feof(fp);)
{
fscanf(fp,"%d%d%s\n",&s.snum,&um,&ame);
total++;
printf("%22d%17d%18s\n",s.snum,um,ame);
}
printf("\n选课学生总人数为:
%d人",total);
fclose(fp);
menu();
}
函数功能及实现:
此函数为查看选修课被选择的情况。
定义了变量total为了统计选课人数,通过if语句判断是否存在文件“student.txt”,通过for循环打印出所有已选课学生的学号、选课课程编号和所选课程的名称,通过计数变量total输出已选课的人数信息。
然后打印菜单,返回主函数。
4.2.7voidinput()
函数原型:
voidinput();
函数源程序:
/*录入选修课课程信息*/
voidinput()
{
FILE*fp;
structcoursec;
intcount;
inti;
if((fp=fopen("course.txt","a+"))==NULL)/*建立文件"course.txt"*/
{
printf("cannotopenfile\n");
}
printf("\n(录入选课信息)请输入课程门数:
");
scanf("%d",&count);
printf("\n(各项目间用空格分开)\n\n");
f1();
for(i=0;i {scanf("%d%s%s%d%d%d%d%d",&c.num,&c.name,&c.kind,&c.ttime,&c.etime,&c.taltime,&c.mark,&c.term); fprintf(fp,"%d%s%s%d%d%d%d%d\n",c.num,c.name,c.kind,c.ttime,c.etime,c.taltime,c.mark,c.term); } fclose(fp); printf("\n录入数据成功! \n\n"); menu(); } 函数功能及实现: 此函数录入课程信息,在查询、浏览、进入选课,查看选课信息等函数之前。 定义指向文件的指针变量*fp,课程信息结构体c,通过fopen函数建立文件”course.txt”,后输入录入课程的门数,打印表头,通过for循环,用scanf函数从屏幕读取课程信息,并通过fprintf函数将课程信息录入到文件“course.txt”中,最后输出主菜单,返回主程序。 4.2.8voidmain() 函数源程序: /*主函数*/ voidmain() { intn; menu(); scanf("%d",&n); /*防止错误,提示重新输入*/ for(;n>5||n<0;) { printf("\n输入错误! 请重新输入! "); scanf("%d",&n); } while(n>0&&n<6) { switch(n) { case1: browser();break;/*浏览选课信息*/ case2: search();break;/*查询选课信息*/ case3: xuan_ke();break;/*进入选课操作*/ case4: xuanke_information();break;/*选课情况统计*/ case5: input();break;/*录入选课信息*/ } scanf("%d",&n); /*防止错误,提示重新输入*/ for(;n>5||n<0;) { printf("\n输入错误! 请重新输入! "); scanf("%d",&n); } system("cls");/*调用系统命令cls,清除屏幕*/ } if(n==0) exit(0);/*退出选课系统*/ } 函数功能及实现: 函数先打印出主菜单,用户可通过输入项目编号进行后续操作,输入数字为0~5之间的任意数字,代表进入不同的模块,通过for循环可有效避免错误选择。 如果输入1~5通过while循环和switch调用相关函数,实现相关功能,调用完后,通过break跳出循环,并选择后续操作。 为了界面的更加简洁,调用DOS命令,清屏。 如果输入0则执行exit(0)退出程序。 五、程序调试: 调试过程与步骤,发现的问题,解决的办法等。 (1)在用scanf函数给普通变量输入数据时,在变量名前漏写地址运算符&。 如: scanf(″%d%d″,x,y); (2)在scanf函数调用语句中,企图规定输入实型数据的小数位。 如执行以下语句: scanf(″%6.2f″,&a); (3)输入数据时的数据形式与要求不符。 用scanf函数输入数据时,必须注意要与scanf语句中的对应形式匹配。 如: scanf(″%d,%d″,&x,&y); 若按以下形式输入数据: 24 是不合法。 数据2和4之间应当有逗号。 (4)输入、输出时的数据类型与所用格式说明符不匹配。 例如有以下说明语句: intx=1;chary=’a’; 则运行时执行语句 printf(″x=%c,y=%d\n″,x,y); 将给出与原意不符的结果: (在TURBOC2.0下运行) (5)混淆"="和"=="。 在C语言中,"="赋值运算符,"=="是关系运算符。 (6)在不该出现分号的地方加了分号。 例如: if(x>y); printf(″xislargerthany.\n″); (7)对于复合语句,忘记加花括号。 例如: i=1;a=0; while(i<=10) a+=i;i++; printf(″a=%d\n″,a); (8)误把数组说明时所定义的元素个数作为最大下标值使用。 C语言规定,引用数组元素时下标从0开始,即下标值的下限为0,而下标的上限值是数组定义时元素个数减1。 (9)在switch语句的各分支中未使用break语句。 例如: switch(n) { case1: browser(); case2: search(); case3: xuan_ke(); case4: xuanke_information(); case5: input(); } 六、测试: 运行程序,输入测试数据,判断是否达到预期目的。 测试数据要有典型意义,要注意临界值的选取,注意测试数据的广泛性和普适性。 (1)进入系统界面 (2)录入选修课课程信息: 根据提示输入课程信息,先输入课程门数,再输入相关课程信息,每个输入项用空格隔开,如图输入5门课程后的结果: (3)浏览课程信息: 在输入课程信息后方可进行课程信息浏览,如图是输入“1”进行课程信息浏览后得到的结果: (4)按“2”进行课程信息查询 (1)按学分查询 首先输入“1”按学分查询,再根据提示输入要查询的学分,如图为所有为1学分课程的相关信息: (2)按课程性质查询 选择“2”为按课程性质查询,输入“自然科学”并按“Enter”,得到所有性质为“自然科学”的课程,如图为得到的结果: (3)按课程名称查询 输入“3”进行按课程名称查询,输入“大学语文”按“Enter”得到如图的结果: (5)按“3”进入选课系统进行选课 选课时输入学号和所要选择的课程编号,并用空格隔开,如图是学号为“201153101”的学生选择编号为“1”(即大学语文课程)得到的结果: (6)统计选课情况 输入“4”可以统计选课情况,如图是统计结果: (7)按“0”退出选课系统 七、总结: 收获与体会,有实际内容,忌空洞无物,忌千篇一律,400字左右。 程序设计的过程,实际上是确定解决问题的详细步骤,而这个步骤通常叫做流程,在程序设计过程中理清楚整个问题的流程很重要,然后采取逐步细化的方法实现整个程序。 对于一个较大的应用程序,我们一般不可能一次就设计出一个很完善的系统。 通常要先设计满足基本要求的系统,然后再测试或者在使用的过程中不断完善,慢慢地做成一个功能很完善选修课程管理系统。 当看到这系统之前,感觉这是一个不可能完成的作业,系统,多高档的东西。 但等我坐下来认真分析时,才发现这系统并没有想象中的那么难,也是由我们平时做的简单程序段组成的。 虽然程序段简单但也有些细节性错误搞得我头大,弄得我一度想放弃,最后我还是坚持了下来。 这次实训让我对之前一窍不通的结构体有了一定的了解,让我更会思考问题,懂得了应虚心向别人求教。 总之,当自己做完这课程管理系统,我感觉非常充实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告书