《学生成绩管理系统》编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p->next=head;head=p;
5、 记录函数 void print(STUDENT *head) 算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数 据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p 结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为 止。
《学生成绩管理系统》 课程设计报告
专 业: 软 件 学 院 班 级: 计HR-06-7班 姓 名: 李 政 源 指导教师: 李 建 中
学 号: 0620010710
课程设计报告
一、课程设计题目 1 基本要求题目:矩阵乘法。 2 综合训练:学生成绩管理系统
二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2 列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结 果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等 的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、 三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以 下功能: (1)主菜单 学生成绩管理系统
六、各功能模块的算法处理流程图及相关说明 1、主函数 main() 2、初始化函数 STUDENT *init() 3、菜单选择函数 int menu_select(); 4、输入记录函数 STUDENT *create() 算法:先声明一个首节点head,并将head->next设为NULL。每输入一个 数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的 尾端。 N-S流程图如下:
N-S流程图如下: 点
p=head,使指向第一个结点 输出p所指向的结
p指向一下个结点 当p指的不是表尾
6、 找记录函数 void search(STUDENT *head) 算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号 s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。 N-S流程图如下:
6往表中插入学生记录
7从表中删除学生记录
8存储记录到文件中
9从文件中读取记录
10退出
数据字典
1数据流条目
数据流名称:全部记录
别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录<>旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车;
按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。
4、回到主菜单,输入1,回车 每10个暂停显示数据
5、回到主菜单,输入2,回车 出现排序成功信息。
6、回到主菜单,输入3,回车 出现排序成功信息。
7、回到主菜单,输入5,回车 按提示插入一组数据
8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息
9、回到主菜单,输入4,回车 输入学号进行查询
10、回到主菜单,输入1,回车 出现统计信息
11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统 四、各变量的定义和作用 #define N 3 定义常数 typedef struct z1 定义数据结构 { char no[11]; char name[15]; int score[N]; float sum; float average; int order; struct z1 *next; }STUDENT; char *menu[] 定义菜单字符串数组 Enter list 输入记录 Print list 显示单链表中所有记录 Sort to make new file 按照总成绩排序 sort to Single course result 按照单科成绩排序 Search record on ID 按照学号查找记录 Insert record to list 插入记录到表中
自定义输入控制函数
五、系统各模块(函数)的组成。功能、参数说明、相互调用关系 主函数 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”进行删除。
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)
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;
排序函数 STUDENT *sort(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高 低进行排序,还可以显示名次。 插入函数 STUDENT *insert(STUDENT *head,STUDENT *new) 这是一个有参函数,形参有两个,一个是“链表头的指针”,一个 是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重 新进行排序,并返回。 保存数据到文件函数 void save(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生 记录保存在电脑上由自己任意命名的二进制文件。 从文件读数据函数 STUDENT *load() 这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的 文件地址进行读取
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流程图如下:
输入要查找的学生的学号s
p=head,使p指向第一结点
当记录的学号不是要找的,或指针不为空时
p=p->next p!=NULL如果指针不为空
是否 显示没有该
输出p所指向的结点 学生
7、删除记录函数 STUDENT *delete(STUDENT *head)
算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入 的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p 后移一个结点,再如此进行下去,直到遇到表尾为止。 N-S流程图如下:
Delete a record from list 从表中删除记录 Save the file 将单链表中记录保存到文件中 Load the file 从文件中读入记录*/ Quit 退出 STUDENT *init() 初始化链表 STUDENT *create()创建链表,完成数据录入功能 inputs(char *prompt, char *s, int count)
1、 成绩录入 2、 成绩查询 3、 成绩统计 4、 退 出
(2)各菜单项功能
1 成绩录入:输入学生的学号、姓名及三门课的成绩;
2 成绩查询:(至少一种查询方式)。
按学号查询学生记录。
查询不及格学生的记录。
③成绩统计:
计算学生的平均分;
根据学生的平均分高低,对学生的数据进行排序后输出;
对学生单科成绩排序,输出学生姓名与该科成绩;
};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;
④退出系统:退出整Hale Waihona Puke Baidu系统(即主菜单)。
(3)结构体数组:
#define N 30
struct student
{int num;
/* 定义学号*/
char name[20]; /* 定义姓名*/
float score[3]; /* 定义存贮三门课成绩的数组*/
float average; /* 定义平均成绩*/
5、 记录函数 void print(STUDENT *head) 算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数 据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p 结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为 止。
《学生成绩管理系统》 课程设计报告
专 业: 软 件 学 院 班 级: 计HR-06-7班 姓 名: 李 政 源 指导教师: 李 建 中
学 号: 0620010710
课程设计报告
一、课程设计题目 1 基本要求题目:矩阵乘法。 2 综合训练:学生成绩管理系统
二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2 列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结 果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等 的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、 三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以 下功能: (1)主菜单 学生成绩管理系统
六、各功能模块的算法处理流程图及相关说明 1、主函数 main() 2、初始化函数 STUDENT *init() 3、菜单选择函数 int menu_select(); 4、输入记录函数 STUDENT *create() 算法:先声明一个首节点head,并将head->next设为NULL。每输入一个 数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的 尾端。 N-S流程图如下:
N-S流程图如下: 点
p=head,使指向第一个结点 输出p所指向的结
p指向一下个结点 当p指的不是表尾
6、 找记录函数 void search(STUDENT *head) 算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号 s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。 N-S流程图如下:
6往表中插入学生记录
7从表中删除学生记录
8存储记录到文件中
9从文件中读取记录
10退出
数据字典
1数据流条目
数据流名称:全部记录
别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录<>旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车;
按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。
4、回到主菜单,输入1,回车 每10个暂停显示数据
5、回到主菜单,输入2,回车 出现排序成功信息。
6、回到主菜单,输入3,回车 出现排序成功信息。
7、回到主菜单,输入5,回车 按提示插入一组数据
8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息
9、回到主菜单,输入4,回车 输入学号进行查询
10、回到主菜单,输入1,回车 出现统计信息
11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统 四、各变量的定义和作用 #define N 3 定义常数 typedef struct z1 定义数据结构 { char no[11]; char name[15]; int score[N]; float sum; float average; int order; struct z1 *next; }STUDENT; char *menu[] 定义菜单字符串数组 Enter list 输入记录 Print list 显示单链表中所有记录 Sort to make new file 按照总成绩排序 sort to Single course result 按照单科成绩排序 Search record on ID 按照学号查找记录 Insert record to list 插入记录到表中
自定义输入控制函数
五、系统各模块(函数)的组成。功能、参数说明、相互调用关系 主函数 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”进行删除。
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)
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;
排序函数 STUDENT *sort(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高 低进行排序,还可以显示名次。 插入函数 STUDENT *insert(STUDENT *head,STUDENT *new) 这是一个有参函数,形参有两个,一个是“链表头的指针”,一个 是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重 新进行排序,并返回。 保存数据到文件函数 void save(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生 记录保存在电脑上由自己任意命名的二进制文件。 从文件读数据函数 STUDENT *load() 这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的 文件地址进行读取
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流程图如下:
输入要查找的学生的学号s
p=head,使p指向第一结点
当记录的学号不是要找的,或指针不为空时
p=p->next p!=NULL如果指针不为空
是否 显示没有该
输出p所指向的结点 学生
7、删除记录函数 STUDENT *delete(STUDENT *head)
算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入 的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p 后移一个结点,再如此进行下去,直到遇到表尾为止。 N-S流程图如下:
Delete a record from list 从表中删除记录 Save the file 将单链表中记录保存到文件中 Load the file 从文件中读入记录*/ Quit 退出 STUDENT *init() 初始化链表 STUDENT *create()创建链表,完成数据录入功能 inputs(char *prompt, char *s, int count)
1、 成绩录入 2、 成绩查询 3、 成绩统计 4、 退 出
(2)各菜单项功能
1 成绩录入:输入学生的学号、姓名及三门课的成绩;
2 成绩查询:(至少一种查询方式)。
按学号查询学生记录。
查询不及格学生的记录。
③成绩统计:
计算学生的平均分;
根据学生的平均分高低,对学生的数据进行排序后输出;
对学生单科成绩排序,输出学生姓名与该科成绩;
};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;
④退出系统:退出整Hale Waihona Puke Baidu系统(即主菜单)。
(3)结构体数组:
#define N 30
struct student
{int num;
/* 定义学号*/
char name[20]; /* 定义姓名*/
float score[3]; /* 定义存贮三门课成绩的数组*/
float average; /* 定义平均成绩*/