简单的电话簿 java编程
Java散列表以拉链法解决冲突问题(以电话簿为例)
Java散列表以拉链法解决冲突问题(以电话簿为例)原理哈希表的结构哈希表⼜被称为数组链表。
当插⼊删除操作和取值操作都较频繁时,我们可以采⽤哈希表来作为集合的数据结构。
定义:哈希表(Hash table,也叫散列表),是根据关键码值(Key value)⽽直接进⾏访问的数据结构。
也就是说,它通过把关键码值映射到表中⼀个位置来访问记录,以加快查找的速度。
这个映射函数叫做散列函数,存放记录的数组叫做散列表。
⼤致结构如下但是本例题未采⽤Java⾃带的hash集合特点:1.第⼀列是⼀个数组。
因此我们在查找每⼀个链表头结点位置所耗费的时间复杂度都是常数1;2.每⼀⾏都是⼀个链表。
理论上,这个链表可以⽆限扩⼤。
实际上当然是不⾏的,我们可以设想两种极端情况。
⼀种是链表的长度远远⼤于头结点数组的长度,那么这时这个哈希表其实就相当于⼀个链表,它取值操作的时间复杂度还是接近n。
另⼀种情况就是链表的长度远远⼩于头结点数组的长度,那么这时这个哈希表其实就相当于⼀个数组,它插⼊和删除操作的时间复杂度还是接近n。
为了避免这两种极端情况的出现,我们引⼊了⼀个控制变量peakValue(当前哈希表的数据个数/数组长度)。
如果这个值超过了某⼀界限,我们就对当前的哈希表进⾏重构。
3.每⼀次存放和取出数据,都是先找到对应的⾏号(即头结点的位置),然后再去遍历该⾏链表中的各个数据。
哈希表的构建思路基本思路:⾸先我们需要开辟⼀个连续的数组来储存每个头结点,这个数组的⼤⼩是固定的。
每当我们从⽂件中读取出⼀个电话簿,⾸先要将其封装成⼀个节点。
然后根据number计算出相应的code,这个code会定位到唯⼀的⼀个链表头。
最后再把数据放到这个链表⾥⾯。
源代码import java.io.File;import java.io.FileNotFoundException;import java.util.Scanner;public class worktest {class Listnode {String name;String number;Object key;Listnode next;Listnode() {};Listnode(String name, String number) { = name;this.number = number;}Listnode(String name, String number, Listnode next) { = name;this.number = number;this.next = next;}}public void read_file(Listnode []node){File file = new File("d://电话号码.txt");if (!file.exists()){System.out.println("该⽂件不存在");System.exit(0);}try {Scanner scanner = new Scanner(file);while(scanner.hasNext()){String name = scanner.next();String number = scanner.next();Listnode listnode = new Listnode(name,number);listnode.next = null;int i = (number.charAt(10)-'0')%10;//除10取余// System.out.println(i);if(node[i] == null){//简单拉链法存数据node[i] = listnode;}else{listnode.next = node[i].next;node[i].next = listnode;}}} catch (FileNotFoundException e) {e.printStackTrace();}}public void show(Listnode []node){//输出电话簿Listnode listnode = new Listnode();for (int i = 0; i < 10; i++) {listnode = node[i];while (listnode!=null){System.out.println(+" "+listnode.number);listnode = listnode.next;}}}public void search1(Listnode []node, String name){//根据姓名查找 Listnode listnode = new Listnode();for (int i = 0; i < 10; i++) {listnode = node[i];while (listnode != null){if (.equals(name)){System.out.println(+" "+listnode.number); }listnode = listnode.next;}}}public void search2(Listnode []node, String number){//根据电话查找 Listnode listnode = new Listnode();for (int i = 0; i < 10; i++) {listnode = node[i];while (listnode != null){if (listnode.number.equals(number)){System.out.println(+" "+listnode.number); }listnode = listnode.next;}}}public static void main(String[] args) {Scanner in = new Scanner(System.in);worktest test = new worktest();Listnode []node = new Listnode[10];//key%10test.read_file(node);// test.show(node);while(true){System.out.println("请选择查找⽅式:1.按姓名查找,2.按电话查找,(输出其他退出)");int choice = in.nextInt();if (choice == 1){String name = in.next();long startTime = System.currentTimeMillis();//计算查找所消耗的时间test.search1(node,name);long endTime = System.currentTimeMillis();System.out.println("本次查找消耗时间为"+(endTime-startTime)+"微秒");}else if(choice == 2){String number = in.next();long startTime = System.currentTimeMillis();test.search2(node,number);long endTime = System.currentTimeMillis();System.out.println("本次查找消耗时间为"+(endTime-startTime)+"微秒");}elsebreak;}}}⽂件截图总结反思1.把⼀个String字符串转化为int型整数有两种意思。
号码簿管理系统(详细设计说明书)
1引言 (2)1.1编写目的 (2)1.2背景 (2)1.3定义 (2)1.4参考资料 (3)2程序系统的结构 (3)3程序1(标识符)设计说明 (4)3.1程序描述 (4)3.2功能 (5)3.3性能 (5)3.4输人项 (6)3.5输出项 (6)3.6算法 (6)3.7流程逻辑 (6)3.8接口 (7)3.9存储分配 (7)3.10注释设计 (8)3.11限制条件 (8)3.12测试计划 (8)3.13尚未解决的问题 (8)4程序2(标识符)设计说明 (8)详细设计说明书1引言1.1编写目的本详细设计说明书实现添加联系人的姓名和手机号码家庭电话号码和办公号码,并且连接进数据库,将信息储存进数据库文件中去,添加成功弹出添加成功的对话框,对话框中的信息可以重置。
可以在文本框中显示姓名,手机号码,家庭电话,办公电话等用户信息,添加姓名,手机号码,家庭电话,办公电话等信息到数据库中,并且用户的图形界面要求在文本框中显示姓名,手机号码,家庭电话,办公电话等用户信息。
修改姓名,手机号码,家庭电话,办公电话等信息到数据库中, 对已经存储的信息进行查询,而客户的具体需求多样,为了给客户营造更多的便利,可以将软件的查询细分为按整体进行查询模糊查询和精确查询和整体查询,整体查询允许用户用整体的查询条件,比如信息的姓来进行查询。
实现了满足用户需求的多样化。
对已经存储的信息进行查询,而客户的具体需求多样,为了给客户营造更多的便利,可以将软件的查询细分为按整体进行查询模糊查询和精确查询和整体查询,模糊查询允许用户用较为模糊的查询条件,比如信息的姓来进行查询。
实现了满足用户需求的多样化。
对已经存储的信息进行查询,而客户的具体需求多样,为了给客户营造更多的便利,可以将软件的查询细分为按整体进行查询模糊查询和精确查询和整体查询,整体查询允许用户用整体的查询条件,比如信息的姓来进行查询。
实现了用户的便利化。
1.2背景说明:a.号码簿管理系统;b.添加姓名,手机号码,家庭电话,办公电话等信息到数据库中,同样需要连接SQLSERVER2000数据库,用户的图形界,修改姓名,手机号码,家庭电话,办公电话等信息到数据库中,同样需要连接SQLSERVER2000数据库1.3定义号码薄管理系统软件:自主开发的管理软件,以增加或者删除个人通讯信息为基本目的,用数据库来实现功能的软件。
使用sqliteopenhelper实现简易通讯录实训报告
实训报告:使用SQLiteOpenHelper实现简易通讯录一、实训目标通过本次实训,掌握SQLite数据库的基本操作,使用SQLiteOpenHelper类创建、打开、升级数据库,以及在Android应用程序中实现简易通讯录功能。
二、实训步骤1.创建SQLite数据库2.使用SQLiteOpenHelper类创建数据库。
首先,创建一个继承自SQLiteOpenHelper的类,并重写onCreate()和onUpgrade()方法。
在onCreate()方法中执行创建表的SQL语句,onUpgrade()方法用于升级数据库时执行更新表的SQL语句。
3.实现通讯录功能4.在通讯录界面上,显示联系人列表。
当用户点击某个联系人时,显示该联系人的详细信息。
实现添加、删除、修改和查询联系人操作。
5.实现数据绑定6.使用Data Binding库将数据绑定到界面上。
在布局文件中定义变量,通过布局文件与Java代码的双向绑定,将联系人数据显示在界面上。
7.实现增删改查操作8.通过SQLiteOpenHelper类提供的insert()、update()、delete()和query()方法实现增删改查操作。
将操作封装在DAO(Data Access Object)类中,方便进行数据操作。
9.测试应用程序10.运行应用程序,测试通讯录功能是否正常工作。
检查添加、删除、修改和查询联系人操作是否能够正确执行。
三、实训总结通过本次实训,我掌握了SQLite数据库的基本操作,了解了如何使用SQLiteOpenHelper 类创建、打开和升级数据库。
同时,我也学会了在Android应用程序中实现简易通讯录功能,包括数据绑定和增删改查操作。
通过实际操作,我对Android应用程序开发有了更深入的理解。
在未来的学习和工作中,我将继续深入学习Android开发技术,提高自己的技能水平。
java验证手机号码、电话号码(包括最新的电信、联通和移动号码)
java验证⼿机号码、电话号码(包括最新的电信、联通和移动号码)⼀、⽬前的号码段(2017-06-01更新)⼆、代码package com.linbilin.test;import java.util.regex.Pattern;public class CheckPhone {/** 座机电话格式验证 **/private static final String PHONE_CALL_PATTERN = "^(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?$";/*** 中国电信号码格式验证⼿机段: 133,153,180,181,189,177,1700,173* **/private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|53|7[37]|8[019])\\d{8}$)|(?:^(?:\\+86)?1700\\d{7}$)";/*** 中国联通号码格式验证⼿机段:130,131,132,155,156,185,186,145,176,1707,1708,1709,175* **/private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1(?:3[0-2]|4[5]|5[56]|7[56]|8[56])\\d{8}$)|(?:^(?:\\+86)?170[7-9]\\d{7}$)";/*** 简单⼿机号码校验,校验⼿机号码的长度和1开头*/private static final String SIMPLE_PHONE_CHECK = "^(?:\\+86)?1\\d{10}$";/*** 中国移动号码格式验证* ⼿机段:134,135,136,137,138,139,150,151,152,157,158,159,182,183,184* ,187,188,147,178,1705***/private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1(?:3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(?:^(?:\\+86)?1705\\d{7}$)";/*** 仅⼿机号格式校验*/private static final String PHONE_PATTERN = new StringBuilder(300).append(CHINA_MOBILE_PATTERN).append("|").append(CHINA_TELECOM_PATTERN).append("|").append(CHINA_UNICOM_PATTERN).toString();/*** ⼿机和座机号格式校验*/private static final String PHONE_TEL_PATTERN = new StringBuilder(350).append(PHONE_PATTERN).append("|").append("(").append(PHONE_CALL_PATTERN).append(")").toString();/*** 匹配多个号码以,、或空格隔开的格式,如 177********* 133********、(596)3370653,177********,133******** (0596)3370653* @param input* @param separator 可以⾃⼰指定分隔符,如"、, "表⽰可以以顿号、逗号和空格分隔* @return*/public static boolean checkMultiPhone(String input, String separator) {separator = escapeMetacharacterOfStr(separator);String regex = "^(?!.+["+ separator+ "]$)(?:(?:(?:(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?)|(?:1\\d{10}))(?:["+ separator + "]|$))+$";return match(regex, input);}/*** 转义字符串中的[]-^\元字符** @param input* @param separator* @return*/private static String escapeMetacharacterOfStr(String input) {String regex = "[-^\\[\\]\\\\]";return input.replaceAll(regex, "\\\\$0");}/*** 仅⼿机号码校验** @param input* @return*/public static boolean isPhone(String input) {return match(PHONE_PATTERN, input);}/*** ⼿机号或座机号校验** @param input* @return*/public static boolean isPhoneOrTel(String input) {System.out.println(PHONE_TEL_PATTERN);return match(PHONE_TEL_PATTERN, input);}/*** 验证电话号码的格式** @author LinBilin* @param str* 校验电话字符串* @return 返回true,否则为false*/public static boolean isPhoneCallNum(String str) {return match(PHONE_CALL_PATTERN, str);}/*** 验证【电信】⼿机号码的格式** @author LinBilin* @param str* 校验⼿机字符串* @return 返回true,否则为false*/public static boolean isChinaTelecomPhoneNum(String str) { return match(CHINA_TELECOM_PATTERN, str);}/*** 验证【联通】⼿机号码的格式** @author LinBilin* @param str* 校验⼿机字符串* @return 返回true,否则为false*/public static boolean isChinaUnicomPhoneNum(String str) { return match(CHINA_UNICOM_PATTERN, str);}/*** 验证【移动】⼿机号码的格式** @author LinBilin* @param str* 校验⼿机字符串* @return 返回true,否则为false*/public static boolean isChinaMobilePhoneNum(String str) { return match(CHINA_MOBILE_PATTERN, str);}/*** 简单⼿机号码校验,校验⼿机号码的长度和1开头** @param str* @return*/public static boolean isPhoneSimple(String str) {return match(SIMPLE_PHONE_CHECK, str);}/*** 匹配函数** @param regex* @param input* @return*/private static boolean match(String regex, String input) { return Pattern.matches(regex, input);}}。
通讯录程序设计
通讯录程序设计设计一个实用的小型通讯录程序,具有添加,查询和删除功能。
由姓名,籍贯,电话号码1,电话号码2,电子邮箱组成,姓名可以由字符和数字混合编码。
电话号码可由字符和数字组成。
实现功能:(1)系统以菜单方式工作(2)信息录入功能(3)信息浏览功能(4)信息查询功能(5)信息修改功能(6)系统退出功能//WREN编取材网路(适用于VC++)本题有细节上的缺陷,请自身予以修改。
#include <stdio.h>#include <conio.h>#include <string.h>#include <stdlib.h>#define PF printf#define SF scanfint n=0,i;struct address_book{char name[20];char place[20];long num1;long num2;char mail[40];}stud[200];void add(){char j;front1:system("cls");//清屏PF("\n请输入要添加的姓名:");SF("%s",stud[n].name);PF("\n请输入要添加的籍贯:");SF("%s",stud[n].place);PF("\n请输入要添加的电话号码一:");SF("%d",&stud[n].num1);PF("\n请输入要添加的电话号码二:");SF("%d",&stud[n].num2);PF("\n请输入要添加的电子邮箱:");SF("%s",stud[n].mail);getchar();n++;PF("是否继续(Y/N)?:");j=getchar();getchar();if(j=='y'||j=='Y') goto front1;//再次输入记录}void del(){int k=0,m,i;char j;front2:system("cls");//清屏PF("\n请输入要删除的联系人:");SF("%d",&m);getchar();for(i=0;i<n;i++)//查找记录if(strcmp(m,stud[i].name)==0){k=1;break;}if(k==1)//删除记录{for(k=i;k<n-1;k++)stud[k]=stud[k+1];n--;PF("已删除\n\n");}else{PF("找不到要删除的记录!\n");PF("按回车键返回:");getchar();}PF("是否继续(Y/N)?:");j=getchar();getchar();if(j=='y'||j=='Y') goto front2;getchar();}void arrange(){int k,i;struct address_book t;system("cls");//清屏PF("姓名籍贯电话号码一电话号码二电子邮箱\n");for(k=0;k<n-1;k++)for(i=0;i<n-k-1;i++)if(strcmp(stud[i].name,stud[i+1].name)<0){t=stud[i];stud[i]=stud[i+1];stud[i+1]=t;}for(i=0;i<=n-1;i++)PF("%-10s%-8s %-15ld %-15ld %-20s",stud[i].name,stud[i].place,stud[i].num1 ,stud[i].num2,stud[i].mail);PF("按回车键返回!");getchar();getchar();}void change(){int k=0;char j,m[20];front5:system("cls");//清屏PF("\n请输入要修改记录的姓名:");SF("%s",m);getchar();for(i=0;i<n;i++)//查找if(strcmp(m,stud[i].name)==0){k=1;break;}if(k==1){PF("\n");PF("\n请输入修改后的姓名:");SF("%s",stud[i].name);PF("\n请输入修改后的籍贯:");SF("%s",stud[i].place);PF("\n请输入修改后的电话号码一:");SF("%d",&stud[i].num1);PF("\n请输入修改后的电话号码二:");SF("%d",&stud[i].num2);PF("\n请输入修改后的电子邮箱:");SF("%s",stud[i].mail);PF("修改成功\n");getchar();}if(k==0){PF("找不到要修改的记录!\n");PF("按回车键返回:");getchar();}getchar();PF("是否继续(Y/N)?:");j=getchar();getchar();if(j=='y'||j=='Y') goto front5;}void find(){int k=0;char j,m[20];front3:system("cls");//清屏PF("\n请输入要修改记录的姓名:");SF("%s",m);getchar();for(i=0;i<n;i++)//查找if(strcmp(m,stud[i].name)==0){k=1;break;}if(k==1){PF("姓名籍贯电话号码一电话号码二电子邮箱\n");PF("%-10s%-8s %-15ld %-15ld %-20s",stud[i].name,stud[i].place,stud[i].num1 ,stud[i].num2,stud[i].mail);}else{PF("找不到该联系人!请重新输入!按回车返回!");getchar();goto front3;}PF("是否继续(Y/N)?:");j=getchar();getchar();if(j=='y'||j=='Y') goto front3;}void main(){char j;PF("\n\n\n\n\n\n\t\t\t 欢迎使用简单通讯录");PF("\n\n\n\t\t\t\t制作人:王靖焱");PF("\n\n\n\t\t\t\t 2012年2月");PF("\n\n\n\n\n\n\n\n\n\n\n\n按回车键进入主菜单:");getchar();loop:system("cls");PF("\n");PF("\t\t\t\t ************\n");PF("\t\t\t\t ***主菜单***\n");PF("\t\t\t\t ************\n\n\n\n\n\n");PF("\t\t 1、录入联系人信息2、删除联系人信息\n\n");PF("\t\t 3、查询联系人信息4、联系人信息游览\n\n");PF("\t\t 5、修改联系人信息6、保存退出系统\n\n");PF("\n\n\n\n\n\n\n\n\n请选择[1/2/3/4/5/6]:");j=getchar();if(j=='\n') goto loop;//返回主菜单switch(j){case '1': add();goto loop;//返回主菜单case '2': del();goto loop;case '3': find();goto loop;case '4': arrange();goto loop;case '5': change();goto loop;case '6':{FILE *fp;fp=fopen("student.dat","w");for(i=0;i<n;i++)fwrite(&stud[i],sizeof(struct address_book),1,fp);fclose(fp);exit(0);}default: goto loop;} }。
02-电话号码薄(完整)
void Pack(); // 在物理上删除作有删除标记的记录
public:
// 构造函数, 析构函数与方法
TelephoneBook(); // 无参构造函数
virtual ~TelephoneBook(){ file.close(); } // 析构函数
struct TelephoneType
{ // 电话结构
bool delTag; // 删除标志
unsigned int seat; // 序号
char name[16]; // 姓名
char teleNo[18]; // 电话号码
};
// 电话号码簿类的声明
cin>>;
cout<<"输入电话号码:";
cin>>telph.teleNo;
file.write((char*)&telph,sizeof(TelephoneType));
cout<<"继续添加吗?";
}
while(UserSaysYes());
}
if(!file.eof())
{//查询成功
cout<<setw(18)<<telph.seat<<setw(18)<<<<setw(18)<<telph.teleNo <<endl;
cout<<"输入更新后数据:"<<endl;
cout<<"输入序号";
Java通讯录管理系统设计报告
Java通讯录管理系统设计报告1. 引言随着社会发展和信息技术的进步,通讯录在人们的日常生活和工作中变得越来越重要。
Java通讯录管理系统是一种用于管理个人和组织联系信息的软件系统。
本篇文档将详细介绍Java通讯录管理系统的设计和实现。
2. 功能需求Java通讯录管理系统具有以下功能需求: - 添加联系人:用户可以添加新的联系人,包括姓名、电话号码、电子邮件等相关信息。
- 删除联系人:用户可以删除已存在的联系人。
- 编辑联系人:用户可以修改已存在联系人的信息。
- 搜索联系人:用户可以根据姓名、电话号码或其他关键字搜索联系人。
- 显示联系人列表:用户可以查看所有联系人的列表,并按照姓名或其他方式进行排序。
- 导入/导出联系人:用户可以将联系人导入/导出到文件中,以实现数据的备份和共享。
3. 系统设计3.1 技术栈选择Java通讯录管理系统采用Java语言进行开发,使用Java的面向对象特性来实现系统的各个功能模块。
系统使用MySQL数据库来存储联系人的信息。
3.2 系统架构Java通讯录管理系统采用三层架构,分为表示层、业务逻辑层和数据访问层。
•表示层:负责与用户的交互,包括图形界面和用户输入输出的处理。
•业务逻辑层:负责处理用户的请求,对联系人信息进行增加、删除、编辑、搜索等操作,并调用数据访问层进行数据的读写。
•数据访问层:负责与数据库交互,进行联系人信息的读写操作。
3.3 类设计在Java通讯录管理系统中,主要涉及以下类的设计: - Contact类:表示一个联系人,包含姓名、电话号码、电子邮件等属性。
- ContactDAO接口:定义对联系人的增删改查等操作。
- ContactDAOImpl类:实现ContactDAO接口,负责与数据库进行交互。
- ContactService类:负责处理业务逻辑,调用ContactDAOImpl 类进行联系人信息的操作。
- ContactConsole类:表示层的用户界面,处理用户输入输出和展示联系人信息。
java课程设计(通讯录管理系统)
掌握Java语言基础
理解面向对象编程思 想
掌握数据库操作技术
提高团队协作和沟通 能力
完成一个实用的通讯 录管理系统
联系人管理:添加、删除、修改、查询联系人信息 联系人分组:创建、删除、修改、查询联系人分组 联系人搜索:根据姓名、电话、邮箱等信息进行搜索 联系人导出:将联系人信息导出为Excel、CSV等格式的文件 联系人导入:从Excel、CSV等格式的文件中导入联系人信息 系统设置:修改系统语言、主题、字体等设置
数据库类型:MySQL
数据库表结构:用户表、 联系人表、分组表等
主键和外键:用户ID、联 系人ID、分组ID等
数据库操作:增删改查等 基本操作
数据库优化:索引、缓存、 分表等优化措施
数据库安全:用户权限管 理、数据加密等安全措施
界面布局:简洁 明了,易于操作
色彩搭配:协调 统一,易于阅读
功能模块:联系 人管理、分组管 理、搜索功能等
汇报人:
添加标题
添加标题
查询方式:支持模糊查询和精确查 询
查询优化:使用索引提高查询效率
功能描述:删除指定联系人信 息
实现方法:调用数据库删除接 口
操作步骤:选择联系人,点击 删除按钮,确认删除
注意事项:确保删除操作不会 影响其他数据完整性
添加联系人:输入姓名、电话、邮箱等信 息
修改联系人:修改姓名、电话、邮箱等信 息
删除联系人:删除指定联系人
查询联系人:根据姓名、电话、邮箱等信 息进行查询
导出联系人:将联系人信息导出为Excel 或CSV文件
导入联系人:将Excel或CSV文件中的联系 人信息导入到系统中
修改模块界面:提供用户友 好的界面,方便用户操作
简单个人电话号码查询系统数据结构课程设计
一、课题任务人们在日常生活中经常要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询二、设计要求(1)在外存上,用文件保存电话号码信息;(2)在内存中,设计数据结构存储电话号码信息;(3)提供查询功能:根据姓名或编号实现快速查询;(4)提供其他维护功能,例如插人、删除、修改等。
三、程序的结点设计现假设链表结点仅含有一个数据域和一个指针域。
数据域是为了描述通讯者的相关信息,定义通讯者的结点类型:typedef struct{char num[10]; //编号char name[15]; //姓名char phone[11]; //电话号码}dataType;因此,,线性表的链式存储结构定义如下:typedef struct node{ //结点类型定义dataType data; //结点的数据域struct node *next ; //结点指针域}listnode , * linklist ;linklist head ; //定义指向单链表的头指针listnode * p ; //定义一个指向结点的指针变量四、程序的功能设计创建:创建通讯录文件添加:添加通讯录记录输出:显示通讯录记录删除:删除通讯录记录查找:查询通讯录记录修改:修改通讯录记录保存:将信息保存到文件中五、程序的数据设计该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。
下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。
建立:可以建立通讯录记录,利用C语言文件,向文件中按顺序输入编号、姓名、电话号码,这里实际上是要求建立一个带头结点的单链表。
添加:可以添加通信录记录,向链表中继续增加结点,但只是输入到内存中,如果要输入到文件中还得调用保存函数。
输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。
简单java程序编程例子
简单java程序编程例子
以下是 8 条关于简单 Java 程序编程例子的内容:
1. 嘿,你知道吗?打印出一句话就很简单呢!就像这样:`("Hello World!");` 想象一下,电脑屏幕上出现了你让它说的话,是不是很神奇呀?
2. 哇哦,计算两个数的和也不难呀!比如 int a = 5, int b = 10; 然后 int sum = a + b; 这就求出结果啦,就像我们生活中做加法一样轻松呢!
3. 诶呀,判断一个数是奇数还是偶数也挺有趣呢!用 if 语句就可以啦,比如 int num = 7; if (num % 2 == 0) {...} else {...},是不是很有意思呀?
4. 嘿,还可以通过循环来重复做一些事情哦!像 for 循环,比如说要打印 5 次“我爱Java”,for (int i = 0; i < 5; i++) { ("我爱 Java"); } 这不就实现啦,感觉好酷呀!
5. 哈,创建一个数组来存储多个值也不难哟!int[] array = {1, 2, 3, 4, 5}; 然后可以通过索引来访问每个元素,就像找到藏在里面的宝贝一样呢!
6. 哇噻,实现一个简单的猜数字游戏也超好玩呢!电脑心里想一个数字,你来猜,然后它告诉你大了还是小了,这就跟和朋友玩游戏一样刺激呀!
7. 呀,创建一个类和对象也很重要呢!比如定义一个学生类,然后创建一个学生对象来表示具体的一个学生,这就像是给每个学生都造了一个专属模型一样呢!
8. 嘿嘿,用 Java 来解决一些实际问题,那才叫厉害呢!比如计算购物车的总价,或者统计一篇文章里某个单词出现的次数,这多有成就感呀!
结论:Java 编程有很多有趣又实用的例子呢,只要你去尝试,就能发现其中的乐趣和魅力!。
c语言中通讯录代码
c语言中通讯录代码以下是一个简单的C语言实现通讯录的代码。
这个程序可以添加,删除和查找联系人,以及列出所有联系人的信息。
```C#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_CONTACTS 100/* 定义联系人结构体 */struct contact {char name[50];char phone[20];char email[50];};/* 全局变量 */struct contact contacts[MAX_CONTACTS]; // 用于保存所有联系人int num_contacts = 0; // 当前联系人数量/* 函数声明 */void add_contact();void delete_contact();void search_contact();void list_contacts();int main() {int choice; // 用户选择的操作while (1) {printf("\n通讯录\n");printf("---------\n");printf("1. 添加联系人\n");printf("2. 删除联系人\n");printf("3. 查找联系人\n");printf("4. 列出所有联系人\n");printf("0. 退出\n");printf("请选择操作(0-4):");scanf("%d", &choice);switch (choice) {case 0:printf("谢谢使用通讯录!\n"); exit(0);case 1:add_contact();break;case 2:delete_contact();break;case 3:search_contact();break;case 4:list_contacts();break;default:printf("无效的选择,请重试!\n"); }}return 0;}/* 添加联系人 */void add_contact() {struct contact new_contact;printf("请输入姓名:");scanf("%s", new_);printf("请输入电话号码:");scanf("%s", new_contact.phone);printf("请输入电子邮件:");scanf("%s", new_contact.email);contacts[num_contacts] = new_contact;num_contacts++;printf("联系人已添加!\n");}/* 删除联系人 */void delete_contact() {char name[50];int i, index = -1;printf("请输入要删除的联系人姓名:"); scanf("%s", name);for (i = 0; i < num_contacts; i++) {if (strcmp(name, contacts[i].name) == 0) { index = i;break;}}if (index == -1) {printf("没有找到该联系人!\n");} else {for (i = index; i < num_contacts - 1; i++) { contacts[i] = contacts[i + 1];}num_contacts--;printf("联系人已删除!\n");}}/* 查找联系人 */void search_contact() {char name[50];int i, found = 0;printf("请输入要查找的联系人姓名:");scanf("%s", name);for (i = 0; i < num_contacts; i++) {if (strcmp(name, contacts[i].name) == 0) { printf("姓名:%s\n", contacts[i].name); printf("电话:%s\n", contacts[i].phone);printf("电子邮件:%s\n", contacts[i].email);found = 1;break;}}if (!found) {printf("没有找到该联系人!\n");}}/* 列出所有联系人 */void list_contacts() {int i;if (num_contacts == 0) {printf("通讯录为空!\n");} else {printf("所有联系人:\n");for (i = 0; i < num_contacts; i++) {printf("%d. 姓名:%s\t电话:%s\t电子邮件:%s\n", i + 1, contacts[i].name, contacts[i].phone, contacts[i].email);}}}```这个程序使用了结构体来表示联系人的信息,并通过全局数组来保存所有联系人。
Java课程设计通讯录管理系统
摘要随着社会的发展,人际关系变来越重要,为了保持良好的人际关系,必须常与亲戚朋友,同学同事保持联系,但有时候存在许多限制条件,因此我们需要为了快速查找联系人的信息,节省查找时间,开发通讯录管理系统。
通讯录管理系统是一个基于C/S模式的个人通讯录管理系统,它是将自己的联系人的具体信息集中处理,成为一个方便人们使用的小软件。
在开发过程中应用java,JDK,MYSQL,SWING等技术,由于开发工具与数据库之间的良好使用,可以为开发带来方便,使之成为可视性的系统。
通过采用相关技术,将系统设计的功能全部实现。
功能包括:用户登录,添加联系人信息,修改联系人信息,删除联系人信息,查询联系人信息,可以浏览全部通讯录联系人,可以根据数据表的歌字段来查询你要找的联系人等功能。
关键字:C/S架构,联系信息,通讯录,数据库目录一、需求分析 (2)二、系统总体规划 (2)三、程序流程 (2)四、设计步骤 (5)1.数据库表的设计 (5)2.详细设计 (5)五、设计总结 (9)六、结束语 (10)六、参考文献 (11)七、程序清单 (12)1一需求分析通讯录在当今的日常生活工作中的应用是十分普及的,每个人都拥有大量的通讯录资料信息,当前大家一般都用手工来记录所有的通讯录信息。
但随着时代的发展,人们的联系方式及信息变得复杂多样,通讯录信息大量增加,导致管理这些信息资料就成了问题。
直接操作来查找,添加,修改,删除这些信息,由于数据多,工作量十分巨大,查找,编辑都很困难,而且极易出错,容易造成资料的混乱或丢失。
在各种手机,上午通内设的电话簿尽管携带方便却又存在“记录量少,界面小,浏览不方便,记录信息不全面”的缺点。
有人利用Excel或Word编制通讯录,虽然数据比较全面,信息比较充分,可是查找及其不便,维护起来也麻烦,所以运用文件或数据库技术建立一个通讯录管资料理系统十分必要,使通讯录资料管理工作规范化,系统化,程序化,避免资料管理中的混乱。
java通讯录课程设计报告
课程设计报告:Java通讯录一、引言本次课程设计是关于Java通讯录的开发,旨在让我们更深入地理解Java编程语言在现实生活中的应用。
通讯录是一种常见的应用程序,它可以帮助我们管理联系人信息,方便我们与朋友和家人保持联系。
二、需求分析本次课程设计的目标是根据用户需求,设计并实现一个功能齐全的Java通讯录应用程序。
具体需求如下:用户可以添加联系人信息,包括姓名、电话号码、电子邮件地址等。
用户可以删除联系人信息。
用户可以编辑联系人信息。
用户可以按姓名、电话号码或电子邮件地址搜索联系人信息。
用户可以查看所有联系人信息。
三、设计数据库设计为了存储联系人信息,我们选择使用Java内置的ArrayList类作为数据库。
ArrayList是一个动态数组,可以根据需要自动增长。
我们将使用ArrayList的add()方法添加联系人信息,使用get()方法获取联系人信息,使用remove()方法删除联系人信息。
界面设计我们使用Java Swing库来创建用户界面。
界面包括以下组件:JLabel:显示提示信息和标题。
JTextField:用于输入和编辑联系人信息。
JButton:用于触发添加、删除、编辑和搜索等操作。
JTable:用于显示所有联系人信息。
JComboBox:用于选择搜索条件。
四、实现添加联系人信息当用户点击“添加”按钮时,程序会创建一个新的联系人对象,并将用户输入的信息设置到该对象中。
然后,程序将该对象添加到ArrayList中。
删除联系人信息当用户选择要删除的联系人并点击“删除”按钮时,程序会从ArrayList中删除该联系人对象。
编辑联系人信息当用户选择要编辑的联系人并点击“编辑”按钮时,程序会将该联系人的信息显示在文本框中,以便用户进行修改。
修改完成后,程序会将修改后的信息保存到ArrayList中。
搜索联系人信息当用户选择搜索条件并输入搜索关键字时,程序会在ArrayList 中查找符合条件的联系人对象,并将其显示在表格中。
java简单编程例子
java简单编程例子以下是十个以Java编写的简单编程例子:1. 计算两个整数的和```javapublic class SumCalculator {public static void main(String[] args) {int num1 = 10;int num2 = 5;int sum = num1 + num2;System.out.println("两个整数的和为:" + sum); }}```2. 判断一个数是否为偶数```javapublic class EvenNumberChecker {public static void main(String[] args) {int num = 6;if (num % 2 == 0) {System.out.println(num + "是偶数");} else {System.out.println(num + "不是偶数");}}}```3. 打印九九乘法表```javapublic class MultiplicationTable {public static void main(String[] args) {for (int i = 1; i <= 9; i++) {for (int j = 1; j <= i; j++) {System.out.print(j + " × " + i + " = " + (i * j) + "\t");}System.out.println();}}}```4. 计算一个数的阶乘```javapublic class FactorialCalculator {public static void main(String[] args) {int num = 5;int factorial = 1;for (int i = 1; i <= num; i++) {factorial *= i;}System.out.println(num + "的阶乘为:" + factorial); }}```5. 判断一个字符串是否为回文串```javapublic class PalindromeChecker {public static void main(String[] args) {String str = "level";boolean isPalindrome = true;for (int i = 0; i < str.length() / 2; i++) {if (str.charAt(i) != str.charAt(str.length() - 1 - i)) {isPalindrome = false;break;}}if (isPalindrome) {System.out.println(str + "是回文串");} else {System.out.println(str + "不是回文串");}}}```6. 求一个整数数组的平均值```javapublic class AverageCalculator {public static void main(String[] args) {int[] array = {5, 8, 12, 3, 10};int sum = 0;for (int num : array) {sum += num;}double average = (double) sum / array.length;System.out.println("数组的平均值为:" + average); }}```7. 将一个字符串反转```javapublic class StringReverser {public static void main(String[] args) {String str = "Hello World";StringBuilder reversedStr = new StringBuilder();for (int i = str.length() - 1; i >= 0; i--) {reversedStr.append(str.charAt(i));}System.out.println("反转后的字符串为:" + reversedStr.toString());}}```8. 判断一个年份是否为闰年```javapublic class LeapYearChecker {public static void main(String[] args) {int year = 2020;if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {System.out.println(year + "年是闰年");} else {System.out.println(year + "年不是闰年");}}}```9. 打印斐波那契数列前n项```javapublic class FibonacciSeries {public static void main(String[] args) {int n = 10;int[] fibonacci = new int[n];fibonacci[0] = 0;fibonacci[1] = 1;for (int i = 2; i < n; i++) {fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];}System.out.println("前" + n + "项斐波那契数列为:");for (int num : fibonacci) {System.out.print(num + " ");}}}```10. 判断一个数是否为质数```javapublic class PrimeNumberChecker {public static void main(String[] args) {int num = 17;boolean isPrime = true;if (num <= 1) {isPrime = false;} else {for (int i = 2; i <= Math.sqrt(num); i++) { if (num % i == 0) {isPrime = false;break;}}}if (isPrime) {System.out.println(num + "是质数");} else {System.out.println(num + "不是质数");}}}```以上是十个简单的Java编程例子,涵盖了常见的数学运算、字符串处理、数组操作等基础知识点。
基于JAVA CLDC1.1和MIDP2.0手机电话簿的设计与实现
件 。
无 线 通 讯 技 术 的 产 生 与 发展 , 变 了 人 们 的 生 活 。手 机 改 以 成 为 人 们 必 不 可 少 的 通 讯 设 备 。 手机 电话 簿 中 记 录 着 人 们 的 联 系 方 式 。一 旦 手 机 丢 失 了那 么 手 机 电 话 簿 中 记 录 有
一
个 名 为“ as r ” p s d 的记 录 存 储 管 理 系 统 (M S , 果 没 有 wo R )如
则 直 接 进 入 系 统 。如 果 有 则 读 取 其 中 R C R D 为 1的 记 E O DI
录转 换成 字符 串, 后与用 户输入 的密码 比较 , 然 正确 才可 以
并 写入 到 V C O 向量 中 , 然 后 再 写 入 手 机 电话 簿 的 记 录 E TR 存 储 管 理 系 统 (M S 中 。 R )
作者 简 介 :李 寒松 , 安 徽 宿 州人 , 男, 本科 , 师 , 究 方向 :基 于移 动 技 术的 计 算机 应 用技 术 , 接 触 式 i卡 应 用 。 讲 研 非 c
可能就找不 回来 了而且 还有 可能会 泄露 出去 。这样将 会造
成 很 大 的 损 失 和 麻 烦 。 有 没 有 一 种 办 法 能 在 手 机 丢 失 后 找 回 原 本 手 机 电 话 簿 中所 有 的 记 录 , 并且 能 远 程 控 制 手 机 电 话 簿 , 要 能 保 护 手机 电话 簿 中 的记 录 不 会 泄 露 出去 呢 ?本 还 文 将 对 这 一 问 题 进 行 探 讨 。 目前 主 流 的 手 机 都 支 持 J v A A C DC1 1 MI P . 。本 文 介 绍 一 个 支 持 J V C D . L . 和 D 20 A A L C1 1 和 MI P . D 2 0的具 有 网 络 备 份 、 同步 和 远 程 控 制 等 功 能 的 手 机 电话 簿 软 件 , 给 出 了设 计 思 路 及 实现 方 法 。 并 2 系 统 总 体 设 计 . 软 件 功 能 需 求 包 括 : 实 现 一 般 手 机 电 话 簿 软 件 所 具 有 的功 能, 加 邮箱备份 功能 、 载 更新功 能、 置密 码功 能、 增 下 设 远程控制功 能。 系 统 的 总 体 设 计 思 路 :使 用 记 录 存 储 管 理 系 统 (M S R ) 存 储 手 机 电 话 簿 中 的 记 录 , 记 录 存 储 管 理 系 统 (M S 的 对 R )
JAVA实验通讯录 实验报告
这次实验收获非常大对第六章的加深了理解更动手实践了有关事件监听器的操作这让本来在上课时听得懵懂的内容如事件监听器的响应等理解的更深刻了书上介绍的三种布局管理器也得到了实际的应用上课时没注意到的组件也应用到了实验中
集中上机实习报告
实验题目 用java实现简单功能的学生通讯录
实验题目
用java实现简单功能的学生通讯录;
这次实验收获非常大,对第六章的加深了理解,更动手实践了 有关事件监听器的操作,这让本来在上课时听得懵懂的内容如事件 监听器的响应等理解的更深刻了,书上介绍的三种布局管理器也得 到了实际的应用,上课时没注意到的组件也应用到了实验中。总体 来说,受益匪浅。
构造了
JFrame mainFrm 为主窗口,
JTextField name 为姓名输入框,
JTextField tel 为电话输入框,
JTextField add 为地址输入框,
JList dataList 为列表组建,
String[] ming 为姓名数组,
String[] phone 为电话数组,
String[] addr 为地址数组。
在实现过程中,定义 PhoneBook 类继承了 MouseAdapter 类与 ActionListener 接口,就可以用 Book 类来实现按钮命令监听器和鼠标事件监听 器。如果出现错误操作,会在控制台出现异常,且操作无效。
简单的java代码例子
简单的java代码例子Java是一门广泛应用的编程语言,下面为大家提供一些简单的Java代码例子:1. HelloWorld程序public class HelloWorld {public static void main(String[] args) {System.out.println('Hello, World');}}2. 计算器程序import java.util.Scanner;public class Calculator {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.print('Enter the first number: ');int num1 = in.nextInt();System.out.print('Enter the second number: ');int num2 = in.nextInt();System.out.println('Sum: ' + (num1 + num2));System.out.println('Difference: ' + (num1 - num2));System.out.println('Product: ' + (num1 * num2));System.out.println('Quotient: ' + (num1 / num2));}}3. 猜数字游戏import java.util.Random;import java.util.Scanner;public class GuessNumber {public static void main(String[] args) {Random rand = new Random();int numberToGuess = rand.nextInt(100) + 1;Scanner in = new Scanner(System.in);int guess;int tries = 0;do {System.out.print('Enter your guess (1-100): '); guess = in.nextInt();tries++;if (guess > numberToGuess) {System.out.println('Too high');} else if (guess < numberToGuess) {System.out.println('Too low');}} while (guess != numberToGuess);System.out.println('Congratulations, you guessed the number in ' + tries + ' tries');}}以上是几个简单的Java代码例子,希望对初学者有所帮助。
简单个人电话号码查询系统设计--程序部分
#include<iostream>#include<fstream>#include<string>using namespace std;int x=0;char a;int j=1;struct TeleNumber //数据类{char name[10]; //姓名double phoneNumber; //固定电话号码double mobileNumber; //移动电话号码char email[10]; //电子邮箱int s;TeleNumber * Next;void ReadFile(istream & in);void input();void display();} ;void TeleNumber::ReadFile(istream & in) //从文件把数据读入到程序{in>>name>>phoneNumber>>mobileNumber>>email;}void TeleNumber::input() //信息输入{cout<<"请输入姓名"<<endl;cin>>name;cout<<"请输入固定电话号码"<<endl;cin>>phoneNumber;cout<<"请输入移动电话号码"<<endl;cin>>mobileNumber;cout<<"请输入电子邮箱"<<endl;cin>>email;s=j++;}void TeleNumber::display() //信息输出{cout<<"姓名:"<<name<<'\t'<<"固定号码:"<<phoneNumber<<'\t'<<"移动电话号码:"<<mobileNumber<<'\t'<<"电子邮箱:"<<email<<endl; }class TeleMessage //功能类{public:TeleMessage(); //构造数据结构~TeleMessage(); //释放单链表void Save(); //数据保存到文件TeleNumber * Search(char *); //信息查找void Sort(); //排序void Insert(); //插入void Remove(); //删除void Change(); //更改void Show(); //显示void Swap(TeleNumber *,TeleNumber *); //两个TeleNumber对象交换数据域private:TeleNumber * End,* Head;ifstream in; //定义读,写文件对象ofstream out;};TeleMessage::TeleMessage(){Head=new TeleNumber; //头插法建立单链表Head->Next=new TeleNumber;End=Head->Next;in.open("TeleNumber.text"); //打开外存文件,看是否有数据存在if(!in)cout<<"电话系统中没有任何号码"<<endl;else{while(!in.eof()) //如果有,则打开,并将数据读取到程序{End->ReadFile(in);if(End->name[0]=='\0')break;End->Next=new TeleNumber;End=End->Next;}in.close();cout<<"读取电话号码系统成功!"<<endl;}cout<<"输入任意字符键继续"<<endl;cin>>a;}TeleMessage::~TeleMessage() //释放单链表{TeleNumber * temp;while(Head->Next!=End){temp=Head->Next;Head=Head->Next;delete temp;}delete Head,End; //删除头尾指针}void TeleMessage::Save() //保存文件{out.open("TeleNumber.txt"); //建立外存文件TeleNumber.txtfor(TeleNumber *p=Head->Next;p!=End;p=p->Next)out<<p->name<<"\t"<<p->phoneNumber<<"\t"<<p->mobileNumber<<"\t"<<p->email<<en dl; //将数据存到外存文件里out.close();cout<<"保存成功!"<<endl;}void TeleMessage::Swap(TeleNumber *p1,TeleNumber *p2) //两个类对象数据域进行交换{TeleNumber * temp=new TeleNumber;strcpy(temp->name,p1->name);strcpy(temp->email,p1->email);temp->mobileNumber=p1->mobileNumber;temp->phoneNumber=p1->phoneNumber;temp->s=p1->s;strcpy(p1->name,p2->name);strcpy(p1->email,p2->email);p1->mobileNumber=p2->mobileNumber;p1->phoneNumber=p2->phoneNumber;p1->s=p2->s;strcpy(p2->name,temp->name);strcpy(p2->email,temp->email);p2->mobileNumber=temp->mobileNumber;p2->phoneNumber=temp->phoneNumber;p2->s=temp->s;}void TeleMessage::Sort() //起泡排序{TeleNumber *p=NULL,*q=NULL;int exchange=j-1;int bound;int i;while(exchange){bound=exchange;exchange=0;for(p=Head->Next,i=1;i<bound;i++,p=p->Next)if(p->mobileNumber>p->Next->mobileNumber){Swap(p,p->Next); //调用交换函数exchange=p->s;}}Show();}void TeleMessage::Insert() //插入{End->input(); //从单链表尾部插入End->Next=new TeleNumber;End=End->Next;cout<<endl<<"插入成功"<<endl;}void TeleMessage::Remove() //删除{char name[20];TeleNumber * p=new TeleNumber,*temp=NULL;cout<<"请输入要删除人的姓名:"<<endl;cin>>name;p->Next=Search(name); //先进行查找,找到所要删除的结点if(Search(name)){temp=p->Next;p->Next=p->Next->Next; //摘链delete temp;cout<<"\t\t删除成功!"<<endl;}else{cout<<"\t\t没有找到!"<<endl;}}TeleNumber * TeleMessage::Search(char * name){for(TeleNumber *p=Head->Next;p!=End;p=p->Next)if(!strcmp(p->name,name)){if(x==4){p->display();return p;}elsereturn p;}if(x==4)cout<<"查无此人"<<endl;return 0;}void TeleMessage::Change() //修改信息{char name[20];cout<<"请输入要修改的人的姓名:";cin>>name;if(Search(name)){cout<<"\t\t已找到个人的信息,请输入新的信息!"<<endl;Search(name)->input();cout<<"修改成功!"<<endl;}else{cout<<"\t\t没有找到!"<<endl;}}void TeleMessage::Show(){for(TeleNumber * p=Head->Next;p!=End;p=p->Next)p->display();}int main(){bool flag=true;TeleMessage tele;char name[20];while(flag){system("cls");cout<<" 简单个人电话号码查询系统"<<endl;cout<<"1.增加电话号码"<<endl;cout<<"2.显示电话号码"<<endl;cout<<"3.排序个人电话"<<endl;cout<<"4.查找个人电话"<<endl;cout<<"5.删除个人信息"<<endl;cout<<"6.修改个人信息"<<endl;cout<<"7.保存个人信息*"<<endl;cout<<"0.退出系统*"<<endl;cout<<"请选择:";cin>>x;switch(x){case 0:flag=false;break;case 1:tele.Insert();break;case 2:tele.Show();break;case 3:tele.Sort();break;case 4:cout<<"请输入欲查找认得姓名"<<endl;cin>>name;tele.Search(name);break;case 5:tele.Remove();break;case 6:tele.Change();break;case 7:tele.Save();break;}cout<<"输入任意字母返回"<<endl;cin>>a;}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《面向对象程序设计》课程设计报告题目:简单的电话记录薄所属院(系):数计学院专业年级:08级计科四班指导老师:***小组成员/学号:孙义(组长) **********姚哲 2008061002曹宣勇 2008061008 时间:2010年11月14日摘要对于程序设计者而言,一个程序的好坏取决于源代码的精简、安全性强、可移植性好和易维护。
而对于用户而言,功能的完善和界面友好至关重要。
设计和实现图形用户界面的工作主要有两个:一是创建组成界面的各种成分和元素,指定他们的属性和位置关系,根据具体需要安排他们,从而构成完整的图形用户界面的物理外观;二是定义图形用户界面的事件和个界面元素对不同事件的响应,从而实现图形用户界面与用户的交互功能。
图形用户界面之所以能为广大用户所喜爱并最终成为事实上的标准,很重要的一点就在于图形用户界面的事件驱动机制,他可以根据产生的事件来决定执行的程序段。
事件(event)代表了某对象可执行的操作及其状态的变化。
列如,在图形用户界面,用户可以通过移动鼠标对特定图形界面元素进行单击,双击等操作来实现输入,输出操作。
该系统主要功能包括:实现添加联系人的姓名、手机号码、家庭电话、住址、公司及分组,并且对输入的信息进行储存。
添加或修改消息成功,则将消息显示在电话簿的记录上。
如果输入的方法有误,对话框会显示相应的错误提示。
消息对话框负责显示消息,调用其静态方法显示警告信息。
要求在文本框中显示姓名,手机号码,家庭电话、住址、公司及分组。
添加姓名,手机号码,地址,分组等信息将会保存到本地磁盘的文档中。
修改姓名,手机号码,地址,分组等信息也会保存到本地磁盘中,用户的图形界面将显示所有的输入信息。
对已经存储的信息进行查询,而客户的具体需求多样,为了给客户营造更多的便利,可以将软件的搜索细分为按姓名查找和按电话号码查找。
目录•设计题目 4 •实验分工 4 •系统环境 4 •设计内容 4 •总体设计思路。
5 •各类模块的功能及成员变量和成员方法的作用。
6 •程序清单 9 •软件测试数据及测试结果19 •设计中遇到的问题及解决方案22 •心得体会23一、设计题目简单的电话记录簿二、实验分工姓名分工孙义(组长)编写代码、修改代码、程序及实验报告的总体设计姚哲编写代码、分析运行结果、心得体会曹宣勇编写代码、分析运行结果、查找资料三、系统环境2.1软件环境Java版本:jdk1.6.0_182.2硬件环境操作系统:Windows 7 ultimate处理器:AMD X4 B35 2.91GHz内存:2GB四、设计内容4.1设计目标手机的信息管理无外乎添加联系人的姓名、手机号码、家庭电话、住址、公司和分组。
可以删除相对应的信息以及对存储的信息进行查询和修改。
为满足客户的具体需求多样,给客户营造更多的便利,本软件的查询分为按姓名查找和按电话号码查找。
为了更方便用户的查询号码,本软件更加直观的将所有的号码存储放在主界面的表格区域中,用户可自行选择要显示的分组,将用户的所有的信息显示在表格区域中。
4.2系统功能模块该系统共有五个主要模块:1、创建信息2、删除信息3、修改信息4、搜索信息,按姓名查找5、搜索信息,按电话号码查找6、按分组显示信息4.3系统权限划分本系统只要使用者通过启动程序就可以使用,无需身份验证。
4.4可行性分析●技术可行性根据系统功能、性能及实现系统的各项约束条件,现有的技术已较为成熟,硬件、软件的性能要求、环境条件等各项条件良好,估计利用现有技术条件应完全可以达到该系统的功能目标。
同时,考虑给予的开发期限也较为充裕,预计系统是可以在规定期限内完成开发。
●经济可行性估算新系统的成本效益分析,其中包括估计项目开发的成本,开发费用和今后的运行、维护费用,估计新系统将获得的效益,估算开发成本是否回高于项目预期的全部经费。
并且,分析系统开发是否会对其它产品或利润带来一定影响。
●运行可行性新系统的研制和开发是充分得考虑用户对系统的易于管理,管理者方便查询设备信息效率。
从而能完全满足使用者的要求。
五、总体设计思路PhoneBookFrame模块电话簿总体框架StatusTableModel模块状态区表格模型SetPersonPanel模块创建联系人ModPerson模块修改数据CharacterComparator模块比较Person模块用来获取用户信息的IO模块序列化读写文件及保存文件对每次输入的用户信息,系统将会自动保存在PhoneBook.dat中。
六、各类模块的功能及成员变量和成员方法的作用PhoneBookFrame模块实现的是电话簿总体框架的构造StatusTableModel 模块的作用是定义状态区表格模型 数据成员作用create 定义一个标签为create 的按钮 research 定义一个标签为research 的按钮 delete 定义一个标签为delete 的按钮 modi 定义一个标签为modi 的按钮 text定义一个标签为text 的文本域statusTable定义一个标签为statusTable 的表格statusTableModel 定义一个标签为statusTableModel 的表格区域 type 定义一个标签为type 的下拉列表 pane1 定义一个标签为pane1的容器 pane2 定义一个标签为pane2的容器 pane3 定义一个标签为pane3的容器 pane4 定义一个标签为pane4的容器 pane5 定义一个标签为pane5的容器buttonOne 定义一个标签为buttonOne 的选项按钮 buttonTwo 定义一个标签为buttonTwo 的选项按钮 Items[] 定义一个数组io定义一个io 类的数组<Person>vec定义一个Vector 类型的静态对象成员方法 作用object.addActionListener(this) 注册object 给监听对象public static void add(String name,String number,String add) 向table 中添加数据,static 使得在SetPersonPanel 中调用public static void mod(int s,String name,String number,String add)修改table 数据,static 使得在ModPerson 中调用actionPerformed(ActionEvent e) 对于监听事件的响应 Public reSetV() 重置vecpublic static voidrepaintTable(Vector<Person> vv) 对表格区域模块的所有的用户信息进行 重新写入public voiditemStateChanged(ItemEvent e) 对于下拉列表状态事件的响应数据成员 作用rowData[]定义一行5栏的状态表格IO 模块的作用是序列化读写文件以及将用户输入的所有的所有的信息以PhoneBook 名dat 格式存放在当前的文件夹中Person 模块的作用是接受用户输入的个人用户信息并将它添到表格区域模块数据成员 作用name定义<Person>中的数据成员cellphone homenumber address typeworkplace成员方法作用public StatusTableModel()添加状态栏的属性名 public boolean isCellEditable(int row, int column)设置表格区域模块不可编辑public void addRow(String name,String cellphone,Stringhomenumber,String address,String workplace)在表格区域中添加列名public void rRow(int n)在表格区域中删除单个用户的所有的信息public void setRow(int m,String name,String cellphone,String homenumber,String add,String workplace)设置列的值public void removeAll()移除整个表格的所有信息public void addAll(Vector<Person> v) 将<Person> v 中新增的用户信息添加到表格区域中数据成员 作用filename 定义一个File 类的文件 <Person>v 定义一个动态数组成员方法作用public voidwritePerson(Vector <Person>ve)将新增到动态数组Person>ve 的信息写入文档中 public Vector<Person> readPerson()从文档中读取信息到<Person>的动态数组中CharacterComparator 模块的作用是将更新的个人用户信息与表格中所有的信息进行比较以获得引发事件的对象名SetPersonPanel 模块的作用是创建用户的个人信息成员方法作用Person(String name, String number, Stringaddress, String type) 引用类的数据成员setName(String name1)设置数据成员setNumber(String number1)setAddress(String address1) setType(String type1) getName() 获取数据成员的信息 getNumber() getAddress() getType() getInt()成员方法作用public CharacterComparator() 定义Collator 的规则 public int compare(Objectobj1, Object obj2)比较并获取新增的信息数据成员 作用confirm 定义一个标签为confirm 的按钮 cancel 定义一个标签为cancel 的按钮 cellphone 定义一个标签为cellphone 的按钮 homenumber 定义一个标签为homenumber 的按钮 address 定义一个标签为address 的按钮 type定义一个标签为type 的按钮workplace 定义一个标签为workplace 的按钮 name1定义一个标签为name1的文本域cellphone1 定义一个标签为cellphone1的文本域 homenumber1 定义一个标签为homenumber1的文本域 add1 定义一个标签为add1的文本域 tye1定义一个标签为tye1的文本域workplace1 定义一个标签为workplace1的文本域 io定义一个io 类的数组<Person>v 定义一个Vector 类型的静态对象 frame 定义一个JFrame 容器 items[]定义一个数组七、程序清单//PhoneBookFrame.java import java.awt.*;import java.awt.event.*;import java.beans.PropertyVetoException; import javax.swing.*;import javax.swing.table.TableColumn; import java.io.*;import java.text.CollationKey; import java.text.Collator;import java.text.RuleBasedCollator; import java.util.*;import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JComboBox;public class PhoneBookFrame extends JFrame implements ActionListener, Serializable,ItemListener{ private JButton create; private JButton research; private JButton delete; private JButton modi; private JTextField text; public static JTable statusTable; public static StatusTableModel statusTableModel; private JScrollPane s_pan = null; private JComboBox type; private JLabel show; private JPanel pane1; private JPanel pane2; private JPanel pane3; private JPanel pane4; private JPanel pane5; private JRadioButton buttonOne; private JRadioButton buttonTwo;private String[] items = {"全部","家人","朋友","同事","同学","其他"}; private IO io; private static Vector <Person>vec = new Vector<Person>(); public PhoneBookFrame(){ super("电话簿"); io = new IO(); ype = new JComboBox(items); show =new JLabel("请选择要显示的分组:"); pane1 = new JPanel(); JLabel lb = new JLabel("按分组查找:"); pane2 = new JPanel(); pane2.setLayout(new GridLayout(1,1)); pane3 = new JPanel(); pane3.setLayout(new GridLayout(1,3)); pane4 = new JPanel(); pane4.setLayout(new GridLayout(1,4)); pane5 = new JPanel(); pane5.setLayout(new GridLayout(1,2)); create = new JButton("创建");成员方法作用public SetPersonPanel() 设置创建用户界面容器的组建布局 public voidactionPerformed(ActionEvent event) 对于监听事件的响应public Vector<Person> sort(Vector<Person> v1) 将新增的<Person> v1的数据添加到<Person>后面 public void start() 创建线程实例 public void run()定义线程体research = new JButton("搜索");delete = new JButton("删除");modi = new JButton("修改");text = new JTextField(30);buttonOne = new JRadioButton("按姓名查找", true);buttonTwo = new JRadioButton("按手机号码查找");ButtonGroup bg=new ButtonGroup();bg.add(buttonOne);bg.add(buttonTwo);research.addActionListener(this);vec = io.readPerson();create.addActionListener(this);modi.addActionListener(this);delete.addActionListener(this);type.addItemListener(this);statusTableModel = new StatusTableModel();statusTable = new JTable(statusTableModel);statusTableModel.addAll(vec);s_pan = new JScrollPane(statusTable);pane1.add(show,"Center");pane1.add(type);pane2.add(s_pan);pane3.add(create);pane3.add(delete);pane3.add(modi);pane4.add(buttonOne);pane4.add(buttonTwo);pane4.add(text);pane4.add(research);pane5.add(pane4);pane5.add(pane3);add(pane1,"North");add(pane2,"Center");add(pane5,"South");setSize(1000,500);setVisible(true);setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE);}public static void add(String name,String cellphone,Stringhomenumber,String add,String workplace){//向table中添加数据,static使得在SetPersonPanel中调用statusTableModel.addRow(name,cellphone,homenumber,add,workplace);}public static void mod(int s,String name,String cellphone,String homenumber,String add,String workplace){//修改table数据,static使得在ModPerson中调用statusTableModel.setRow(s,name,cellphone,homenumber,add,workplace);}public void actionPerformed(ActionEvent e) {boolean m;if(e.getSource() == create ){if(!type.getSelectedItem().equals("全部")){requestFocusInWindow();JOptionPane.showMessageDialog(null, "请换到全部界面"); m=false;}else{m=true;}if(m){SetPersonPanel setit=new SetPersonPanel();setit.start();reSetV();}}if(e.getSource() == delete){if(!type.getSelectedItem().equals("全部")){requestFocusInWindow();JOptionPane.showMessageDialog(null, "请换到全部界面");m=false;}else{m=true;}if(m){if(statusTable.getSelectedRow()==-1){requestFocusInWindow();JOptionPane.showMessageDialog(null, "你还没有选择删除的联系人");}else{int s = statusTable.getSelectedRow();statusTableModel.rRow(s);vec.remove(s);io.writePerson(vec);}}}if(e.getSource() == modi){if(!type.getSelectedItem().equals("全部")){requestFocusInWindow();JOptionPane.showMessageDialog(null, "请换到全部界面");m=false;}else{m=true;}if(m){if(statusTable.getSelectedRow()==-1){requestFocusInWindow();JOptionPane.showMessageDialog(null, "你还没有选择修改的联系人");}else{ModPerson mod=new ModPerson(statusTable.getSelectedRow());mod.start();reSetV();}}}if(e.getSource() == research){Vector <Person>v = new Vector<Person>();v.clear();if(text.getText().equals("")){repaintTable(vec);}else{if(buttonOne.isSelected()){for(int i=0;i<vec.size();i++){if(vec.get(i).getName().equals(text.getText())){v.add(vec.get(i));}}if(v.size()==0){requestFocusInWindow();JOptionPane.showMessageDialog(null, "没有这个联系人");}else{repaintTable(v);}}else if(buttonTwo.isSelected()){for(int i=0;i<vec.size();i++){if(vec.get(i).getCellphone().equals(text.getText())){v.add(vec.get(i));}}if(v.size()==0){requestFocusInWindow();JOptionPane.showMessageDialog(null, "没有这个联系人");}else{repaintTable(v);}}}}}public void reSetV(){ //重置vecvec.clear();vec = io.readPerson();}public static void main( String[] args){new PhoneBookFrame();}public static void repaintTable(Vector<Person> vv){statusTableModel.removeAll();statusTableModel.addAll(vv);}@Overridepublic void itemStateChanged(ItemEvent e) {// TODO Auto-generated method stubVector<Person> ve=new Vector<Person>();JComboBox c = (JComboBox) e.getSource();reSetV();if(e.getStateChange()== ItemEvent.SELECTED){if(e.getItem().equals("全部")){repaintTable(vec);}else{for(int i=0;i<vec.size();i++){if(vec.get(i).getType().equals(e.getItem())){ve.add(vec.get(i));}}if(ve.size()==0){statusTableModel.removeAll();}else{repaintTable(ve);}}}}}//StatusTableModel.javaimport ponent;import java.util.HashMap;import java.util.Map;import java.util.*;import javax.swing.BorderFactory;import javax.swing.JCheckBox;import javax.swing.JProgressBar;import javax.swing.JTable;import javax.swing.SwingWorker;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.DefaultTableModel;/*** 状态区表格模型类***/class StatusTableModel extends DefaultTableModel {public Object[] rowData = {"", "", "", "",""};public StatusTableModel() {super();addColumn("姓名");addColumn("手机号码");addColumn("家庭电话");addColumn("住址");addColumn("单位");}/*** 设置为不可编辑*/public boolean isCellEditable(int row, int column) {return false;}public void addRow(String name,String cellphone,String homenumber,String address,String workplace) { rowData[0] = name;rowData[1] = cellphone;rowData[2] = homenumber;rowData[3] = address;rowData[4] = workplace;addRow(rowData);}public void rRow(int n){removeRow(n);}public void setRow(int m,String name,String cellphone,String homenumber,String add,String workplace){setValueAt(name, m, 0);setValueAt(cellphone,m,1);setValueAt(homenumber, m, 2);setValueAt(add, m, 3);setValueAt(workplace, m, 4);}public void removeAll(){for (int j=getRowCount()-1;j>=0;j-- ) {removeRow(j);} }public void addAll(Vector<Person> v){for (int i =0;i<v.size();i++){addRow(v.get(i).getName(),v.get(i).getCellphone(),v.get(i).getHomenumber(),v.get(i).getAddress(),v.get(i).g etWorkplace());} }}//SetPersonPanel.java/********* 创建联系人*/import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.util.*;import java.text.CollationKey;import java.text.Collator;import java.text.RuleBasedCollator;import java.util.GregorianCalendar;import java.util.Calendar;import javax.swing.border.BevelBorder;import java.text.CollationKey;import java.text.Collator;import java.text.RuleBasedCollator;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import javax.swing.JComboBox;//在继承一个父类之后用Runnable借口来实现多线程public class SetPersonPanel extends JFrame implements Runnable{Thread runThread;private JButton confirm;private JButton cancel;private Label name;private Label cellphone;private Label homenumber;private Label address;private Label type;private Label workplace;private JTextField name1;private JTextField cellphone1;private JTextField homenumber1;private JTextField add1;private JTextField workplace1;private JComboBox tye1;private IO io;private Vector<Person> v;private String[] items = {"其他","家人","朋友","同事","同学"};public SetPersonPanel(){super();io = new IO();v = new Vector<Person>();v = io.readPerson();setLayout(new GridLayout(7,2));confirm = new JButton("确定");cancel = new JButton("取消");name = new Label("姓名:");cellphone = new Label("手机号码:");homenumber = new Label("家庭电话:");address = new Label("地址:");type = new Label("分组");workplace = new Label("单位");name1 = new JTextField(25);cellphone1 = new JTextField(25);homenumber1 = new JTextField(25);add1 = new JTextField(25);workplace1 = new JTextField(25);tye1 = new JComboBox(items);confirm.addActionListener(new confirmListener());cancel.addActionListener(new cancelListener());add(name);add(name1);add(cellphone);add(cellphone1);add(homenumber);add(homenumber1);add(address);add(add1);add(workplace); add(workplace1);add(type);add(tye1);add(confirm);add(cancel);}public static void main(String[] args) {JFrame frame=new JFrame();SetPersonPanel a=new SetPersonPanel();frame.setContentPane(a);frame.setSize(300, 800);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}class confirmListener implements ActionListener{public void actionPerformed(ActionEvent event) {String name = null;String cellphone =null;String homenumber = null;String address = null;String type = null;String workplace = null;boolean p1=false;if(name1.getText().equals("")){name = "未命名";}else{name = name1.getText();}if(homenumber1.getText().equals("")){homenumber = "";}else{homenumber = homenumber1.getText();}if(cellphone1.getText().equals("")){cellphone1.requestFocusInWindow();JOptionPane.showMessageDialog(null, "请输入手机号码");p1=false;}else{cellphone = cellphone1.getText();if(cellphone.length()!=11){cellphone1.requestFocusInWindow();JOptionPane.showMessageDialog(null, "手机号码位数不对");p1=false;}else{p1=true;}}if(workplace1.getText().equals("")){workplace = "";}else{workplace = workplace1.getText();}address = add1.getText();type = (String)tye1.getSelectedItem();if(p1==true){Person person = new Person(name,cellphone,homenumber,address,workplace,type);v.add(person);Vector<Person> vv = new Vector<Person>();vv=sort(v);io.writePerson(vv);setVisible(false);PhoneBookFrame.repaintTable(vv);//PhoneBookFrame.add(name,cellphone,homenumber,address,workplace);}}}class cancelListener implements ActionListener{public void actionPerformed(ActionEvent event) {setVisible(false);}}public Vector<Person> sort(Vector<Person> v1){Comparator comp = new CharacterComparator();Collections.sort(v1,comp);return v1;}public void start(){if(runThread == null){runThread = new Thread(this, "CreatPerson"); //创建线程实例runThread.start(); //启动执行}}public void run() //定义线程体{setSize(300, 200);setVisible(true);}}//Person.javaimport java.io.Serializable;public class Person implements Serializable,Comparable {private static final long serialVersionUID = 1L;private int p=0;private String name; //姓名private String cellphone; //手机号码private String homenumber; //家庭电话private String address; //地址private String type=null; //组别private String workplace;public Person(String name, String cellphone,String homenumber, String address,String workplace ,String type) { = name;this.cellphone = cellphone;this.homenumber = homenumber;this.address = address;this.type = type;this.workplace = workplace;}public void setName(String name1){name = name1;}public void setCellphone(String cellphone1){cellphone = cellphone1;}public void setHomenumber(String homenumber1){homenumber = homenumber1;}public void setAddress(String address1){address = address1;}public void setWorkplace(String workplace1){workplace = workplace1;}public void setType(String type1){type = type1;}public String getName(){return name;}public String getCellphone(){return cellphone;}public String getHomenumber(){return homenumber;}public String getAddress(){return address;}public String getWorkplace(){return workplace;}public String getType(){return type;}public int getInt(){if(type.equals("其他")){p=0;}else if(type.equals("家人")){p=1;}else if(type.equals("朋友")){p=2;}else if(type.equals("同事")){p=3;}else if(type.equals("同学")){p=4;}return p;}public int compareTo(Object obj) {//sort as you wishreturn 0;}}//ModPerson.javaimport java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.util.*;import java.text.CollationKey;import java.text.Collator;import java.text.RuleBasedCollator;import java.util.Collections;import parator;import java.util.GregorianCalendar;import java.util.Calendar;import java.util.Vector;import javax.swing.border.BevelBorder;import java.text.CollationKey;import java.text.Collator;import java.text.RuleBasedCollator;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import javax.swing.JComboBox;/************ 修改数据**/public class ModPerson extends JFrame implements Runnable{ Thread runThread;private JButton confirm;private JButton cancel;private Label name;private Label cellphone;private Label address;private Label homenumber;private Label workplace;private Label type;private JTextField name1;private JTextField cellphone1;private JTextField homenumber1;private JTextField add1;private JTextField workplace1;private String[] items = {"其他","家人","朋友","同事","同学"};private IO io;private Vector<Person> v;private JComboBox tye1;private int m =0;private String typ =null;public ModPerson(int i){super();io = new IO();m=i;v = new Vector<Person>();v = io.readPerson();tye1 = new JComboBox(items);tye1.setSelectedIndex(v.get(i).getInt());setLayout(new GridLayout(7,2));confirm = new JButton("确定");cancel = new JButton("取消");name = new Label("姓名:");cellphone = new Label("手机号码:");homenumber = new Label("家庭电话:");address = new Label("地址:");workplace = new Label("单位:");type = new Label("分组");name1 = new JTextField(25);name1.setText(v.get(m).getName());cellphone1 = new JTextField(25);cellphone1.setText(v.get(m).getCellphone());homenumber1 = new JTextField(25);homenumber1.setText(v.get(m).getHomenumber());add1 = new JTextField(25);add1.setText(v.get(m).getAddress());workplace1 = new JTextField(25);workplace1.setText(v.get(m).getWorkplace());confirm.addActionListener(new confirmListener());cancel.addActionListener(new cancelListener());add(name);add(name1);add(cellphone);add(cellphone1);add(homenumber);add(homenumber1);add(address);add(add1);add(workplace);add(workplace1);add(type);add(tye1);add(confirm);add(cancel);}public static void main(int n) {JFrame frame=new JFrame();ModPerson a=new ModPerson(n);frame.setContentPane(a);frame.setSize(300, 600);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}class confirmListener implements ActionListener{public void actionPerformed(ActionEvent event) {String name = null;String cellphone = null;String homenumber = null;String address = null;String type = null;String workplace = null;boolean p1=false;if(name1.getText().equals("")){name = "未命名";}else{name = name1.getText();}if(cellphone1.getText().equals("")){cellphone1.requestFocusInWindow();JOptionPane.showMessageDialog(null, "请输入手机号码");p1=false;}else{cellphone = cellphone1.getText();if(cellphone.length()!=11){cellphone1.requestFocusInWindow();JOptionPane.showMessageDialog(null, "手机号码位数不对");p1=false;}else {p1=true;}}if(homenumber1.getText().equals("")){homenumber = "";}else{homenumber = homenumber1.getText();}address = add1.getText();workplace = workplace1.getText();type = (String)tye1.getSelectedItem();if(p1==true){Person person = new Person(name,cellphone,homenumber,address,workplace,type);v.add(m,person);v.remove(m+1);Vector<Person> vv=new Vector<Person>();vv = sort1(v);io.writePerson(vv);setVisible(false);PhoneBookFrame.repaintTable(vv);}}}public Vector<Person> sort1(Vector<Person> v1){Comparator comp = new CharacterComparator();Collections.sort(v1,comp);return v1;}class cancelListener implements ActionListener{public void actionPerformed(ActionEvent event) {setVisible(false);}}public void start(){if(runThread == null){runThread = new Thread(this, "CreatPerson"); //创建线程实例runThread.start(); } } //启动执行public void run() //定义线程体{setSize(300, 200);setVisible(true);}}//CharacterComparator.javaimport java.text.CollationKey;import java.text.Collator;import java.text.RuleBasedCollator;import parator;public class CharacterComparator implements Comparator{RuleBasedCollator collator; // you can set your rules for the instance "collator"public CharacterComparator(){collator = (RuleBasedCollator)Collator.getInstance(java.util.Locale.CHINA);// try testing various locales}public int compare(Object obj1, Object obj2) {String tempname1 = ((Person) obj1).getName();String tempname2 = ((Person) obj2).getName();CollationKey c1 = collator.getCollationKey(tempname1);CollationKey c2 = collator.getCollationKey(tempname2);return pare(((CollationKey) c2).getSourceString(),((CollationKey) c1).getSourceString());}}//IO.javaimport java.io.*;import java.util.*;/****** 序列化读写文件**/public class IO implements Serializable {private File filename;private Vector <Person>v;public IO(){filename = new File("PhoneBook.dat");v=new Vector<Person>();}public void writePerson(Vector <Person>ve){try {ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));out.writeObject(ve);out.close();}catch(Exception event){}}public Vector<Person> readPerson(){try {ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));v=(Vector<Person>)in.readObject();in.close();} catch (Exception event) {} return v;}}八、软件测试数据及测试结果8.1测试的意义系统测试是管理信息系统的开发周期中的一个十分重要环节。