语c言课程设计报告课程信息管理系统大学论文.docx
- 文档编号:26962272
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:45
- 大小:396.66KB
语c言课程设计报告课程信息管理系统大学论文.docx
《语c言课程设计报告课程信息管理系统大学论文.docx》由会员分享,可在线阅读,更多相关《语c言课程设计报告课程信息管理系统大学论文.docx(45页珍藏版)》请在冰豆网上搜索。
语c言课程设计报告课程信息管理系统大学论文
中国地质大学
本科生课程论文封面
课程名称C语言课程设计
教师姓名
本科生姓名
本科生学号
本科生专业会计学
所在院系经济管理学院
类别:
课程设计
日期:
2015年1月21日
课程设计评语
对课程论文的评语:
平时成绩:
课程论文成绩:
总成绩:
评阅人签名:
注:
1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
1.课程论文题目
课程信息管理系统
课程信息包括:
记录编号、课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)
功能要求:
A、从课程信息文件中读取已有的课程信息,并实现屏幕显示。
B、能通过课程编号对已有的课程信息进行修改,要求编号不能修改,其他信息内容都可改,修改的结果保存至课程信息文件。
C、实现对课程信息的统计(分学期统计课程数量及开课总学分数)。
D、实现对课程信息的查询显示(查询条件分为课程编号、课程学分、开课学期),对有多条记录的查询结果按照课程开课学期进行排序显示。
E、新课程信息的添加并保存至课程信息文件。
F、数据约束关系:
学时=讲课学时+时间学时;学分=学时/16。
G、课程信息的删除,根据课程编号,删除指定课程信息,并将结果写入文件。
H、每增加一条记录,记录编号自动加1。
2.程序设计思路
(1)需求分析
由于要录入、读取、保存课程信息,因而要实现文件的输入输出以及保存功能;要求可以对课程信息进行统计,因而需要有统计功能;要求用户可以修改、删除课程信息,并且可以添加新课程信息等,因而要提供修改、删除和添加功能;另外,还应该提供键盘式选择菜单以实现功能选择。
(2)总体设计
可以将这个系统的设计分为数据输入、数据修改、数据统计、数据查找、数据添加、删除数据、数据显示7个模块。
(3)数据结构设计
根据问题描述,可采用结构体数组。
结点结构(画相应的结构图):
Number
ClassNumber
Name
TeachTime
PracticeTime
Credit
Semester
TextWay
定义如下:
structClass
{
intNumber;
intClassNumber;
charName[10];
floatTeachTime;
floatPracticeTime;
floatCredit;
charSemester[10];
charTextWay[10];
}Class[10],CL;
3.功能模块图
【输入课程信息数据模块】:
【显示课程信息模块】:
【查询课程模块】:
【修改课程信息模块】:
【统计课程数目模块】:
【课程信息添加模块】:
【删除课程信息模块】:
4.
数据结构设计
把课程的相关信息作为结构体成员,存放若干课程信息用结构体数组。
用while循环控制功能菜单的选择,swith中设置相应的功能模块函数调用,调用完一个函数后然后返回while进行判断,结果为真则进行功能菜单的选择,如果条件为假则终止函数。
5.算法设计
(1)总体设计
把课程的记录编号、课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)作为结构体成员,存放若干个课程的信息用结构体数组。
将要实现的功能分为一个一个的函数模块,需实现哪个供的语句时就调用该功能语句。
而要实现菜单式的功能选择又需要while中嵌套swith语句,即调用完一个函数后进行while判断,while中的条件控制语句如果为真,则执行功能选项,然后进行swith判断,符合case几的选项就调用相应的函数,然后再进行while判断,直到不符合条件是跳出循环,结束函数。
这样就实现了函数的菜单式功能选择并得到相应的结果。
(2)各个功能模块的设计
各个函数功能模块实现不同的功能,且互相不影响。
加入需同时实现二个或两个以上的函数就同时调用函数,这与函数模块之间互相独立互不影响不矛盾,而且这样写思路清晰,程序可读性高,不易出错,能够插入你想要的模块功能而不影响其他的函数和整体。
(3)输入数据模块具体算法
首先是声明结构体,然后定义结构体数组,数组的每一个元素都包含结构体中的所有成员,即一个课程的所有信息。
用for循环遍历分别输入每一个课程的:
课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)。
循环结束完后即完成了数据的录入操作。
代码如下:
/**********输入模块***********/
voidInput()
{
inti=g_intNum;
charc;
for(intt=1;t;i++,g_intNum++)
{
intflag=1;
printf("请输入要输入的课程的相关信息:
\n");
Class[i].Number=i;
printf("请输入课程编号:
");
scanf("%d",&Class[i].ClassNumber);
printf("请输入课程名:
");
scanf("%s",Class[i].Name);
printf("请输入讲课学时:
");
scanf("%f",&Class[i].TeachTime);
printf("请输入实践学时:
");
scanf("%f",&Class[i].PracticeTime);
Class[i].Credit=(Class[i].TeachTime+Class[i].PracticeTime)/16;
printf("请输入开课学期(春季或者秋季):
");
scanf("%s",Class[i].Semester);
printf("请输入考核方式(考试或者报告):
");
scanf("%s",Class[i].TextWay);
printf("是否继续输入Y/N\n");
while(flag)
{
fflush(stdin);
scanf("%c",&c);
switch(c)
{
case'Y':
flag=0;
break;
case'y':
flag=0;
break;
case'N':
t=0;flag=0;
break;
case'n':
t=0;flag=0;
break;
default:
printf("输入有误,重新输入Y/N:
");
}
}
}
save();
}
(4)信息修改模块具体算法
首先输入信息,用for循环遍历每一个课程的课程编号,找出相应信息在文件的位置,依次用修改的信息替换掉原文件信息,即完成修改信息的操作。
代码如下:
/*******修改模块*******/
voidModification()
{
intn,i;
printf("请输入您要修改的课程的课程编号:
");
scanf("%d",&n);
for(i=0;i<10;i++)
{
if(Class[i].ClassNumber==n)
break;
}
FILE*fp;
if((fp=fopen("Class.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
fscanf(fp,"%d%s%f%f%f%s%s\n",&Class[i].ClassNumber,Class[i].Name,&Class[i].TeachTime,&Class[i].PracticeTime,&Class[i].Credit,Class[i].Semester,Class[i].TextWay);
printf("请输入要修改的课程的相关信息:
\n");
Class[i].ClassNumber=n;
printf("请输入课程名:
");
scanf("%s",CL.Name);
strcpy(Class[i].Name,CL.Name);
printf("请输入讲课学时:
");
scanf("%f",&CL.TeachTime);
Class[i].TeachTime=CL.TeachTime;
printf("请输入实践学时:
");
scanf("%f",&CL.PracticeTime);
Class[i].PracticeTime=CL.PracticeTime;
CL.Credit=(CL.TeachTime+CL.PracticeTime)/16;
Class[i].Credit=CL.Credit;
printf("请输入开课学期(春季或者秋季):
");
scanf("%s",CL.Semester);
strcpy(Class[i].Semester,CL.Semester);
printf("请输入考核方式(考试或者报告):
");
scanf("%s",CL.TextWay);
strcpy(Class[i].TextWay,CL.TextWay);
save();
fclose(fp);
}
(5)信息统计模块具体算法
首先定义两个整型变量和两个浮点型变量,再用for循环和if条件语句遍历文件,若符合条件,整型变量自增一,浮点型变量由零开始相加,直至信息终结,即完成统计操作。
代码如下:
/***********统计模块***********/
voidStatistics()
{
inti,n1=0,n2=0;
floatm1=0,m2=0;
FILE*fp;
if((fp=fopen("Class.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
for(i=0;i<10;i++)
{
fscanf(fp,"%d%d%s%f%f%f%s%s\n",&Class[i].Number,&Class[i].ClassNumber,Class[i].Name,&Class[i].TeachTime,&Class[i].PracticeTime,&Class[i].Credit,Class[i].Semester,Class[i].TextWay);
if(strcmp(Class[i].Semester,"春季")==0)
{
n1++;
m1=m1+Class[i].Credit;
}
elseif(strcmp(Class[i].Semester,"秋季")==0)
{
n2++;
m2=m2+Class[i].Credit;
}
}
printf("春季学期总课程数为%d\n",n1);
printf("春季学期总学分数为%f\n",m1);
printf("秋季学期总课程数为%d\n",n2);
printf("秋季学期总学分数为%f\n",m2);
}
(6)信息查询模块具体算法
将for循环和if条件语句连用,先按选择的条件定位,再用for循环遍历文件,找出相应的信息使其显示在屏幕上即完成操作。
代码如下:
/**********查询模块**************/
voidQuery()
{
inti,k,a;
floatb;
charm[10];
FILE*fp;
if((fp=fopen("Class.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
for(i=0;i<10;i++)
fscanf(fp,"%d%d%s%f%f%f%s%s\n",&Class[i].Number,&Class[i].ClassNumber,Class[i].Name,&Class[i].TeachTime,&Class[i].PracticeTime,&Class[i].Credit,Class[i].Semester,Class[i].TextWay);
printf("查询模块:
");
printf("\n");
printf("***********************************************\n");
printf("**\n");
printf("*1:
课程编号2:
课程学分*\n");
printf("**\n");
printf("*3:
开课学期*\n");
printf("**\n");
printf("***********************************************\n");
printf("\n\n请输入查询选项:
");
scanf("%d",&k);
for(;k<1||k>4;)
{
printf("请输入1到4之间的整数:
");
scanf("%d",&k);
}
if(k==1)
{
printf("请输入要查询的课程编号:
");
scanf("%d",&a);
for(i=0;i<10;i++)
{
if(Class[i].ClassNumber==a)
break;
}
printf("记录编号:
%d\n",Class[i].Number);
printf("课程编号:
%d\n",Class[i].ClassNumber);
printf("课程名:
%s\n",Class[i].Name);
printf("讲课学时:
%f\n",Class[i].TeachTime);
printf("实践学时:
%f\n",Class[i].PracticeTime);
printf("学分:
%f\n",Class[i].Credit);
printf("开课学期:
%s\n",Class[i].Semester);
printf("考核方式:
%s\n\n",Class[i].TextWay);
}
elseif(k==2)
{
printf("请输入要查询的课程的学分:
");
scanf("%f",&b);
for(i=0;i<10;i++)
{
if(Class[i].Credit==b)
{
printf("记录编号:
%d\n",Class[i].Number);
printf("课程编号:
%d\n",Class[i].ClassNumber);
printf("课程名:
%s\n",Class[i].Name);
printf("讲课学时:
%f\n",Class[i].TeachTime);
printf("实践学时:
%f\n",Class[i].PracticeTime);
printf("学分:
%f\n",Class[i].Credit);
printf("开课学期:
%s\n",Class[i].Semester);
printf("考核方式:
%s\n\n",Class[i].TextWay);
}
}
}
else
{
printf("请输入要查询的开课学期:
");
scanf("%s",m);
for(i=0;i<10;i++)
{
if(strcmp(Class[i].Semester,m)==0)
{
printf("记录编号:
%d\n",Class[i].Number);
printf("课程编号:
%d\n",Class[i].ClassNumber);
printf("课程名:
%s\n",Class[i].Name);
printf("讲课学时:
%f\n",Class[i].TeachTime);
printf("实践学时:
%f\n",Class[i].PracticeTime);
printf("学分:
%f\n",Class[i].Credit);
printf("开课学期:
%s\n",Class[i].Semester);
printf("考核方式:
%s\n\n",Class[i].TextWay);
}
}
}
}
(7)信息添加模块具体算法
用for循环遍历文件中的信息,找出结构体数组中最后一个数组的位置,使全局变量自增一作为记录编号,信息也将写入后一个空位置,填入信息即可完成操作。
代码如下:
/**********添加模块*************/
voidAdd()
{
inti;
intt=g_intNum++;
FILE*fp;
if((fp=fopen("Class.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
for(i=0;i<10;i++)
{
fscanf(fp,"%d%d%s%f%f%f%s%s\n",&Class[i].Number,&Class[i].ClassNumber,Class[i].Name,&Class[i].TeachTime,&Class[i].PracticeTime,&Class[i].Credit,Class[i].Semester,Class[i].TextWay);
if(Class[i].Number==0)
break;
}
printf("请输入要添加的课程的相关信息:
\n");
Class[i].Number=t;
printf("请输入课程编号:
");
scanf("%d",&Class[i].ClassNumber);
printf("请输入课程名:
");
scanf("%s",Class[i].Name);
printf("请输入讲课学时:
");
scanf("%f",&Class[i].TeachTime);
printf("请输入实践学时:
");
scanf("%f",&Class[i].PracticeTime);
Class[i].Credit=(Class[i].TeachTime+Class[i].PracticeTime)/16;
printf("请输入开课学期(春季或者秋季):
");
scanf("%s",Class[i].Semester);
printf("请输入考核方式(考试或者报告):
");
scanf("%s",Class[i].TextWay);
save();
}
(8)信息删除模块具体算法
首先定义变量n,使输入的课程编号为n,然后用for循环遍历文件找出相应课程编号的位置,令其所有信息值为空,之后保存即可完成操作。
代码如下:
/********删除模块**********/
voidDelete()
{
intn,i;
printf("请输入要删除的课程的课程编号:
");
scanf("%d",&n);
FILE*fp;
if((fp=fopen("Class.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
for(i=0;i<10;i++)
{
fscanf(fp,"%d%d%s%f%f%f%s%s\n",&Class[i].Number,&Class[i].ClassNumber,Class[i].Name,&Class[i].TeachTime,&Class[i].PracticeTime,&Class[i].Credit,Class[i].Semester,Class[i].TextWay);
if(Class[i].ClassNumber==n)
{
Class[i].Number=0;
Class[i].ClassNumber=0;
Class[i].Credit=0;
strcpy(Class[i].Name,"0");
Class[i].PracticeTime=0;
strcpy(Class[i].Semester,"0");
Class[i].TeachTime=0;
strcpy(Class[i].TextWay,"0");
break;
}
}
save();
fclose(fp);
}
(9)浏览模块具体算法
定义指针fp,打开文件,用for循环依次将信息输出到屏幕上即完成操作。
代码如下:
/*******显示模块**********/
voidDisplay()
{
FILE*fp;
if((fp=fopen("Class.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
for(inti=0;i<10;i++)
fscanf(fp,"%d%d%s%f%f%f%s%s\n",&Class[i].Number,&Class[i].ClassNumber,Class[i].Name,&Class[i].TeachTime,
&Class[i].PracticeTime,&Class[i].Credit,Class[i].Semester,Class[i].TextWay);
for(i=0;i<10&&Class[i].Number!
='\0';i++)
{
printf("记录编号:
%d\n",Class[i].Number);
printf("课程编号:
%d\n",Class[i].ClassNumber);
printf("课程名:
%s\n",Class[i].Name);
printf("讲课学时:
%f\n",Class[i].Teach
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 课程 信息管理 系统 大学 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)