public static void Main(string[] args)
int receivedKey = Loop();
public static bool RangeCheck(int inp, int rn1 = 1, int rn2 = 1)
if (inp >= rn1 && inp <= rn2)
CoinJar cj = new CoinJar();
Console.WriteLine($"\nWhich coin type do you want to put in the jar? (enter number)");
Console.WriteLine($"1. Penny, 1¢");
Console.WriteLine($"2. Nickel, 5¢");
Console.WriteLine($"3. Dime, 10¢");
Console.WriteLine($"4. Quarter, 25¢");
Console.WriteLine($"5. See jar stats");
Console.WriteLine($"6. Exit");
int.TryParse(Console.ReadLine(), out int opt1);
if (RangeCheck(opt1, 1, 6))
Console.WriteLine("\nInvalid entry, enter again");
Console.WriteLine($"\nWhat do you want to do? (enter number)");
Console.WriteLine($"1. Add pennies (1¢)");
Console.WriteLine($"2. Add nickels (5¢)");
Console.WriteLine($"3. Add dimes (10¢)");
Console.WriteLine($"4. Add quarters (25¢)");
Console.WriteLine($"5. See jar stats");
Console.WriteLine($"6. Exit");
int.TryParse(Console.ReadLine(), out opt1);
if (opt1 >= 1 && opt1 <= 4) {
Console.WriteLine($"\nHow many coins do you want to put in the jar (enter number from 1 - 1 million)");
int.TryParse(Console.ReadLine(), out opt2);
if (RangeCheck(opt2, 1, 1000000))
Console.WriteLine("\nInvalid entry, enter again");
Console.WriteLine($"\nHow many coins do you want to put in the jar (enter number from 1 - 1 million)");
int.TryParse(Console.ReadLine(), out opt2);
Console.WriteLine($"\n\nJAR STATS: ");
Console.WriteLine($"-------------------------------------");
Console.WriteLine($"- Coins: {Coin.Count()}");
Console.WriteLine($"- Total Value: {Coin.GetTotalValue()}");
Console.WriteLine($"PENNIES:");
int pcount = (int)((((double)Penny.GetTotalValue()) / 0.01)+0.25);
Console.WriteLine($"- Coins: {pcount}");
Console.WriteLine($"- Total Value: {new Penny(0).GetValue(pcount)}");
Console.WriteLine($"NICKELS:");
int ncount = (int)((((double)Nickel.GetTotalValue()) / 0.05) + 0.25);
Console.WriteLine($"- Coins: {ncount}");
Console.WriteLine($"- Total Value: {new Nickel(0).GetValue(ncount)}");
Console.WriteLine($"DIMES:");
int dcount = (int)((((double)Dime.GetTotalValue()) / 0.1) + 0.25);
Console.WriteLine($"- Coins: {dcount}");
Console.WriteLine($"- Total Value: {new Dime(0).GetValue(dcount)}");
Console.WriteLine($"QUARTERS:");
int qcount = (int)((((double)Quarter.GetTotalValue()) / 0.25) + 0.25);
Console.WriteLine($"- Coins: {qcount}");
Console.WriteLine($"- Total Value: {new Quarter(0).GetValue(qcount)}");
Console.WriteLine("Press Enter to continue.");
Console.WriteLine("Thank you for using this app ;)");
Console.WriteLine($"\nWhat do you want to do? (enter number)");
Console.WriteLine($"0. Exit");
Console.WriteLine($"1. Back to Main Menu");
int.TryParse(Console.ReadLine(), out opt);
if (RangeCheck(opt, 0, 1))
Console.WriteLine("\nInvalid entry, enter again");
Console.WriteLine($"0. Exit");
Console.WriteLine($"1. Back to Main Menu");
int.TryParse(Console.ReadLine(), out opt);
Console.WriteLine("Thank you for using this app ;)");
protected List<Coin> coins;
coins = new List<Coin>();
public decimal Calculate()
return Coin.GetTotalValue();
public void AddCoin(int sel, int num)
for (int i = 0; i < num; i++)
Console.WriteLine($"You put {num} penny(ies) in the jar, which is ${new Penny(0).GetValue(num)}.");
for (int i = 0; i < num; i++)
Console.WriteLine($"You put {num} nickel(s) in the jar, which is ${new Nickel(0).GetValue(num)}.");
for (int i = 0; i < num; i++)
Console.WriteLine($"You put {num} dime(s) in the jar, which is ${new Dime(0).GetValue(num)}.");
for (int i = 0; i < num; i++)
coins.Add(new Quarter());
Console.WriteLine($"You put {num} quarter(s) in the jar, which is ${new Quarter(0).GetValue(num)}.");
Console.WriteLine($"You now have {Coin.Count()} coin(s) in the jar, adding up to ${Coin.GetTotalValue()}.");
internal abstract class Coin
protected static int count = 0;
public static int Count()
public abstract decimal GetValue(int x = 1);
public static decimal GetTotalValue()
return Penny.GetTotalValue() +
internal class Penny : Coin
static decimal tot = 0.00m;
public Penny(int x) : base()
public override decimal GetValue(int x = 1)
public static decimal GetTotalValue()
internal class Nickel : Coin
static decimal tot = 0.00m;
public Nickel(int x) : base()
public override decimal GetValue(int x = 1)
public static decimal GetTotalValue()
internal class Dime : Coin
static decimal tot = 0.00m;
public Dime(int x) : base()
public override decimal GetValue(int x = 1)
public static decimal GetTotalValue()
internal class Quarter : Coin
static decimal tot = 0.00m;
public Quarter() : base()
public Quarter(int x) : base()
public override decimal GetValue(int x = 1)
public static decimal GetTotalValue()