Java项目--家庭收支记录程序

目录
  • 一、项目需求及流程说明
    • 1.需求说明
    • 2.流程说明
      • 项目阶段1
      • 项目阶段2
      • 项目阶段3
    • 二、完整源代码及工具类
      • 1.源代码
      • 2.工具类
    • 三、程序部分运行结果展示
  • 总结

一、项目需求及流程说明

本项目学习目标:

1.模拟实现一个基于文本界面(程序控制台)的《家庭收支记录程序》

2.掌握初步的编程技巧和调试技巧

3.灵活运用基础知识

1.需求说明

模拟实现一个基于文本界面(程序控制台)的《家庭收支记录程序》,该程序能够记录家庭的收入、支出,并能够打印收支明细表。

项目采用分级菜单方式。

主菜单如下:

具体需求说明:

1、假设家庭起始的生活基本金为10000元;

2、每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询;

3、每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询;

4、查询收支明细(菜单1)时,将显示所有的收入、支出名细列表。

2.流程说明

项目阶段1

首先,实现界面展示功能,并且能进入每个功能里面!

主界面展示功能代码:

public static void menu() {
    System.out.println("----------家庭收支记账软件----------");
    System.out.println();
    System.out.println("\t\t\t1.收支明细");
    System.out.println("\t\t\t2.登记收入");
    System.out.println("\t\t\t3.登记支出");
    System.out.println("\t\t\t4.退出");
    System.out.println();
    System.out.print("请选择(1-4):");
}

进入每个功能的代码(main方法):

public static void main(String[] args) {
    init();
    boolean loopFlag = true;
    while (loopFlag) {
        menu();
        char n = Utility.readMenuSelection();
        switch (n) {
            case '1':
                list();
                System.out.println();
                break;
            case '2':
                income();
                break;
            case '3':
                expend();
                break;
            case '4':
                System.out.print("是否确认退出(Y/N):");
                char select = Utility.readConfirmSelection();
                if (select == 'Y')
                    loopFlag = false;
                break;
        }
    }
}

项目阶段2

在阶段1的过程中完成主要的“收入”,“支出”功能!

收入功能:

1)从键盘读取收入的金额(int)

2)从键盘读取收入的原因(String)

3)按照要求存储数据(数组)

4)添加成功

收入功能代码:

public static void income() {
    System.out.print("收入金额:");
    int amount = Utility.readNumber();
    System.out.print("收入原因:");
    String reason = Utility.readString();
    storage("收入", amount, reason);
    System.out.println("添加成功!");
}

支出功能:

1)从键盘读取支出的金额(int)

2)从键盘读取支出的原因(String)

3)按照要求存储数据(数组)

4)添加成功

支出功能代码:

public static void expend() {
    System.out.print("支出金额:");
    int amount = Utility.readNumber();
    System.out.print("支出原因:");
    String reason = Utility.readString();
    storage("支出", amount, reason);
    System.out.println("添加成功!");
}

项目阶段3

在显示账单明细完成遍历数组即可。

public static void list() {
    for (int i = 0; i <= r; i++) {
        for (int j = 0; j < 4; j++) {
            if (i == 0)
                System.out.print(arr[i][j] + "\t\t");
            else
                System.out.print(arr[i][j] + "\t\t  ");
        }
        System.out.println();
    }
}

二、完整源代码及工具类

1.源代码

package Stage3;
import java.util.Scanner;
public class FamilyBookkeeping {
    static int r = 0, count = 10000;
    static String[][] arr = new String[100][4];//不灵活
    public static void main(String[] args) {
        init();
        boolean loopFlag = true;
        while (loopFlag) {
            menu();
            char n = Utility.readMenuSelection();
            switch (n) {
                case '1':
                    list();
                    System.out.println();
                    break;
                case '2':
                    income();
                    break;
                case '3':
                    expend();
                    break;
                case '4':
                    System.out.print("是否确认退出(Y/N):");
                    char select = Utility.readConfirmSelection();
                    if (select == 'Y')
                        loopFlag = false;
                    break;
            }
        }
    }
    public static void menu() {
        System.out.println("----------家庭收支记账软件----------");
        System.out.println();
        System.out.println("\t\t\t1.收支明细");
        System.out.println("\t\t\t2.登记收入");
        System.out.println("\t\t\t3.登记支出");
        System.out.println("\t\t\t4.退出");
        System.out.println();
        System.out.print("请选择(1-4):");
    }
    public static void income() {
        System.out.print("收入金额:");
        int amount = Utility.readNumber();
        System.out.print("收入原因:");
        String reason = Utility.readString();
        storage("收入", amount, reason);
        System.out.println("添加成功!");
    }
    public static void expend() {
        System.out.print("支出金额:");
        int amount = Utility.readNumber();
        System.out.print("支出原因:");
        String reason = Utility.readString();
        storage("支出", amount, reason);
        System.out.println("添加成功!");
    }
    public static void list() {
        for (int i = 0; i <= r; i++) {
            for (int j = 0; j < 4; j++) {
                if (i == 0)
                    System.out.print(arr[i][j] + "\t\t");
                else
                    System.out.print(arr[i][j] + "\t\t  ");
            }
            System.out.println();
        }
    }
    public static void storage(String type, int amount, String reason) {
        r++;
        arr[r][0] = type;
        if (type == "收入") {
            arr[r][1] = (count + amount) + "";
            count += amount;
            arr[r][2] = "+" + amount;
        }
        if (type == "支出") {
            arr[r][1] = (count - amount) + "";
            count -= amount;
            arr[r][2] = "-" + amount;
        }
        arr[r][3] = reason;
    }
    public static void init() {
        arr[r][0] = "收支";
        arr[r][1] = "账户总金额";
        arr[r][2] = "收支金额";
        arr[r][3] = "说明";
    }
}

2.工具类

引入工具类Utility,实现一些错误输入判断,使程序更完善。(注意此工具类要和上面的源代码在同一个包下)

工具类Utility代码如下:

package Stage3;
import java.util.Scanner;
/**
 Utility工具类:
 将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
 */
public class Utility {
    private static Scanner scanner = new Scanner(System.in);
    /**
     用于界面菜单的选择。该方法读取键盘,如果用户键入'1'-'4'中的任意字符,则方法返回。返回值为用户键入字符。
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }
    /**
     用于收入和支出金额的输入。该方法从键盘读取一个不超过4位长度的整数,并将其作为方法的返回值。
     */
    public static int readNumber() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(4);
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     用于收入和支出说明的输入。该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
     */
    public static String readString() {
        String str = readKeyBoard(8);
        return str;
    }
    /**
     用于确认选择的输入。该方法从键盘读取‘Y'或'N',并将其作为方法的返回值。
     */
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }

    private static String readKeyBoard(int limit) {
        String line = "";
        while (scanner.hasNext()) {
            line = scanner.nextLine();
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }
        return line;
    }
}

三、程序部分运行结果展示

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • idea ssm项目java程序向串口发送指令并且使用十六进制 rxtx包的方法

    idea ssm项目 java程序向串口发送指令并且使用十六进制 rxtx包 1.前提 idea ssm项目环境要配好,这里就不多赘述了,自己配好 2.下载配置rxtx包 官网下载:http://rxtx.qbang.org/wiki/index.php/Download 根据需要下载,本章记录的是windows10下64位系统的配置 3.踩过的坑 如果和我一样是windows10系统下64位操作系统,不要去用别的博客说的comm2.0.jar串口开发包,因为在配置后会出现问题:Can't lo

  • 将java普通项目打包成exe可执行文件的步骤记录

    前言 · 提示,无论打包成jar还是exe程序,运行都需要JDK,需要给没有安装JDK的电脑安装:不会安装JDK的朋友可以参考这篇文章:https://www.jb51.net/article/179937.htm · maven项目有自己的打jar包方式,我们普通的java项目,可以安照步骤一打包成jar: 步骤一.先把项目打包成jar包 1. 打开项目结构 2. 选择jar包形式 3. 设置主类 4. 构建 5. 确认构建 6. 打包完成,在项目的out目录下有jar了. 步骤二.把jar包

  • JavaWeb 入门篇:创建Web项目,Idea配置tomcat

    目录 创建一个maven项目 项目结构 添加框架 在pom.xml 中添加如下依赖 配置tomcat 添加完如下图: 解决导入包问题: 启动测试: 总结 创建一个maven项目 项目结构 添加框架 在pom.xml 中添加如下依赖 dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <versi

  • java策略枚举:消除在项目里大批量使用if-else的优雅姿势

    想起刚开始接触JAVA面向对象编程时,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭.等到编程能力渐渐提升之后,再回过头去看曾经写过的满屏if-else时,脑海里只有一个画面,全都是翔..... 可能初学者都会忽略掉一点,其实if-else是一种面向过程的实现. 那么,如何避免在面向对象编程里大量使用if-else呢? 网络上有很多解决思路,有工厂模式.策略模式.甚至是规则引擎(这个太重了吧)..

  • IDEA2020.1启动SpringBoot项目出现java程序包:xxx不存在

    本地启动springboot项目一直报一个工具类的找不到,但是我看了好几次,那个类明明就在项目中,不知道为什么一启动项目就报错,,说这个包xxxx不存在,,弄了我一晚上没睡好觉,,整的我都快开始怀疑人生了,.我是谁?我在那?我还适合敲代码吗? Error:(3, 38) java: 程序包org.springframework.stereotype不存在 Error:(4, 47) java: 程序包org.springframework.web.bind.annotation不存在 Error

  • Java项目--家庭收支记录程序

    目录 一.项目需求及流程说明 1.需求说明 2.流程说明 项目阶段1 项目阶段2 项目阶段3 二.完整源代码及工具类 1.源代码 2.工具类 三.程序部分运行结果展示 总结 一.项目需求及流程说明 本项目学习目标: 1.模拟实现一个基于文本界面(程序控制台)的<家庭收支记录程序> 2.掌握初步的编程技巧和调试技巧 3.灵活运用基础知识 1.需求说明 模拟实现一个基于文本界面(程序控制台)的<家庭收支记录程序>,该程序能够记录家庭的收入.支出,并能够打印收支明细表. 项目采用分级菜单

  • java项目中的多线程实践记录

    项目开发中对于一些数据的处理需要用到多线程,比如文件的批量上传,数据库的分批写入,大文件的分段下载等. 通常会使用spring自带的线程池处理,做到对线程的定制化处理和更好的可控,建议使用自定义的线程池. 主要涉及到的几个点: 1. 自定义线程工厂(ThreadFactoryBuilder),主要用于线程的命名,方便追踪 2. 自定义的线程池(ThreadPoolExecutorUtils),可以按功能优化配置参数 3. 一个抽象的多线程任务处理接口(OperationThreadService

  • Golang收支记账程序详细编写过程

    目录 1.项目开发流程 2.项目需求说明 3.项目的界面 4.项目代码实现 1.项目开发流程 2.项目需求说明 模拟实现基于文本界面的<家庭记账软件> 该软件能够记录家庭的收入,支出,并能够打印收支明细表 3.项目的界面 4.项目代码实现 实现基本功能(先使用面向过程,后面改成面向对象) 功能1:先完成可以显示主菜单,并且可以退出 思路分析: 更加给出的界面完成,主菜单的显示,当用户输入4时,就退出该程序 功能2:完成可以显示明细和登记收入的功能 思路分析: 因为需要显示明细,我们定义一个变量

  • 浅谈在JAVA项目中LOG4J的使用

    一.直接使用: //输出到项目文件夹下output1.txt文件中 ////////////////////////////// // DEBUG - Here is some DEBUG // INFO - Here is some INFO // WARN - Here is some WARN // ERROR - Here is some ERROR // FATAL - Here is some FATAL ////////////////////////////// package

  • Java项目的目录结构详解

    一个java web项目 目录分为两个部分 ① Web应用的根目录下子目录WEB-INF,里面内容不能被客户端访问的,包括专用Web应用程序软件,包括Servlet类文件.部署描述符web.xml.外部库以及其他任何由此应用程序使用的专用文件. ② 所有位于WEB-INF之外的文件都被看作是公共的,客户端是可以访问到的.资源包括HTML页面.JSP页面和图像等. 一.Common包 Common用来封装一些常用的公共方法. 二.Dao包 Dao主要用来封装对数据库的新增,删除,查询,修改.叫做数

  • 一文搞懂Java项目中枚举的定义与使用

    目录 什么是枚举 为什么需要枚举类 枚举类的定义和使用 什么是枚举 最近写新项目!有很多数据字典常量需要定义和使用.就顺便记录一下.什么是枚举类呢?就是用enum修饰是一种Java特殊的类,枚举是class.底层是继承了java.lang.Enum类的实体类.使用枚举可以很方便的定义数据常量.方便清晰我们使用 为什么需要枚举类 下面就举例说明一下吧 1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示. 比如对于性别的表示: public static final int WOMAN = 0

  • java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格式的jar包: 2.通过安装exe4j软件,将导出的.jar格式的文件制作成.exe格式的可执行的文件,(注意:此时的.exe文件只是可以执行,还不能够安装): 3.通过安装Inno setup软件,将可执行的.exe格式的文件..jar格式的文件以及其它需要的文件制作成一个可安装的.exe格式的文

  • C++键盘记录程序代码

    本文实例讲述了C++键盘记录程序.分享给大家供大家参考.具体分析如下: 主程序如下: 就是基于对话框的框架,加个个OnHookKey函数, 复制代码 代码如下: long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam)   //处理自定义消息  {      char szKey[80]={0};      GetKeyNameText(lParam, szKey, 80);      CString strItem;      strI

  • Java项目开发命名规范(动力节点Java学院整理)

    最好使用英文,不要用汉语拼音 1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名.比如www.bjpowernode.com 对于包名:每个字母都需要小写.比如:com. bjpowernode.test;该包下的Test类的全名是:com. bjpowernode.Test.java .如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(default package). 2:类:首字母大写

  • 使用eclipse创建java项目的方法

    本文为大家分享了如何使用eclipse创建java项目,供大家参考,具体内容如下 首先,打开Eclipse,在工具栏依次点击[File]>>>[New]>>>[Other],这个窗口显示的所有我们可以新建的项目类型,上面有个搜索框可以输入你想新建什么样的项目 我们在搜索框里输入[java],然后下面会列出符合要求的列表,我们点击一下[Java Project],然后点击[Next] 这里要输入你JAVA项目的名称了,我测试一下,就输入HelloWorld,你可以输入你想

随机推荐