【Java实战】面向对象编程实践:银行账户与学生成绩管理与集合的应用综合练习

设计一个银行流水账号类

设计一个BankAccount类,这个类包括:
(1)一个int型的balance,表示账户余额。
(2)一个无参构造方法,将账户余额初始化为0。
(3)一个带一个参数的构造方法,将账户余额初始化为输入的参数。
(4)一个getBlance()方法,返回账户余额。
(5)一个withdraw()方法:带一个amount参数,表示从账户余额中提取amount指定的款额,并返回账户余额;
若账户余额不足,则输出相应的提示信息。
(6)一个deposit()方法:带一个amount参数,表示将amount指定的款额存储到该银行账户上。
设计一个Main类进行测试,分别输入账户余额、提取额度以及存款额度,并分别输出账户余额。

输入格式:
依次输入账户余额、提取额度、存款额度,所有数据大于等于0。

输出格式:
依次输出初始账户余额、提取amount额度后的账户余额、存入amount后的账户余额。

输入样例1:
700
500
30
输出样例1:
账户的初始余额是:700
取款后,账户的余额是:200
存款后,账户的余额是:230
输入样例2:
300
500
20
输出样例2:
账户余额不足
账户的初始余额是:300
输入样例3:
-100
50
20
输出样例3:
输入的数据不能为负数

import java.util.Scanner;
class BankAccount{
    private int balance;
    public  BankAccount(){
        this.balance=0;
    }
    public BankAccount(int balance){
        this.balance=balance;
    }
    public int getBalance(){
        return balance;
    }
    public int withdraw(int amount){
        if(balance>=amount){
            balance-=amount;
        }else{
            System.out.println("账户余额不足");
        }
        return balance;
    }
    public void deposit(int amount){
         balance+=amount;
    }
}

public class Main{
    public static void main(String[] args){
    Scanner src=new Scanner(System.in);
    int balance=src.nextInt();
    int amount1=src.nextInt();
    int amount2=src.nextInt();
    if(balance<0||amount1<0||amount2<0){
        System.out.println("输入的数据不能为负数");
        return;
    }
    BankAccount account=new BankAccount(balance);
    account.withdraw(amount1);
    if(balance<amount1){
        System.out.println("账户的初始余额是:"+balance);
        return;
    }
    System.out.println("账户的初始余额是:"+balance);
    System.out.println("取款后,账户的余额是:"+account.getBalance());
    account.deposit(amount2);
    System.out.println("存款后,账户的余额是:"+account.getBalance());
    }
}

设计思路解析

  1. 封装性:BankAccount类将balance设为private,通过公共方法提供访问和修改途径
  2. 构造方法重载:提供了无参和有参两种构造方式,增加灵活性
  3. 业务逻辑: - 取款时检查余额是否充足 - 存款直接增加余额4. 输入验证:在主类中检查输入是否为负数

容器-ArrayList-排序

输入多个学生的成绩信息,包括:学号、姓名、数学成绩、物理成绩。

学号是每个学生的唯一识别号,互不相同。

姓名可能会存在重复。

要求:使用ArrayList存储学生信息。

输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+数学成绩+英文空格+物理成绩

以“end”为输入结束标志

输出格式:
按数学/物理成绩之和从高到低的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+数学/物理成绩之和

成绩相同的情况,按输入的先后顺序输出。

输入样例:
在这里给出一组输入。例如:
20201124 张少军 83 75
20201136 李四 78 86
20201118 郑觉先 80 62
end

输出样例:
在这里给出相应的输出。例如:
20201136 李四 164
20201124 张少军 158
20201118 郑觉先 142

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
class Student{
    String id;
    String name;
    int mathScores;
    int physicsScores;
    public Student(String id,String name,int mathScores,int physicsScores){
    this.id=id;
    this.name=name;
    this.mathScores=mathScores;
    this.physicsScores=physicsScores;
    }
    public int gettotalScores(){
        return mathScores+physicsScores;
    }
    @Override
    public String toString(){
    return id+" "+name+" "+gettotalScores();
    }
}
public class Main{
    public static void main(String[] args){
    Scanner src=new Scanner(System.in);
    ArrayList<Student> students=new ArrayList<>();
    while(true){
    String input=src.nextLine();
        if("end".equals(input)){
          break;
        }
  
    String[] arr=input.split(" ");
    String id=arr[0];
    String name=arr[1];
    int mathScores=Integer.parseInt(arr[2]);
    int physicsScores=Integer.parseInt(arr[3]);
    students.add(new Student(id,name,mathScores,physicsScores));
    }
    Collections.sort(students,(s1,s2)->s2.gettotalScores()-s1.gettotalScores());
    for(Student student:students){
    System.out.println(student);
    }
    
    }
}

设计思路解析

  1. Student类设计
  • 包含学号、姓名、数学成绩、物理成绩字段
  • 提供计算总分的方法getTotalScores()
  • 重写toString()方法方便输出
  1. ArrayList使用
  • 动态存储学生对象
  • 支持不确定数量的学生信息输入
  1. 排序实现
  • 使用Collections.sort()方法
  • 通过Lambda表达式定义比较规则(按总分降序)
  • 保持输入顺序作为相同分数时的排序依据4. 输入处理
  • 使用"end"作为输入结束标志
  • 按行读取并解析输入数据

关键知识点

  1. 集合框架:ArrayList的动态扩容特性
  2. 自定义排序:Comparator接口的Lambda实现
  3. 字符串处理:split()方法分割输入行
  4. 面向对象:Student类的封装和toString重写

你可能感兴趣的:(Java,java,程序人生,职场和发展,学习方法,代码规范)