//定义一个会员类Member public class Member { //姓名 private String name; //卡号 private int cardId; //密码 private String password; //积分 private int score; //开卡日期 private String registDate; //无参构造 public Member() { } //有参构造 public Member(String name, int cardId, String password, int score, String registDate) { this.name = name; this.cardId = cardId; this.password = password; this.score = score; this.registDate = registDate; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCardId() { return cardId; } public void setCardId(int cardId) { this.cardId = cardId; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getRegistDate() { return registDate; } public void setRegistDate(String registDate) { this.registDate = registDate; } }
import java.text.SimpleDateFormat; import java.util.*; //定义一个会员管理类MemberMgr public class MemberMgr { //所有会员卡//创建了一个ArrayList类型的List实例,用于存储Member类型的对象 List<Member> memberList = new ArrayList<Member>(); //创建键盘录入对象 Scanner input = new Scanner(System.in); //输出欢迎菜单 public void menu() { System.out.println("-----------------------------欢迎使用会员卡管理系统---------------------------"); System.out.println("1.开卡 2.修改密码 3.积分累计 4.积分兑换 5.剩余积分查询 6.退出"); System.out.println("---------------------------------------------------------------------------"); System.out.println("请选择"); } //搭建项目的整体流程 public void start() { do { menu();//静态方法调用可以直接用方法名调用 int choose = input.nextInt(); switch (choose) { case 1: register(); continue;//跳出当前循环迭代 case 2: if (changePwd()) { System.out.println("新密码设置成功!"); } continue; case 3: if (savescore()) { System.out.println("您的积分累计成功!"); } continue; case 4: if (minusscore()) { System.out.println("积分兑换成功!"); } continue; case 5: showScore(); continue; case 6: System.out.println("感谢您的使用,欢迎下次使用!"); break;//跳出switch default: System.out.println("您的操作有误,请重新选择:"); continue;//结束本次循环,进入下次循环 } break; } while (true);//可以一直重复运行循环 } //系统随机生成一个会员卡号 public int createId() { Random random = new Random(); //随机函数random int id = random.nextInt(99999999); //保证生成的会员卡号不能和之前已有的会员卡号重复 for (Member m : memberList) { if (m.getCardId() == id) { id = random.nextInt(99999999); } } return id; } //开卡 public void register(){ Member member=new Member();//生成一串随机数字 System.out.print("请输入注册姓名:"); member.setName(input.next());//调用方法setName System.out.print("请输入注册密码");// 会员卡密码不能低于6位 String pwd;boolean flag= true;//输入会员密码是否格式正确 do {pwd = input.next();if(pwd.length()<6){ System.out.print("会员密码不能小于6位,请重新输入注册密码:"); flag = false; }else { flag = true; member.setPassword(pwd);} } while(!flag); member.setCardId (createId());//调用建卡的方法去建立一个新的卡号 member.setScore(100);//给新卡赋予100积分 // 开卡日期 Date date =new Date();//调用date方法,导入包 SimpleDateFormat formater = new SimpleDateFormat("MM月dd日");//写一个SimpleDateFormat方法生成一个格式划的日期 String cardDate=formater.format(date); System.out.println("开卡日期是:" +cardDate);//调用了SimpleDateFormat对象的format方法,将Date对象转换为字符串,格式如上所述。 // 结果将被存储在cardDate字符串变量中。 member.setRegistDate(cardDate);//最后,将格式化后的日期字符串cardDate设置为member对象的registDate属性。 //调用setRegistDate方法来建立一个新卡 //将注册成功的会员添加到会员集合中,并提示开卡成功 memberList.add(member); System.out.println("恭喜,开通会员卡成功!系统赠送您100积分,您的会员卡号是:" + member.getCardId()); } // 验证会员是否存在//查询条件(会员卡号和密码)--封装在参数m中传过来 public Member hasMember(Member m) {//hasMember方法接收一个类型的参数m,这个参数应该是一个Member对象,包含了要验证的会员卡号和密码。 // 方法的返回类型也是Member,意味着它将返回一个Member对象,或者在找不到匹配项时返回null。 Member member = null;//用于存储找到的会员对象,如果没有找到匹配的会员,此变量将保持为null for (Member everyMember : memberList) {//这是一个增强型for循环,它遍历memberList集合中的每一个Member对象,everyMember是集合中当前迭代的元素。 if (m.getCardId() == everyMember.getCardId() &&//检查传入的参数m的卡号getCardId()和密码getPassword()是否与everyMember对象的卡号和密码相匹配。 m.getPassword().equals(everyMember.getPassword())) {// 找到了会员,会员是存在的。这里还调用了equals方法 member = everyMember;//若为真,则赋值给member } } return member; } //修改密码 public boolean changePwd() { boolean flag = true;//密码修改是否成功 Member member = new Member(); System.out.print("请输入您的会员卡号:"); member.setCardId(input.nextInt());//调用卡号中的member.setCardId方法 System.out.print("请输入您的会员密码:"); member.setPassword(input.next()); member = hasMember(member);// member如果找到了,就是找到的会员对象。如果找不到,member是nu11 if (member != null) {//会员卡号和密码正确,找到了该会员,此时允许修改密码 System.out.print("请输入您新的会员密码:"); String pwd;//声明一个字符串变量pwd,用于存储用户输入的新密码。 boolean flagPwd = true;// 新设置的会员密码格式是否正确。 // 声明一个布尔变量flagPwd,初始值为true,用于标记密码格式是否正确。这个标志用于控制密码输入的循环。 do { pwd = input.next(); if (pwd.length() < 6) { System.out.print("会员密码不能小于6位,请重新输入会员密码:"); flagPwd = false; } else { member.setPassword(pwd); flag = true; flagPwd = true; } } while (!flagPwd); } else { System.out.println("你输入的会员卡号或密码错误,无法修改密码"); flag = false; } return flag; } //积分累计 public boolean savescore() { System.out.print("请输入您的会员卡号:"); int cardId = input.nextInt();//输入卡号的表达式 Member member = memberList.stream()//Stream<T> filter(Predicate<? super T> predicate) .filter(e -> e.getCardId() == cardId) .findAny() .orElse(null); if (member != null) { System.out.print("请输入累计积分:"); int points = input.nextInt();//读取用户输入的积分数值。 member.setScore(member.getScore() + points);//将找到的会员的当前积分member.getScore()与新输入的积分points相加, // 然后使用setScore方法更新会员的积分。 return true; } else { System.out.println("会员卡号不存在,无法累计积分"); return false; } } //积分兑换 public boolean minusscore() {//因为积分兑换的结果只有正确和不正确,所以定义他为boolean System.out.print("请输入您的会员卡号:"); int cardId = input.nextInt();//读取用户输入的数值 Member member = memberList.stream()//调用stream方法 .filter(e -> e.getCardId() == cardId) .findAny() .orElse(null); if (member != null) {//若输入的值不为空 System.out.print("请输入兑换积分:"); int points = input.nextInt();//读取用户输入的值 if (points <= member.getScore()) {//积分够可以换 member.setScore(member.getScore() - points); return true; } else {//为空或者不够 System.out.println("积分不足,无法兑换"); return false; } } else {//卡号不正确 System.out.println("会员卡号不存在,无法兑换积分"); return false; } } //查询积分 public void showScore() { System.out.print("请输入您的会员卡号:"); int cardId = input.nextInt();//读取用户输入的值 Member member = memberList.stream()//调用stream方法 .filter(e -> e.getCardId() == cardId) .findAny() .orElse(null); if (member != null) { System.out.println("您的剩余积分为: " + member.getScore()); } else { System.out.println("会员卡号不存在"); } } } 测试
public class Test{ public static void main(String[]args) { MemberMgr mgr=new MemberMgr(); mgr.start(); }}
制作该系统的第一步即明确要创建的变量(需要用什木样的基础数据)
即创建一个基类,用私有属性private进行属性封装,然后进行无参构造方法的创建以及有参构造方法的创建,生成get和set方法。
创建一个会员管理类 ,整个代码的精华所在
1直接创建一个MemberMgr 类,创建一个Arraylist实列用于存储Member类型的对象
2输出欢迎菜单
3创建项目的整体流程
1>创建一个start方法
在start方法中调用菜单,静态方法可以直接调用,嵌套do while循环,然后在do while循环中嵌套一个switch case方法,在switch方法中调用各种方法,再switch case后写出各种要调用的方法
首先用系统生成一个随机的银行卡号,即调用创建卡号方法createId,这里用到随机函数random。并用加强for循环遍历了会员卡号,使其不能重复
之后调用开卡方法register,通过调用member类中的建卡方法来进行开卡工作,注:这里密码验证可以提前定义变量。利用do while循环内嵌套if else语句来完成密码的注册和验证,之后调用date方法来赋予开卡日期
这之后验证一下会员是否存在,之后的方法都需要先输入会员卡号,因此要先验证会员卡号是否存在,用加强for循环。嵌套一个if循环,并且调用.equals方法。
然后撰写修改密码的代码
1>首先定义一个boolean变量确定密码是否修改成功,2个scanner语句进行变量的输入并调用member里的set方法。
2>然后用if else 循环 (当卡号不为空时,可以输入会员卡号密码,此时需要声明变量来存储用户新密码,并检测新密码格式是否正确,或者当卡号为空或者卡号不正确是进入else条件)嵌套一个do while循环(即分为正确和不正确(格式不正确))来进行密码验证操作(包括密码长度和密码是否输入错误问题)
在之后就是积分累计的方法,常规输入输出语句的调用后就是Stream<T> filter(Predicate<? super T> predicate)语法的调用
.filter(e -> e.getCardId() == cardId) .findAny() .orElse(null);
代码的后半部分无非就是为空(重新输入)或者不为空(输入要累计的积分)的问题。
那木根据菜单下一步就是积分兑换,积分兑换在这里显示的结果无非是成功或者失败,所以可以创建一个boolean类型的变量以用于被switch case调用。键盘输入并读取用户输入的值然后同上调用Stream方法
.filter(e -> e.getCardId() == cardId) .findAny()
之后又是熟悉的不为空或者不够(或为空)的环节,这里加了一种不正确,也就是卡号不对,无法进行兑换。
到了代码的最后就是最后一项积分查询,相同的步骤创建方法,然后输入读取用户的值,调用Stream方法
.filter(e -> e.getCardId() == cardId) .findAny() .orElse(null);
后面就是为空不为空。