《c语言程序设计》-综合性实验实验报告(参考格式)
- 1 - 综合性实验报告课程名称: 《C 语言程序设计 》 实验题目: 班级成绩管理系统的设计与实现 姓名学号: (组长) 系 别: 专业班级: 指导教师:- 2 - 实验日期: 2012 年 06 月 01 日—06 月 20 日一、实验目的和要求 实验目的 1、利用所学的三种程序基本结构以及数组、用户自定义函数进行一个小型程序的设计, 进一步理解和掌握 C 语言的语法以及三种基本程序结构的综合应用。 2、通过程序中涉及到的排序、查找、求和等操作加深对算法、程序设计思路、常用程 序设计技巧的理解与掌握,逐步培养学生的程序开发能力。 实验要求 1、根据实验内容,认真编写源程序代码、上机调试程序,书写实验报告。 2、分小组协作实验时,要写明每一位学生负责的实验内容。 二、设计要求 (一)学生信息和程序功能 给定的原始数据和程序应实现的功能是该 C 程序开发的依据,此实验只处理一个班级 学生信息,最多学生数为 120 人。 1、学生信息和数据类型 最多学生人数和最多课程数定义为全局符号常量: #define Mmax 120 #define Nmax 3 (1)学生信息 学生信息包含:学号,姓名,三门课(语文,数学,英语)成绩和总分。 (2)数据类型 学号、姓名、课程三个信息为 char 型,课程分数和总分为 float 型,其余为 int 型。其 中,假设学号有 10 位数字字符(注意此时要求存储空间要 11 个字节),例如 2011023102 表示入学年份为 2011 年,023 是专业编码,102 是学生在班级中的排号。 2、测试数据 测试数据在定义数组时以初值形式提供,其中学生总成绩通过程序计算。 学号 姓名 语文 数学 英语 2011023001 Zhang 73.5 85 67 2011023002 Li 83 91.5 87 2011023003 Cheng 65 82 78- 3 - 2011023004 Wang 71 83 80.5 但是,在用单链表处理学生信息时,要求直接从键盘上接收数据。 3、程序功能 (1)学生信息(学号、姓名、成绩等)的显示(数据结构要求用数组) ; (2)按姓名查找学生(数据结构要求用数组) ; (3)计算各门课程的平均分(数据结构要求用数组) ; (4)计算学生总成绩,并按总成绩进行排序(数据结构要求用数组) ; (5)按总成绩降序显示学生信息; (6)学生记录的插入; (7)用单链表(结构体)处理班级学生信息(学号、姓名、成绩等) ,包括学生信息 输入(添加) 、学生信息浏览、学生总成绩计算和将学生信息存入文件。 其中第(7)为选作内容,如果学生能够做出来,实验成绩应给予加分奖励。 (二)程序总体设计 1、数据结构 依据给定的学生信息和数据类型,定义相应的数组和结构体类型分别如下: 课程名称定义为全局数组: char course[Nmax][50] = {“Chinese“,“Mathematic“,“English“}; 学生结构体类型如下: struct student { char code[11]; /* 学号 */ char name[20]; /* 姓名 */ float score[Nmax]; /* 各课程成绩 */ float total; /* 总分 */ struct student *next; }; 以下的数组或变量均为局部类型的(可放在 main 函数中加以定义): sno 数组存储学生学号,可事先加入初始数据若干条: char sno[Mmax][11]={“2011023001“,“2011023002“,“2011023003“,“2011023004“}; name 数组存储学生姓名,可事先加入初始数据若干条; namesearch 数组用于存储 要查找的学生姓名: char name[Mmax][20]={“Zhang“,“Li“,“Cheng“,“Wang“}, namesearch[20]; score 数组存储学生成绩;假设至多有 M 名学生,N 门课程,可事先加入初始数 据若干条; avecourse 数组存储每门课程的平均分,实际计算时可事先初始化: float score[Mmax][Nmax]={ {73.5,85,67}, {83,91.5,87},{65, 82, 78},{71,83,80.5}}; float avecourse[Nmax]={0}; tscore 数组存储每位学生成绩的总分: float tscore[Mmax]={0};- 4 - index 数组为排名索引(约定为降序) ,存储每位学生总成绩在 tscore 数组中的名 次(即 index[0]存放了总分第一的学生在 tscore 数组中的下标, index[1]存放了总 分第二的学生在 tscore 数组中的下标,依次类推): int index[Mmax]; M 为实际学生数; N 为实际课程数; M 、N 的值要根据插入或删除学生记录情况加 以适时修改: int M=4, N=3; 2、模块划分 依据程序的数据结构和功能,遵照“自顶向下”原则,采用基于函数的逐步求精法, 描述该程序的层次结构。该程序可按给定的程序功能直接描述模块层次结构。该程序要求 保留一种排序状态:按总分排序。 图 1 模块层次结构 1-1 计 算 所 有 课 程 的 平 均 分 1-2 计 算 每 位 学 生 所 修 课 程 总 分 1-5 按 总 分 降 序 浏 览 全 部 学 生 信 息 1-6 添 加 新 的 学 生 记 录 1-4 浏 览 全 部 学 生 信 息 1-7 用 单 链 表 进 行 班 级 成 绩 管 理 1-3 按 姓 名 查 找 学 生 记 录 main 2-2 输入 和添 加学 生信 息 2-3 浏览 学生 信息 2-4 保存 学生 信息 2-1 按总 分递 减排 序- 5 - 在 C 语言中,模块用函数实现,函数原型清单如下(注意:以下各函数原型中很多地 方用到了指向一维数组的指针变量或指向二维数组的指针变量,也可以将之对应的定义为 形参数组的形式进行处理): 1-1 计算所有课程的平均分 void averagemark(float (*pscore)[Nmax], float *pavecourse, int m, int n) 1-2 计算每位学生所修课程总分 void totalmark(float (*pscore)[Nmax], float *ptscore, int m, int n) 1-3 按姓名查找学生记录 int retrievebyn(char (*pname)[20], char *pnamesearch, int m) 1-4 浏览全部学生信息 void displaystu(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int m, int n) 1-5 按总分降序浏览全部学生信