import java.util.*;
public class App {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int id = readId(in);
String tag = readTag(in);
int value = readValue(in);
System.out.println("--- After reading in the values");
printState(id, tag, value);
System.out.println();
System.out.println("--- Performing putIn 50");
value = putIn(value, 50);
printState(id, tag, value);
System.out.println("--- Performing takeOut 20");
value = takeOut(value, 20);
printState(id, tag, value);
}
// ---------------- Input ----------------
static int readId(Scanner in) {
System.out.print("Enter id: ");
return in.nextInt();
}
static String readTag(Scanner in) {
System.out.print("Enter tag: ");
return in.next();
}
static int readValue(Scanner in) {
System.out.print("Enter value: ");
return in.nextInt();
}
// ---------------- Operations ----------------
static int putIn(int value, int amount) {return value + amount;}
static int takeOut(int value, int amount) {return value - amount;}
// ---------------- Output ----------------
static void printState(int id, String tag, int value) {
System.out.println("STATE");
System.out.println("-----");
System.out.println("id = " + id);
System.out.println("tag = " + tag);
System.out.println("value = " + value);
}
}
putIn, and takeOut, cannot modify the balance in place, because they are passed
by-value; rather they must return the new value, which is then assigned (by main — the caller) to balance.
readxxx methods that read in the relevant values
putIn and takeOut in this instance)
id, value must be passed to printState as they are used by that method
10010 Weiss 100
Enter id: 10010 Enter tag: Weiss Enter value: 100 --- After reading in the values STATE ----- id = 10010 tag = Weiss value = 100 --- Performing putIn 50 STATE ----- id = 10010 tag = Weiss value = 150 --- Performing takeOut 20 STATE ----- id = 10010 tag = Weiss value = 130
Enter id: Enter tag: Enter value: --- After reading in the values STATE ----- id = 10010 tag = Weiss value = 100 --- Performing putIn 50 STATE ----- id = 10010 tag = Weiss value = 150 --- Performing takeOut 20 STATE ----- id = 10010 tag = Weiss value = 130
stdout presents the exact output produced by the System.out.println's of the program … including the prompts
interactive session presents what you see at the terminal; this includes the keyboard input which is mirrored (together with the nmewlines generated by the carriage returns types by the user).
id, tag, value, also convey possible interpretations, but on a much more general scale.
BankAccount: An App with Application Semantics
import java.util.*;
public class BankAccountApp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int accountNumber = readAccountNumber(in);
String owner = readOwner(in);
int balance = readBalance(in); // units interpreted as cents
System.out.println("After creating account");
printAccount(accountNumber, owner, balance);
System.out.println("Preforming deposit 50");
balance = deposit(balance, 5000); // $50.00
printAccount(accountNumber, owner, balance);
System.out.println("Preforming deposit withdrawal 2000");
balance = withdraw(balance, 2000); // $20.00
printAccount(accountNumber, owner, balance);
}
// ---------------- Input ----------------
static int readAccountNumber(Scanner in) {
System.out.print("Enter account number: ");
return in.nextInt();
}
static String readOwner(Scanner in) {
System.out.print("Enter owner name: ");
return in.next();
}
static int readBalance(Scanner in) {
System.out.print("Enter starting balance (cents): ");
return in.nextInt();
}
// ---------------- Operations ----------------
static int deposit(int balance, int amount) {
return balance + amount;
}
static int withdraw(int balance, int amount) {
return balance - amount;
}
// ---------------- Output ----------------
static void printAccount(int accountNumber, String owner, int balance) {
System.out.println("ACCOUNT STATE");
System.out.println("-------------");
System.out.println("Account #: " + accountNumber);
System.out.println("Owner: " + owner);
System.out.println("Balance: " + balance + " cents");
}
}
import java.util.*;
public class BankAccountApp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int accountNumber = readAccountNumber(in);
String owner = readOwner(in);
int balance = readBalance(in); // cents
String status = readStatus(in);
String openedDate = readOpenedDate(in);
System.out.println("--- After creating account");
printAccount(accountNumber, owner, balance, status, openedDate);
System.out.println("Performing deport 5000");
System.out.println("--- Performing deposit 5000");
balance = deposit(balance, 5000);
printAccount(accountNumber, owner, balance, status, openedDate);
System.out.println("--- Performing withdraw 2000");
balance = withdraw(balance, 2000);
printAccount(accountNumber, owner, balance, status, openedDate);
}
// ---------------- Input ----------------
static int readAccountNumber(Scanner in) {
System.out.print("Enter account number: ");
return in.nextInt();
}
static String readOwner(Scanner in) {
System.out.print("Enter owner name: ");
return in.next();
}
static int readBalance(Scanner in) {
System.out.print("Enter starting balance (cents): ");
return in.nextInt();
}
static String readStatus(Scanner in) {
System.out.print("Enter status: ");
return in.next();
}
static String readOpenedDate(Scanner in) {
System.out.print("Enter opened date: ");
return in.next();
}
// ---------------- Operations ----------------
static int deposit(int balance, int amount) {return balance + amount;}
static int withdraw(int balance, int amount) {return balance - amount;}
// ---------------- Output ----------------
static void printAccount(int accountNumber, String owner, int balance, String status, String openedDate) {
System.out.println("ACCOUNT STATE");
System.out.println("-------------");
System.out.println("Account #: " + accountNumber);
System.out.println("Owner: " + owner);
System.out.println("Balance: " + balance + " cents");
System.out.println("Status: " + status);
System.out.println("Opened: " + openedDate);
}
}
read… methods.
printAccount method to include those attributes
status in our logic … shouldn't we
withdraw to act more realistically; i.e., you can only withdraw if the account is ACTIVE
static int withdraw(int balance,
int amount,
String status) {
if (!status.equals("ACTIVE")) {
System.out.println("Withdrawal denied: account not active");
return balance;
}
return balance - amount;
}
…
System.out.println("--- Performing a deposit of 5000");
balance = deposit(balance, 5000);
printAccount(accountNumber, owner, balance, status, openedDate);
System.out.println();
System.out.println("--- Performing a withdrawal of 2000");
balance = withdraw(balance, 2000, status);
printAccount(accountNumber, owner, balance, status, openedDate);
…
Some things to think about:
main) from bypassing all that logic
by nit calling the operation method and doing the logic on their own?
First we need each attribute to become an array:
int [] accountNumbers;
String [] owners;
int [] balances;
String [] statuses;
String [] openedDates;
swap(accountNumbers, i, j); swap(owners, i, j); swap(balances, i, j); swap(statuses, i, j); swap(openedDates, i, j);
import java.util.*;
import java.io.*;
public class BankAccountApp {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(new File("accounts.text"));
final int CAPACITY = 100;
int [] accountNumbers = new int[CAPACITY];
String [] owners = new String[CAPACITY];
int [] balances = new int[CAPACITY];
String [] statuses = new String[CAPACITY];
String [] openedDates = new String[CAPACITY];
int size = 0;
while (in.hasNextInt()) {
accountNumbers[size] = readAccountNumber(in);
owners[size] = readOwner(in);
balances[size] = readBalance(in); // cents
statuses[size] = readstatuses(in);
openedDates[size] = readOpenedDate(in);
size++;
}
System.out.println("-- After reading in and creating the accounts");
printAccounts(accountNumbers, owners, balances, statuses, openedDates, size);
System.out.println("--- Performing a deposit of 5000 on account at position 1");
balances[1] = deposit(balances[1], 5000);
printAccounts(accountNumbers, owners, balances, statuses, openedDates, size);
System.out.println("-- Sorting by owner");
sort(accountNumbers, owners, balances, statuses, openedDates, size);
printAccounts(accountNumbers, owners, balances, statuses, openedDates, size);
}
// ---------------- Input ----------------
static int readAccountNumber(Scanner in) {
return in.nextInt();
}
static String readOwner(Scanner in) {
return in.next();
}
static int readBalance(Scanner in) {
return in.nextInt();
}
static String readstatuses(Scanner in) {
return in.next();
}
static String readOpenedDate(Scanner in) {
return in.next();
}
// ---------------- Operations ----------------
static int deposit(int balances, int amount) {return balances + amount;}
static int withdraw(int balance, int amount, String statuses) {
if (!statuses.equals("ACTIVE")) {
System.out.println("Withdrawal denied: account not active");
return balance;
}
return balance - amount;
}
// ---------------- Output ----------------
static void printAccounts(int [] accountNumbers, String [] owners, int [] balances, String [] statuses, String [] openedDates, int size) {
System.out.println("\nACCOUNTS");
System.out.println("-------------");
for (int i = 0; i < size; i++) {
printAccount(accountNumbers[i], owners[i], balances[i], statuses[i], openedDates[i]);
System.out.println();
}
}
static void printAccount(int accountNumber, String owner, int balance, String status, String openedDate) {
System.out.println("Account #: " + accountNumber);
System.out.println("Owner: " + owner);
System.out.println("Balance: " + balance + " cents");
System.out.println("status: " + status);
System.out.println("Opened: " + openedDate);
}
static void sort(int [] accountNumbers, String [] owners, int [] balances, String [] statuses, String [] openedDates, int size) {
boolean swapped = true;
for (int last = size-1; size > 0 && swapped; size --) {
swapped = false;
for (int i = 0; i < last; i++)
if (owners[i].compareTo(owners[i+1]) > 0) {
swap(accountNumbers, i, i+1);
swap(owners, i, i+1);
swap(balances, i, i+1);
swap(statuses, i, i+1);
swap(openedDates, i, i+1);
swapped = true;
}
}
}
static void swap(int [] arr, int idx1, int idx2) {
int t = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = t;
}
static void swap(String [] arr, int idx1, int idx2) {
String t = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = t;
}
}
swap method needs to be defined; one per data type (i.e., not one per attribute)
10010 Weiss 10000 ACTIVE 01/25/2026 10020 Arnow 20000 ACTIVE 12/21/2025 10030 Sokol 0 CLOSED 11/19/2025
stdout
-- After reading in and creating the accounts
ACCOUNTS
-------------
Account #: 10010
Owner: Weiss
Balance: 10000 cents
status: ACTIVE
Opened: 01/25/2026
Account #: 10020
Owner: Arnow
Balance: 20000 cents
status: ACTIVE
Opened: 12/21/2025
Account #: 10030
Owner: Sokol
Balance: 0 cents
status: CLOSED
Opened: 11/19/2025
--- Performing a deposit of 5000 on account at position 1
ACCOUNTS
-------------
Account #: 10010
Owner: Weiss
Balance: 10000 cents
status: ACTIVE
Opened: 01/25/2026
Account #: 10020
Owner: Arnow
Balance: 25000 cents
status: ACTIVE
Opened: 12/21/2025
Account #: 10030
Owner: Sokol
Balance: 0 cents
status: CLOSED
Opened: 11/19/2025
-- Sorting by owner
ACCOUNTS
-------------
Account #: 10020
Owner: Arnow
Balance: 25000 cents
status: ACTIVE
Opened: 12/21/2025
Account #: 10030
Owner: Sokol
Balance: 0 cents
status: CLOSED
Opened: 11/19/2025
Account #: 10010
Owner: Weiss
Balance: 10000 cents
status: ACTIVE
Opened: 01/25/2026
BankAccountOps.java):
public class BankAccountOps {
static int deposit(int balance, int amount) {
return balance + amount;
}
static int withdraw(int balance, int amount, String status) {
if (status.equals("CLOSED")) {
System.out.println("Withdrawal denied: account closed");
return balance;
}
return balance - amount;
}
static void printAccount(int accountNumber,
String owner,
int balance,
String status,
String openedDate) {
System.out.println("ACCOUNT STATE");
System.out.println("-------------");
System.out.println("Account #: " + accountNumber);
System.out.println("Owner: " + owner);
System.out.println("Balance: " + balance + " cents");
System.out.println("Status: " + status);
System.out.println("Opened: " + openedDate);
}
}
Here is the updated app:
import java.util.Scanner;
public class BankAccountApp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int accountNumber = readAccountNumber(in);
String owner = readOwner(in);
int balance = readBalance(in);
String status = readStatus(in);
String openedDate = readOpenedDate(in);
balance = BankAccountOps.deposit(balance, 5000);
balance = BankAccountOps.withdraw(balance, 2000, status);
BankAccountOps.printAccount(accountNumber,
owner,
balance,
status,
openedDate);
}
// input helpers unchanged
static int readAccountNumber(Scanner in) {return in.nextInt();}
static String readOwner(Scanner in) {in.nextLine(); return in.nextLine();}
static int readBalance(Scanner in) {return in.nextInt();}
static String readStatus(Scanner in) {in.nextLine(); return in.nextLine();}
static String readOpenedDate(Scanner in) { return in.nextLine();}
}
BankAccountOps) that contains the method when invoking it; this is similar to
Math.sqrt.
read methods have not been moved; this is a somewhat subtle point, but
they don't really operate on a bank account as such
public class BankAccountData {
public int accountNumber;
public String owner;
public int balance; // cents
public String status; // "ACTIVE" or "CLOSED"
public String openedDate; // free-form for now
}
BankAccountOps class; it contains the
attributes packaged as a single (class) entity.
public class BankAccountOps {
public static void deposit(BankAccountData account, int amount) {
account.balance += amount;
}
public static void withdraw(BankAccountData account, int amount) {
if (account.status.equals("CLOSED")) {
System.out.println("Withdrawal denied: account is CLOSED");
return;
}
account.balance -= amount;
}
public static void printAccount(BankAccountData account) {
System.out.println("ACCOUNT STATE");
System.out.println("-------------");
System.out.println("Account #: " + account.accountNumber);
System.out.println("Owner: " + account.owner);
System.out.println("Balance: " + account.balance + " cents");
System.out.println("Status: " + account.status);
System.out.println("Opened: " + account.openedDate);
}
}
BankAccountData entity.
account
in our example).
balance in the method persist after returning to the caller. As a result we can perform the deposit/withdrawal
modification to balance in place, rather than returning the new value as the method
return value and assigning it into balance in the caller.
import java.util.Scanner;
public class BankAccountApp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BankAccountData account = new BankAccountData();
account.accountNumber = readAccountNumber(in);
account.owner = readOwner(in);
account.balance = readBalance(in);
account.status = readStatus(in);
account.openedDate = readOpenedDate(in);
BankAccountOps.deposit(account, 5000);
BankAccountOps.withdraw(account, 2000);
BankAccountOps.printAccount(account);
}
// ----- Input helpers -----
static int readAccountNumber(Scanner in) {
System.out.print("Enter account number: ");
return in.nextInt();
}
static String readOwner(Scanner in) {
System.out.print("Enter owner name: ");
in.nextLine(); // consume newline
return in.nextLine();
}
static int readBalance(Scanner in) {
System.out.print("Enter starting balance (cents): ");
return in.nextInt();
}
static String readStatus(Scanner in) {
System.out.print("Enter status (ACTIVE/CLOSED): ");
in.nextLine(); // consume newline
return in.nextLine();
}
static String readOpenedDate(Scanner in) {
System.out.print("Enter opened date: ");
return in.nextLine();
}
}
class BankAccount {
public static void deposit(BankAccount account, int amount) {
account.balance += amount;
}
public static void withdraw(BankAccount account, int amount) {
if (account.status.equals("CLOSED")) {
System.out.println("Withdrawal denied: account is CLOSED");
return;
}
account.balance -= amount;
}
public static void printAccount(BankAccount account) {
System.out.println("ACCOUNT STATE");
System.out.println("-------------");
System.out.println("Account #: " + account.accountNumber);
System.out.println("Owner: " + account.owner);
System.out.println("Balance: " + account.balance + " cents");
System.out.println("Status: " + account.status);
System.out.println("Opened: " + account.openedDate);
}
int accountNumber;
String owner;
int balance;
String status;
String openedDate;
}
BankAccount
import java.util.Scanner;
public class BankAccountApp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BankAccount account = new BankAccount();
account.accountNumber = readAccountNumber(in);
account.owner = readOwner(in);
account.balance = readBalance(in);
account.status = readStatus(in);
account.openedDate = readOpenedDate(in);
BankAccount.deposit(account, 5000);
BankAccount.withdraw(account, 2000);
BankAccount.printAccount(account);
}
// ----- Input helpers -----
static int readAccountNumber(Scanner in) {
System.out.print("Enter account number: ");
return in.nextInt();
}
static String readOwner(Scanner in) {
System.out.print("Enter owner name: ");
return in.next();
}
static int readBalance(Scanner in) {
System.out.print("Enter starting balance (cents): ");
return in.nextInt();
}
static String readStatus(Scanner in) {
System.out.print("Enter status (ACTIVE/CLOSED): ");
return in.next();
}
static String readOpenedDate(Scanner in) {
System.out.print("Enter opened date: ");
return in.nextLine();
}
}
import java.util.*;
import java.io.*;
public class BankAccountApp {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(new File("accounts.text"));
final int CAPACITY = 100;
BankAccount [] accounts = new BankAccount[CAPACITY];
int size = 0;
while (in.hasNextInt()) {
accounts[size] = new BankAccount();
readAccount(in, accounts[size]);
size++;
}
System.out.println("-- After reading in and creating the accounts");
printAccounts(accounts, size);
System.out.println("--- Performing a deposit of 5000 on account at position 1");
BankAccount.deposit(accounts[1], 5000);
printAccounts(accounts, size);
System.out.println("-- Sorting by owner");
sort(accounts, size);
printAccounts(accounts, size);
}
// ---------------- Input ----------------
static void readAccount(Scanner in, BankAccount account) {
account.accountNumber = readAccountNumber(in);
account.owner = readOwner(in);
account.balance = readBalance(in); // cents
account.status = readStatus(in);
account.openedDate = readOpenedDate(in);
}
static int readAccountNumber(Scanner in) {return in.nextInt();}
static String readOwner(Scanner in) {return in.next();}
static int readBalance(Scanner in) {return in.nextInt();}
static String readStatus(Scanner in) {return in.next();}
static String readOpenedDate(Scanner in) {return in.next();}
// ---------------- Output ----------------
static void printAccounts(BankAccount [] accounts, int size) {
System.out.println("ACCOUNTS");
System.out.println("-------------");
for (int i = 0; i < size; i++) {
BankAccount.printAccount(accounts[i]);
System.out.println();
}
}
// ---------------- Sort ----------------
static void sort(BankAccount [] accounts, int size) {
boolean swapped = true;
for (int last = size-1; size < 0 && swapped; size --) {
swapped = false;
for (int i = 0; i < last; i++)
if (accounts[i].owner.compareTo(accounts[i+1].owner) > 0) {
swap(accounts, i, i+1);
swapped = true;
}
}
}
static void swap(BankAccount [] accounts, int idx1, int idx2) {
BankAccount t = accounts[idx1];
accounts[idx1] = accounts[idx2];
accounts[idx2] = t;
}
}
BankAccount class is the same as before
BankAccount [] accounts = new BankAccount[CAPACITY];
creates the array; however the individual elements are not created by this; that is done by the
code accounts[size] = new BankAccount();
printAccounts now calls printAccount with the
i'th bank account (rather than the i'th elements of the parallel arrays).
swap method now swaps the i'th BankAccount
element, rather than multiple parallel arrays.
BankAccount entity.
BankAccount operations accepted a BankAccount parameter representing the account to be manipulated.
BankAccount.deposit(account, amount) becomes account.deposit(amount).
import java.util.*;
import java.util.Scanner;
public class BankAccountApp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BankAccount account = new BankAccount();
account.accountNumber = readAccountNumber(in);
account.owner = readOwner(in);
account.balance = readBalance(in);
account.status = readStatus(in);
account.openedDate = readOpenedDate(in);
account.deposit(5000);
account.withdraw(2000);
account.print();
}
// ----- Input helpers -----
static int readAccountNumber(Scanner in) {
System.out.print("Enter account number: ");
return in.nextInt();
}
static String readOwner(Scanner in) {
System.out.print("Enter owner name: ");
return in.next();
}
static int readBalance(Scanner in) {
System.out.print("Enter starting balance (cents): ");
return in.nextInt();
}
static String readStatus(Scanner in) {
System.out.print("Enter status (ACTIVE/CLOSED): ");
return in.next();
}
static String readOpenedDate(Scanner in) {
System.out.print("Enter opened date: ");
return in.next();
}
}
deposit/withdraw/printAccount methods; rather we invoke the method on a specific account
BankAccount class; specifically the methods:
class BankAccount {
public void deposit(int amount) {balance += amount;} // no static
public void withdraw(int amount) { // no static
if (status.equals("CLOSED")) {
System.out.println("Withdrawal denied: account is CLOSED");
return;
}
balance -= amount;
}
public void print() {
System.out.println("Account #: " + accountNumber);
System.out.println("Owner: " + owner);
System.out.println("Balance: " + balance + " cents");
System.out.println("Status: " + status);
System.out.println("Opened: " + openedDate);
}
int accountNumber;
String owner;
int balance;
String status;
String openedDate;
}
static in the method headers.
static.
new is called an instance, or an object, of the class.
account.printAccount(), the Account suffix is unnecessary: account.print().
BankAccount
import java.util.*;
import java.io.*;
public class BankAccountApp {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(new File("accounts.text"));
final int CAPACITY = 100;
BankAccount [] accounts = new BankAccount[CAPACITY];
int size = 0;
while (in.hasNextInt()) {
accounts[size] = new BankAccount();
readAccount(in, accounts[size]);
size++;
}
System.out.println("-- After reading in and creating the accounts");
printAccounts(accounts, size);
System.out.println("--- Performing a deposit of 5000 on account at position 1");
accounts[1].deposit(5000);
printAccounts(accounts, size);
System.out.println("-- Sorting by owner");
sort(accounts, size);
printAccounts(accounts, size);
}
// ---------------- Input ----------------
static void readAccount(Scanner in, BankAccount account) {
account.accountNumber = readAccountNumber(in);
account.owner = readOwner(in);
account.balance = readBalance(in); // cents
account.status = readStatus(in);
account.openedDate = readOpenedDate(in);
}
static int readAccountNumber(Scanner in) {return in.nextInt();}
static String readOwner(Scanner in) {return in.next();}
static int readBalance(Scanner in) {return in.nextInt();}
static String readStatus(Scanner in) {return in.next();}
static String readOpenedDate(Scanner in) {return in.next();}
// ---------------- Output ----------------
static void printAccounts(BankAccount [] accounts, int size) {
System.out.println("ACCOUNTS");
System.out.println("-------------");
for (int i = 0; i < size; i++) {
accounts[i].print();
System.out.println();
}
}
// ---------------- Sort ----------------
static void sort(BankAccount [] accounts, int size) {
boolean swapped = true;
for (int last = size-1; size > 0 && swapped; size --) {
swapped = false;
for (int i = 0; i < last; i++)
if (accounts[i].owner.compareTo(accounts[i+1].owner) > 0) {
swap(accounts, i, i+1);
swapped = true;
}
}
}
static void swap(BankAccount [] accounts, int idx1, int idx2) {
BankAccount t = accounts[idx1];
accounts[idx1] = accounts[idx2];
accounts[idx2] = t;
}
}
static.
deposit
BankAccount objects, and the overall structure of the app
remains the same.