《学生成绩管理系统》编程
};struct student stu[N]; /* 定义结构体数组,存贮
多个学生的记录*/
三、数据结构设计描述
系统功能描述
1能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。
2能够以表格的形式输出学生记录
3能够按照学生三科的平均成绩进行排序
4能够按照学生的单科成绩进行排序
5能够按照学号查询学生记录
N-S流程图: temp=head->next,head->next=NULL
当temp!=NULL时
t=temp;temp=temp->next;p1=head;p2=head; 当t->average<p1->average&&p1!=NULL时
p2=p1;p1=p1->next; p1=p2
是否 t->next=p1; t->next=p1; head=t; p2->next=t;
for(;;)
head=NULL
指针p指向新开辟的单元
指针p是否为空
是否
输入学号p->num
输出 p->num是否为0
内存 是 否
溢出
>name
停止 for(i=0;i<3;i++)
输入 输入成绩
返回
p->sum=s;
输入姓名p-
菜单
p->average=(float)s/3; p->order=0;
按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。
4、回到主菜单,输入1,回车 每10个暂停显示数据
5、回到主菜单,输入2,回车 出现排序成功信息。
6、回到主菜单,输入3,回车 出现排序成功信息。
7、回到主菜单,输入5,回车 按提示插入一组数据
6往表中插入学生记录
7从表中删除学生记录
8存储记录到文件中
9从文件中读取记录
10退出
数据字典
1数据流条目
数据流名称:全部记录
别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录<>旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车;
1、 成绩录入 2、 成绩查询 3、 成绩统计 4、 退 出
(2)各菜单项功能
1 成绩录入:输入学生的学号、姓名及三门课的成绩;
2 成绩查询:(至少一种查询方式)。
按学号查询学生记录。
查询不及格学生的记录。
③成绩统计:
计算学生的平均分;
根据学生的平均分高低,对学生的数据进行排序后输出;
对学生单科成绩排序,输出学生姓名与该科成绩;
自定义输入控制函数
五、系统各模块(函数)的组成。功能、参数说明、相互调用关系 主函数 main() 利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入 的数字选项来调用相应的函数。 初始化函数 STUDENT *init() 这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使 head的值为NULL。比如:没有这个函数的话,在你没有输入任何数据的 情况下,去执行显示功能的时候会显示一些乱码! 菜单选择函数 int menu_select(); 这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显 示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系 统当前的时间。等执行完每一个函数功能后,按任一键回到主界面也要 通过这个函数来实现! 输入记录函数 STUDENT *create() 这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停 止输入,函数结束后,带回一个指向链表头的指针head。 输入记录函数 STUDENT *create() 这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停 止输入,函数结束后,带回一个指向链表头的指针head。 显示记录函数 void print(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部 学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。 查找记录函数 void search(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号 对某个学生进行查找,并显示所查找到的记录。 删除记录函数 STUDENT *delete(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,先输入要删除的学生记 录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。
④退出系统:退出整个系统(即主菜单)。
(3)结构体数组:
#define N 30
struct student
{int num;
/* 定义学号*/
char name[20]; /* 定义姓名*/
float score[3]; /* 定义存贮三门课成绩的数组*/
float average; /* 定义平均成绩*/
《学生成绩管理系统》 课程设计报告
专 业: 软 件 学 院 班 级: 计HR-06-7班 姓 名: 李 政 源 指导教师: 李 建 中
学 号: 0620010710
课程设计报告
一、课程设计题目 1 基本要求题目:矩阵乘法。 2 综合训练:学生成绩管理系统
二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2 列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结 果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等 的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、 三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以 下功能: (1)主菜单 学生成绩管理系统
排序函数 STUDENT *sort(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高 低进行排序,还可以显示名次。 插入函数 STUDENT *insert(STUDENT *head,STUDENT *new) 这是一个有参函数,形参有两个,一个是“链表头的指针”,一个 是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重 新进行排序,并返回。 保存数据到文件函数 void save(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生 记录保存在电脑上由自己任意命名的二进制文件。 从文件读数据函数 STUDENT *load() 这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的 文件地址进行读取
六、各功能模块的算法处理流程图及相关说明 1、主函数 main() 2、初始化函数 STUDENT *init() 3、菜单选择函数 int menu_select(); 4、输入记录函数 STUDENT *create() 算法:先声明一个首节点head,并将head->next设为NULL。每输入一个 数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的 尾端。 N-S流程图如下:
p1=head;
输入入要删除的学号s 当(strcmp(p1->num,s))&& p1 !=
NULL
p2=p1 p1=p1->next
p1是要删除的结点 是否 p1所指是头结点 是 否 输出”找不
到” head=p1->next p2->next=p1-next 的 信息“ (删除头结点)
8、排序函数 STUDENT *sort(STUDENT *head)
Delete a record from list 从表中删除记录 Save the file 将单链表中记录保存到文件中 Load the file 从文件中读入记录*/ Quit 退出 STUDENT *init() 初始化链表 STUDENT *create()创建链表,完成数据录入功能 inputs(char *prompt, char *s, int count)
p1=head; 当p1!=NULL时
i++;p1->order=i;p1=p1->next; 输出“排序成功”
9、 入函数 STUDENT *insert(STUDENT *head,STUDENT *new) 算法:先将学生的成绩按平均分由高分到低分进行排序,再插入一个新 生的结点,要求按平均分的高低顺序插入。先用指针变量p0指向待插入 的结点,p1指向第一个结点。如果p0->average<p1->average,则待插 入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才 p1所指的结点。重复以上的步骤,直到p0->average>=p1->average为 止。这时将p0指向的结点插到p1所指结点之前。但是如果p1所指的已是 表尾结点,则p1就不应后移了。如果p0->average比所有结点的average 都小,则应将p0所指的结点插到链表末尾。如果插入的位置既不在第一 个结点之前,又不在表尾结点之后,则将p0的值赋给p2->,使p2->next 指向待插入的结点,然后将p1的值赋给p0->next,使得p0->next指向p1 指向的变量。如果插入位置为第一个结点之前,则将p0赋给head,将p1 赋给p0->next。如果要插到表尾之后,应将p0赋给p1->next,NULL赋给 p0->next。最后再调用排序的函数,将学生成绩重新排序. N-S流程图如下: