
实习报告
题目:编制一个学生成绩管理系统的程序。
一:需求分析
(一) 设每个学生有如下的信息:
学号 姓名 年龄 性别 课 程
1
成绩 教师 课 程
2
成绩 教师
基本信息 所学的课程 1 信息 所学课程 2 信息
(二)采用 Hash 表加上课程链表的结构。其中 hash 表中存放每个学生的基本信息,并
由课程指针指向该同学所学的课程链表。
学号 姓名 年龄 性别
课程 成绩 教师
Hash 表长度=11
(三)对程序的具体要求:
1.建立 hash 表和成绩链表
(1) 输入 10 位同学信息
(2) hash 函数
。H=(学号的后四位)MOD 11
。用线性探测再散列法解决冲突
2.查询
(1) 显示全部信息
(2) 按学号查找
(3) 按姓名查找
(4) 按性别生查找
(5) 某年级查找
(6) 听某教师讲授课的全部学生
3.排序
(1) 按学号从小到大排序。
(2) 按年龄从小到大排序。
(3) 按按某一科成绩排序。
4.统计
(1) 男/女生人数。
(2) 每个人的平均成绩。
课程 成绩 教师
1

(3) 各科的平均年龄。
(4) 按年级统计平均成绩。
二:概要设计:
1.抽象数据类型定义如下:
InitHList(StudHash hashlist) ( 从文件中读取数据.建立 Hash 表和成绩链表)
void save(StudHash hashlist) { 存盘}
void Print(StudHash hashlist) { 打印函数}
void AllPrint(StudHash hashlist) { 显示全部信息}
void NumFind(StudHash hashlist) { 按学号查找}
void NameFind(StudHash hashlist) (按名字查找}
void SexFind(StudHash hashlist) { 按男女生查找}
void GCFind(StudHash hashlist) { 某年级的全部课程}
void TeacherFind(StudHash hashlist) { 听某个老师授课的所有学生}
void CourseFind(StudHash hashlist) { 选修某门课程的全部学生}
int chazhao(StudHash hashlist) { 实现查询菜单}
void QuickSort(long int *r,int head,int tail) { 把 r[s]至 r[t]的元素快速排序}
void Sift(int *r,int *flag,int l,int n) { 建堆的函数,用 flag[11]来记录哪些元素进行了交换}
void HeapSort(int *r,int *flag,int n) { 实现堆分类的函数}
void Merge(int *r,int l,int m,int h,int *r2 ) { 归并排序 }
void MSort(int *r,int l,int h,int *r1) { 将 r[l..h]归并排序为 r1[l..h]}
void SelectSort(int *r,int *flag,int n) { 选择排序}
int Sort(StudHash hashlist) { 实现排序菜单}
void SexStatictics(StudHash hashlist) { 按男/女生人数}
void MarkStatictics(StudHash hashlist) { 每个人的平均成绩}
void Mark1Statictics(StudHash hashlist) { 各年级第一门平均成绩}
void Mark2Statictics(StudHash hashlist) { 各年级第二门平均成绩}
void CouStatictics(StudHash hashlist) { 计算各门课程平均成绩}
Statictics(StudHash hashlist) { 实现统计菜单 }
int hashsearch(StudHash hashlist,long k) { 查询需更新的学生记录}
int hashinsert(StudHash hashlist) { 插入学生信息}
int hashdelete(hashlist){ 删除学生信息}
int Gengxin(hashlist) {实现更新菜单}
int Change(hashlist){实现插入/删除菜单}
2.主程序
Void main()
{ 初始化;
While{
接受命令;
处理命令。
}
}
3.本程序只有两个模块,调用关系很简单。
主程序模块 子程序模块
三. 详细设计:
2

基本数据类型:
typedef struct Course{
char KCM[30]; //课程名
int chengji; //成绩
char laoshi[N]; //教师姓名
struct Course *next;
}Course,*CourseList;
typedef struct Student{
long int xuehao; //学号
char xingming[10]; //姓名
int nianling; //年龄
char xingbie[6]; //性别
CourseList FirstCourse; //指向第一个课程纪录的指针
}Student,*StudHash;
主要函数调用关系图:
四:用户手册:
主函数 main( )
总菜单
查询
排序
统计
显示全部信息
按学号查找
按姓名查找
按性别查找
某年级课程
按老师查找
学号从大到小
年龄从小到大
成绩从大到小
男女生人数
个人平均成绩
年级平均成绩
功课平均成绩
按总成绩排序
3

如以上界面所示:选择您要的选项,就就可以进行相应的功能了。
五:测试数据:
先运行程序
选择 1。查询
选择 3。按姓名查询->输入名字赵甲
运行结果:
4

六:调试体会:
在此之前虽然已经学过 C 语言,但是由于自己的懒惰而并没有太多的实践,这一次数据
结构的课程设计使自己不得不耐下性子再把 C 语言的知识再复习一遍。C 语言的知识得到
了一定的巩固,自己的编程能力也得到了一定的提高。在编写程序的过程中难免遇到这样
那样的困难,但是自己也能够查阅资料,虚心向同学学习。解决了一系列的难题。这次数
据结构的课程设计对自己有很大帮助。在课程设计的要求中设计菜单的要求,在起初自己
一直认为做菜单需要特定的函数,在图书馆和网上找了很久也没有大的收获,后来在复习
C 语言书本 switch 语句的时候发现菜单可以通过用 case 调用函数来实现,最初的界面不是
很美观,后来经过同学的指点使用了 system(”cls”)进行清屏处理,再对 printf()函数作
了一些修改,使自己的界面有了很大的改进。
在编程的过程中也发生了很多常见的错误,再此也作一些总结,以提醒自己以后少犯
类似的错误:1:在调试的过程中添加语句时经常忘记加分号。2:经常未经定义便使用该
变量。3:忘记关闭文件。4:函数没有返回值。5:调用函数时经常忘记定义形参。6:
case 语句后忘记加上 break。这些都是不起眼的错误,但是却花费了自己大量的调试的时间,
希望自己能够在以后的编程过程中给予足够的重视。对数据结构,C 语言,和 Turbo C 都
有了进一步的理解,也增强了自己学习计算机知识的信心。虽然数据结构的课程已经结束
但是自己仍应该不断的复习,不断的提高自己。
7:程序附录:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define yishanchu 0 //定义删除标记
#define N 10
#define OK 1
//********课程信息********//
typedef struct Course{
char KCM[30];
int chengji;
char laoshi [N];
struct Course *next;
}Course,*CourseList;
//************学生基本信息************//
typedef struct Student{
long int xuehao;
char xingming[10];
int nianling;
char xingbie[6];
CourseList FirstCourse;
}Student,*StudHash;
//****************1.建立 Hash 表和成绩链表***************//
5
评论2