名片管理系统(构建可进不可退的多级从菜单名单系统)

文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()方法
在这里插入图片描述

任务八

1.数组列表

2.

3.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值