// Nik Johnson // 1-25-2024 // TA: Andy Ruan // modified attempt for resubmission 1 import java.util.*; import java.io.*; // stock simulator // stock market sandbox which reads fake market data from "stonks.tsv", and allows users to: // buy and sell stocks, and save their portfolio to a file. // upon quitting, the value of the users portfolio will be calculated and printed. public class Stonks { public static final String STOCKS_FILE_NAME = "stonks.tsv"; public static void main(String[] args) throws FileNotFoundException { Scanner console = new Scanner(System.in); File stonks = new File(STOCKS_FILE_NAME); Scanner stonklines = new Scanner(stonks); int numStocks = Integer.parseInt(stonklines.nextLine()); String[] tickers = new String[numStocks]; Double[] prices = new Double[numStocks]; Double[] portfolio = new Double[numStocks]; // fill portfolio with zeros to prevent null exceptions // without using Arrays.fill() for (int n = 0; n < numStocks; n++) { portfolio[n] = 0.0; } String info = stonklines.nextLine(); // this runs once. // functionally decomposing it would add lines of code, but no functionality. int index = 0; while (stonklines.hasNextLine()) { String nextline = stonklines.nextLine(); Scanner token = new Scanner(nextline); tickers[index] = token.next(); prices[index] = token.nextDouble(); index++; } System.out.println("Welcome to the CSE 122 Stocks Simulator!"); System.out.println("There are " + numStocks + " stocks on the market:"); for (int i = 0; i < numStocks; i++) { System.out.println(tickers[i] + ": " + prices[i]); } System.out.println(); String next = navigator(console); while (!next.equals("quit")) { if (next.equals("buy")) { portfolio = buy(console, tickers, prices, portfolio); } else if (next.equals("sell")) { portfolio = sell(console, tickers, prices, portfolio); } else if (next.equals("save")) { save(console, tickers, portfolio); } else { System.out.println("Invalid choice: " + next); System.out.println("Please try again"); System.out.println(); } next = navigator(console); } Double value = quit(prices, portfolio); System.out.println("Your portfolio is currently valued at: $" + value); } // menu method, called for inital prompt and then after using any other methods // returns String which decides which function to use public static String navigator(Scanner console) { System.out.println("Menu: buy, sell, save, quit"); System.out.print("Enter your choice: "); String destination = console.next(); return destination; } // add (buy) to portfolio according to user input, no lower than $5.0 // takes console scanner, and all data arrays defined in main lines 24-26 // return modified portfolio with MORE shares than before public static Double[] buy(Scanner console, String[] tickers, Double[] prices, Double[] portfolio) { System.out.print("Enter the stock ticker: "); String order = console.next(); System.out.print("Enter your budget: "); Double budget = console.nextDouble(); if (budget >= 5.0) { for (int i = 0; i < tickers.length; i++) { if (order.equals(tickers[i])) { portfolio[i] += (budget / prices[i]); System.out.println("You successfully bought " + tickers[i] + "."); System.out.println(); } } } else { System.out.println("Budget must be at least $5"); System.out.println(); } return portfolio; } // subtract (sell) from portfolio according to user input, if they have enough to sell // takes console scanner, and all data arrays defined in main lines 24-26 // return modified portfolio with LESS shares than before public static Double[] sell(Scanner console, String[] tickers, Double[] prices, Double[] portfolio) { System.out.print("Enter the stock ticker: "); String ticker = console.next(); System.out.print("Enter the number of shares to sell: "); Double sellAmount = console.nextDouble(); for (int i = 0; i < tickers.length; i++) { if (ticker.equals(tickers[i])) { if (sellAmount > portfolio[i]) { System.out.println("You do not have enough shares of " + ticker + " to sell " + sellAmount + " shares."); System.out.println(); } else if (sellAmount <= portfolio[i]) { portfolio[i] = portfolio[i] - sellAmount; System.out.println("You successfully sold " + sellAmount + " shares of " + ticker + "."); System.out.println(); } } } return portfolio; } // write current portfolio to file named according to user input // takes console scanner, array of tickers and the users current portfolio public static void save(Scanner console, String[] tickers, Double[] portfolio) throws FileNotFoundException { System.out.print("Enter new portfolio file name: "); String fileName = console.next(); System.out.println(); File saveData = new File(fileName); PrintStream savePortfolio = new PrintStream(saveData); for (int i = 0; i < tickers.length; i++) { if (portfolio[i] != 0.0) { savePortfolio.println(tickers[i] + " " + portfolio[i]); } } } // upon quitting, calculate total portfolio value using- // -values in portfolio and current market prices // return total value for printing public static double quit(Double[] prices, Double[] portfolio) { System.out.println(); Double portfolioValue = 0.0; for (int i = 0; i < prices.length; i++) { if (portfolio[i] != null) { Double currValue = prices[i]*portfolio[i]; portfolioValue += currValue; } else portfolioValue += 0; } return portfolioValue; } }