Java_编写简单的家庭收支

这是一个使用Java实现的家庭收支管理软件,提供收支明细查询、收入登记、支出登记及退出功能。通过简单的菜单选择,用户可以查看当前账户余额,记录收入来源或支出用途。

Test类

import java.util.Scanner;
public class Family{
	public static void main(String[] args){
		// 定义初始金钱
		double money = 0.0;
		String arg = "收支\t账户金额\t\t收支金额\t\t说明\n";
		boolean falg = true;
		do{
		System.out.println("--------------------------家庭收支记账软件-----------------------\n");
		System.out.println("                            1.收支明细\n");
		System.out.println("                            2.登记收入\n");
		System.out.println("                            3.登记支出\n");
		System.out.println("                            4.  退出\n");
		System.out.print("\t\t请选择(1-4):");
		int i = Function.shouye();
		switch(i){
			case 1:
			System.out.println(arg+'\n');
			break;
			case 2:
			System.out.print("本次收入金额:");
			double money1 = Function.shouye2();
			while(money1<0){
				System.out.println("您这是存钱,取钱请到3!\n 给我重新输:");
				money1 = Function.shouye2();
			}
			money += money1;
			System.out.print("请输入这钱的来源:");
			String yijuhua = Function.shuom();
			arg += "收入\t"+money+"\t\t\t"+money1+"\t\t\t"+yijuhua+"\n";
			System.out.println("----------------------登记完成----------------------------");
			// arg += "收入\t"+money+"\t\t"+money1+"\t\t"+"\n";
			break;
			case 3:
			System.out.print("本次支出金额:");
			double money2 = Function.shouye3();
			while(money2<0){
				System.out.println("请认真对待自己!重新输:");
				money2 = Function.shouye3();
			}
			while(money2>money){
				if(money==0)System.out.println("穷鬼哟!");
				System.out.println("请您现实一点!");
				money2 = Function.shouye3();
			}
			money -= money2;
			System.out.print("请说明这钱的用途:");
			String erjuhua = Function.shuom();
			arg += "支出\t"+money+"\t\t\t"+money2+"\t\t\t"+erjuhua+"\n";
			System.out.println("----------------------登记完成----------------------------");
			break;
			case 4:
			System.out.print("确认是否退出(Y/N):");
			char yn = Function.yesno();
			if(yn == 'Y'){
				//return false;
				falg = false;
			}
			
		/*	case '4':
					System.out.print("确认是否退出(Y/N):");
				    char yn = Function.yesno();
					if(yn=='Y'){
						falg = false;//当确认退出时,退出循环
					}
			break;*/
		}
		}while(falg);
		
	}
	
}

功能模块

import java.util.*;
public class Function{
	// 首页1-4选项
	public static int shouye(){
		Scanner sc = new Scanner(System.in);
		// 输入整数1,2,3,4,
		int i = sc.nextInt();
		while(true){
		if(i != 1 && i !=2 && i != 3 && i !=4){
			System.out.println("选择错误,请重新输入:");
			i = sc.nextInt();
		}else break;
		}
		return i;
	}
	
	// 收入的钱
	public static double shouye2(){
		Scanner sc = new Scanner(System.in);
		double shouru = sc.nextDouble();
		//shouru1 = shouru;
		return shouru;
	}
	
	// 说明
	public static String shuom(){
		Scanner sc = new Scanner(System.in);
		String sm = sc.nextLine();
		return sm;
	}
	// 支出的钱
	public static double shouye3(){
		Scanner sc = new Scanner(System.in);
		double zhichu = sc.nextDouble();
		return zhichu;
	}
	// 输入yn
	public static char yesno(){
		Scanner sc = new Scanner(System.in);
		char yn = sc.next().charAt(0);
		// 改变大小写
		while(true){
		if(yn == 'y'){
			yn = 'Y';break;
		}else if(yn == 'n'){
			yn = 'N';break;
		}else if (yn != 'Y' || yn != 'N') {
                System.out.print("再给你一次机会,输入Y/N:");
				yn = sc.next().charAt(0);
            } else{
				System.out.println(yn);break;
			}
			}
		/*	switch(yn){
				case 'y':yn = 'Y';break;
				case 'n':yn = 'N';break;
				case 'Y':yn = 'Y';break;
				case 'N':yn = 'N';break;
				default:System.out.print("选择错误,请重新输入:");
			}*/
		return  yn;
	}
	
/*	public static char readConfirmSelection() {
	Scanner str = new Scanner(System.in);
        char c;
        for (; ; ) {
        //    c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }*/
}

<think>我们正在讨论Java开发家庭收支记账软件。根据提供的引用内容,我们可以构建一个简单家庭收支记账系统。主要功能包括:显示收支明细、登记收入、登记支出、退出系统等。设计思路:1.使用一个二维数组或集合来存储每笔收支记录,每条记录包括:类型(收入/支出)、当前余额、金额(收入为正,支出为负)、说明。2.主循环显示菜单,根据用户选择调用相应功能。3.工具类Utility用于处理输入,包括读取数字、字符串等。下面是一个简化版的实现示例:步骤:1.创建主类(如FamilyAccount),包含main方法。2.创建工具类Utility,封装输入方法。3.主程序中初始化一个数组(或ArrayList)来存储记录,并设置初始余额。4.显示主菜单,根据用户选择执行不同操作。注意:根据引用[3],记录存储在二维数组中,每行代表一条记录,每列分别存储:类型、余额、金额(带符号)、说明。代码结构:主程序FamilyAccount.java:```javapublicclassFamilyAccount{publicstaticvoidmain(String[]args){//初始化doublesumNum=10000;//初始金额intcount=0;//记录条数String[][]details=newString[100][4];//假设最多100条记录while(true){System.out.println("-----------------家庭收支记账软件-----------------");System.out.println("1收支明细");System.out.println("2登记收入");System.out.println("3登记支出");System.out.println("4退出");System.out.print("请选择(1-4):");charselection=Utility.readMenuSelection();switch(selection){case'1'://收支明细showDetails(details,count);break;case'2'://登记收入sumNum=incomeregistration(details,count,sumNum);count++;break;case'3'://登记支出sumNum=outcomeregistration(details,count,sumNum);count++;break;case'4':System.out.print("确认是否退出(Y/N):");charconfirm=Utility.readConfirmSelection();if(confirm=='Y'){return;}break;}}}//显示收支明细publicstaticvoidshowDetails(String[][]details,intcount){System.out.println("-----------------当前收支明细记录-----------------");System.out.println("收支\t账户金额\t收支金额\t说明");for(inti=0;i<count;i++){System.out.println(details[i][0]+"\t"+details[i][1]+"\t"+details[i][2]+"\t"+details[i][3]);}System.out.println("--------------------------------------------------");}//登记收入publicstaticdoubleincomeregistration(String[][]details,intindex,doublesumNum){System.out.print("请输入本次收入的金额:");doubleincome=Utility.readNumber();System.out.print("请输入本次收入的说明:");Stringremarks=Utility.readString();details[index][0]="收入";sumNum+=income;details[index][1]=String.valueOf(sumNum);details[index][2]="+"+income;details[index][3]=remarks;System.out.println("---------------------登记完成---------------------");returnsumNum;}//登记支出publicstaticdoubleoutcomeregistration(String[][]details,intindex,doublesumNum){System.out.print("请输入本次支出的金额:");doubleexpenditure=Utility.readNumber();System.out.print("请输入本次支出的说明:");Stringremarks=Utility.readString();details[index][0]="支出";sumNum-=expenditure;details[index][1]=String.valueOf(sumNum);details[index][2]="-"+expenditure;details[index][3]=remarks;System.out.println("---------------------登记完成---------------------");returnsumNum;}}```工具类Utility.java:```javaimportjava.util.Scanner;publicclassUtility{privatestaticScannerscanner=newScanner(System.in);//读取菜单选择(1-4)publicstaticcharreadMenuSelection(){charc;while(true){Stringstr=readKeyBoard(1);c=str.charAt(0);if(c!='1'&&c!='2'&&c!='3'&&c!='4'){System.out.print("选择错误,请重新输入:");}elsebreak;}returnc;}//读取金额publicstaticdoublereadNumber(){doublen;while(true){Stringstr=readKeyBoard(4);//假设最多4位整数,可调整try{n=Double.parseDouble(str);break;}catch(NumberFormatExceptione){System.out.print("数字输入错误,请重新输入:");}}returnn;}//读取字符串publicstaticStringreadString(){returnreadKeyBoard(10);//假设说明最多10个字符}//读取确认选择(Y/N)publicstaticcharreadConfirmSelection(){charc;while(true){Stringstr=readKeyBoard(1).toUpperCase();c=str.charAt(0);if(c=='Y'||c=='N'){break;}else{System.out.print("选择错误,请重新输入:");}}returnc;}//读取键盘输入,限制长度privatestaticStringreadKeyBoard(intlimit){Stringline="";while(scanner.hasNext()){line=scanner.nextLine();if(line.length()==0)continue;if(line.length()>limit){System.out.print("输入长度(不大于"+limit+")错误,请重新输入:");continue;}break;}returnline;}}```注意:以上代码是一个基础版本,实际开发中可能需要考虑更多细节,比如异常处理、数据持久化(保存到文件或数据库)、界面美化等。根据引用内容,我们参考了收支记录的数据结构(二维数组)和工具类的方法。这个程序可以运行,但为了更好的扩展性,建议使用面向对象的方式重构,例如将每笔收支作为对象,使用集合来存储。相关问题:1.如何改进这个家庭收支记账软件,使其能够保存数据到文件?2.如何用面向对象的思想重构这个程序?3.这个记账软件可以添加哪些新功能?</think>以下是如何使用Java开发家庭收支记账软件的详细指南,包含核心设计思路和示例代码: ### 一、系统设计思路 1. **核心功能模块**: - 收支明细展示 - 收入/支出登记 - 账户余额计算 - 数据持久化(可选) 2. **数据结构设计**: ```java // 使用二维数组存储记录 [类型, 余额, 金额, 说明] String[][] records = new String[100][4]; // 或面向对象方式(推荐): class Transaction { String type; // "收入"/"支出" double amount; // 金额 String desc; // 说明 LocalDateTime time; // 时间 } ``` 3. **系统架构**: ``` Main → 控制层 → Service层 → 数据层 ↗ 工具类(输入验证等) ``` ### 二、核心代码实现 #### 1. 主程序框架(FamilyAccount.java) ```java public class FamilyAccount { private static double balance = 10000.0; // 初始余额 private static final List<Transaction> records = new ArrayList<>(); public static void main(String[] args) { while (true) { System.out.println("\n===== 家庭收支记账系统 ====="); System.out.println("1. 收支明细"); System.out.println("2. 登记收入"); System.out.println("3. 登记支出"); System.out.println("4. 退出系统"); char choice = Utility.readMenuSelection(); switch (choice) { case '1': showDetails(); break; case '2': addIncome(); break; case '3': addExpense(); break; case '4': if (confirmExit()) return; } } } // 其他方法在下文实现... } ``` #### 2. 工具类(Utility.java) ```java import java.util.Scanner; public class Utility { private static final Scanner scanner = new Scanner(System.in); // 读取菜单选择 (1-4) public static char readMenuSelection() { while (true) { System.out.print("请选择(1-4): "); String input = scanner.next(); if (input.matches("[1-4]")) { return input.charAt(0); } System.out.println("输入错误,请重新输入!"); } } // 读取金额(带验证) public static double readAmount() { while (true) { try { return Double.parseDouble(scanner.next()); } catch (Exception e) { System.out.print("金额格式错误,请重新输入:"); } } } // 读取文本说明 public static String readDescription() { scanner.nextLine(); // 清除缓冲区 return scanner.nextLine(); } } ``` #### 3. 收支明细展示 ```java private static void showDetails() { System.out.println("\n====== 收支明细 ======"); System.out.println("类型\t金额\t时间\t\t说明"); if (records.isEmpty()) { System.out.println("暂无收支记录"); return; } for (Transaction record : records) { String sign = record.getType().equals("收入") ? "+" : "-"; System.out.printf("%s\t%s%.2f\t%s\t%s\n", record.getType(), sign, record.getAmount(), record.getTime().format(DateTimeFormatter.ISO_LOCAL_DATE), record.getDesc()); } System.out.printf("当前余额:%.2f\n", balance); } ``` #### 4. 收入登记功能 ```java private static void addIncome() { System.out.print("\n请输入收入金额:"); double amount = Utility.readAmount(); System.out.print("请输入收入说明:"); String desc = Utility.readDescription(); balance += amount; records.add(new Transaction("收入", amount, desc, LocalDateTime.now())); System.out.println("✔ 收入登记成功!"); } ``` #### 5. 支出登记功能 ```java private static void addExpense() { System.out.print("\n请输入支出金额:"); double amount = Utility.readAmount(); if (amount > balance) { System.out.println("错误:支出金额超过当前余额!"); return; } System.out.print("请输入支出说明:"); String desc = Utility.readDescription(); balance -= amount; records.add(new Transaction("支出", amount, desc, LocalDateTime.now())); System.out.println("✔ 支出登记成功!"); } ``` ### 三、关键优化建议 1. **数据持久化**: ```java // 保存数据到文件 try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("records.dat"))) { oos.writeObject(records); oos.writeDouble(balance); } ``` 2. **数据验证增强**: ```java // 在Utility类中添加 public static double readPositiveAmount() { while (true) { double amount = readAmount(); if (amount > 0) return amount; System.out.print("金额必须大于0,请重新输入:"); } } ``` 3. **分类统计功能**: ```java Map<String, Double> categorySum = records.stream() .collect(Collectors.groupingBy( Transaction::getCategory, Collectors.summingDouble(Transaction::getAmount) )); ``` ### 四、学习资源推荐 1. 面向对象设计模式在记账系统中的应用[^1] 2. Java集合框架实战 - ArrayList/LinkedList选择策略[^2] 3. 异常处理最佳实践 - 金融类系统注意事项[^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值