CISC 3115
Modern Programming Techniques
Lecture 1
Motivating Classes


00 — Just a Simple App

What does this app do?

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);
	}
}

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
  • The 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).
  • 01 — BankAccount: An App with Application Semantics

    Now consider the following app:

    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");
        }
    }
    

    02 — Adding Additional Attributes

    Suppose we decide to add the following attributes:
    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);
        }
    }
    

    03 — What About Rules for Bank Account Operations?

    Suppose we wanted 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:

    04 — Detour: Multiple Accounts … Parallel Arrays

    Now suppose we want a number of bank accounts

    First we need each attribute to become an array:

    int [] accountNumbers;
    String [] owners;
    int [] balances;
    String [] statuses;
    String [] openedDates;
    

    Sorting Parallel Arrays

    Sorting poses a particular challenge when dealing with parallel arrays. Here is an app operating on a set of parallel arrays representing 'bank accounts'.

    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;
    	}
    }
    

    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
    

    05 — A First Step Towards a Solution … Isolating the Bank Account Methods

    Let's isolate those methods that work on bank accounts and place them in their own file (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();}
    }
    

    06 — The Next Step … Packaging the Attributes

    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
    }
    

    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);
        }
    }
    

    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();
        }
    }
    

    07 — Merge Ops and Attributes

    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;
    }
    

    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();
        }
    }
    

    08 — Detour: Arrays

    Before we go further we're going to examine the effect of the previous step on apps using an array of accounts.

    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;
    	}
    }
    

    09 — Making Operations Account-Specific

    Now comes the big change:

    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();
        }
    }
    

    Achieving this involves a relatively simple change to the 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;
    }
    

    10 — Detour: An Array of BankAccount

    And again, let's see the effect of all this on our array app:

    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;
    	}
    }