java学习---小项目---租房系统

news2024/9/22 5:42:08
package com.project.House_rental.HouseApp;

import com.project.House_rental.HouseView.HouseView;
//主界面
public class HouseApp {
    public static void main(String[] args) {
        new HouseView().List_();
        System.out.println("------已退出----------");
    }
}
package com.project.House_rental.House;

//定义·一个类,存放需要的属性
public class House {
    int id;//房屋编号
    String name;//房东姓名
    String tele;//电话
    String add;//地址
    double monthly_rent;//租金
    String stale;//状态
 //构造器
    public House(int id, String name, String tele, String add, double monthly_rent, String stale) {
        this.id = id;
        this.name = name;
        this.tele = tele;
        this.add = add;
        this.monthly_rent = monthly_rent;
        this.stale = stale;
    }
//封装
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTele() {
        return tele;
    }

    public void setTele(String tele) {
        this.tele = tele;
    }

    public String getAdd() {
        return add;
    }

    public void setAdd(String add) {
        this.add = add;
    }

    public double getMonthly_rent() {
        return monthly_rent;
    }

    public void setMonthly_rent(double monthly_rent) {
        this.monthly_rent = monthly_rent;
    }

    public String getStale() {
        return stale;
    }

    public void setStale(String stale) {
        this.stale = stale;
    }
    //重写toString方法

    @Override
    public String toString() {
        return
                "编号" + "\t\t 姓名" + "\t\t电话"+"\t\t地址" +"\t\t月租" +"\t\t状态\n"+ id+"\t\t"
                 + name + "\t\t" +
                 tele + "\t\t" +
                 add + "\t\t"+
                monthly_rent +"\t\t"+
                  stale + "\t" ;
    }
}
package com.project.House_rental.HouseServe;

import com.project.House_rental.House.House;
//实现效果所需的方法放入该类
public class HoseServe {
    House house[] = null;//定义一个House类的数组,暂时置空,用来接收房屋数据的
    private int size;//数组大小
    private int HosueNum = 1;//当前有的房屋信息数量,因为,在构造器我们初始化了一组房屋数据所以数量为1
    int idCount = 1;//房屋编号,有一组所以目前编号为1

    //构造器,用于初始化属性
    public HoseServe(int size) {

        this.size = size;
        house = new House[size];//初始化新建的数组,使其容量为size
        house[0] = new House(1, "小美", "12345", "北海", 1234, "未出租");//初始化一组数据

    }

    //类似一般属性封装的get
    public House[] List_() {
        return house;
    }
//数据的增加
    public Boolean HouseAdd_(House newhouse) {
        if (HosueNum == size) {//判断house数组当前数据是否已满
            System.out.println("数组已满无法添加");
            return false;
        } else {
            house[HosueNum++] = newhouse;//没满就将传进来的newhouse数据赋为house数组
            //下标从0开始,HouseNum计数从1开始,所以,HouseNum当前的值就正好为下个数值的下标,
            // 与此同时,HouseNum也需要自加,完成计数的任务
            System.out.println("添加成功!");
            newhouse.setId(++idCount);//id不能人为自己选择是多少,
            // 所以在此需要给新加入的数据自加编号
            return true;
        }


    }
//数据的删除
    public Boolean House_Delet(int idIndext) {
        //方法一

//        int i=0;
//        for( i=0;i<house.length;i++)
//        {
//           if (house[i].getId()==idIndext)//判断当前id是否是要删的id
//           {
//              break;//是的直接跳出循环不再接着循环
//           }
//        }
//        if (i<house.length) {//判断i的值,如果i的值还是小于数组长度,代表进入过循环中的if判断,
//        //且当前的i就是对应id的数据的下标
//            for (; i < house.length; i++) {
//                if (i + 1 < house.length)
//                    house[i] = house[i + 1];//将当前的数据用后面的数据覆盖,实现删除
//            }
//            HosueNum--;//因为删除了数据,所以相应的数据数量也要减少
//            return true;
//        }
//        else
//            return false;
//    }
        //方法二
        int indext_ = -1;//一个索引用来判断是否进入过判断
        for (int i = 0; i < HosueNum; i++) {
            if (house[i].getId() == idIndext) {//判断当前id是否是要删的id
                indext_ = i;
                break;
            }


        }
        //如果还为代表遍历完循环了并未进入过判断
        if (indext_ == -1) {
            return false;
        } else {
            for (int i = idIndext; i < HosueNum - 1; i++) {//下标从0开始,而HouseNum计数从1开始


                house[i] = house[i + 1];//将当前的数据用后面的数据覆盖,实现删除


            }
            house[--HosueNum] = null;//因为当前数据删了一个,删除数据后的所有数据都向前挪了一个,
            // 最后一个就会没有数值,所以需要将最后一个手动置空
            //并且计数的HouseNum也需要减少
            return true;
        }
    }
//查找
    public House House_Find(int Index1)
    {
        if (Index1>0&&Index1<=HosueNum) {//先判断是否存在

            for (int i=0;i<HosueNum;i++)
                if (Index1==house[i].getId())//寻找是否有对应编号的数据
                    return house[i];//找到了返回其数据


        }
        else
        {
            return null;//未找到,返回null
        }


        return null;
    }



}
package com.project.House_rental.HouseView;

import com.project.House_rental.House.House;
import com.project.House_rental.HouseApp.HouseApp;
import com.project.House_rental.HouseServe.HoseServe;
import com.project.House_rental.Utility.Utility;

import java.util.Scanner;

public class HouseView {
    private boolean o=true;//相当于索引,结束循环的工具
    private char key=' ';//执行操作的索引

    private HoseServe hoseServe=new HoseServe(10);//新建了个HoseServe类的属性这样可以实现调用该类的方法
    public void List_(){//用于展示的方法
    do{
        menu();//菜单目录
        key= Utility.readChar();//Utility包中的一个方法,功能:读取键盘输入的一个字符
        switch (key)//通过判断key中的为哪个字符从而去到相应的case实现效果
        {

            case '1':
                HouseAdd();
                break;
            case '2':
                HouseCheck();
                break;
            case '3':
                ViewDelet();
                break;
            case '4':
                House_modify();

                break;
            case '5':
                HouseList_();

                break;
            case '6':
              Quit();
                break;
            default:
                System.out.println("请重新输入");


        }



    }while(o);
    }
    //菜单
    private void menu(){
        System.out.println("--------房屋出租列表--------\n"+
                "1.新增房源\n"+"2.查找房源\n"+"3.删除房源\n"+"4.更改房源\n"+"5.查看房源\n"+"6.退出\n"+"1-6请输入一个数字"
        );
    }
    //查看房源列表
    private void HouseList_()
    {
        House house[]=hoseServe.List_();//调用了hoseServe中List_(),该方法返回了创建的House类型数组
        System.out.println("--------房屋列表-------");
        for(int i=0;i<house.length;i++)
        {
            //挨个遍历,但数组不一定都是满的,没有数据的数组会自动赋null,
            // 所以如果遍历到null值直接退出循环不执行之后的代码
            if (house[i]==null)
                break;
            System.out.println(house[i]);
        }

    }
    //添加
    private void HouseAdd()
    {
        System.out.println("姓名:");
        //手动输入要添加的数据的属性
        //* readString( );功能:读取键盘输入的指定长度的字符串
        // * @param limit 限制的长度
        // @return 指定长度的字符串
        String name=Utility.readString(9);
        System.out.println("电话:");
        String tele=Utility.readString(11);
        System.out.println("地址:");
        String add=Utility.readString(20);
        System.out.println("租金");
        Scanner scanner=new Scanner(System.in);
        double monthly_rent=scanner.nextDouble();
        System.out.println("状态(未出租/已出租):");
        String stale=Utility.readString(10);
        //新建一个House类型的对象将刚刚输入的信息传入其中
        House newhouse = new House(0, name, tele, add, monthly_rent, stale);
        //HouseAdd_(newhouse)方法的返回值为布尔类型,如果成功会返回true失败为false
        if (hoseServe.HouseAdd_(newhouse))
        {
            System.out.println("-------添加成功--------");
        }
        else
        {
            System.out.println("添加失败");
        }





    }
    //删除
    private void ViewDelet()
    {
        System.out.println("-------删除房屋--------\n");
        System.out.println("输入-1为退出");
        /** Utility中的readInt()方法
         * 功能:读取键盘输入的整型,长度小于2位
         * @return 整数
         */

        int index=Utility.readInt();

        if (index==-1)
            return;//输入-1表示退出
        else {
            /**Utility中的readConfirmSelection()方法
             * 功能:读取键盘输入的确认选项,Y或N
             * 将小的功能,封装到一个方法中.
             * @return Y或N
             */
            Utility.readConfirmSelection();
            System.out.println("请选择要删除的编号:\n");
            if (hoseServe.House_Delet(index)) {//House_Delet(index)方法的返回值为布尔类型,如果成功会返回true失败为false
                System.out.println("--------删除成功--------");
            } else {
                System.out.println("-------删除失败-------");
            }
        }


    }
    private void Quit(){
        /**Utility中的readConfirmSelection()方法
         * 功能:读取键盘输入的确认选项,Y或N
         * 将小的功能,封装到一个方法中.
         * @return Y或N
         */
       char c=Utility.readConfirmSelection();
       if (c=='Y')
       {
           o=false;//代表确定退出将o置为false即可退出循环

       }



    }
    //查找
    private void HouseCheck()
    {
        System.out.println("------查询房源--------");
        System.out.println("输入编号:");
        System.out.println("输入-1为退出");
        /** Utility中的readInt()方法
         * 功能:读取键盘输入的整型,长度小于2位
         * @return 整数
         */
        int Index1=Utility.readInt();
        //创建一个House类数据接收
        House house=hoseServe.House_Find(Index1);//House_Find(Index1)方法的返回类型为House,查到返回数据失败返回null
        if (house==null)
            System.out.println("查找失败!无此编号");
        else
            System.out.println(house);

    }
    //修改
    private void House_modify()
    {
        System.out.println("------修改房源--------");
        System.out.println("输入编号:");
        /** Utility中的readInt()方法
         * 功能:读取键盘输入的整型,长度小于2位
         * @return 整数
         */
        int Index1=Utility.readInt();
        House house=hoseServe.House_Find(Index1);//调用House_Find(Index1)方法查找该编号数据是否存在
        if (house==null)
            System.out.println("查找失败!无此编号");

        else {
            System.out.print("姓名(" + house.getName() + "):");
            //手动输入要修改的数据的属性
            //* readString( );功能:读取键盘输入的指定长度的字符串
            // * @param limit 限制的长度
            // @return 指定长度的字符串
            String name=Utility.readString(9);
            //判断name是否做修改,如果跟“ ”一样代表并未修改,那么就不用进入if更改house的name的值
            //如果修改了,则直接调用setName(name)方法,将修改的name的值传人其中
            if (!"".equals(name))
            {
                house.setName(name);
            }
            System.out.print("电话(" + house.getTele() + "):");
            String tele=Utility.readString(11);
            if (!"".equals(tele))
            {
                house.setTele(tele);
            }
            System.out.print("地址(" + house.getAdd() + "):");
            String add=Utility.readString(20);
            if (!"".equals(add))
            {
                house.setAdd(add);
            }
            System.out.print("月租(" + house.getMonthly_rent() + "):");
            Scanner scanner=new Scanner(System.in);
            double monthly_rent=scanner.nextDouble();
            if (!" ".equals(monthly_rent))
            {
                house.setMonthly_rent(monthly_rent);
            }
            System.out.print("状态(" + house.getStale() + "):");
            String state=Utility.readString(20);
            if (!"".equals(state))
            {
                house.setStale(state);
            }




        }


    }

}
package com.project.House_rental.Utility;
/**
 工具类的作用:
 处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
 */

import java.util.*;
/**


 */
public class Utility {
    //静态属性。。。
    private static Scanner scanner = new Scanner(System.in);


    /**
     * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
     * @return 1——5
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);//包含一个字符的字符串
            c = str.charAt(0);//将字符串转换成字符char类型
            if (c != '1' && c != '2' &&
                    c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }

    /**
     * 功能:读取键盘输入的一个字符
     * @return 一个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);//就是一个字符
        return str.charAt(0);
    }
    /**
     * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
     * @param defaultValue 指定的默认值
     * @return 默认值或输入的字符
     */

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    /**
     * 功能:读取键盘输入的整型,长度小于2位
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, false);//一个整数,长度<=10位
            try {
                n = Integer.parseInt(str);//将字符串转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, true);
            if (str.equals("")) {
                return defaultValue;
            }

            //异常处理...
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串
     * @param limit 限制的长度
     * @return 指定长度的字符串
     */

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
     * @param limit 限制的长度
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */

    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }


    /**
     * 功能:读取键盘输入的确认选项,Y或N
     * 将小的功能,封装到一个方法中.
     * @return Y或N
     */
    public static char readConfirmSelection() {
        System.out.println("请输入你的选择(Y/N): 请小心选择");
        char c;
        for (; ; ) {//无限循环
            //在这里,将接受到字符,转成了大写字母
            //y => Y n=>N
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }

    /**
     * 功能: 读取一个字符串
     * @param limit 读取的长度
     * @param blankReturn 如果为true ,表示 可以读空字符串。
     * 					  如果为false表示 不能读空字符串。
     *
     *	如果输入为空,或者输入大于limit的长度,就会提示重新输入。
     * @return
     */
    private static String readKeyBoard(int limit, boolean blankReturn) {

        //定义了字符串
        String line = "";

        //scanner.hasNextLine() 判断有没有下一行
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();//读取这一行

            //如果line.length=0, 即用户没有输入任何内容,直接回车
            if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串,必须输入内容
            }

            //如果用户输入的内容大于了 limit,就提示重写输入
            //如果用户如的内容 >0 <= limit ,我就接受
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}


效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5G网络近海覆盖和融合应用5G网关5G路由器CPE

5G移动超远高速率CPE 5G移动超远距离高速率海上CPE是根据海上特殊场景需求&#xff0c;研发的5G天通电话&#xff0c;短信&#xff0c;北斗短报文&#xff0c;远航道宽带接入系统&#xff0c;专门为海洋急救&#xff0c;海洋作业、海洋施工定制的船用5G高速上网终端&#xff0c…

合并区间 1

合并区间 思路&#xff1a; 感觉就是一个个vector遍历&#xff1f; 两两对比。若第一个的第二个元素大于下一个的第一个元素&#xff0c;则合并&#xff0c;存入答案数组即可。 nonono 新思路 思路打开&#xff01; 对于每一个区间&#xff0c;判断他能覆盖的最大区间在哪里…

哈希 -- 简单实现

在STL库中&#xff0c;有map和set两个关联式容器&#xff0c;这两个容器的底层都是以红黑树为底层。但是在后续的发展过程中&#xff0c;我们发现有些场景的数据不适合用红黑树进行存储&#xff0c;所以有人就发明了底层为哈希表的map和set,称为unordered_map 和 unordered_set…

SAP Fiori 实战课程(二):新建页面

课程回顾 上一课中,利用Visual studio Code 新建、并运行了一个Demo工程。可以实现对项目的启动,启动后进入一个List清单。 那么本次课程的目前就是在上一节Demo的基础上,从零开始新建一个完整的页面。实现从首页清单,选择行后,鼠标点击,进入下一个页面。 准备工作 在开…

pcie数据传输

一 数据传输通道总体设计 在上传数据时首先将 FPGA 中数据缓存到 DDR3 存储器&#xff0c;然后上位机请求后把数据从DDR3 存储器中取出并通过 PCIE 总线将数据传输到上位机&#xff1b;在下传数据时上位机中的数据首先通过 PCIE 总线下传至 FPGA&#xff0c;FPGA 读取这些数据并…

展厅中控系统有哪些优势呢

格芬科技的展厅中控系统具有多方面的优势&#xff0c;主要体现在以下几个方面&#xff1a; 一、高度集成与灵活控制 全终端网络可编程&#xff1a;格芬科技的展厅中控系统采用全终端网络可编程技术&#xff0c;能够实现对展厅内各种设备的集中控制和管理&#xff0c;包括电脑…

关于对CSDN的谴责

关于对CSDN的谴责 如果不是心血来潮登了一次旧帐号我是万万不会想到&#xff0c;所有的文章都被设置成了仅VIP可见。 CSDN你的VIP有多不受人待见您不知道吗&#xff1f;为什么要把我用于你开通VIP刷绩效的工具&#xff1f; 这种东西不应该首先经过同意再开启吗&#xff1f;默认…

yum不可用

当使用yum命令安装xx时&#xff0c;出现“Cannot find a vaild baseurl for repo&#xff1a;base”的错误&#xff0c;通常意为着yum源配置不正确或网络连接问题。 一、普通方法 1、检查网络连接 使用ping命令&#xff0c;测试是否可以ping通公网&#xff0c;如百度&#xf…

数据结构第一讲:复杂度

数据结构第一讲&#xff1a;复杂度 1.数据结构前言1.1什么是数据结构1.2算法 2.算法效率2.1复杂度的概念 3.时间复杂度3.1案例13.2案例23.3案例33.4案例43.5案例53.6案例63.7案例7 4.空间复杂度4.1案例14.2案例2 5.常见复杂度对比6.轮转数组题目分析6.1优化16.2优化2 博客简介&…

爬虫的深度爬取

爬虫的深度爬取和爬取视频的方式 深度爬取豆瓣读书 import time import fake_useragent import requests from lxml import etree head {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 …

SpringBoot 介绍和使用(详细)

使用SpringBoot之前,我们需要了解Maven,并配置国内源(为什么要配置这些,下面会详细介绍),下面我们将创建一个SpringBoot项目"输出Hello World"介绍. 1.环境准备 ⾃检Idea版本: 社区版: 2021.1 -2022.1.4 专业版: ⽆要求 如果个⼈电脑安装的idea不在这个范围, 需要…

C++编程逻辑讲解step by step:用MFC类库开发一个小游戏-军官能力测验

先给出最终效果 代码&#xff08;没法一点一点讲了&#xff0c;太长&#xff09; checkvw.h checkvw.cpp // checkvw.h : interface of the CCheckerView class // /class CCheckerView : public CView { protected: // create from serialization onlyCCheckerView();DECL…

掌握这4种翻译方式,阅读外语文件不再困难

如果你作为学生需要学习或者研究外国文件&#xff0c;或者出国旅游前也需要了解一些外国文件。如果掌握文件翻译工具&#xff0c;那这些问题就不是问题啦。这里我给你介绍几个效果不错的文件翻译工具吧。 1.福.昕文献翻译网站 这个工具只要在线就能使用&#xff0c;而且在线丝…

腾讯技术创作特训营 -- SUPERWINNIE -- AI重塑社交内容

目录 1 什么是AI社交内容 2 案例拆解 3 用LLM做爆文选题 4 用LLM出爆文脚本提示词 1 什么是AI社交内容 任何一个因素被AI取代都是AI社交内容 2 案例拆解 数字人 资讯素材 录屏产品的素材&#xff08;小红书测试AI产品&#xff09; 脚本 素材 剪辑 3 用LLM做爆文选题 &…

突破•指针二

听说这是目录哦 复习review❤️野指针&#x1fae7;assert断言&#x1fae7;assert的神奇之处 指针的使用和传址调用&#x1fae7;数组名的理解&#x1fae7;理解整个数组和数组首元素地址的区别 使用指针访问数组&#x1fae7;一维数组传参的本质&#x1fae7;二级指针&#x…

mq基础入门

前言 黑马商城导入了mq依赖 但是没有改service发消息 因为下单业务一直有问题 所以先没改 作业时间不够也没处理 1.异步调用 就是所谓的发短信 可以不用立即恢复 比如下单业务 下了单更新信息 就相当于发个消息通知一下 不用立即更改 但是支付就比较重要 不需要因为故障导…

数据结构——队列(顺序结构)

一、队列的定义 队列是一种线性数据结构,具有先进先出(FIFO)的特性。它可以理解为排队的队伍,先到先得,后到后得。队列有两个基本操作:入队(enqueue)和出队(dequeue)。入队在队列的末尾插入新元素,出队则是从队列的头部移除元素。这种数据结构常用于需要按照顺序处…

C语言中的运算符(二)

文章目录 &#x1f34a;自我介绍&#x1f34a;位运算符&#x1f34a;赋值复合运算符&#x1f34a;逗号运算符和赋值运算符&#x1f34a;运算符优先级 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ …

Qt开发网络嗅探器03

数据包分析 想要知道如何解析IP数据包&#xff0c;就要知道不同的IP数据包的包头结构&#xff0c;于是我们上⽹查查资料&#xff1a; 以太网数据包 ARP数据包 IPv4 IPv6 TCP UDP ICMP ICMPv6 根据以上数据包头结构&#xff0c;我们就有了我们的protocol.h文件&#xff0c;声明…

HTML+CSS+JS精美气泡提示框

源代码在效果图后面 点赞❤️关注&#x1f49b;收藏⭐️ 主要实现&#xff1a;提示框出现和消失两种丝滑动画 弹出气泡提示框后延迟2秒自动消失 效果图 错误框 正确 警告 提示 源代码 <!DOCTYPE html> <html lang"en"> <head><meta cha…