Untitled
unknown
java
a year ago
9.2 kB
13
Indexable
import java.util.*;
import java.io.*;
// Nimai Belur
// 10/9/2024
// CSE 122
// TA: Cora Supasatit
// This class is a stock simulator. It allows you to buy and sell stocks for your portfolio, and you can save everything to a file that contains your
// portfolio at the end
public class Stonks {
public static final String STOCKS_FILE_NAME = "stonks.tsv";
public static void main(String[] args) throws FileNotFoundException {
// TODO: write main method here
//Create Scanner for stonks file and populating empty arrays with stock info, then creating second Scanner for user input
File stocks = new File(STOCKS_FILE_NAME);
Scanner fileScan = new Scanner(stocks);
int numStocks = Integer.parseInt(fileScan.nextLine());
String[] stockNames = new String[numStocks];
double[] prices = new double[numStocks];
double[] portfolio = new double[numStocks];
populateArrays(stockNames, prices, numStocks, fileScan);
Scanner input = new Scanner(System.in);
String response = input.nextLine();
//Main loop checking if you want to quit
while(!response.equalsIgnoreCase("Q")){
//buy stock
if(response.equalsIgnoreCase("B")){
buyStock(stockNames, prices, portfolio, input);
//sell stock
} else if(response.equalsIgnoreCase("Se")){
sellStock(stockNames, portfolio, input);
//save portfolio
} else if(response.equalsIgnoreCase("S")){
savePortfolio(portfolio, stockNames, input);
//user entered invalid character
} else {
System.out.println("Invalid choice: " + response);
System.out.println("Please try again");
}
//reprompting
response=reprompt(input);
}
//print value of portfolio at the end
printValue(portfolio, prices);
}
// Behavior: Asks the user for a stock and budget, and adds the correct amount of shares to the user's porfolio depending on the budget.
// Asks user to retry if their budget is too low.
// Exceptions: None
// Returns: Nothing
// Parameters:
// - stockNames: String[] - array containing the names of available stocks
// - prices: double[] - array containing the prices of each stock
// - portfolio: double[] - array representing the number of shares the user owns for each stock
// - input: Scanner - Scanner object to get user input
public static void buyStock(String[] stockNames, double[] prices, double[] portfolio, Scanner input){
System.out.print("Enter the stock ticker: ");
String name = input.nextLine();
//gets the index of the stock in stockNames
int stockIndex = nameAsIndex(name, stockNames);
System.out.print("Enter your budget: ");
String budgetString = input.nextLine();
//gets budget as a double
double budget = Double.parseDouble(budgetString);
//if budget less than $5, user cannot buy stock, otherwise add however many shares they can buy to their portfolio
if(budget<5){
System.out.println("Budget must be at least $5");
} else {
portfolio[stockIndex] += budget/prices[stockIndex];
System.out.println("You successfully bought " + name + ".");
}
}
// Behavior: Asks the user what stock they want to sell and how much. Sells that many shares if the user has that many, otherwise user must try again
// Exceptions: N/A
// Returns: Nothing
// Parameters:
// - stockNames: String[] - array containing the names of available stocks
// - portfolio: double[] - array representing the number of shares the user owns for each stock
// - input: Scanner - Scanner object to get user input
public static void sellStock(String[] stockNames, double[] portfolio, Scanner input){
System.out.print("Enter the stock ticker: ");
String name = input.nextLine();
int stockIndex = nameAsIndex(name, stockNames);
//amount of shares to sell as a double
System.out.print("Enter the number of shares to sell: ");
String numShares = input.nextLine();
double shares = Double.parseDouble(numShares);
//prevents users from selling more shares than they have
if(shares>portfolio[stockIndex]){
System.out.println("You do not have enough shares of " + name + " to sell " + shares
+ " shares.");
} else {
portfolio[stockIndex]-=shares;
System.out.println("You successfully sold " + shares + " shares of " + name + ".");
}
}
// Behavior: Saves the user's current portfolio to a file by looking through their portfolio and printing stocks that
// the user has more than 0 shares of to the new file
// Exceptions: Throws FileNotFoundException
// Returns: Nothing
// Parameters:
// - portfolio: double[] - array representing the number of shares the user owns for each stock
// - stockNames: String[] - array containing the names of available stocks
// - input: Scanner - Scanner object to get user input
public static void savePortfolio(double[] portfolio, String[] stockNames, Scanner input) throws FileNotFoundException {
System.out.print("Enter new portfolio file name: ");
String fileName = input.nextLine();
File portfolioFile = new File(fileName);
PrintStream fileWrite = new PrintStream(portfolioFile);
for(int i=0; i<portfolio.length; i++){
//Only puts stock info in portfolio if you have more than 0 shares of it
if(portfolio[i]>0.0){
fileWrite.println(stockNames[i]+" "+portfolio[i]);
}
}
}
// Behavior: Maps the stock ticker name to its index in the stockNames array.
// Returns -1 if the stock ticker is not found.
// Exceptions: N/A
// Returns: int - index of the stock in the stockNames array, or -1 if not found
// Parameters:
// - name: String - stock ticker to look for
// - stockNames: String[] - array containing the names of available stocks
public static int nameAsIndex(String name, String[] stockNames){
for(int i=0; i<stockNames.length; i++){
if(name.equals(stockNames[i])){
return i;
}
}
return -1;
}
// Behavior: Calculates and prints the total value of the user's portfolio by multiplying each amount of
// shares in the portfolio by the share price for the corresponding company
// Exceptions: N/A
// Returns: Nothing
// Parameters:
// - portfolio: double[] - array representing the number of shares the user owns for each stock
// - prices: double[] - array containing the prices of each stock
public static void printValue(double[] portfolio, double[] prices){
double total=0.0;
for(int i=0; i<portfolio.length; i++){
total+=portfolio[i]*prices[i];
}
System.out.println("Your portfolio is currently valued at: $" + total);
}
// Behavior: Reads the stock names and prices from the file and populates the stockNames and prices arrays.
// It also prints out the available stocks and their prices to the user.
// Exceptions: N/A
// Returns: Nothing
// Parameters:
// - stockNames: String[] - array to populate with the names of stocks
// - prices: double[] - array to populate with the prices of stocks
// - numStocks: int - number of stocks to populate
// - fileScan: Scanner - Scanner object to read the file
public static void populateArrays(String[] stockNames, double[] prices, int numStocks, Scanner fileScan) {
System.out.println("Welcome to the CSE 122 Stocks Simulator!");
System.out.println("There are " + numStocks + " stocks on the market:");
//Skips over the line that contains the name of each category in stonks file
fileScan.nextLine();
for(int i=0; i<numStocks; i++){
stockNames[i]=fileScan.next();
prices[i]=Double.parseDouble(fileScan.next());
System.out.println(stockNames[i]+": "+prices[i]);
if(fileScan.hasNextLine()){
//Skips over dividend yield and P/E ratio
fileScan.nextLine();
}
}
System.out.println();
//User prompt
System.out.println("Menu: (B)uy, (Se)ll, (S)ave, (Q)uit");
System.out.print("Enter your choice: ");
}
// Behavior: Prompts the user to choose an action (Buy, Sell, Save, or Quit) and returns their input.
// Exceptions: N/A
// Returns: String - the user's input command
// Parameters:
// - input: Scanner - Scanner object to get user input
public static String reprompt(Scanner input){
System.out.println();
System.out.println("Menu: (B)uy, (Se)ll, (S)ave, (Q)uit");
System.out.print("Enter your choice: ");
String in = input.nextLine();
return in;
}
}Editor is loading...
Leave a Comment