Java阶段三:基础项目—家庭记录收支程序
目录
需求说明
软件设计
界面展示
设计判断输入的各个方法
1. 判断主界面功能选择输入的方法
2. 判断输入是否全为数字
3. 判断输入是否全为汉字
添加收入记录的方法
添加支出记录的方法
查看信息记录的方法
确认退出的方法
二维数组扩容的方法
总结
需求说明
该软件能够记录家庭的收入、支出,并能够打印收支明细表。
项目采用分级菜单方式。主菜单如下:
-----------------家庭收支记账软件-----------------
1 收支明细
2 登记收入
3 登记支出
4 退 出 请选择(1-4):_
1. 假设家庭起始的生活基本金为10000元。
2. 查询收支明细(菜单1)时,将显示所有的收入、支出名细列表。
3. 每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询。
4. 每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
5. 点击退出(菜单4)后,确认该操作后即可退出程序。
软件设计
界面展示
设计思路:
(怎样来保存数据?) 我们要保存一组多维度的数据使用一维数组难以做到,此时应该使用二维数组进行数据存取。
(界面效果要怎样设计?) 经过观察发现当我们选择退出后程序才会结束运行,所以界面的展示应该写在一个死循环里面。
(怎样选择要执行的操作?) 根据我们所学的基础知识,不难发现使用switch语句就可以做到。
为了简化主界面代码,我把对应实现的功能设计成各个方法,使用时直接调用即可。(设计的各个方法写在本类中,主方法main之外)
界面效果的代码:
//导包
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Demo {//定义私有静态对象,创建后每个方法都可使用private static Scanner sc = new Scanner(System.in);//定义账户余额,并设置初始值private static int sumMoney = 10000;//定义数组中记录的条数private static int count = 0;public static void main(String[] args) {//定义二维数组并设置容量String[][] arr = new String[10][4];//定义一个boolean值,用于判断主界面的循环boolean flag=true;while(flag){//调用数组扩容的方法arr = expandArray(arr);System.out.println("\n----------------家庭收支记账软件----------------\n");System.out.println(" 1.收支明细");System.out.println(" 2.登记收入");System.out.println(" 3.登记支出");System.out.println(" 4.退 出\n");System.out.print("请选择(1-4): ");//输入你想要进行的操作数String num = sc.next();//调用判断输入的方法char b1 = readMenuSelection(num);switch(b1){case '1'://调用查看信息的方法readInfo(arr);break;case '2'://调用添加收入记录的方法addRecord(arr);break;case '3'://调用添加支出记录的方法reduceRecord(arr);break;case '4'://调用选择退出的方法boolean b = quitSystem();if(b==true)flag=false;else break;}}}
}
界面效果图:
设计判断输入的各个方法
1. 判断主界面功能选择输入的方法
目的:用户输入错误时给出提示,直到输入正确的操作数字符后再进行操作,而不是输入错误,程序就直接停止运行。
//创建判断输入的方法//返回值类型char(需要返回一个字符和操作数字符匹配)//参数为String(用户输入的类型是String)public static char readMenuSelection(String n) {char c;//设置死循环,满足条件后退出,直到获取到正确操作数字符while(true){//获取参数字符串的第一个字符c = n.charAt(0);//判断是否对应给定的操作数字符if (c != '1' && c != '2' && c != '3' && c != '4') {System.out.print("输入数字错误,请按提示正确输入:");String n1 = sc.next();n = n1;} else break;}//返回给定的正确操作数字符return c;}
2. 判断输入是否全为数字
目的: 在用户输入收入金额和支出金额时进行判断,为了使输入的内容规范,要求输入的字符串只能是数字,然后再转换成 int 类型的数字进行操作。
//把全为数字的字符串转换为int类型,并返回其数值public static int printInt(String x){//调用判断字符串是否全为数字的方法的返回值进行判断if(isNumberic(x)){//将获取到的数字字符串转为int类型的数字int y = Integer.parseInt(x);return y;}else{//写一个死循环,直到用户输入全为数字字符串时才停止while(true){System.out.print("你输入的值无意义! 请你重新输入: ");String num = sc.next();if(isNumberic(num)){int y1 = Integer.parseInt(num);return y1;}}}}//判断字符串是否全是数字,是返回true,否则返回false//设置参数为String类型的字符串public static boolean isNumberic(String str) {//使用正则表达式进行判断是否全为数字Pattern pattern = Pattern.compile("[0-9]*");return pattern.matcher(str).matches();}
3. 判断输入是否全为汉字
目的:在用户输入收入说明和支出说明时进行判断,为了使输入的内容规范,要求输入的字符串只能是汉字。
//判断字符串是否全为汉字,是则返回,否则从新输入字符串public static String printString(String x){if(isChinese(x)){return x;}else{while(true){System.out.print("输入错误! 请你重新输入: ");String t = sc.next();if(isChinese(t)){return t;}}}}//判断字符串是否全是汉字,是返回true,否则返回falsepublic static boolean isChinese(String str) {//使用正则表达式进行判断是否全为汉字Pattern p_str = Pattern.compile("[\\u4e00-\\u9fa5]+");Matcher m = p_str.matcher(str);if(m.find()&&m.group(0).equals(str)){return true;}return false;}
添加收入记录的方法
设计思路:根据需求可知用户首先应该输入收入的金额及说明,并且判断输入的规范性;然后再算出增加收入后的总金额;最后将各个记录保存到二维数组中。(将数组中的记录条数加1)
代码实现:
//创建添加收入记录的方法//该方法直接使用无需返回值,设置参数为String类型的二维数组public static void addRecord(String[][] arr){System.out.println("收入的金额:");String num1 = sc.next();//调用判断输入是否全为数字的方法int money = printInt(num1);System.out.println("收入的原因:");String b1 = sc.next();//调用判断输入是否全为汉字的方法String because = printString(b1);arr[count][0]="收入";//计算收入的总金额值sumMoney += money;//将int类型的总金额和收入金额转为String类型String t1=String.valueOf(sumMoney);String t2=String.valueOf(money);arr[count][1]=t1;arr[count][2]=t2;arr[count][3]=because;//数组中的记录条数加1count++;System.out.println("添加成功!");}
效果展示:
添加支出记录的方法
设计思路:跟添加收入记录的方法大同小异,可对比起来设计。(将数组中的记录条数加1)
代码实现:
//创建添加支出记录的方法public static void reduceRecord(String[][] arr){System.out.println("支出的金额:");String num2 = sc.next();int money1 = printInt(num2);System.out.println("支出的原因:");String b2 = sc.next();String because1 = printString(b2);arr[count][0]="支出";sumMoney -= money1;String t3=sumMoney+"";String t4=money1+"";arr[count][1]=t3;arr[count][2]=t4;arr[count][3]=because1;count++;System.out.println("添加成功!");}
效果展示:
查看信息记录的方法
设计思路:用户在还没有录入信息的时候也有可能会进行查询操作,此时我们首先就应该进行判断并给出提示信息;然后再进行二维数组的遍历;最后进行判断查询的类别,格式化输出记录。
代码实现:
//创建查看信息的方法public static void readInfo(String[][] arr){//判断二维数组是否为空,如果为空给出提示信息,如不为空进行查询操作if(arr[0][0]==null){System.out.println("暂无收支记录,账户余额为:10000元");}else{System.out.println("收支\t\t账户总金额\t\t收支金额\t\t说 明");//循环二维数组for(int i=0; i<arr.length; i++){//循环二维数组中的一维数组for(int j=0; j<arr[i].length; j++){if(arr[i][j]!=null){//判断查询的记录是收入还是支出,以便给出不同的展示效果if(arr[i][0]=="收入"){//格式化输出,为了美观System.out.println(String.format("%-6s %-15s +%-11s %-8s",arr[i][j],arr[i][1],arr[i][2],arr[i][3]));break;}else{System.out.println(String.format("%-6s %-15s -%-11s %-8s",arr[i][j],arr[i][1],arr[i][2],arr[i][3]));break;}}}}}}
效果展示:
确认退出的方法
设计思路:给出提示语句让用户输入,再对用户的输入进行判断,如果输入的是y或者Y表示用户确认退出返回 true,输入其他则认为用户选择取消退出返回 false。
代码实现:
//创建选择退出的方法//返回值设置为boolean类型,无参数传递public static boolean quitSystem(){System.out.print("确定退出?(输入y确认操作): ");//单个字符不能直接输入,此时我们输入一个字符串String t = sc.next();//获取字符串的第一个字符char tc = t.charAt(0);//获取该字符的ASCII码int tc1 = (int)tc;//y的ASCII码121,Y的ASCII码89//判断用户输入的字符串是否是一个字符并且为y或则Y,满足条件则返回true,否则返回falseif((tc1==121 && t.length()==1) || (tc1==89 && t.length()==1)){System.out.println("\n退出成功!");return true;}else{System.out.println("\n已取消退出");return false;}}
效果展示:
二维数组扩容的方法
设计目的:二维数组的容量是固定的,可以看出本次二维数组的最大存储数据条数为10,当我们录入的记录条数超过这个限制时,程序就会报错并且结束运行,给用户不好的体验,因此,对于给二维数组的扩容就很有必要。
设计思路:定义一个扩容后的新二维数组,再判断原二维数组中的数据条数达到最大值时,如果达到了最大值,就把原二维数组中的数据传入到新二维数组,最后返回新二维数组;如果没有达到最大值时,最后返回原二维数组。
代码实现:
//二维数组扩容//设置返回值为二维数组,参数也为二维数组public static String[][] expandArray(String[][] arr){//定义一个在原二维数组基础上扩容的二维数组String[][] arr1 = new String[arr.length+10][4];//判断传入的二维数组的数据条数是否已经达到最大容量if(arr[arr.length-1][0] != null){//使用循环把传入的二维数组中的数据赋值给扩容后的新二维数组for(int i=0; i<arr.length; i++){for(int j=0; j<4; j++){arr1[i][j] = arr[i][j];}}//返回扩容后的新二维数组return arr1;}else {//返回原二维数组return arr;}}
总结
该程序总的来说还是比较简单,非常适合作为 Java 初学者的练习小项目,这也是小编初学 Java 以来做的第一个小项目;在编写代码的时候还是需要注意部分的细节 (比如:添加记录后的二维数组记录条数要增加 1、int 类型数据转为 String 类型、单个字符不能直接输入,应该输入字符串后获取单个字符...);以上代码完全可以正常运行,希望对正在学习 Java 的你有许些帮助,如有任何问题,请联系小编~
Java阶段三:基础项目—家庭记录收支程序相关推荐
- 基础项目-家庭记录收支程序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.目标 二.分析 二维数组 三.实现 try catch 错误处理 一.目标 模拟实现一个基于文本界面的<家庭记账软 ...
- 项目一(基础)家庭记录收支记账软件
1.项目功能简介 该项目采用分级菜单方式,显示功能选择以及使用. 由收支明细,登记收入,登记支出,退出四个功能进行设计. 收支明细:查询收支明细( 菜单1)时, 将显示所有的收入.支出名细列表 登记收 ...
- Java基础项目:家庭记录收支程序
需求分析 要求:该软件能够记录家庭的收入.支出,并能够打印收支明细表. 1.主界面示例 --------家庭收支记账软件-------- 1 收支明细 2 登记收入 3 登记支出 4 退出 2.不同模 ...
- 基本项目_家庭记录收支程序
目的: 01.模拟实现一个基于文本界面的<家庭记账软件> 02.掌握初步的编程技巧和调试技巧 03.灵活运用基础知识 !!最后附代码 需求说明: 该软件能够记录家庭的收入.支出,并能够打印 ...
- JAVA——家庭记录收支程序
程序需求 模拟实现一个基于文本界面的<家庭记账软件> 该软件能够记录家庭的收入.支出,并能够打印收支明细表 -----------------家庭收支记账软件--------------- ...
- JAVA实验三:输出点菜记录中每种菜的价格及总价格
题目 假设某餐馆中每桌顾客点菜记录的格式为"北京烤鸭:189 西芹百合:15 清蒸鲈鱼:80"(每道菜的价格与下一道菜的名字之间有一个空格).编写一个类的方法,能够接受键盘录入的符 ...
- java需要记的语法,Java笔记(三)……基础语法
myeclipse,eclipse控制台输出乱码问题 首先我描述一下问题,我在做udp socket编程(一个聊天的程序)的时候,从控制台中读取中文,然后再向控制台中打印,出现中文乱码的情况. 1.出 ...
- java比较三个数的编程_Java小程序输入三个数求最大数
Java小程序输入三个数求最大数代码: import java.io.*; public class Help { // 比较两个数字 public static void main(String[] ...
- Java | 用Java实现选择排序算法(记录写程序全过程的编程哲学)
最近听了马士兵老师的java算法课,感觉这不错,我很欣赏其中的编程哲学. 一.编程哲学 有简单到复杂 1.1 验证一步走一步 1.2 多打印中间结果 先局部后整体 先粗糙后精细 3.1 变量更名 3. ...
- 穿越障碍物JAVA编程_JAVA 基础编程练习题1 【程序 1 不死神兔】
1 [程序 1 不死神兔] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月 又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子 ...
最新文章
- Python sys.path详解
- zzfrom水木-Linux环境学习和开发心得(作者:lunker)
- 【Linux】一步一步学Linux——gcov命令(257)
- php中子类实现多接口,PHP子类无法实现相同的接口父类实现
- 修改小程序radio组件的默认样式
- OpenCV4每日一练day14:光流法跟踪移动物体
- Excel插入多列相同数据
- Exception:No identifier specified for entity
- python2.7 安装第三方库
- 世界地图矢量文件shp格式获取/下载方法
- 花生壳+FileZilla搭建公网FTP服务器
- ffmpeg中使用screen capture recorder录音的问题
- 天地图矢量mxd版标准地图
- S7 200 smart模拟量应用介绍
- 如何在微信复制链接直接可以用浏览器打开 微信调用手机浏览器打开指定链接
- Canvas悟空推箱子
- hackme1新手教学
- CSDN文章 无法通过百度搜索,怎么办?
- PCA和SVD傻傻分不清楚?
- 用Adobe acrobat给pdf文件添加书签目录(子书签目录)
热门文章
- Java-String类常用方法汇总
- linux系统下的打印机驱动下载,用于UNIXLinux系统的打印机驱动程序-Lexmark.PDF
- 3D打印切片软件支撑算法研究
- Nature 期刊介绍
- 利用模拟低通滤波器设计带通、带阻、高通模拟滤波器
- 参考答案+实验设计与分析(第6版) [Design and analysis of experiments] - 蒙哥马利(Montgomery D.C)
- logogogo最新变种XP.exe的分析(Win32.Logogo)
- WebService(一):工作原理
- VMware Tools安装
- 在西安参加Java培训该怎么学习?