数据结构课程设计—java通讯录管理系统
import java.io.*; import java.util.*; public class LittleProgram {
static boolean isDelete = true;
static boolean isFind = true;
public static void main(String [] args)//主方法,程序从这里开始运行
throws IOException,NumberNotFoundException
{
int choice=-1;
do{
LittleProgram lp = new LittleProgram();
System.out.println();
System.out.println("
#");
System.out.println();
System.out.println(" 通訊錄管理系统");
System.out.println("
请用号码插入,查找,修改,删除数据");
System.out.println();
System.out.println("
# ");
System.out.print("1.增加号码: "+
"2.查找号码: "+
"3.删除号码: "+ "4.清除所有号码: "+ "5.把号码全部打印到屏幕 "+ "6.把通讯录按号码排序 "+
"7.修改号码 "+
"8.统计通码讯录的总人数 "+
"9.关于作者 "+
"0.退出程序. " +
"输入:");
BufferedReader in =
//从终
new BufferedReader(
//端接
new InputStreamReader(System.in));//收数
String inputLine = in.readLine();
//字选
choice= Integer.valueOf(inputLine).intValue();//项;
switch(choice)
{
case 1: {//1.增加号码
String str = lp.inputData();
lp.addData(str);
System.out.println("增加号码成功.");
timeOut(1);
}break;
case 2: {//2.查找号码
long find = 0;
System.out.print("请输入你要查找的号码:");
BufferedReader inn =
new BufferedReader(
new InputStreamReader(System.in));
String inputLi = inn.readLine();
find = Integer.valueOf(inputLi).longValue();
lp.findData(find);
timeOut(2);
}break;
case 3: {//3.删除号码
long deleteNumber = 0;
System.out.print("请输入你想删除号码:");
BufferedReader bf =
new BufferedReader (
new InputStreamReader(System.in));
String inputL = bf.readLine();
deleteNumber = Integer.valueOf(inputL).longValue();
lp.deleteData(deleteNumber);
if(isDelete)
System.out.println("删除号码成功!");
timeOut(1);
}break;
case 4: {
lp.clearData();//4.清除所有号码
timeOut(1);
}break;
case 5: {
print();//5.把号码全部打印到屏幕
timeOut(2);
}break;
case 6: {
lp.numSort();//6.把号码按号码排序
System.out.println("按照号码从小到大排序成功! "+
"排序后: ");
print();
timeOut(2);
}break;
case 7: {
lp.rewrite();//7.修改号码
timeOut(2);
}break;
case 8: {
int count = lp.count();
System.out.println("共有"+count+"个号码记录.");
timeOut(2);
}break;
case 9: {
System.out.print(" 李雪萍 "+
" 安徽理工大學理學院 "+
" QQ:1154646392 ");
timeOut(4);
}break;
}}while (choice != 0);
System.out.println("Bye! ^-^");
System.exit(0);
}
public String inputData()//从终端接收数据的方法,返回字符串
throws IOException,NumberFormatException
{
System.out.print("请依次输入 :号码 姓名 地址 生日 " +
"每项数据请用空格隔开:");
String all = "";
try{
BufferedReader in =
//从终
new BufferedReader (
//端接
new InputStreamReader(System.in));
//收数
String inputLine = in.readLine();
//据
StringTokenizer str =
new StringTokenizer(inputLine," ");//接收的数据用空格隔开,这个类用来提取每个字符串
long num = Integer.valueOf(str.nextToken()).longValue();//号码
String name = (String)str.nextToken();
//姓名
String add = (String)str.nextToken();
// 地址
String birth = (String)str.nextToken();//出生年月
all = String.valueOf(num) +" , "+
name +" , "+
add +" , "+
String.valueOf(birth);//把所有的数据用" , "隔开然后在连起来放进字符串all
}catch (IOException e){}
catch (NumberFormatException e){}
return all;//返回字符串all
}
public void addData(String str)//增加号码的方法
throws IOException
{
String s1 ="",s2="" ,s3= "";
File file = new File("c:data.txt");
if (file.exists())//如果文件data.txt存在
{
try{
BufferedReader in =
new BufferedReader(
new FileReader(file));
while ((s1=in.readLine())!=null)
s2+=s1+" ";//把文件中的每行数据全部放进一个字符串s2
s2+=str+" ";
//再把s2于形参str相连放进s2
BufferedReader in2 =
//把字符
new BufferedReader(
//串s2也
new StringReader(s2));
//就是原
PrintWriter out =
//文件+
new PrintWriter(
//形参str(新输入的一行数据)
new BufferedWriter(
//重新写进data.txt
new FileWriter(file)));
//覆盖原来的数据
while ((s3=in2.readLine())!= null)
{
out.println(s3);
}
out.close();
//System.out.println("write data true.");
}catch (IOException e){}
}else{
System.err.println("File "data" Missing!");
}
}
public void clearData()//清除data.txt的所有数据的方法
throws IOException
{
File file = new File("c:data.txt");
if(file.exists())//如果文件在
{
try{
PrintWriter out =
new PrintWriter(
new BufferedWriter(
new FileWriter(file)));
out.print("");//在文件data.txt里写进一个空字符,所以清除了原来的内容
out.close(); //关闭文件
System.out.println("clear data true!");
}catch(IOException e){}
}else{
System.err.println("File "data" Missing!");
}
}
public void deleteData(long deleteNumber)//删除某条号码数据
throws IOException,FileNotFoundException
{
isDelete = true;
try{
DataMap mp = new DataMap();//生成一个自己编写的容器
long j=0;
String s1="",s2="",s3="";
BufferedReader in =
new BufferedReader(
new FileReader("c:data.txt"));
while ((s1=in.readLine())!=null)
{
j=numberTokenizer(s1);
mp.put(j,s1);
}
try{
if(mp.containsKey( String.valueOf(deleteNumber).toString()))
{
mp.remove(deleteNumber);
}else
throw new NumberNotFoundException();
Collection c = mp.values();
Iterator iter = c.iterator();
while(iter.hasNext())
{
s1 = (String)iter.next();
s3 +=s1+" ";
}
BufferedReader in2 =
new BufferedReader(
new StringReader(s3));
PrintWriter out =
new PrintWriter(
new BufferedWriter(
new FileWriter("c:data.txt")));
//System.out.println("delete No"+deleteNumber);
while( (s1 = in2.readLine())!=null)
{
out.println(s1);
} out.close(); }catch (NumberNotFoundException e) {
isDelete = false;
System.out.println(deleteNumber+" no found :(");
}
}catch(IOException e){}
}
public long numberTokenizer(String s)
throws IOException
{
StringTokenizer st =
new StringTokenizer(s," ");
return Integer.valueOf((st.nextToken())).longValue();
}
public void findData(long find)//查找数据
throws IOException,NumberNotFoundException
{
isFind = true;
String s = "",findString =""; long i; DataMap dm = new DataMap(); BufferedReader in =
new BufferedReader(
new FileReader("c:data.txt"));
while ((s=in.readLine())!=null)
{
i=numberTokenizer(s);
dm.put(i,s);
}
//in.close();
try{
if(dm.containsKey( String.valueOf(find).toString()))
{
findString = dm.get(find);
System.out.println("学号"+find+"学生的资料是:");
System.out.println(findString);
}else
throw new NumberNotFoundException();
}catch (NumberNotFoundException e){
System.out.println(find+" no found :(");
isFind = false;
}
}
public static void print()//读取文本文件把数据打印到终端的方法
throws IOException
{
try{
BufferedReader in =
new BufferedReader(
new FileReader("c:data.txt"));
String read = "";
while ((read = in.readLine())!=null)
System.out.println(read);
}catch(IOException e){}
}
public static void timeOut(double sec)//停顿短暂时间的一个方法完全可以不要这个功能
{
double seconds = sec;
long t = System.currentTimeMillis()+(int)(seconds*1000);
while ((System.currentTimeMillis())
;
}
public void numSort()//按学号排序
throws IOException
{
long i = 0;
String s = "";
try{
DataArrayList dal = new DataArrayList();
BufferedReader in =
new BufferedReader(
new FileReader("c:data.txt"));
while ((s=in.readLine())!=null)
{
i=numberTokenizer(s);
dal.add(i);
}
Collections.sort(dal);
DataMap dm = new DataMap();
BufferedReader in2 =
new BufferedReader(
new FileReader("c:data.txt"));
while ((s=in2.readLine())!=null)
{
i=numberTokenizer(s);
dm.put(i,s);
}
PrintWriter out =
new PrintWriter (
new BufferedWriter(
new FileWriter("c:data.txt")));
Iterator it = dal.iterator();
long temp = 0;
String tempStr = "";
while (it.hasNext())
{
temp = Integer.valueOf((String)it.next()).longValue();
tempStr = dm.get(temp);
out.println(tempStr);
}
out.close();
}catch(IOException e){}
}
public void rewrite()
throws IOException,NumberNotFoundException
{
try{
System.out.print("请输入你要修改的学生号码:");
BufferedReader in =
new BufferedReader (
new InputStreamReader(System.in));
String inputLine = in.readLine();
long num = Integer.valueOf(inputLine).longValue();
findData(num);
if(isFind)
{ deleteData(num); System.out.print("请重新输入该号码:"); String str = inputData();
addData(str);
System.out.println("rewrite true!");
}
}catch(IOException e){}
catch(NumberNotFoundException e){}
}
public int count()
throws IOException
{
DataArrayList dal = new DataArrayList();
try{
String s = "";
long i =0;
BufferedReader in =
new BufferedReader(
new FileReader("c:data.txt"));
while ((s=in.readLine())!=null)
{
i=numberTokenizer(s);
dal.add(i);
}
}catch(IOException e){}
return dal.size();
} } /* *
* @author RangWei * TODO 这是个写的一个容器,继承公共类HashMap * 大概的功能就相当一个数组
*
*/ class DataMap extends HashMap//一个存储数据的Map
{
public void put(long i,String str)//把学号和数据放进这个Map
{
//以后一个学号(key)对应的是一个人的数据(value)
put(String.valueOf(i).toString(),str);
}
public void remove(long i)//接收学号,然后删除学号(key)和它对应的数据(value)
{
remove(String.valueOf(i).toString().toString());
}
public String get(long i)//接收一个学号,然后返回这个key对应的value
{
String s = String.valueOf(i).toString();
if (!containsKey(s))
{
System.err.println("Not found Key: "+s);
}
return (String)get(s);
} } /*
*
* @author RangWei * * TODO 这个类继承ArrayList * 用来按数字排序,在用号码排序时要用到它
*
*/ class DataArrayList extends ArrayList {
public void add(long num)
{
String numToString = String.valueOf(num).toString();
add(numToString);
} } /* *
* @author RangWei * * TODO 增加的一个Exception,主要是在文件里没有要找
* 的号码就抛出
*
*/ class NumberNotFoundException extends Exception {
public NumberNotFoundException()
{} }
4.2 数据库设计
在本实例中使用的是SQL Server 2000数据库管理系统。数据库服务器安装的位置为本机,数据库名称为communicationserver。下面将介绍数据库分析和设计、数据表的创建、数据表关系图和创建存储过程的内容。
4.2.1 数据库分析和设计
在本节中,将根据上一节系统功能的设计分析创建各数据表的实体E-R关系图,它是数据库设计非常重要的一步,下面用E-R图的形式表示出各实体的属性。
1. 用户E-R实体图
用户的实体具有用户ID、密码、姓名、性别、电话、E-mail、用户权限7个属性,ER图如图4-5所示。
姓名用户权限性别电话用户E-mail用户ID图4-5 用户E-R实体图
密码 2. 地区E-R实体图
地区的实体具有地区编号、地区名称2个属性,E-R图如图4-6所示。
地区编号地区图4-6 地区E-R实体图
地区名称 3. 职务E-R实体图
职务的实体具有职务编号、职务名称2个属性,E-R图如图4-7所示。
职务编号职务图4-7 职务E-R实体图
职务名称 4. 学校E-R实体图
学校的实体具有学校名称、学校所在地区、在校学生人数3个属性,可用E-R图表示,如图4-8所示。
学校名称学校在校学生人数学校编号学校所在地区
图4-8 学校E-R实体图
5. 通讯录E-R实体图
通讯录的实体具有联系人姓名、地址、联系电话、所属职务、所在学校、所在单位、所属地区7个属性,E-R图如图4-9所示。
联系人姓名联系电话所在单位通讯录所在学校图4-9 通讯录E-R实体图
所属地区地址所属职务
4.2.2 数据表的创建
在上面一节中讲解了实体的E-R图,本节中将根据E-R图的内容,创建企业信息管理系统中的各数据表,在此系统中共涉及到5个数据表的应用,分别为如下。
1、字段采用camel 风格定义
2、用不同颜色区分字段 主键:蓝色 外键:白色
既是主键又是外键:淡蓝色 普通字段:青绿 1. 用户信息表
用户信息表(Users)用于存放校园通讯录信息管理系统中所有系统管理用户的信息,用户管理是每个管理系统中必不可少的,也是比较重要的一部分,本系统中进行了较详细的设计,表中各个字段的数据类型、大小以及简短描述如表4-1所示。
表4-1 用户信息表 TB_Users 字段名称 sUserID sUserName sUserPassword sUserSex sUserEmail sUserPhone sUserPurview 2.地区信息表
地区信息表(Client)用于存放校园通讯录信息管理系统中所有地区的信息,地区信息的管理是系统中比较重要的内容,地区的名称是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-2所示。
表4-2 地区信息表
TB_Area 字段名称 sAreaID sAreaName 3. 职务信息表
职务信息表(Compact)用于存放校园通讯录信息管理系统中所有职务的信息,职务信息的管理是系统中比较重要的内容,职务的名称是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-3所示。
表4-3 职务信息表
TB_Duty
字段名称 sDutyID sDutyName
字段类型 varchar(20) varchar(50)
字段描述 职务编号[PK] 职务名称
字段类型 varchar(20) varchar(50)
字段描述 地区编号[PK] 地区名称
字段类型 varchar(10) varchar (20) varchar(10) char(2) varchar(20) varchar(20) char(1)
字段描述 用户ID [PK] 用户姓名
记录用户登入本系统时的用户密码
用户性别 用户E-mail 用户的联系电话 用户权限 4. 学校信息表
学校信息表(Com_detail)用于存放校园通讯录信息管理系统中所有学校的信息,学校信息的管理是系统中比较重要的内容,学校名称是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-4所示。
表4-4 学校信息表
TB_School 字段名称 sSchoolID sSchoolName iStudentNum sAreaID_FK 5. 通讯录信息表
通讯录信息表(product)用于存放校园通讯录信息管理系统中所有通讯录的信息,通讯录信息的管理是系统中比较重要的内容,联系电话是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-5所示。
表4-5 通讯录信息表
TB_AddrList
字段类型 varchar(20) varchar(50) int varchar(20)
字段描述 学校编号[PK] 学校名称 学校人数 地区编号[FK] 字段名称 iAddrID sLinkName sAddress sLinkPhone sUnitName sSchoolID_FK sDutyID_FK sAreaID_FK
字段类型 int varchar(50) varchar(20) varchar(20) varchar(50) varchar(20) varchar(20) varchar(20)
字段描述
通讯录编号(自动编号)[PK] 联系人姓名 地址 联系电话 工作单位 学校编号[FK] 职务编号[FK] 地区编号[PK] 4.2.3 创建视图
学校信息视图表V_SchoolInfo 字段名称 sSchoolName sAreaName
字段类型 varchar(50) varchar(50)
字段描述 学校名称 地区名称 sLinkName sDutyName sLinkPhone
create view V_SchoolInfo as
varchar(20) varchar(20) varchar(20)
联系人姓名 职务名称 联系电话
select sSchoolName,sAreaName,sLinkName,sDutyName,sLinkPhone from TB_AddrList,TB_School,TB_Duty,TB_Area where TB_AddrList.sSchoolID_FK=TB_School.sSchoolID
and and TB_AddrList.sDutyID_FK=TB_Duty.sDutyID TB_AddrList.sAreaID_FK=TB_Area.sAreaID 4.2.4 数据表关系图
在学校通讯录信息管理系统中各数据表的关系图,如图4-10所示。在TB_School数据表中,TB_Area数据表的sDutyID_FK字段作为外键。在TB_AddrList数据表中,TB_School数据表的sSchoolID_FK字段、TB_Area数据表中的sAreaID_FK字段和TB_Duty数据表中的sDutyID_FK字段作为外键。
图4-10 数据表关系图 4.2.5 创建存储过程
因为使用存储过程可以给系统带来优化,所以系统将很大程度地使用存储过程,在系统中共应用了10个存储过程,以Add开头的存储过程为系统中信息添加的存储过程,以Update开头的存储过程为系统中信息修改的存储过程,这些存储过程将会在系统程序文件的后台应用中调用,下面将对系统中应用的存储过程进行解释。
1. AddTB _Users存储过程
AddTB _Users存储过程用于向用户信息表中添加新的用户信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_Users @sUserID varchar(10), @sUserName varchar(20), @sUserPassword varchar(10), @sUserSex char(2), @sUserEmail varchar(20), @sUserPhone varchar(20), @sUserPurview char(1) AS
INSERT INTO TB_Users ( sUserID, sUserName, sUserPassword, sUserSex, sUserEmail, sUserPhone,
sUserPurview )
VALUES ( @sUserID, @sUserName, @sUserPassword, @sUserSex, @sUserEmail, @sUserPhone, @sUserPurview ) GO 2. Add 存储过程 Add TB_Area存储过程用于往地区信息表中添加新的地区信息。以下代码表示了这一存储过程。
CREATE PROCEDURE AddTB_Area
@sAreaID varchar(20),
@sAreaName varchar(50) AS
INSERT INTO TB_Area (
sAreaID,
sAreaName )
VALUES (
@sAreaID,
@sAreaName ) GO 3. AddTB_Duty存储过程
AddTB_Duty存储过程用于往职务信息表中添加新的职务信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_Duty
@sDutyID varchar(20),
@sDutyName varchar(50) AS
INSERT INTO TB_Duty (
sDutyID,
sDutyName )
VALUES (
@sDutyID,
@sDutyName ) GO 4.AddTB_School存储过程
AddTB_School 该存储过程用于往学校信息表中添加新的学校信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_School
@sSchoolID varchar(20),
@sSchoolName varchar(50),
@iStudentNum int,
@sAreaID_FK varchar(20) AS
INSERT INTO TB_School (
sSchoolID,
sSchoolName,
iStudentNum,
sAreaID_FK )
VALUES (
@sSchoolID,
@sSchoolName,
@iStudentNum,
@sAreaID_FK ) GO 5. AddTB_AddrList存储过程
AddTB_AddrList存储过程用于往通讯录信息表中添加新的通讯录信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_AddrList
@sLinkName varchar(20),
@sAddress varchar(50),
@sLinkPhone varchar(20),
@sUnitName varchar(20),
@sSchoolID_FK varchar(20),
@sDutyID_FK varchar(20) AS
INSERT INTO TB_AddrList (
sLinkName,
sAddress,
sLinkPhone,
sUnitName,
sSchoolID_FK,
sDutyID_FK )
VALUES (
@sLinkName,
@sAddress,
@sLinkPhone,
@sUnitName,
@sSchoolID_FK,
@sDutyID_FK ) GO 6. UpdateTB _Users存储过程
UpdateTB _Users存储过程用于修改用户信息表中,符合条件的用户信息,其中密码信息不可以更新。以下代码表示了这一存储过程。 CREATE PROCEDURE UpdateTB_Users
@sUserID varchar(10),
@sUserName varchar(20),
@sUserSex char(2),
@sUserEmail varchar(20),
@sUserPhone varchar(20),
@sUserPurview char(1) AS
UPDATE TB_Users SET
sUserID =@sUserID,
sUserName =@sUserName,
sUserSex=@sUserSex,
sUserEmail=@sUserEmail,
sUserPhone=@sUserPhone,
sUserPurview=@sUserPurview WHERE
sUserID =@sUserID GO 7. UpdateTB_Area存储过程
UpdateTB_Area存储过程用于修改地区信息表中的地区信息。以下代码表示了这一存储过程。 CREATE PROCEDURE UpdateTB_Area
@sAreaID varchar(20),
@sAreaName varchar(50) AS
UPDATE TB_Area SET
sAreaID =@sAreaID,
sAreaName =@sAreaName WHERE
sAreaID =@sAreaID GO 8. UpdateTB_Duty存储过程
UpdateTB_Duty存储过程用于修改职务信息表中的职务信息。以下代码表示了这一存储过程。
CREATE PROCEDURE UpdateTB_Duty
@sDutyID varchar(20),
@sDutyName varchar(50) AS
UPDATE TB_Duty SET
sDutyID =@sDutyID,
sDutyName =@sDutyName WHERE
sDutyID =@sDutyID GO 9. UpdateTB_School存储过程
UpdateTB_School存储过程用于修改学校信息表中的学校信息。以下代码表示了这一存储过程。 CREATE PROCEDURE UpdateTB_School
@sSchoolID varchar(20),
@sSchoolName varchar(50),
@iStudentNum int,
@sAreaID_FK varchar(20) AS
UPDATE TB_School SET
sSchoolID =@sSchoolID,
sSchoolName =@sSchoolName,
iStudentNum =@iStudentNum,
sAreaID_FK=@sAreaID_FK WHERE
sSchoolID =@sSchoolID GO 10. UpdateTB_AddrList存储过程
UpdateTB_AddrList存储过程用于修改通讯录信息表中的通讯录信息。以下代码表示了这一存储过程。
CREATE PROCEDURE UpdateTB_AddrList
@iAddrID int,
@sLinkName varchar(20),
@sAddress varchar(50),
@sLinkPhone varchar(20),
@sUnitName varchar(20),
@sSchoolID_FK varchar(20),
@sDutyID_FK varchar(20) AS
UPDATE TB_AddrList SET
sLinkName =@sLinkName,
sAddress =@sAddress,
sLinkPhone =@sLinkPhone,
sUnitName=@sUnitName,
sSchoolID_FK=@sSchoolID_FK,
sDutyID_FK=@sDutyID_FK WHERE
iAddrID =@iAddrID GO
1 需求分析
在银行业务模拟中用随机函数产生随机数,求客户在银行的平均时间,客户来到银行后加入两个队列,客户办理的业务有两种,一是取款和贷款,二是存款和还款。
2 概要设计
typedef struct service { int num; //客户号 string type; //到达或离开 int beginTime; int endTime; int money; //正数为存款,负数为取款 struct service* next; }service; typedef struct //队列 { service* head; service* rear; }queue; int total; //初始时银行现存资金总额 int closeTime; //营业结束时间
int arriveTime; //两个到达事件之间的间隔上限 int dealTime; //客户交易的时间上限 int dealMoney=5000; //交易额上限 int currentTime=0; //当前时间 int totalTime=0; //客户逗留总时间 int counter=0; //客户总数 int number=1; //初始客户序列号 int currentTimeOfDeal=0;
1 int theArriveTime=0; queue eq; //事件队列 queue fq; //队列一
queue sq; //对列二 //初始化三个队列 service* temped; int Time; void push(queue &q,int a)// 插入元素a为Q的新的队尾元素 void pop(queue &q)// 若队列不空,出对列函数 service* front(queue &q)//返回队首元素 service* back(queue &q)//返回队尾元素
service* searchAndDel(queue &q,int m)//在对列中寻找可处理元素 bool state=1; //用于判断是否有窗口在处理
void arrive()//"到达"函数 随机产生顾客,进入队列一产生到达事件 进入事件队列
void putMoney()//存款函数 void getMoney()//取款函数
void findAndDeal()//在对列中寻找可处理元素,对其进行处理
3 运行环境
Window XP Visual C++
4 开发工具和编程语言
Visual C++ C++
5 详细设计
1.队列的链式表示和实现 typedef struct service { int num; //客户号
2 string type; //到达或离开 int beginTime; int endTime; int money; //正数为存款,负数为取款 struct service* next; }service; typedef struct //队列 { service* head; service* rear; }queue; 2.插入一个元素为队尾元素 void push(queue &q,int a) { service* p=new service; p->money=a; p->next=NULL; if(q.head==NULL)//列队为空,初始化 { q.head=p; q.rear=p; } else //队列不为空,插入元素a { q.rear->next=p; q.rear=q.rear->next; } } 3. 返回函数
3 service* front(queue &q)//返回队首元素 { return q.head; } service* back(queue &q)//返回队尾元素 { return q.rear; } 4. 在对列中寻找可处理元素
service* searchAndDel(queue &q,int m) { service* sign=q.head; //标记头节点 service* p; while(q.head!=NULL) { if((-(q.head->money))
{ p=q.head; q.head=q.head->next; //首节点后移一位,返回原首节点 return p; }
4 } if((-(q.head->money))>m) //队首元素不能被处理 {
if(q.head==q.rear) { } return NULL; else //首节点移到队列尾部 { q.rear->next=q.head; q.rear=q.rear->next; q.head=q.head->next; q.rear->next=NULL; } } if(q.head==sign) //队列循环一周时停止 return NULL; } return NULL; } 5.到达函数
void arrive()//到达"函数 随机产生顾客,进入队列一产生到达事件 进入事件队列 { push(fq,(rand()%(2*dealMoney)-dealMoney)); //随机产生顾客加入第一队列
back(fq)->beginTime=currentTime; back(fq)->num=number; push(eq,(back(fq)->money)); //将产生事件加入事件队列
5 back(eq)->beginTime=currentTime; back(eq)->type="到达"; back(eq)->num=number; ++number; } 6存款函数 void putMoney() { total+=front(fq)->money; //更新资金总额 push(eq,front(fq)->money); //加入事件队列 离开 back(eq)->type="离开"; back(eq)->num=front(fq)->num; back(eq)->endTime=(front(fq)->beginTime+rand()%dealTime+1); ++counter; //更新客户总数
totalTime+=(back(eq)->endTime-front(fq)->beginTime); //更新逗留时间
pop(fq); //删除第一队列第一个业务 currentTimeOfDeal=back(eq)->endTime; state=0; } 7取款函数
void getMoney() //取款函数 { if((-fq.head->money)>total) //资金短缺 加入第二队列 { push(sq,front(fq)->money); back(sq)->beginTime=front(fq)->beginTime; back(sq)->num=front(fq)->num; pop(fq); 6 } else { total=total+back(fq)->money; push(eq,front(fq)->money); //加入事件队列离开 back(eq)->type="离开"; back(eq)->num=front(fq)->num; back(eq)->endTime=(front(fq)->beginTime+rand()%dealTime+1); back(eq)->beginTime=0; currentTimeOfDeal=back(eq)->endTime; ++counter; //更新客户总数
totalTime+=(back(eq)->endTime-back(fq)->beginTime); //更新逗留时间
pop(fq); //删除第一队列第一个业务 state=0; } } 8. 在对列中寻找可处理元素,对其进行处理 void findAndDeal() { while((temped=searchAndDel(sq,total))&&NULL!=temped) //查找可处理取款 { total+=temped->money;
totail=total+temped->money; push(eq,temped->money); //加入事件队列训 离开 back(eq)->type="离开"; back(eq)->num=temped->num; randomTemp=rand()%dealTime+1;
//更
新资
金总额 7 back(eq)->endTime=currentTime+randomTemp; currentTimeOfDeal+=randomTemp; ++counter; //更新客户总数
totalTime+=(back(eq)->endTime-temped->beginTime); //更新逗留时间
delete temped; //删除节点 temped=NULL; } state=0; } 9 主函数 int main() { int m; cin>>m; if(m=111111) { cout<<”欢迎进入系统<>n; while(n==1) {
srand(time(NULL)); //初始化随机函数 cout<<"输入银行的初始存款: "; cin>>total; cout<<"输入银行的营业时间: "; cin>>closeTime; 8
cout<<"输入最大到达时间间隔: "; cin>>arriveTime; cout<<"输入最大的处理时间: "; cin>>dealTime; theArriveTime+=rand()%arriveTime+1; //首次到达时间 while(currentTime
} cout<
} if(state==1&&fq.head!=NULL) {
} if(fq.head->money>=0) {
} else getMoney(); putMoney(); findAndDeal(); arrive(); theArriveTime+=rand()%arriveTime+1; 9
<<"事件类型"<<" " <<" 时间"<<" " <<" 处理金额"<
} cout<<"未处理客户:"<<""
cout
}
} cout<<"银行当前余额:"<
在用随即函数rand产生随机数的时候,对其初始化用srand(time(NULL),为了使得产生的随机数是整数要在后面加一
7 测试结果
如图一所示为输入密码进入系统后
图一输入密码进入系统后
如图二为输入银行的初始存款,营业时间,两个到达事件的最大间隔,客户交易的最大时间
图二输入各项信息后
如图三所示产生的客户信息
图三 客户的信息(到达时间和离开时间,平均在的时间)
参考文献
[1] 吴文虎,程序设计基础(第二版),北京,清华大学出版社 [2] 谭浩强,C语言程序设计,北京 ,清华大学出版社 [3] 边肇祺,模式识别(第二版),北京:清华大学出版社
[4] 李永忠,几种小波变换的图像处理技术,西北民族学院学报,自然科学版 [5] 严蔚敏,吴伟民,米宁,数据结构题集(c语言版),清华大学出版社
心得体会
转眼之间,来到大学已经一年半的时间了,对程序的学习也有了初步的认识,在大一的时候学习了程序设计,大二紧接着又学了数据结构,在这次的课程设计中,遇到了一些问题,通过老师和同学的帮助得到了解决,并且对程序设计的认识又提高了一个层次,在以后的学习中,对经常出现的问题会更加注意。
这次的课程设计给了我很大的帮助,在过程中学到了很多的知识,对程序的规范性以及有效性更加的重视。在以后编程序的过程中会更加注意程序的完善性,使程序的功能更加的齐全,而这也是作为一个程序设计师必须要具备的。认识到只有多多的练习才能更好的运用所学习的知识。在大学里要充分的利用各种资源,提高自己的水平。
课 程 设 计 报 告
课程名称数据库课程设计—总结题目个人CD盘管理系统_________________________________
指导教师设计起止日期
学院计算机学院
系别专业计算机科学与技术
学生姓名班级/学号 成绩___________________
课程设计总结:
经过近2个月的设计,CD盘管理系统基本开发完成,该系统是一个简单的关于数据库与现实相结合的管理系统,它集各种功能用于一身,在系统的各个模块中体现了它的功能,针对音乐爱好者的需求方面进行设计的,方便了用户的一些信息操作,为音乐爱好者节省了管理成本,提高管理效率。该系统的界面简单大方,非常方便用户的操作,同时,也为以后系统的扩展留出了足够的空间。
在此次设计中后台主要采用了servlet和JavaBean技术,数据库则加入了存储过程和触发器的控制。我进一步理解了servlet和JavaBean的工作机制和所提供的便利,也感受到了存储过程和触发器所带来的方便。
servlet具有以下的优势:
1 方便Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。* 功能强大在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
2可移植性好Servlet用Java编写,Servlet API具有完善的标准。因此,为IPlanet
Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、
Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。3 节省投资不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。
JavaBean具有以下特点:
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语
句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。可以降低网络的通信量。使体现企业规则的运算程序放入数据库服务器中,以便集中控制。当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
在本系统的设计过程中,首先通过对CD盘管理系统功能进行详细的分析,得到系统功能模块图,然后根据系统功能分析,围绕它进行系统的设计,介绍开发环境和开发技术,再可行性分析、功能和性能需求,然后得出系统业务流图、数据流图、E-R图,并进行数据库的设计和模块化的实现。由于之前有稍微接触过Java Web方面的知识,再加上利用自己的课余时间的学习,做起来感觉没太多的困难。经过这次系统设计过程,加深了我对数据库操作的认识,更加熟悉了Java Web的构架,如servlet,struts,SOA等等。完成本设计后,才知道平日里书本上所学的东西太少,仅是些概念知识,没运用到实践中来,知识是无法得到升华的。只有不断地学习才能够跟上科技和知识的发展步伐。
数据库课程设计
校友通讯录
南华大学计算机科学与技术学院网络工程
(2010~2011 第二学期)
2011.6.25
目 录
一、设计需求说明··············3
二、总体设计分析··············
三、部分模块设计分析············
四、程序源代码···············
五、运行结果及截图·············
六、心得体会················
七、参考文献················
3 4 10 18 23 23
一、 设计需求说明
1、设计题目及要求
◆
建立校友通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;
◆ 能够提供注册、登录和修改个人信息等的功能; ◆ 校友之间能进行相互通信;
2、系统功能需求分析:
1).注册,找回密码(无法登陆该系统); 2).登陆;
3).更改个人资料;
4).查看并浏览校友所有的公开性信息; 5).申请私人互动,进一步获取校友私有信息: ①发送申请消息; ②拒绝;
③通过,开放私人信息; 6).删除已在列表中的对象; 7).账号注销。
二、 总体设计分析
系统功能模块图:
校友通讯录要实现的需求功能主要有注册,找回密码;登录;修改个人资料;浏览校友信息;查找校友;修改密码;删除校友;账号注销。 (1)注册:如果是新用户,用户可注册加入,填写详细的注册信息表。验证通过,如果注册成功,则进入校友通讯录主界面。
(2)找回密码:用户忘记了登陆密码,可通过找回密码功能找回密码,进入找回密码界面,填写邮箱号,可以修改密码。
(3)登录:输入正确的账号,密码,登陆成功,如果登陆次数超过5次,提示错误信息。
(4) 修改个人资料:进入个人信息页面,填写要修改的内容,如果修改成功,系统更新并记录信息。
(5)浏览校友信息:查看已在校友列表的校友的信息。 (6)查找校友:输入姓名、学院、专业等查找信息,查找成功。
(7)删除校友: 在已有的可互动的联系人中找寻并选择要删除的对象,如果删除成功则用户的私密信息不再对已删除对象开放。
(8)帐户注销:用户提出注销请求,如果退出校友通讯录系统,则系统注销退出者的个人信息。
三、 部分模块设计分析
1.通讯录:
2.工作顺序图:
(1)注册:申请账号
注册注册数据 : <未指定>真实性检查错误真实加入班级记录,分配帐号
6
②找回密码:找回用户丢失的密码
找回密码已登陆用户进入更改密码界面已注册未登记用户申请找回密码键入新密码输入帐号系统发送密码通过电子邮件确认否记录
7
(3)登录:已注册的用户利用系统已分配的账号登录
已注册用户或管理员登录键入密码帐号验证密码帐号是否正确通过验证未通过验证验证是否为管理员拒绝进入普通用户管理员进入个人主页进入管理员界面系统维护8
4)修改个人资料:修改个人中心的资料
更改个人资料进入更改个人资料页面已登陆用户输入要更改的个人资料确定取消记录9 (
(5)浏览校友信息:查看校友的信息
已登陆用户 查看搜索校友公开信息进入搜索界面键入搜索信息精确搜索模糊搜索显示符合条件校友名单显示选中校友公开信息10
(6)查找校友:查找用户感兴趣的校友
通信许可权发送许可权申请收到许可权申请已登陆用户拒绝许可权申请同意许可权申请记录,加入联系人列表删除许可权浏览联系人私人信息
11
(7)删除校友:删除用户的好友
已登陆用户
删除通信权进入已获通信权列表选中要删除的联系人取消删除确定要删除移出,记录12
四、 源程序代码
五、 运行结果及截图 1.显示主菜单界面
2.添加界面
3.显示界面
4.删除界面
删除后,通讯录里的显示记录:
5.查询界面
以姓名查询方式为例:
6.修改界面
修改后,通讯记录的显示记录:
7.保存界面
六、 心得体会
李兰利: 李竹村: 姚莉 : 李叶婷: 毛蓓:
梁娟:这次课程设计我觉得我做的事情比较少,尽的力不够,但在组员的辅助下,还是学到了一些东西。如:如何做原型设计、需求分析的应该做些什么,以及界面设计,数据库那边了解甚少。我觉得那句话话说得很对,团结就是力量。要做一件事,你需要有一个优秀的团队,大家可以一同进步,一同努力,困难一起克服。在这个团队中,我看到了他们钻研的精神,令我很敬佩;看到大家分工明确一起努力地画面。只是一次不错经验。
七、 参考文献
何玉洁、李宝安《数据库系统教程》人民邮电出版社 教材《软件工程》
题目1:计算机学院毕业设计管理系统
题目2:课程设计管理系统
要求:1)教师端和学生端
2)学生端:分组、选题目、进度安排、任务分配等
3)教师端:查看分组,查看题目,登记成绩
题目3: 教室管理系统
1. 系统概述
本系统用于管理东华大学松江校区1号和2号教学楼的教室使用。 2. 信息要求
课程信息,教师信息,教室信息,学院信息,专业信息 3. 系统功能要求
1) 教室分配:由管理员为某门课分配教室;
2) 教室借用:学生可以借教室,即获得教室在某段时间的使用权,办讲座,开展社团活动等等。 3) 教室查询:学生可以查询相关教学楼相关教室的信息以及该教室在每天任一时段的使用情况,或者有课,或者有讲座、或者有活动等等。这个功能以便使同学能更好地了解教室及其使用情况。
4) 教师查询:学生可以查询相关院系相关教师的个人信息以及开课信息,以便能更好地了解教师及其开课情况。
5) 课程查询:学生可以查询某一课程的详细信息,如同一课程可以有多个教师开课,以便更好地了解任一课程的详细信息。
6) 我要自习:学生通过可以查询当天某一时段或多个时段的空闲教室,去上自习。
题目4:医院住院管理系统
1. 系统概述
本系统用于管理医院的住院病人及其费用的管理 2. 信息要求:
病人信息,主治医生信息,病房信息,科室信息,处方信息,检验信息 3. 系统功能
– 病人住院登记
– 病人处方和检查检验项目开立 – 病人出院 – 异常处理
– 基本数据维护: 题目5:公交车管理信息系统
1. 系统概述
本软件用于管理公交线路。 2. 信息要求
公交线路信息,站点信息 3. 系统功能要求:
1) 所有公交线路在内的市区所有线路及郊区主要线路的管理、维护;同时提供精确、模糊等方式查询,并能对查询结果按不同条件排序;
2) 支持自动换乘查询,即使不输入中转地也能自动搜索出相应的出行方案; 3) 可以自行添加、修改、删除记录; 4) 提供公交运营企业的资料供网友查询;
题目6:航空售票管理信息系统
• 能用于所有航空售票处(公司、中心,点)的客户资料和购送票情况,以及乘机人明细资料管理,能对客户累计购票情况进行统计分析,具自动编号、快速查询、任意组合条件查询、客户购票统计、送票员和业务员管理、操作员权限控制和密码设置等功能,能根据任意电话号码快速定位到某一客户,并录入购票明细数据,其所属业务员功能可考核业务员的业绩情况。能制作各种客户资料报表和客户购票统计报表等,表格制作具有较强的可扩充性。
题目7:车辆管理信息系统
• 协助各单位对车辆档案、驾驶人员、车辆费用(维修费、洗车费、养路费、燃料费、停车费、保险费、年审费、过桥费等多项费用)、车辆使用和交通事故进行全面管理的系统。车辆管理资料完备,打印灵活。提供车辆综合查询系统,可以按各种查询条件查询到车辆费用明细和车辆费用合计。各种车辆资料可方便打印成自由设定的表格方式。系统配有详细的开发帮助、资料文档,操作演示图文并茂,简便易用。
题目8- 物业管理信息系统
物业管理信息系统软件是一套具备记录、查询物业小区业主信息、物业管理费用信息、水电煤气有线电视等费用信息、有线电视信息、供暖费用信息、业主房款缴纳信息,并且可以打印输出上述信息报表(月报表、季报表、年报表)的管理软件系统。 要求:
1.记录业主基本信息如:身份证号、楼号、房号、姓名、工作单位、联系电话、建筑面积等,并生成业主的综合信息表(包括所有业主有费用综合信息表、单个业主信息表);
2.记录月水电煤气抄表数据并打印业主交费通知单,包括水电煤气有线电视费通知单、供暖费通知单、物业管理费通知单;
3.记录业主交费情况并打印交费单,包括水电煤气费、供暖费、物业管理费、分期付款; 4.统计业主信息月、季和年报表,包括:物业实收费用汇总表、物业应收未收汇总表、应交未交费用业主信息表、月度房款还款名细表、单用户年度应收代款还款表。 5. 网络多用户操作,具备多人同时联网操作功能 6.异常处理
题目9-社区图书馆管理信息系统
图书馆在正常运营中面对大量书籍、读者信息以及两者间相互联系产生的借书信息、还书信息。现有的人工记录方法既效率低又错误过多,大大影响了图书馆的正常管理工作。因此需要对书籍资源、读者资源、借书信息、还书信息进行管理,及时了解各个环节中信息的变更,有利于管理效率的提高 要求: (1) 读者信息的制定、输入、修改、查询,包括种类、性别、借书数量、借书期限、备注。 (2) 书籍基本信息制定、输入、修改、查询,包括书籍编号、类别、关键词、备注。
(3) 借书信息制定、输入、修改、查询,包括书籍编号、读者编号、借书日期、借书期限、备注。
(4) 还书信息制定、输入、修改、查询,包括书籍编号、读者编号、还书日期、还书期限、备注。
(5)意外处理(续借、超期赔偿、丢失赔偿、损坏赔偿等) (6)多条件查询各种信息. (7)用户权限(普通读者和图书管理员) (8)异常处理
项目10 科研项目管理
要求:在该项目中,应按照实际需求分析过程建立关系,以下关系仅供参考:
项目信息:项目编号、项目名称、项目性质(国家86
3、国家97
3、国家自然科学基金、横向等)、项目类型(软件技术、规范设计、计算机应用)、项目总费用(单位:千元)、项目状态、开始日期、状态、结题日期、费用余额。 科研单位:单位编号、单位名称、单位性质(高校、研究所、企业等)、联系人、电话号码、电子信箱; 项目管理:项目编号、单位编号、合同编号(允许多个单位联合承担一项项目); 项目费用管理:项目编号、下拨费用、时间。
题目11-进销存管理信息系统
• 是流程较为完整的中小型商业企业信息管理系统,包括企业的客户信息、供应商信息、银行资料信息、采购管理、销售管理、库房管理、报表管理、应收应付、报表统计、利润统计和异常处理一等一系列企业业务全方位的解决方案。 •
题目12-车辆管理信息系统
• 协助各单位对车辆档案、驾驶人员、车辆费用(维修费、洗车费、养路费、燃料费、停车费、保险费、年审费、过桥费等多项费用)、车辆使用和交通事故进行全面管理的系统。车辆管理资料完备,打印灵活。提供车辆综合查询系统,可以按各种查询条件查询到车辆费用明细和车辆费用合计。各种车辆资料可方便打印成自由设定的表格方式。系统配有详细的开发帮助、资料文档,操作演示图文并茂,简便易用。 项目13 房屋交易管理
要求:在该项目中,应按照实际需求分析过程建立关系,以下关系仅供参考:
房屋信息:房屋编号、房屋名称、房屋装修(未装修、简易装修、普通装修、豪华装修)、房型、房屋性质(新房、二手房)、房屋面积、售价、奉送项目;
客户信息:客户编号、姓名、单位或国籍、性别、年龄、身份证号;
交易信息:房屋编号、客户编号、时间、成交价、交易费用、状态
项目14 计算机学院会议室管理系统
项目15 小区停车管理系统
推荐阅读:
通讯录系统数据库设计(精选9篇)11-20
设计通讯录管理系统(共9篇)09-22
串口通讯与数据通信论文提纲11-15
《化工设计通讯》杂志简介05-13
通讯软件设计论文提纲11-15
串口通讯与数据通信论文(推荐3篇)04-13
关于DCS数据通讯故障的分析与思考09-12
数据通讯中红外通信技术论文(共3篇)05-02
通讯软件设计论文(共3篇)04-12
教室设计大赛通讯稿(推荐6篇)10-19