文章目录
- 任务七、名片管理系统
- 1.日期前推和日期后推
- 2.计算你活过的时间
- 3.名片管理系统
- (一) 编程实现
- 构建名片实体类
- 创建名片管理类
- 1.创建主菜单
- 2.创建登录方法
- 3.创建名片管理方法
- 4. 创建添加名片方法
- 5.创建保存名片的方法
- 6. 创建读取名片文件的方法
- 7.创建查看查询名片方法
- 8..创建修改名片的方法
- 9. 创建删除名片的方法
- 任务八
- 1.数组列表
- 2.
- 3.
任务七、名片管理系统
1.日期前推和日期后推
-当前日期100天前是哪年哪月哪日星期几,当前日期100天后是哪年哪月哪日星期几
2.计算你活过的时间
-计算你活了多少秒、多少分、多少小时、多少天要求利用Calendar类来完成任务
3.名片管理系统
1.实现可进可退的多级菜单系统
2.功能:添加名片、查询名片、修改名片、删除名片
3.要求:数据要持久化保存在磁盘上
(一) 编程实现
构建名片实体类
在nrt.lixin. p03.t07
包里创建Card
实体类
package net.lixin.p03.t07;
/**
* 功能:名片实体类
* 作者:李信
* 日期:2022年05月26日
*/
public class Card {
private String id;
private String name;
private String worUnit;
private String post;
private String telephone;
/**
* @param id
* @param name
* @param worUnit
* @param post
* @param telephone
*/
public Card(String id, String name, String worUnit, String post, String telephone) {
this.id = id;
this.name = name;
this.worUnit = worUnit;
this.post = post;
this.telephone = telephone;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWorUnit() {
return worUnit;
}
public void setWorUnit(String worUnit) {
this.worUnit = worUnit;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Override
public String toString () {
return "Card{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", worUnit='" + worUnit + '\'' +
", post='" + post + '\'' +
", telephone='" + telephone + '\'' +
'}';
}
}
创建名片管理类
在net.lixin.p03.t07
包里创建CardManagement
类
1.创建主菜单
/**
* 功能
* 作者:李信
* 日期:2022年05月26日
*/
public class CardManagement {
//创建名片数组列表对象
public static void main(String[] args) {
//声明部分
int mc1;
Scanner sc = new Scanner(System.in);
boolean isRuning=true;
//绘制一级菜单
while (isRuning){
System.out.println("名片管理系统");
System.out.println("================");
System.out.println("1.登录");
System.out.println("0.退出");
System.out.println("==================");
System.out.println("输入菜单选项[1,0]");
mc1 = sc.nextInt();
//根据用户选择执行相应操作
switch (mc1) {
case 1:
//调用登陆方法
login();
break;
case 0:
System.out.println("谢谢使用再见");
isRuning=false;//结束循环
break;
default:
System.out.println("输入菜单表编号有错误!");
}
}
-如果直接插入我们以前的写的名片管理系统的(如上代码块)那么程序将报错。因为在菜单项目1里调用的登陆方法login()
还尚未定义(如下图所示)
2.创建登录方法
-在CardManagement
类里创建login()
方法
/**
* 登陆方法
*/
private static void login() {
String username, password;
Scanner sc = new Scanner(System.in);
System.out.println("用户名");
username = sc.next();
System.out.println("密码");
password = sc.next();
if (username.equals("李信") && password.equals("1234526")) {
System.out.println("登陆成功");
//屌用名片管理的方法
cardManagement();
} else {
System.out.println("用户名或密码有误,登陆失败");
}
}
-但是在后面插入如上代码块后,程序依旧会报错,因为login()
方法要调用的名片管理方法cardManagement
却尚未定义
3.创建名片管理方法
-在CardManagement
类里创建CardManagement
方法
/*
* 名片管理方法
* */
private static void cardManagement() {
int mc2;
Scanner sc = new Scanner(System.in);
boolean isRuningn = true;//循环控制变量
//绘制二级菜单
while (isRuningn) {
System.out.println("===========名片管理========");
System.out.println("1.添加名片");
System.out.println("2.修改名片");
System.out.println("3.查询名片");
System.out.println("4.删除名片");
System.out.println("5.读取名片");
System.out.println("6.保存名片");
System.out.println("7.返回上级");
System.out.println("================");
System.out.println("输入菜单编号[1,2,3,4,5,6,7]");
mc2 = sc.nextInt();
switch (mc2) {
case 1:
System.out.println("执行添加名片功能");
break;
case 2:
System.out.println("执行修改名片功能");
break;
case 3:
System.out.println("执行查询名片功能");
break;
case 4:
System.out.println("执行删除名片功能");
break;
case 5:
System.out.println("读取名片文件到名片数组列表中");
break;
case 6:
System.out.println("将名片数组列表写入名片文件");
break;
case 7:
isRuningn = false;//结束二级菜单循环
break;
default:
System.out.println("输入的菜单编号有误!");
}
}
}
}
现在一个可进可退的菜单系统就建好了,让我们来测试一下吧!
文
4. 创建添加名片方法
-在CardManagement
类创建addCard()
方法
-思路:输入名片信息,基于名片信息构建名片对象,将名片对象添加到名片数组列表
-在类的声明部分创建名片列表对象(思考为什么要这样做)
在最前面添加如下图字段
-编写addCard()
方法代码
/**
* 添加名片方法
*/
private static void addCard() {
//声明变量
String id;
String name;
String worUnit;
String post;
String telephone;
Scanner sc=new Scanner(System.in);
//输入名片信息
System.out.print("编号");
id=sc.next();
System.out.print("姓名");
name=sc.next();
System.out.print("单位");
worUnit=sc.next();
System.out.print("职位");
post=sc.next();
System.out.print("电话号码");
telephone=sc.next();
//创建名片对象
Card card = new Card(id,name, worUnit,post,telephone);
//将名片对象添加到名片数组列表中
cards.add(card);
}
}
-修改cardManagement()
方法,需要调用addCard()
方法
-运行程序,查看结果
5.创建保存名片的方法
-在CardManagement
类里创建saveCards()
方法
-思路:遍历名片数组列表,将每一个名片对象的属性拼接成一个有分隔符的字符串,写入名片文件
/**
* 保存名片到文件
*/
private static void saveCards(){
try {
//创建文件字符输出流
FileWriter fw= new FileWriter("cards.txt");
//用增强for循环遍历名片的数组列表
for (Card card :cards){
//输出名片对象
System.out.println(card);
创建名片字符串缓冲对象
StringBuffer buffer= new StringBuffer();
//添加名片字段信息(空格作为分隔符)
buffer.append(card.getId()+" ");
buffer.append(card.getName()+" ");
buffer.append(card.getWorUnit()+" ");
buffer.append(card.getPost()+" ");
buffer.append(card.getTelephone());
//将名片信息写入名片文件(必须添加换行符)
fw.write(buffer.toString()+"\n");
}
//关闭文件字符输出流
fw.close();
//提示用户写入成功
System.out.println("恭喜你,名片数据成功写入文件~");
}catch (IOException e){
e.printStackTrace();
}
}
-对每个名片对象都会写入磁盘文件,这个方法不好,需要优化的,将所有名片数据分行放到一个字符串缓冲区对象里,这样只需要写一次磁盘文件,效率就提高了
/**
* 保存名片到文件
*/
private static void saveCards(){
try {
//创建文件字符输出流
FileWriter fw= new FileWriter("cards.txt");
//创建名片容器字符串缓冲对象
StringBuffer cardsbuffer= new StringBuffer();
//用增强for循环遍历名片的数组列表
for (Card card :cards) {
//输出名片对象
System.out.println(card);
//创建名片字符串缓冲对象
StringBuffer buffer = new StringBuffer();
//添加名片字段信息(空格作为分隔符)
buffer.append(card.getId() + " ");
buffer.append(card.getName() + " ");
buffer.append(card.getWorUnit() + " ");
buffer.append(card.getPost() + " ");
buffer.append(card.getTelephone());
//将名片信息添加到名片容器字符串缓冲对象
cardsbuffer.append(buffer.toString());
}
//将名片容器字符串缓冲对象里的数据写入名片文件
fw.write(cardsbuffer.toString()+" \n");
//关闭文件字符输出流
fw.close();
//提示用户写入成功
System.out.println("恭喜你,名片数据成功写入文件~");
}catch (IOException e){
e.printStackTrace();
}
}
-修改cardManagement
方法,添加调用saveCards()
方法
-查看保存的文件
6. 创建读取名片文件的方法
-在CardManagement
类里创建 readCardFile()
方法
-思路:行读取文件名片,把每行数据按空格拆分名片字段信息,基于名片字段信息创建名片对象,然后将每个名片对象添加到名片数组列表
-运行程序,查看结果
细节明细
查看读取名片的完整代码·
/**
* 读取名片文件,保存到名片数组列表
*/
private static void readCardFile() {
try {
//创建文件字符输入流
FileReader fr = new FileReader("Cards.txt");
//创建缓冲字符输入流
BufferedReader br = new BufferedReader(fr);
//定义行变量
String nextLine = " ";
//通过循环读取名片文件
while ((nextLine = br.readLine()) != null) {
//拆分行字符串得到字段数组
String[] fields = nextLine.split(" ");
//创建名片对象
Card card = new Card(fields[0],fields[1],fields[2],fields[3],fields[4]);
//将名片对象添加到名片数组列表
cards.add(card);
//输出名片对象
System.out.println("添加" + card + "到名片数组列表");
}
//关闭缓冲字符输入流
br.close();
//关闭文件字符输入流
fr.close();
}catch(FileNotFoundException e) {
System.err.println("温馨提示:名片文件不存在~");
}catch(IOException e) {
e.printStackTrace();
}
}
-修改cardManagement
方法,添加调用readCardFile()
方法
7.创建查看查询名片方法
-在cardManagement()
类里创建findCard()
方法
-思路:我们可以在做一个子菜单,包含两个选项:按编号查询和按姓名查询,但是我们不想再做子菜单,让用户输入待查的编号和姓名,这样会有四种情况:输入的编号和姓名全部为空字符串,此时查询全部名片;输入的编号不为空字符串但是姓名为空字符串,此时按编号查询名片;输入的编号为空字符串但是姓名不为空字符串,此时按姓名查询;输入的编号和姓名都不能为空字符串,此时按编号和姓名查询名片
/**
* 查询名片方法
*/
private static void findCard() {
String id, name;
Scanner sc = new Scanner(System.in);
System.out.print("编号:");
id = sc.nextLine();// 单行输入,敲回车确认,不能使用next()方法
System.out.print("姓名:");
name = sc.nextLine();//单行输入,敲回车确认
//判断用户按那种方式查询名片
if (id.equals("")) {
if (name.equals("")) {//查询全部名片
//遍历名片数组
for (Card card : cards) {
System.out.println(card.getId() + ""
+ card.getName() + "" + card.getWorUnit() + ""
+ card.getPost() + "" + card.getTelephone());
}
} else {//按姓名查询名片
System.out.println("~按姓名查询名片~");
boolean found = false;
//遍历名片数组列表,按姓名来查
for (Card card : cards) {
if (card.getName().equals(name)) {
found = true;//找到了
break;//跳出循环
}
}
//根据found值提示用户
if (found) {
//针对可能存在的同名情况
for (Card card : cards) {
if (card.getName().equals(name)) {
System.out.println(card.getId() + ""
+ card.getName() + "" + card.getWorUnit() + ""
+ card.getPost() + "" + card.getTelephone());
}
}
}else {
System.out.println("温馨提示:查无此人~");
}
}
} else {
if (name.equals("")) {//按编号查询名片
System.out.println("~按编号查询名片~");
boolean found=false;
//遍历名片数组列表,按编号来查询
for (Card card:cards){
if ( card.getId().equals(id)){
found=true;//找到了
//输出名片信息
System.out.println(card.getId()+""
+card.getName()+""+card.getWorUnit()+""
+card.getPost()+""+card.getTelephone());
break;//跳出循环
}
}
//根据found提示用户
if (!found){
System.out.println("温馨提示,查无此人");
}
} else {//按编号和姓名查询名片
System.out.println("~按编号和姓名来找" );
boolean found=false;
for (Card card:cards){
if (card.getId().equals(id) && card.getName().equals(name)){
found=true;//找到了
//输出名片信息
System.out.println(card.getId()+""
+card.getName()+""+card.getWorUnit()+""
+card.getPost()+""+card.getTelephone());
break;//跳出循环
}
}
//根据found值提示用户
if (!found){
System.out.println("温馨提示,查无此人");
}
}
}
}
}
-修改cardManagement()
方法,添加调用findCard()
方法
-运行程序,查看结果
文3
-测试名片中有同名的情况,修改card.txt
-运行程序,查看结果
8…创建修改名片的方法
-在cardManagement
类里创建modifyCard()
方法
-思路:按编号查询到名片后,可以对每个字段进行修改,如果该字段没有输入非空值,那嘛表明该字段不做任何修改
/**
* 修改名片方法
*/
private static void modifyCard(){
String id,name, worUnit, post,telephone;
Scanner sc =new Scanner(System.in);
boolean found =false;
System.out.print("输入待修改者编号:");
id=sc.nextLine();
//遍历名片数组列表
for (Card card :cards){
if (card.getId().equals(id)){
found =true;//找到了
//输入名片信息
System.out.println(card.getId()+""
+card.getName()+""+card.getWorUnit()+""
+card.getPost()+""+card.getTelephone());
break;//跳出循环
}
}
//判断是否找到名片
if (found){
System.out.println("说明:不输入信息,直接敲回车,表明不修改字段值");
System.out.println("姓名");
name=sc.nextLine();
System.out.println("单位");
worUnit=sc.nextLine();
System.out.println("职业");
post=sc.nextLine();
System.out.println("电话号码");
telephone=sc.nextLine();
//采用传统for循环遍历名片数组列表
for (int i=0;i<cards.size();i++) {
//获取名片对象
Card card=cards.get(i);
if (card.getId().equals(id)) {//按编号找到名片
//根据用户输入修改名片
if (!name.equals(" ")){
card.setName(name);
}
if (!worUnit.equals(" ")){
card.setWorUnit(worUnit);
}
if (!post.equals(" ")){
card.setPost(post);
}
if (!telephone.equals(" ")){
card.setTelephone(telephone);
}
//用修改后的名片对象去更新名片数组列表对应的元素
cards.set(i,card);
//显示修改的数组列表对应的元素
System.out.println(cards.get(i));
break;//跳出循环·
}
}
}else {
System.out.println("温馨提示~查无此人~");
}
}
}
-修改caedmanagement()
方法,添加调用modifyCard()
方法
-运行程序,查看结果
=-查看名片文件,看看第一条记录记录名字是否改成了“蒋欣”
9. 创建删除名片的方法
-在cardManagement()
类里创建deleteCard()
方法
-修改cardManagement()
方法,添加调用deleteCard()
方法