已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中 国 地 质 大 学本科生课程论文封面 课程名称 C语言课程设计 教师姓名 本科生姓名 本科生学号 本科生专业 会计学 所在院系 经济管理学院 类别: 课程设计 日期: 2015年1月21日课程设计评语对课程论文的评语:平时成绩:课程论文成绩:总 成 绩:评阅人签名:注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。目 录课程设计评语2目 录31课程论文题目42程序设计思路43功能模块图54数据结构设计105算法设计116程序代码207程序运行结果318编程中遇到的困难及解决方法369总结心得及良好建议3610致谢371 课程论文题目课程信息管理系统课程信息包括:记录编号、课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)功能要求:A、 从课程信息文件中读取已有的课程信息,并实现屏幕显示。B、 能通过课程编号对已有的课程信息进行修改,要求编号不能修改,其他信息内容都可改,修改的结果保存至课程信息文件。C、 实现对课程信息的统计(分学期统计课程数量及开课总学分数)。D、 实现对课程信息的查询显示(查询条件分为课程编号、课程学分、开课学期),对有多条记录的查询结果按照课程开课学期进行排序显示。E、 新课程信息的添加并保存至课程信息文件。F、 数据约束关系:学时=讲课学时+时间学时;学分=学时/16。G、 课程信息的删除,根据课程编号,删除指定课程信息,并将结果写入文件。H、 每增加一条记录,记录编号自动加1。2 程序设计思路(1)需求分析由于要录入、读取、保存课程信息,因而要实现文件的输入输出以及保存功能;要求可以对课程信息进行统计,因而需要有统计功能;要求用户可以修改、删除课程信息,并且可以添加新课程信息等,因而要提供修改、删除和添加功能;另外,还应该提供键盘式选择菜单以实现功能选择。(2)总体设计可以将这个系统的设计分为数据输入、数据修改、数据统计、数据查找、数据添加、删除数据、数据显示7个模块。(3)数据结构设计 根据问题描述,可采用结构体数组。结点结构(画相应的结构图):NumberClassNumberNameTeachTimePracticeTimeCreditSemesterTextWay定义如下:struct Classint Number;int ClassNumber;char Name10;float TeachTime;float PracticeTime;float Credit;char Semester10;char TextWay10; Class10,CL;3 功能模块图【输入课程信息数据模块】:【显示课程信息模块】:【查询课程模块】:【修改课程信息模块】:【统计课程数目模块】:【课程信息添加模块】:【删除课程信息模块】:结构体成员表列:4 数据结构设计WhileMenueSwitchDeleteModificationStatisticsQueryAddinputDisplayYesNo判断 把课程的相关信息作为结构体成员,存放若干课程信息用结构体数组。用while循环控制功能菜单的选择,swith中设置相应的功能模块函数调用,调用完一个函数后然后返回while进行判断,结果为真则进行功能菜单的选择,如果条件为假则终止函数。5. 算法设计(1)总体设计 把课程的记录编号、课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)作为结构体成员,存放若干个课程的信息用结构体数组。将要实现的功能分为一个一个的函数模块,需实现哪个供的语句时就调用该功能语句。而要实现菜单式的功能选择又需要while中嵌套swith语句,即调用完一个函数后进行while判断,while中的条件控制语句如果为真,则执行功能选项,然后进行swith判断,符合case几的选项就调用相应的函数,然后再进行while判断,直到不符合条件是跳出循环,结束函数。这样就实现了函数的菜单式功能选择并得到相应的结果。(2)各个功能模块的设计各个函数功能模块实现不同的功能,且互相不影响。加入需同时实现二个或两个以上的函数就同时调用函数,这与函数模块之间互相独立互不影响不矛盾,而且这样写思路清晰,程序可读性高,不易出错,能够插入你想要的模块功能而不影响其他的函数和整体。(3)输入数据模块具体算法首先是声明结构体,然后定义结构体数组,数组的每一个元素都包含结构体中的所有成员,即一个课程的所有信息。用for循环遍历分别输入每一个课程的: 课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)。循环结束完后即完成了数据的录入操作。代码如下:/*输入模块*/void Input()int i = g_intNum;char c;for (int t = 1; t;i+,g_intNum+)int flag=1;printf(请输入要输入的课程的相关信息:n); Classi.Number = i;printf(请输入课程编号:);scanf(%d, &Classi.ClassNumber);printf(请输入课程名:);scanf(%s, Classi.Name);printf(请输入讲课学时:);scanf(%f, &Classi.TeachTime);printf(请输入实践学时:);scanf(%f, &Classi.PracticeTime);Classi.Credit = (Classi.TeachTime + Classi.PracticeTime) / 16;printf(请输入开课学期(春季或者秋季):);scanf(%s, Classi.Semester);printf(请输入考核方式(考试或者报告):);scanf(%s, Classi.TextWay); printf(是否继续输入 Y/Nn);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循环遍历每一个课程的课程编号,找出相应信息在文件的位置,依次用修改的信息替换掉原文件信息,即完成修改信息的操作。代码如下:/*修改模块*/void Modification()int n,i;printf(请输入您要修改的课程的课程编号:);scanf(%d, &n);for ( i = 0; i 10; i+)if (Classi.ClassNumber = n)break;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);fscanf(fp, %d%s%f%f%f%s%sn,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);printf(请输入要修改的课程的相关信息:n); Classi.ClassNumber=n;printf(请输入课程名:);scanf(%s, CL.Name);strcpy(Classi.Name,CL.Name);printf(请输入讲课学时:);scanf(%f, &CL.TeachTime);Classi.TeachTime=CL.TeachTime;printf(请输入实践学时:);scanf(%f, &CL.PracticeTime);Classi.PracticeTime=CL.PracticeTime;CL.Credit = (CL.TeachTime+ CL.PracticeTime) / 16;Classi.Credit=CL.Credit ;printf(请输入开课学期(春季或者秋季):);scanf(%s, CL.Semester);strcpy(Classi.Semester,CL.Semester);printf(请输入考核方式(考试或者报告):);scanf(%s, CL.TextWay);strcpy(Classi.TextWay,CL.TextWay);save();fclose(fp);(5) 信息统计模块具体算法首先定义两个整型变量和两个浮点型变量,再用for循环和if条件语句遍历文件,若符合条件,整型变量自增一,浮点型变量由零开始相加,直至信息终结,即完成统计操作。代码如下:/*统计模块*/void Statistics()int i,n1=0,n2=0;float m1=0,m2=0;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for ( i = 0; i 10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);if (strcmp(Classi.Semester,春季)=0)n1+;m1= m1 + Classi.Credit;else if (strcmp(Classi.Semester,秋季)=0)n2+;m2 = m2 + Classi.Credit;printf(春季学期总课程数为%dn, n1);printf(春季学期总学分数为%fn, m1);printf(秋季学期总课程数为%dn, n2);printf(秋季学期总学分数为%fn, m2);(6) 信息查询模块具体算法将for循环和if条件语句连用,先按选择的条件定位,再用for循环遍历文件,找出相应的信息使其显示在屏幕上即完成操作。代码如下:/*查询模块*/void Query()int i, k,a;float b;char m10;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for (i= 0; i10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);printf(查询模块:);printf(n);printf(*n);printf(* *n);printf(* 1:课程编号 2:课程学分 *n);printf(* *n);printf(* 3:开课学期 *n);printf(* *n);printf(*n);printf(nn请输入查询选项:);scanf(%d, &k);for (; k4;)printf(请输入1到4之间的整数:);scanf(%d, &k);if (k=1)printf(请输入要查询的课程编号:);scanf(%d, &a);for ( i = 0; i 10; i+)if (Classi.ClassNumber = a)break;printf(记录编号:%dn,Classi.Number);printf(课程编号:%dn,Classi.ClassNumber);printf(课程名:%sn,Classi.Name); printf(讲课学时:%fn,Classi.TeachTime); printf(实践学时:%fn,Classi.PracticeTime);printf(学分:%fn,Classi.Credit); printf(开课学期:%sn,Classi.Semester); printf(考核方式:%snn,Classi.TextWay);else if (k=2)printf(请输入要查询的课程的学分:);scanf(%f, &b);for ( i = 0; i 10; i+)if (Classi.Credit = b)printf(记录编号:%dn,Classi.Number); printf(课程编号:%dn,Classi.ClassNumber); printf(课程名:%sn,Classi.Name); printf(讲课学时:%fn,Classi.TeachTime); printf(实践学时:%fn,Classi.PracticeTime); printf(学分:%fn,Classi.Credit); printf(开课学期:%sn,Classi.Semester); printf(考核方式:%snn,Classi.TextWay);elseprintf(请输入要查询的开课学期:);scanf(%s, m);for ( i = 0; i 10; i+)if (strcmp(Classi.Semester,m)=0)printf(记录编号:%dn,Classi.Number); printf(课程编号:%dn,Classi.ClassNumber); printf(课程名:%sn,Classi.Name); printf(讲课学时:%fn,Classi.TeachTime); printf(实践学时:%fn,Classi.PracticeTime); printf(学分:%fn,Classi.Credit); printf(开课学期:%sn,Classi.Semester); printf(考核方式:%snn,Classi.TextWay);(7) 信息添加模块具体算法用for循环遍历文件中的信息,找出结构体数组中最后一个数组的位置,使全局变量自增一作为记录编号,信息也将写入后一个空位置,填入信息即可完成操作。代码如下:/*添加模块*/void Add()int i;int t=g_intNum+;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for (i=0; i10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);if (Classi.Number = 0)break;printf(请输入要添加的课程的相关信息:n); Classi.Number = t;printf(请输入课程编号:);scanf(%d, &Classi.ClassNumber);printf(请输入课程名:);scanf(%s, Classi.Name);printf(请输入讲课学时:);scanf(%f, &Classi.TeachTime);printf(请输入实践学时:);scanf(%f, &Classi.PracticeTime);Classi.Credit = (Classi.TeachTime + Classi.PracticeTime) / 16;printf(请输入开课学期(春季或者秋季):);scanf(%s, Classi.Semester);printf(请输入考核方式(考试或者报告):);scanf(%s, Classi.TextWay);save();(8) 信息删除模块具体算法首先定义变量n,使输入的课程编号为n,然后用for循环遍历文件找出相应课程编号的位置,令其所有信息值为空,之后保存即可完成操作。代码如下:/*删除模块*/void Delete()int n,i;printf(请输入要删除的课程的课程编号:);scanf(%d, &n);FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for ( i = 0; i 10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);if (Classi.ClassNumber = n)Classi.Number = 0;Classi.ClassNumber=0;Classi.Credit = 0;strcpy(Classi.Name, 0);Classi.PracticeTime = 0;strcpy(Classi.Semester, 0);Classi.TeachTime=0;strcpy(Classi.TextWay, 0);break;save();fclose(fp);(9) 浏览模块具体算法定义指针fp,打开文件,用for循环依次将信息输出到屏幕上即完成操作。代码如下:/*显示模块*/void Display()FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for (int i = 0; i10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime,&Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);for (i = 0; i 10&Classi.Number!=0; i+)printf(记录编号:%dn,Classi.Number);printf(课程编号:%dn,Classi.ClassNumber);printf(课程名:%sn,Classi.Name);printf(讲课学时:%fn,Classi.TeachTime);printf(实践学时:%fn,Classi.PracticeTime);printf(学分:%fn,Classi.Credit);printf(开课学期:%sn,Classi.Semester);printf(考核方式:%snn,Classi.TextWay);fclose(fp);(10) 保存模块具体算法首先定义一个结构体指针变量fp,然后将文件指向打开文件的信息区,设置打开文件方式为写方式,如果打开文件成功执行fprintf函数,将结构体成员中的信息按指定的格式输出到fp指向的文件中,关闭文件,然后返回到功能选项菜单。代码如下:void save()/定义函数save,向文件输出课程信息FILE *fp;int i;if (fopen(Class.txt, r) = NULL)/打开输出文件Classfp = fopen(Class.txt, w+);elsefp = fopen(Class.txt, r+);for (i = 0; i 10; i+)fprintf(fp, %d, Classi.Number);fputc(n, fp);fprintf(fp, %d, Classi.ClassNumber);fputc(n, fp);fprintf(fp, %s, Classi.Name);fputc(n, fp);fprintf(fp, %f,Classi.TeachTime);fputc(n, fp);fprintf(fp, %f, Classi.PracticeTime);fputc(n, fp);fprintf(fp, %f, Classi.Credit);fputc(n, fp);fprintf(fp, %s, Classi.Semester);fputc(n, fp);fprintf(fp, %s, Classi.TextWay);fputc(n, fp);fclose(fp);6 程序代码#include#include#includestruct Classint Number; / 记录编号int ClassNumber; / 课程编号 char Name10; / 课程名float TeachTime; / 讲课学时float PracticeTime; / 实践学时float Credit; / 学分char Semester10; / 开课学期char TextWay10; / 考核方式 Class10,CL;int g_intNum = 1;/*输入模块*/void save()/定义函数save,向文件输出课程信息FILE *fp;int i;if (fopen(Class.txt, r) = NULL)/打开输出文件Classfp = fopen(Class.txt, w+);elsefp = fopen(Class.txt, r+);for (i = 0; i 10; i+)fprintf(fp, %d, Classi.Number);fputc(n, fp);fprintf(fp, %d, Classi.ClassNumber);fputc(n, fp);fprintf(fp, %s, Classi.Name);fputc(n, fp);fprintf(fp, %f,Classi.TeachTime);fputc(n, fp);fprintf(fp, %f, Classi.PracticeTime);fputc(n, fp);fprintf(fp, %f, Classi.Credit);fputc(n, fp);fprintf(fp, %s, Classi.Semester);fputc(n, fp);fprintf(fp, %s, Classi.TextWay);fputc(n, fp);fclose(fp);void Input()int i = g_intNum;char c;for (int t = 1; t;i+,g_intNum+)int flag=1;printf(请输入要输入的课程的相关信息:n); Classi.Number = i;printf(请输入课程编号:);scanf(%d, &Classi.ClassNumber);printf(请输入课程名:);scanf(%s, Classi.Name);printf(请输入讲课学时:);scanf(%f, &Classi.TeachTime);printf(请输入实践学时:);scanf(%f, &Classi.PracticeTime);Classi.Credit = (Classi.TeachTime + Classi.PracticeTime) / 16;printf(请输入开课学期(春季或者秋季):);scanf(%s, Classi.Semester);printf(请输入考核方式(考试或者报告):);scanf(%s, Classi.TextWay); printf(是否继续输入 Y/Nn);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();/*修改模块*/void Modification()int n,i;printf(请输入您要修改的课程的课程编号:);scanf(%d, &n);for ( i = 0; i 10; i+)if (Classi.ClassNumber = n)break;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);fscanf(fp, %d%s%f%f%f%s%sn,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);printf(请输入要修改的课程的相关信息:n); Classi.ClassNumber=n;printf(请输入课程名:);scanf(%s, CL.Name);strcpy(Classi.Name,CL.Name);printf(请输入讲课学时:);scanf(%f, &CL.TeachTime);Classi.TeachTime=CL.TeachTime;printf(请输入实践学时:);scanf(%f, &CL.PracticeTime);Classi.PracticeTime=CL.PracticeTime;CL.Credit = (CL.TeachTime+ CL.PracticeTime) / 16;Classi.Credit=CL.Credit ;printf(请输入开课学期(春季或者秋季):);scanf(%s, CL.Semester);strcpy(Classi.Semester,CL.Semester);printf(请输入考核方式(考试或者报告):);scanf(%s, CL.TextWay);strcpy(Classi.TextWay,CL.TextWay);save();fclose(fp);/*统计模块*/void Statistics()int i,n1=0,n2=0;float m1=0,m2=0;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for ( i = 0; i 10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);if (strcmp(Classi.Semester,春季)=0)n1+;m1= m1 + Classi.Credit;else if (strcmp(Classi.Semester,秋季)=0)n2+;m2 = m2 + Classi.Credit;printf(春季学期总课程数为%dn, n1);printf(春季学期总学分数为%fn, m1);printf(秋季学期总课程数为%dn, n2);printf(秋季学期总学分数为%fn, m2);/*查询模块*/void Query()int i, k,a;float b;char m10;FILE*fp;if (fp = fopen(Class.txt, r) = NULL)printf(cannot open filen);exit(0);for (i= 0; i10; i+)fscanf(fp, %d%d%s%f%f%f%s%sn,&Classi.Number,&Classi.ClassNumber, Classi.Name, &Classi.TeachTime, &Classi.PracticeTime, &Classi.Credit, Classi.Semester, Classi.TextWay);printf(查询模块:);printf(n);printf(*n);printf(* *n);printf(* 1:课程编号 2:课程学分 *n);printf(* *n);printf(* 3:开课学期 *n);printf(* *n);printf(*n);printf(nn请输入查询选项:);scanf(%d, &k);for (; k4;)printf(请输入1到4之间的整数:);scanf(%d, &k);if (k=1)printf(请输入要查询的课程编号:);scanf(%d, &a);for ( i = 0; i 10; i+)if (Classi.ClassNumber = a)break;printf(记录编号:%dn,Classi.Number);printf(课程编号:%dn,Classi.ClassNumber);printf(课程名:%sn,Classi.Name); printf(讲课学时:%fn,Classi.TeachTime); printf(实践学时:%fn,Classi.PracticeTime);printf(学分:%fn,Classi.Credit); printf(开课学期:%sn,Classi.Semester); printf(考核方式:%snn,Classi.TextWay);else if (k=2)printf(请输入要查询的课程的学分:);scanf(%f, &b);for ( i = 0; i 10; i+)if (Classi.Credit = b)printf(记录编号:%dn,Classi.Number); printf(课程编号:%dn,Classi.ClassNumber); printf(课程名:%sn,Classi.Name); printf(讲课学时:%fn,Classi.TeachTime); printf(实践学时:%fn,Classi.PracticeTime); printf(学分:%fn,Classi.Credit); printf(开课学期:%sn,Classi.Semester); printf(考核方式:%snn,Classi.TextWay);elseprintf(请输入要查询的开课学期:);scanf(%s, m);for ( i = 0; i 10; i+)if (strcmp(Classi.Se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年公务员考试《申论》高分技巧培训与冲刺押题
- 2026年行政许可法学习培训测试题及答案
- 2026非洲智能手机产业链现状供需调研及投资前景规划分析报告
- 2026-2030中国互联网餐饮行业市场深度调研及竞争格局与投资前景研究报告
- 2026上海戏剧学院公开招聘16名工作人员备考题库及参考答案详解
- 2026河北省人民医院选聘48人备考题库含答案详解
- 2026福建厦门市梧村小学招聘5人备考题库及一套答案详解
- 2026黑龙江哈尔滨工业大学(威海)博士后人员遴选110人备考题库含答案详解
- 2026湖北武汉轻工大学人才引进103人备考题库完整参考答案详解
- 资溪县2026年面向社会公开招聘编制外合同教师备考题库【24人】及一套完整答案详解
- 2025年高考历史一轮复习“近代中国革命史”核心考点梳理
- 处方书写规范培训课件
- 《铁路技术管理规程》(普速铁路部分)
- 规划课题申报范例:湖北省拔尖创新人才一体化培养研究(附可修改技术路线图)
- 四川乐山市中区2025届高三下学期联合考试语文试题含解析
- (完整版)大学英语四级必背单词词汇表
- 《行政职业能力测验》2024年公务员考试深圳市福田区模拟预测试卷含解析
- 新能源汽车销售职业规划书
- 23秋国家开放大学《液压气动技术》形考任务1-3参考答案
- 中考古诗文必考篇目(50篇)
- 《文物三维数字化技术规范-器物》-北京市地方标准编制说明
评论
0/150
提交评论