{ 基于JAVA面向对象的学籍管理系统 }
体系结构设计说明
版 本 历 史
目 录
1. 文档介绍... 4
1.1 文档目的... 4
1.2 文档范围... 4
1.3 读者对象... 4
1.4 参考文献... 4
1.5 术语与缩写解释... 4
2. 系统概述... 5
2.1 功能性需求分类... 5
2.2 学籍信息管理... 5
3. 设计约束... 5
4. 设计策略... 6
5. 系统总体结构... 6
6. 开发环境的配置... 6
7. 运行环境的配置... 6
本文档用于描述“基于JAVA面向对象的学籍管理系统”的项目系统总体体系结构设计。
提示:列出本文档的所有参考文献(可以是非正式出版物),格式如下:
[标识符] 作者,文献名称,出版单位(或归属单位),日期
例如:
《Thinking in Java》Brucce Eckel 2002
《JDK1.6 文档》java.sun.com
(1)本系统设计目的
(2)本学籍管理系统主要功能是。。。。。。。
提示:
(1)需求约束。系统设计应遵循需求文档《软件需求规格说明书》相关描述:
(2)隐含约束。本系统应为后续基于JAVA面向对象的学生成绩管理系统项目的系统架构提供参考。
本系统设计策略(Design Strategy)包含扩展策略、复用策略两种,描述如下:
² 扩展策略。通过符合逻辑的分层设计、合理的方法设计为功能扩展提供良好的基础架构。
² 复用策略。本系统为后续基于JAVA面向对象的学生成绩管理系统项目提供参考,本系统中部分类、方法可以为后续项目提供参考。
提示:
(1)系统分为三层,分别为用户交互层(StuRun);业务逻辑层(StuImpl);数据存储层(DataBase);
(2)用户交互层根据用户输入调用业务逻辑层相应方法实现业务逻辑并输出结果
(3)业务逻辑层提供学籍信息的增删改查等相关业务逻辑方法,为用户交互层提供业务逻辑处理支持同时可以调用及更新数据存储层存储的数据。
(4)数据存储层用于存储系统数据。
提示:说明本系统应当在什么样的环境下开发,有什么强制要求和建议?
实验报告
实验题目:使用C编程实现一个学籍管理系统 指导老师:
班级: 姓名:
1.程序设计与分析
要求程序能实现以下基本功能:
(1).提供基本的菜单选项,能根据不同的选项执行不同操作;
(2).对学生信息进行录入,修改,删除、查询等操作;
(3).对学生信息进行统计、排序等操作。
(4).采用数据类型:整型,浮点型,字符型,指针类型,结构体类型
(5).核心算法:
#define MAX 10
//MAX代表学籍管理系统所能处理的最大学生数量,宏定义后,依据实际情况对程序的对应修改更易进行
//实际代码中是将子函数的定义写在了main函数的前面,但此处为了程序结构清晰将main函数写在了前面,因此main函数中没有子函数声明的语句
int main()
{
进行各种类型的变量定义以及初始化,以供后续程序使用
定义一个结构体类型,并定义一个该类型的结构体变量用于存储将要录入的学生信息数据:
struct Student
{
char Id[MAX];//学号
char name[50];//姓名
int clas;//班级
float score[4];//三科成绩以及总成绩
} student[MAX];
定义若干指针变量用于将main函数中的变量地址传递给各子函数,使子函数能够改变main函数中的变量的值
定义各种所需变量
定义整型变量mingling
定义一个变量num来记录总人数的变化并将其初始化为零
for(;;)
{
输出主菜单选项
输入数字命令并赋值给整型变量mingling
判断
若mingling=1,执行函数input进行学生信息输入操作
若mingling=2,执行函数del进行学生信息删除操作
若mingling=3,执行函数selet进行学生信息选择输出操作
若mingling=4,执行函数order进行学生信息整体排序操作
若mingling=5,执行函数output进行学生信息全体输出操作
若mingling=6,执行break语句跳出for循环
}
return 0;
}
void input(通过指针引用学生信息、当前学生总人数等数据)
//我的源代码中每个子函数都是用了许多指针将结构体中的元素一一引用,此处可以改为利用指向结构体变量的指针,代码会简洁许多
{
利用指针来引用主函数中的学生信息变量
定义整型变量i用作循环
定义字符数组panduan[10]用作判断整个学生数据的录入操作是否结束
for(i=0;;i++)
{
输出"Id "
输入学号
输出"class "
输入班级
输出"name "
输入姓名
输出"score1 "
输入成绩1
输出"score2 "
输入成绩2
输出"score3 "
输入成绩3
将存储总成绩数据的变量赋值为成绩1,成绩2,成绩3的和
利用指针使main函数中记录学生人数的变量num自增1
输出"continue?"
输入命令并赋值给字符数组panduan
判断字符串panduan与"no"是否相等
若相等则执行break语句跳出循环
}
}
void del(通过指针引用学生信息、当前学生总人数等数据)
{
定义字符数组panduan[10]用于在已有学生信息中查找需要删除的对应学生信息
定义整型变量h用于判断是否找到了所需删除的学生信息
定义字符数组jueding[10]用于判断用户的删除操作是否全部结束
定义整型变量i用于进行循环查找所需删除的学生
//以下使用num的语句均指通过指针引用main函数中的num变量,为了书写简便,省略了指针引用的过程
for(;;)
{
h=0;
输入所需删除学生的信息关键字(姓名或学号)
for(i=0;i<=num-1;i++)
{
判断字符数组panduan中记录的关键字与第i+1个学生的姓名是否相同
若相同
{
则判断当前的学生信息总数是否为1
若为1,则执行break语句跳出循环
若不为1,则将第i+1个学生的所有信息依次与后一个学生的所有信息交换,直到将该学生信息交换至所有学生信息的最后一个记录处
按序输出num-1个学生的信息
利用指针使main函数中记录当前学生总数的变量num自减1
h=h+1;
}
若不相同
{
判断字符数组panduan中记录的关键字与第i+1个学生的学号是否相同
若相同
{
则判断当前的学生信息总数是否为1
若为1,则执行break语句跳出循环
若不为1,则将第i+1个学生的所有信息依次与后一个学生的所有信息交换,直到将该学生信息交换至所有学生信息的最后一个记录处
按序输出num-1个学生的信息
利用指针使main函数中记录当前学生总数的变量num自减1
h=h+1;
}
若不相同,不执行任何语句
}
}
判断h是否不等于0
若不等于0
{
则输出"continue?"
输入命令并将命令赋值给字符数组jueding
判断字符串jueding与"no"是否相等
若相等则执行break语句跳出循环
}
若等于0
{
则按序输出num个学生的所有信息
执行break语句跳出循环
}
}
}
void selet(通过指针引用学生信息、当前学生总人数等数据)
{
char panduan1[10],jueding[10];
int panduan2,m;
//panduan1用于存储输入的关键字,panduan2用于存储输入的关键字转换成对应整型数的数值,jueding用于判断整个选择过程是否结束,m用于判断是否找到了所需查找的学生
for(;;)
{
m=0;
输入查找关键字并将其赋值给字符数组panduan1
将panduan1中的数字字符转换为对应的整型数并将数值赋值给panduan2
在当前学生中循环查找学号与panduan1中数字字符串相同的学生,若找到则输出该学生所有信息,并使m++
每次循环判断时若当前接受判断的学生学号与panduan1中数字字符串不相同,则继续判断其班级与panduan2存储的数值是否相等,若相等则输出该学生,并使m++
循环查找结束后,判断m是否等于0,若为0,则输出"there is no eligible student"并执行break语句跳出循环
若不为0,则输出"continue?"
输入命令并将命令字符赋给jueding[10]
判断字符串jueding是否与"no"相等,若相等则执行break语句跳出循环
}
}
void order(通过指针引用学生信息、当前学生总人数等数据)
{
对当前存在的所有学生信息按照班级从小到大,同一班级内总成绩从大到小进行冒泡排序,排序结束后按序输出所有学生信息
}
void output(通过指针引用学生信息、当前学生总人数等数据)
{
将当前存在的所有学生信息按数组顺序循环输出
}
2.程序设计中存在的问题和解决思路
(1).由于为了在进行删除操作时比较方便进行输入数据的识别,我把学号和姓名都存储在字符数组中,结果在编写选择函数时由于要求输入班级或学号,而班级是存储在定义为整型的变量中的,因此出现了编写困难。
解决方法:预处理时包含了头文件stdlib.h,在编写选择函数时调用了atoi()函数,将存储学号信息的字符数组中的数字字符转换为对应的整型数,并将其存储在一个新的整型变量中,以供后续程序判断使用。
(2).这一版学籍管理系统的学生数据交换方式还可以改进,如果定义一个struct Student jiaohuan的结构体变量用来交换学生数据会简便许多
另外程序中指针的使用也不够熟练,只是起到了在主函数与子函数之间传递地址的作用,没有体现指针简化数据处理的作用,定义了太多指针去指向结构体中的各个元素,若定义为指向结构体变量的指针会好很多
(3).学籍管理系统的代码和算法优化仍在进行中,这一版不会是最后一版。。。
3.实验收获
对于程序的设计有了更加清晰的认识,对各种命令和数据类型的使用更加熟练,对于一个完整的学籍管理系统的设计有了清晰的思路。
对指针的运用更加熟练,对指针的作用有了更清晰的认识。(虽然代码中指针的运用比较肤浅,但是程序做完之后的思考和对有关知识的重温使我对指针有了更深的了解)
实际上为了用到所学的全部知识,这一版学籍管理系统用了很多不必要的算法,程序反而复杂了,但相对的因为使用到了这学期的几乎所有知识,所以对知识的掌握也上升了一个层次。
发现实现一定功能的程序其算法的多样性,不同的算法有不同的优点,使用的数据结构也有很大不同。
在编写程序的过程中对本学期的知识进行了系统的整理,巩固了所学的知识,为以后的继续学习打下了一个很好的基础。
4.程序的源代码清单
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define MAX 10
void input(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)
{
int i;
char panduan[10];
for(i=*renshu;i<MAX;i++)
{
printf("Id ");
scanf("%s",hao[i]);
printf("class ");
scanf("%d",ban[i]);
printf("name ");
scanf("%s",ming[i]);
printf("score1 ");
scanf("%f",fen[i][0]);
printf("score2 ");
scanf("%f",fen[i][1]);
printf("score3 ");
scanf("%f",fen[i][2]);
*fen[i][3]=*fen[i][0]+*fen[i][1]+*fen[i][2];
printf("continue?\n");
scanf("%s",panduan);
*renshu=*renshu+1;
if(strcmp(panduan,"no")==0)
break;
}
}
void del(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)
{
int i,q,m,h;
float f;
char panduan[10],c[10],jueding[10];
for(;;)
{
h=0;
scanf("%s",panduan);
for(i=0;i<=*renshu-1;i++)
{
if(strcmp(ming[i],panduan)==0)
{
if(*renshu==1)
break;
for(;i<=*renshu-2;i++)
{
q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;
strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);
strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);
for(m=0;m<=3;m++)
{
f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;
}
}
for(m=0;m<=*renshu-2;m++)
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[m],*ban[m],ming[m],*fen[m][0],*fen[m][1],*fen[m][2],*fen[m][3]);
}
*renshu=*renshu-1;
h=h+1;
}
else if(strcmp(hao[i],panduan)==0)
{
if(*renshu==1)
break;
for(;i<=*renshu-2;i++)
{
q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;
strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);
strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);
for(m=0;m<=3;m++)
{
f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;
}
}
for(m=0;m<=*renshu-2;m++)
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[m],*ban[m],ming[m],*fen[m][0],*fen[m][1],*fen[m][2],*fen[m][3]);
}
*renshu=*renshu-1;
h=h+1;
}
}
if(h!=0)
{
printf("continue?\n");
scanf("%s",jueding);
if(strcmp(jueding,"no")==0)
break;
}
else
{
for(m=0;m<=*renshu-1;m++)
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[m],*ban[m],ming[m],*fen[m][0],*fen[m][1],*fen[m][2],*fen[m][3]);
}
break;
}
}
}
void selet(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)
{
char panduan1[10],jueding[10];
int panduan2,i,m;
for(;;)
{
m=0;
scanf("%s",panduan1);
panduan2=atoi(panduan1);
for(i=0;i<=*renshu-1;i++)
{
if(strcmp(hao[i],panduan1)==0)
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);
m=m+1;
}
else if(panduan2==*ban[i])
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);
m=m+1;
}
}
if(m==0)
{
printf("there is no eligible student\n");
break;
}
printf("continue?\n");
scanf("%s",jueding);
if(strcmp(jueding,"no")==0)
break;
}
}
void order(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)
{
int i,k,q,m;
char c[10];
float f;
for(k=1;k<=*renshu-1;k++)
for(i=0;i<=*renshu-1-k;i++)
if(*ban[i]>*ban[i+1])
{
q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;
strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);
strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);
for(m=0;m<=3;m++)
{
f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;
}
}
for(k=1;k<=*renshu-1;k++)
for(i=0;i<=*renshu-1-k;i++)
if(*ban[k]==*ban[k+1])
if(*fen[k][3]<*fen[k+1][3])
{
q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;
strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);
strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);
for(m=0;m<=3;m++)
{
f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;
}
}
for(i=0;i<=*renshu-1;i++)
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);
}
}
void output(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)
{
int i;
for(i=0;i<=*renshu-1;i++)
{
printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);
}
}
int main()
{
int *banji[MAX],*number,i,num,mingling;
char *xingming[MAX],*xuehao[MAX];
float *chengji[MAX][4];
struct Student
{
char Id[10];
char name[50];
int clas;
float score[4];
} student[MAX];
num=0;
for(i=0;i<=MAX-1;i++)
{
banji[i]=&student[i].clas;
xingming[i]=&student[i].name[0];
xuehao[i]=&student[i].Id[0];
chengji[i][0]=&student[i].score[0];
chengji[i][1]=&student[i].score[1];
chengji[i][2]=&student[i].score[2];
chengji[i][3]=&student[i].score[3];
}
number=#
for(;;)
{
printf("1.input\n2.delete\n3.select\n4.order\n5.output\n6.quit\nplease input your option\n");
scanf("%d",&mingling);
if(mingling==1)
input(banji,xingming,xuehao,chengji,number);
if(mingling==2)
del(banji,xingming,xuehao,chengji,number);
if(mingling==3)
selet(banji,xingming,xuehao,chengji,number);
if(mingling==4)
order(banji,xingming,xuehao,chengji,number);
if(mingling==5)
output(banji,xingming,xuehao,chengji,number);
if(mingling==6)
break;
}
return 0;
}
实验报告课程名称软件工程导论课题名称图书管理系统概要设计报告专业计算机科学与技术班级学号20xx030103姓名大蚊子指导教师张铁…
图书管理系统概要设计Zly小组评审日期:年月日目录1.导言?31.1目的...31.2范围?31.3缩写说明...31。4术语定义…
图书管理系统概要设计说明书学生姓名:学号:学院:计算机科学学院班级:计算机科学与技术四班一、引言1.1编写目的本文档的编写是为了完…
20xx838820xx8390图书管理系统概要设计姜宇龙李旭毅软件图书管理系统概要设计YLZ11目的该文档的目的是描述XXX系统…
概要设计说明书东南大学软件学院苏州课程群项目基于SSH框架的图书管理系统概要设计说明书作者递交日期验收人验收日期工作量统计概要设计…
实验报告课程名称软件工程导论课题名称图书管理系统概要设计报告专业计算机科学与技术班级学号20xx030103姓名大蚊子指导教师张铁…
软件系统设计报告题目专业班级小组成员指导教师职称20xx年12月徐州题目概要设计说明书日期20xx年12月目录1软件结构设计411…
南京信息工程大学实验实习报告实验实习名称概要设计实验实习日期20xx4得分指导教师李振宏专业年级班次姓名学号一实验目的1通过对所选…
lt项目名称gt系统概要设计报告版本lt11gt注以下提供的模板用于有限公司CMMI标准的模版其中用尖括号括起来并以蓝色显示的文本…
目录1引言11编写目的12项目背景13定义14参考资料2任务概述21目标22运行环境23需求概述24条件与限制31处理流程32总体…