综合性实验报告
       
华南师范大学研究生学费
课程名称:
C语言程序设计》
实验题目:
班级成绩管理系统的设计与实现
姓名学号:
(组长)
    别:
专业班级:
指导教师:
实验日期:
20120601—0620
杨梅汁怎么洗干净
                                                                   
一、实验目的和要求
实验目的
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
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};
index数组为排名索引(约定为降序),存储每位学生总成绩在tscore 数组中的名次(即index[0]存放了总分第一的学生在tscore数组中的下标, index[1]存放了总分第二的学生在tscore数组中的下标,依次类推):
    int  index[Mmax];
M为实际学生数; N为实际课程数; M、N的值要根据插入或删除学生记录情况加以适时修改:
int  M=4, N=3;
2、模块划分
依据程序的数据结构和功能,遵照“自顶向下”原则,采用基于函数的逐步求精法,描述该程序的层次结构。该程序可按给定的程序功能直接描述模块层次结构。该程序要求保留一种排序状态:按总分排序。
在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  按总分降序浏览全部学生信息
void displaystusort(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int *pindex, int m, int n)
1-6  添加新的学生记录
void insert(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int *pm, int n)
1-7  用单链表进行班级成绩管理
void linkprocess()
2-1  按总分递减排序
void sortscore(float *ptscore, int *pindex, int m)
2-2  输入和添加学生信息
m哥struct student *appendstuinfo(struct student *head)
2-3  浏览学生信息
void displaylist(struct student *head)
2-4  保存学生信息
void savestuinfo(struct student *head)
模块层次结构只是确定模块之间的关系和函数原型,不是程序的执行步骤。程序总体框架是该程序的总体流程图。该程序不是顺序执行全部功能,而是在某一时刻有选择地执行一种或多种功能。因此,选用菜单方式是较佳的方案。
三、小组各成员分工协作情况说明
    成员:            负责编写的函数是:                                   
    成员:            负责编写的函数是:                                   
    成员:            负责编写的函数是:                                   
四、编程体会(或是对实验系统做进一步改进的思考)
五、程序代码
以下给出了程序的基本框架,请完成函数的功能及函数调用等程序代码的编写工作。
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#define  Mmax  120  /*记录最大学生数*/
#define  Nmax  3    /*记录学生选课最大课程数目*/
char course[Nmax][50] = {"Chinese","Mathematic","English"};//以全局变量的形式给出各门课程的名称
/*当使用单链表进行班级成绩管理时,使用如下的结构体类型*/
妈妈怀里的歌struct student
{   
    char    code[11];   
    char    name[20];    /* 姓名 */
    float    score[Nmax]; /* 各课程成绩 */
    float  total;        /* 总分 */
    struct student  *next;
};
/*以下是各函数的声明,其中下面的7个函数和main函数是首先要实现的*/
void  averagemark(float (*pscore)[Nmax], float *pavecourse, int m, int n);
void  totalmark(float (*pscore)[Nmax], float *ptscore, int m, int n);
int    retrievebyn(char (*pname)[20], char *pnamesearch, int m);
void  displaystu(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int m, int n);