学习java第九天 简单小项目

今天简单写了小项目

import java.math.*;
import java.util.*;
public class Project_array{
	// data 拿到外面 封装的方法 共享同一个变量
	// static 静态上下文只能直接访问静态的变量
	// 一旦加上static  代表当前的变量全局共享一份
	static Record[] data = {
		new Record("10月04日",new BigDecimal("-20.8"),"早午晚饭"),
		new Record("10月07日",new BigDecimal("-500.0"),"居家用品"),
		new Record("10月08日",new BigDecimal("10000.0"),"工资输入"),
		new Record("10月08日",new BigDecimal("-20.0"),"行车交通"),
		new Record("10月10日",new BigDecimal("-66.1"),"食品酒水"),
		new Record("10月15日",new BigDecimal("-7.5"),"食品酒水"),
		new Record("10月22日",new BigDecimal("-35.9"),"其他杂项"),
		new Record("10月31日",new BigDecimal("-2000"),"衣服饰品")
	};
	static String[] inData={"工资收入","奖金收入","兼职收入","其他收入","请选择收入明细"};
	static String[] outData={"食品酒水","物业用品","行车交通","其他杂项","请选择支出明细"};
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args){
		a:while(true){
			print("A 查看流水"+"\n"+"B 添加流水"+"\n"+"C 删除流水"+"\n"+"D 修改流水"+"\n"+"E 退出"+"\n"+"请选择");
			// 接收用户选项 调用方法
			String choice = sc.next();// A-D

			/*if(choice.equals("A")){
				chooseA();
			}*/
			// 参数的类型
			// jdk1.0 char byte short int
			// jdk5.0 enum 枚举
			// jdk7.0 String
			switch(choice){
				case "A" :print("A:查看流水");chooseA();break;
				case "B":chooseB();break;
				case "C":chooseC();break;
				case "D":chooseD();break;
				default:print("输入错误重新输入");break;
			}

		}
	}

	// 封装一个方法 完成chooseA的逻辑
	public static void chooseA(){
		print("编码\t\t花销项目\t\t记录时间\t\t收支金额");
		BigDecimal sum=new BigDecimal("0");
		for(int i=0;i<data.length;i++){
			print(i+"\t\t"+data[i].getType()+"\t\t"+data[i].getTime()+"\t\t"+data[i].getMoney());
			sum=sum.add(data[i].getMoney());
		}
		print("收支余额:\t\t\t\t\t\t\t"+sum);
	}

	// 封装一个打印的方法
	public static void print(String str){
		System.out.println(str);
	}

	public static String TypeInfo(String[] str){
		for(int i=0;i<str.length-1;i++){
			print(i+":"+str[i]);
		}
		print(str[str.length-1]);
		int choice=sc.nextInt();
		return str[choice];
	}
	public static boolean contains(Record rr){
		for(int i=0;i<data.length;i++){
			if(data[i].getTime().equals(rr.getTime())&&
				data[i].getMoney().equals(rr.getMoney())&&
				data[i].getType().equals(rr.getType())){
				return true;
		     }
		}
		return false;
	}
	public static void chooseB(){
		print("B:添加流水");
		print("请录入时间:");
		String time=sc.next();
		print("请选择收支明细【a:收入  b:支出】");

		String choice=sc.next();
		String type=TypeInfo(choice.equals("a")?inData:outData);
		print("请输入金额");
		String qian=sc.next();
		BigDecimal money=new BigDecimal(choice.equals("a")?qian:"-"+qian);

		Record rr=new Record(time,money,type);
		boolean flag=contains(rr);
		if(flag){
			print("该数据已经存在 添加失败!");
		}else{
			data=Arrays.copyOf(data,data.length+1);
			data[data.length-1]=rr;
			print("该数据添加成功!");
		}
	}


	public static void chooseC(){
		print("C:删除流水");
		chooseA();

		print("请输入要删除的流水编码");

		int number=sc.nextInt();
		if(number<0||number>data.length-1){
			print("该编码不存在 删除失败!");
		}else{
			//66 55 44 88
			//66 44 88 88
			//66 44 88
			System.arraycopy(data,number+1,data,number,data.length-number-1);
			data=Arrays.copyOf(data,data.length-1);
			print("删除成功!");
		}
	}

	public static void chooseD(){
		print("D:修改流水");
		chooseA();
		print("请输入要修改的流水编号");
		int number=sc.nextInt();
		if(number>data.length-1||number<0){
			print("该流水编号不存在");
			return;
		}else{
			print("请输入时间");
			String time=sc.next();
			print("请选择收支明细【a:收入  b:支出】");
			String choice=sc.next();
			String type=TypeInfo(choice.equals("a")?inData:outData);
			print("请输入金额");
			String qian=sc.next();
			BigDecimal money=new BigDecimal(choice.equals("a")?qian:"-"+qian);
			Record rr=new Record(time,money,type);
			boolean flag=contains(rr);
			if(flag){
				print("该数据已经存在 添加失败!");
			}else{
				print("数据更新之前的时间"+data[number].getTime()+"	数据更新之后的时间"+
						time+"\n数据更新之前的金额"+data[number].getMoney()+"		数据更新之后的金额"+
						money+"\n数据更新之前的类型"+data[number].getType()+"	数据更新之后的类型"+type);
				data[number].setTime(time);
				data[number].setMoney(money);
				data[number].setType(type);
				print("该数据修改成功!");
		}
		}
	}

}
// 封装
class Record{//流水账
	private String time;//花销时间
	private BigDecimal money;//花销金额
	private String type;//花销项

	//构造方法的参数顺序看main方法里面已经创建好的对象的参数顺序
	public Record(String time, BigDecimal money, String type){
		this.time = time;
		this.money = money;
		this.type = type;
	}

	public void setTime(String time){
		this.time = time;
	}

	public String getTime(){
		return time;
	}

	public void setMoney(BigDecimal money){
		this.money = money;
	}

	public BigDecimal getMoney(){
		return money;
	}

	public void setType(String type){
		this.type = type;
	}

	public String getType(){
		return type;
	}

}

选择A时打印出所有内容,并统计总和 sum(BigDecimal类型)

选择B时 进行添加内容,关系到数组的扩容Arrays.copyOf(1,2),以及数组的移动System.arraycopy(1,2,3,4,5);,判断数据是否存在,如果存在则返回并打印添加失败,不存在则添加成功

选择C时,进行删除对应编号的内容,并将数组删除缩容一个Arrays.copyOf(),数组移动System.arraycopy(); 很简单

选择D时,进行修改对于的编码,编码存在则修改 编码不存在则返回 打印出修改之前和修改之后的内容 

以下是测试

输入A时 

选择B时 B中无重复数据时添加成功

B中有重复数据时

 

选择C时,当编码不存在时

选择C时 编码存在时

 

选择D时 只测试修改后的数据

 

猜你喜欢

转载自blog.csdn.net/Miserables_/article/details/142989960