学生成绩管理程序设计讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学生成绩管理程序设计
目录
摘要 (1)
1.绪论 (1)
2. 系统分析 (1)
2.1功能需求 (1)
2.2数据需求 (1)
2.3性能需求 (2)
3. 总体设计 (2)
3.1功能模块设计 (2)
3.2系统设计方案 (2)
4总体设计 (3)
4.1学生信息录入管理模块 (3)
4.2学生成绩信息统计管理模块 (4)
4.3学生排名管理模块 (4)
4.4学生信息修改管理模块 (5)
5. 调试与测试 (6)
5.1调试 (6)
5.2测试 (7)
6. 结论 (7)
结束语 (7)
参考文献 (8)
附录1-用户手册 (9)
摘要
学生成绩信息管理程序是一个学校不可缺少的部分,学校可以利用这套程序进行学生的成绩信息管理,也方便查询修改学生的成绩各项信息,可以提高管理工作的效率。

本系统使用C语言作为开发工具的,开发学生成绩信息管理系统,实现了录入学生成绩信息,按姓名、学号等条件删除学生成绩信息。

本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。

关键词:学生成绩信息管理;删除; C语言
1.绪论
随着科技的发展,愈来愈多的学校选择了运用学生成绩信息管理程序来管理学生成绩信息。

学生成绩信息管理程序是一个学校不可缺少的部分,学校可以利用这套程序进行学生的成绩信息管理,也方便查询修改学生的各项信息,可以提高管理工作的效率和简化管理工作的程序。

有利的为公司节省了运作成本,优化资源利用率,这也正是编写本程序的目的所在。

根据课程设计任务书要求,本系统开发主要完成以下功能和性能。

1.录入学生数据信息(不用考虑学期),学生信息至少包括姓名、学号、语
文、数学、英语成绩,学生信息应及时保存在文件中;
2.根据学号删除某生信息;
3.能够计算平均分并显示所有学生名次。

2. 系统分析
2.1 功能需求
本系统主要是企业对职工信息简单管理的系统。

该系统需要有录入信息,删除信息,统计信息,循环显示主菜单,保存信息的功能,并且利用显示函数将学生的所有信息显示出来。

2.2数据需求
需要向系统输入学号,姓名,语文、数学、英语成绩等信息。

2.3 性能需求
在运行本程序时只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠。

3. 总体设计
3.1功能模块设计
根据分析整个系统主要划分为5个功能模块,分别执行要求中的功能。

该系统需要有录入,利用显示函数将职工所有信息显示,删除,修改,按指定条件查询,统计,查询,保存信息,循环显示主菜单功能。

功能模块图如图1所示。

图1功能模块图
(1)学生成绩信息录入管理模块
该模块分为
①学号号录入,姓名录入,姓名,语文、数学、英语成绩等信息
②按‘0’键结束录入,实现模块退出,返回主菜单。

(2)成绩信息统计管理模块
该模块是显示学生名次功能。

(3)主函数模块
该模块是显示主菜单功能。

(4)成绩排名模块
该模块是显示学生名次功能。

3.2系统设计方案
设计一个总菜单,由于该系统涉及多个学生的成绩存储,因此,定义一个数据结构,
用于存储这些信息。

现仅对学生语文成绩、数学成绩、英语成绩进行统计管理。

建立以下数据结构:
class Student
{
public:
char number[Max]; //存储学生学号
char name[Max]; //存储学生姓名
double chinese; //存储语文成绩
double math; //存储数学成绩
double english; //存储英语成绩
double total; //总成绩
double average; //平均成绩
int rank; //排名
};
4. 详细设计
4.1学生信息录入管理模块
成绩录入就是对前面定义的类Student中的成员进行赋值。

其中,用户需要输入的是学生的学号、姓名两个基本信息和语文、数学和英语三门成绩,其余总成绩、平均成绩和排名由后续的计算函数来实现。

实现成绩录入模块的函数代码如下:
void setData(Student &s) //成绩录入模块
{
cout<<"输入学号,姓名,语文,数学,英语成绩:"; //录入数据
cin>>s.number>>>>s.chinese>>s.math>>s.english;
s.total=0; //初始化
s.average=0;
s.rank=0;
}
该函数运行时其结果如下图所示:
输入学生信息的个数可在主函数用修改相应数值。

图2 学生信息录入管理图
4.2学生成绩信息统计管理模块
成绩统计模块需要建立在成绩录入模块的基础之上,当系统中已经包含一些数据记录后才能对这些成绩求总分、平均分等操作。


图3 学生成绩信息统计流程图
4.3学生排名管理模块
在获得整个班级的总分和平均分之后,就可以对该班级中的同学按照某个参数进行排名了。

在该系统中,使用每位同学的平均成绩对其进行排名,此处使用插入排序来实现。

插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止,其算法流程图如下:
图4学生排名管理模块流程图
4.4学生信息修改管理模块
该系统中的成绩查询工嫩嫩个是根据用户输入的学生的学号作为关键字,在数据结构中进行查询,并将查询结果即该记录的位置返回,第一行代码函数的生命中,参数字符串n 即为用户输入的需要查询的学生学号,将该学号与所有数据元素进行比较,找到则返回该元素的位置,否则返回-1。

该函数执行的流程图如下图:
图5 学生信息修改管理流程图
5. 调试与测试
5.1 调试
调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。

调试的任务是及时改正测试过程中发现的软件错误。

具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。

然后仔细研究推断代码以确定问题的原因,并设法改正。

调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。

本系统调试过程中遇到问题、原因和解决方法如下面介绍。

(1)程序不能运行
定义的指针,很多次引用,过个函数里面,定义的不明确,造成错误连连发生。

(2)不能正确输出信息,有乱码现象
原因是键入信息的时候,没有一一对应,逗号的位置不正确,后来,用的是信息逐一输入,保证了信息的一一对应和高度的准确性,使程序可以正常运行。

(3)程序运行途中,出现错误,被迫中止
其中定义字符数组,却没有定义长度,导致定义类型变成了字符型,而不能接受字符串,因此出现了错误。

5.2 测试
软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。

或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。

过度测试则会浪费许多宝贵的资源。

到测试后期,即使找到了错误,然而付出了过高的代价。

6. 结论
系统实现功能:
该系统实现对学生成绩管理功能,主要包括成绩录入、计算总分和平均分、成绩排名和成绩查询。

系统设计中的难点:
在程序开发阶段,main函数定义、输出模块及数据结构方面存在一定难点,而后参考部分文献决绝该问题。

系统不足之处:
为系统实现简单,并没有对班级进行分类,而且仅仅以三门学科进行数据统计。

结束语
通过本次的课程设计,让我学会了把书本上的知识应用到了实际中来。

虽然在这几周中有过挫折和坎坷,有的问题一直到了最后才被解决,但是我认为这未
必就不是好事,这样能锻炼我的意志,磨练我的耐心,失败是成功之母,这话一点都没错,没有失败就没有成功。

让我没有失去信心的是关怀我们的老师,当我们有了问题和疑问,老师就很耐心的给予讲解,让我们有了一个良好的学习氛围。

参考文献
[1] 谭浩强. C语言程序设计(第三版).北京:清华大学出版社,2005.7
附录1-用户手册
首先输入3组同学数据信息
1)打印所有排名
2)打印出成绩在全班平均分以上的学生名单和数据信息
3)任意输入一个学号,查找出该学生在班级中的排名及其考试成绩
附录2-源程序
#include "stdafx.h"
#include<iostream>
#include<cstdio>
using namespace std;
const int Max=5; //字符串最大长度
class Student;//类声明
void setData(Student &s); //设置对象s的数据
void count(Student &s); //计算对象s的总分,平均分void sort(Student S[],int N);
//把长度为N的对象数组S,按平均分排序double getAverage(Student S[],int N);
//计算全班的平均分
void print(Student &s); //打印信息
int search(Student S[],int N,char *n);//从长度为M的对象数组中,查找学号n的位置class Student
{
public:
char number[Max]; //学号
char name[Max]; //姓名
double chinese; //语文成绩
double math; //数学成绩
double english; //英语成绩
double total; //总分
double average; //平均分
int rank; //只有比较才不为了0
};
void setData(Student &s) //成绩录入模块
{
cout<<"输入学号,姓名,语文,数学,英语成绩:";//录入数据
cin>>s.number>>>>s.chinese>>s.math>>s.english;
s.total=0;//初始化
s.average=0;
s.rank=0;
}
void count(Student &s) //成绩统计
{
s.total=s.chinese+s.math+s.english; //求三门课程的总分
s.average=s.total/3; //求三门课程的平均分
}
void sort(Student S[],int N) //插入法排序(成绩排名)
{
int index; //定义变量
Student inserter; //创建对象
for(int i=1;i<N;i++) //循环
{
inserter=S[i]; //对象初始化
index=i-1; //变量初始化
while(index>=0&&inserter.average>S[index].average)
//比较
{
S[index+1]=S[index]; //元素后移
index--;
}
S[index+1]=inserter; //插入该元素}
for(int j=0;j<N;j++)
S[j].rank=j+1; //设置排名
}
double getAverage(Student S[],int N) //求平均分函数
{
double Average=0; //变量定义并初始化
for(int i=0;i<N;i++) //循环
Average+=(S[i].chinese+S[i].math+S[i].english);
//求所有学生的所有成绩和Average/=(N*3); //求所有学生的成绩平均值return Average; //返回该平均值
}
void print(Student &s) //输出结果
{
cout<<"排名"<<"\t"<<"学号"<<"\t"<<"姓名"<<"\t"<<"语文:"<<"\t"
//定义输出格式<<"数学:"<<"\t"<<"英语:"<<"\t"<<"总分"<<"\t"<<"平均分"<<endl;
cout<<s.rank<<"\t"<<s.number<<"\t"<<<<"\t"<<s.chinese<<"\t"
//输出成员的值<<s.math<<"\t"<<s.english<<"\t"<<s.total<<"\t"<<s.average<<endl;
}
int search(Student S[],int N,char *n) //成绩查询模块
{
for(int i=0;i<N;i++) //在所有记录中查询
{
if(strcmp(S[i].number,n)==0) //找到
return i; //返回结果所在的位置}
return -1; //没有找到
}
int main() //系统集成
{
const int M=3;
Student S[M];
for(int i=0;i<M;i++)
{
cout<<"下面输入第"<<i+1<<"位同学的数据:"<<endl;
setData(S[i]);
count(S[i]);
cout<<endl;
}
sort(S,M);
int order=1;
while(order!=4)
{
cout<<"*****************************命令菜单******************************"<<endl;
cout<<"1.打印所有排名"<<endl;
cout<<"2.打印出成绩在全班平均分以上的学生名单和数据信息"<<endl;
cout<<"3.任意输入一个学号,查找出该学生在班级中的排名及其考试成绩"<<endl;
cout<<"4.退出系统"<<endl;
cout<<"*********************************************************** ********"<<endl;
cout<<"输入命令选择:";
cin>>order;
switch(order)
{
case 1:
{
for(int j=0;j<M;j++)
print(S[j]);
}
break;
case 2:
{
double compare=getAverage(S,M);
for(int k=0;k<M;k++)
if(S[k].average>compare)
print(S[k]);
}
break;
case 3:
{
char code[Max];
cout<<"输入您要查找的学号:";
cin>>code;
int result=search(S,M,code);
if(result==-1)
cout<<"您输入的学号不存在"<<endl;
else
print(S[result]);
}
break;
case 4:
break;
default:
cout<<"输入的命令不存在"<<endl;
}
}
return 0;
}
完成日期:2012年07月10日。

相关文档
最新文档