上海应用技术学院课程设计2011~ 2012学年第二学期设计题目成绩记录簿院(系)计算机科学与信息工程学院专业计算机应用技术班级 12104006 学号 1210400631学生姓名温源设计时间 2013.07.1~2012.07.12指导教师宋智礼提交日期上海应用技术学院课程设计任务书指导教师(签名):教研室主任(签名):目录一、设计目的及要 (4)二、功能描述 (5)三、总体设计 (6)3.1 功能模块设计3.2 数据结构设计3.3 函数功能描述四、程序实现 (15)4.1 源码分析4.2 运行结果五、程序调试与检错 (30)六、程序运行指导 (31)七、课程设计总结 (36)八、参考文献 (36)一、设计目的及要求通过对C语言的熟练掌握,编写一个拥有简单界面的可运行程序来实现对一个或多个学生成绩的记录,并且能在记录的基础上拓展到添加学生成绩、删除学生成绩、查询学生成绩甚至查询班级的某一课程成绩。
能够在执行可运行程序之前读取文件以及在作了一系列修改之后将所键入的学生成绩等各项信息保存在指定的文件夹内。
以下是课程设计的详细要求。
成绩记录簿中记录以下数据:学号、姓名、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分;输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:8位数字;课程编号:5位数字;成绩:0 ~ 100 之间的整数,学分:1~ 5之间的实型数。
添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程成绩给出提示;查询(班级或个人)成绩:查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和已完成的总学分。
查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。
拓展功能:a) 程序启动时先从文件读入数据,如果文件中没有数据则给出提示;b) 每次修改的数据写入文件。
下面是要求的程序的主界面:二、功能描述按照要求的主界面的排布,我将程分为7个模块,依次为1、添加,2、删除,3、查学生成绩,4、查班级成绩,5、写入文件,6、读取文件,7、退出。
(1)、添加学生成绩摸块。
这一个模块又分为两个小模块,将学生的基本信息和学生的课程成绩分开添加,第一个小模块也就是学生的基本信息包括学生的学号、姓名和班级(见程序中第一个结构体);第二个小模块是学生的课程成绩其中包括学生的学号、课程编号、课程名字、成绩以及该门课程所占的学分(见程序中第二个结构体)。
第一个小模块和第二个小模块分别定义了一个函数insert1和insert2,最后用一个insert函数将两个小函数用一个switch语句连接起来。
(2)、删除学生成绩模块。
这一模块在思路上和第一个模块是一样的,都是用两个小函数分别将两个小模块写出来,再用一个函数将其连接起来,不作详细说明。
(3)、查询学生成绩模块。
这一个模块可以通过两种方法来查询学生的成绩,可以通过学号或是名字,只要在已存储的数据中含有该名学生的学号或是名字就会将这名学生的成绩信息输出到屏幕上,快捷,准确。
如果没有该名学生的学号或是名字信息,则程序将会返回到主界面,等待下一步操作。
(4)、查询班级成绩模块。
这一个模块通过输入班级以及想要查询的课程编号来查询该班级学生在该门课程的成绩并且成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。
(5)、写入文件模块。
因为可运行程序每运行一次数据不存储的话就会丢失,所以这个模块是为了将每次键入的学生信息完善以后按照指示存储到指定位置的文件里面去,以便于以后察看及导出。
(6)、读取文件模块。
就在刚才说过的导出文件中的信息就是这个模块的主要功能。
可以在刚开始运行程序的时候先选择读取文件,然后键入文件准确的位置信息,这样就可以将这个文件里面的学生的成绩等信息导入到程序的已以存储中,这样就不用每次都键入很多信息。
(7)、退出模块。
凡是程序有入口必须有出口,否则就不是一个很完善的程序。
这个模块就是提供这样一个出口的功能。
三、总体设计3.1 功能模块设计成绩记录簿的运行如上面的主要框架流程图所示,在检测键入的序号之后开始启动序号所对应的模块。
添加成绩和删除成绩都是对应的分为了两个小模块进一步运行的,一般都是通过先添加基本信息进去,再对应的添加进去基本信息所对应的课程成绩,而删除的时候是不用讲究次序的,可以直接通过键入学号,如果查找到对应的信息,则删除成功,若找不到也会提示删除不成功。
查询学生成绩与查询班级成绩的模块其实在原理上是一样的,只不过开始时输入的查询信息不一样。
一、主函数流程图(1) 主界面程序流程图:二、子函数(模块)流程图(1)、添加学生成绩(2)、删除学生成绩(3)、查询学生成绩(4)、查询班级成绩(5)、写入文件成绩(6)、读取文件成绩3.2 数据结构设计此程序中定义了两个结构体,以及全局变量,在这里着重说明一下这两个结构体的作用以及全局变量的使用。
1.student1结构体这是第一个结构体,它也是第一个模块添加成绩与第二个模块删除成绩中的学生基本信息的载体,如果没有它,那么这两个模块的分步骤添加或删除功能都不可能实现。
2.student2 结构体这是第二个结构体,它是学生详细的成绩信息,通过上面这个截图就能看变得很清楚,两个结构体所包含的元素不同,也使得他们两个的作用截然不同。
3.全局变量上面的截图是源程序中的一个全局变量,主要作用是用来控制后面程序中的for语句中的循环体。
3.3 函数功能描述(1)、isdigit()函数isdigit原型:extern int isdigit(char c);用法:#include <ctype.h>功能:判断字符c是否为数字说明:当c为数字0-9时,返回非零值,否则返回零。
附加说明此为宏定义,非真正函数。
(2)、strcmp()函数原型:extern int strcmp(const char *s1,const char * s2);所在头文件:string.h功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)说明:当s1<s2时,返回值<0当s1==s2时,返回值=0当s1>s2时,返回值>0即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
如:"A"<"B" "a">"A" "computer">"compare"特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
(3)、strcpy()函数原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
(4)、exit()函数函数名: exit()所在头文件:stdlib.h功能: 关闭所有文件,终止正在执行的程序。
exit(1)表示异常退出.这个1是返回给操作系统的不过在DOS好像不需要这个返回值exit(x)(x不为0)都表示异常退出exit(0)表示正常退出用法: void exit(int status);参数 : status //程序退出的返回值.(5)、sizeof()函数sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。
它在编译时起作用,而不是运行时。
sizeof 的结果等于对象或者类型所占的内存字节数四、程序实现4.1 源码分析1.头文件这是源程序的头文件,也就是我们所说的预处理命令。
如果你不认识其中一些头文件那么你看一看上面的函数介绍就会知道为什么会出现这些头文件。
2.主函数main( ){int t;while(1){printf("\n\n\n");printf(" *成绩记录簿*\n");printf("--------------------------------------------------------------------------------");printf(" 1: 添加\n");printf(" 2: 删除\n");printf(" 3: 查询学生成绩\n");printf(" 4: 查询班成绩\n");printf(" 5: 写入文件\n");printf(" 6: 读取文件\n");printf(" 0: 退出\n");printf("--------------------------------------------------------------------------------");printf(" 请输入数字选择: ");scanf("%d",&t);switch(t){case 1: insert();break;case 2: Delete();break;case 3: student_check();break;case 4: class_check(); break;case 5: in_file();break;case 6: read_file();break;case 0: exit(0);default: ;}}3.子函数(1)添加成绩void insert(){int z;printf(" 1.*添加学生基本信息*");printf(" 2.*添加学生成绩*\n");printf(" 0.*退出*\n");scanf("%d",&z);switch(z){case 1: insert1(); break;case 2: insert2();break;case 0: exit(0);default: ;}}(2)删除成绩void Delete(){int z;printf(" 1.*删除学生基本信息*");printf(" 2.*删除学生成绩*\n");printf(" 0.*退出*\n");scanf("%d",&z);switch(z){case 1: delete1(); break;case 2: delete2();break;case 0: exit(0);default: ;}}(3)查询学生信息void student_check(){int i,j,n,k,m=1,l=0,ii,nn,pp;printf(" 1。