C# | Initialized array gives System.NullReferenceException - c#

I am currently making a lottery simulator in C# but now that I wanted to make a feature to let the User randomize their lottery numbers instead of having to write them manually using arrays, but it gives me the Error Code:
Exception thrown
System.NullReferenceException: 'Object reference not set to an instance of an object.'
I declared and initialized my array named "randomList" for the random numbers like this:
public static int[] randomList = new int[5];
After I wanted to write the code that stores the 6 random numbers the user got in the array:
Console.WriteLine("\nRandomized 6 numbers: ");
for (int z = 0; z <= 6; z++)
{
int rndNum = rnd.Next(1, 50);
randomList[z] = rndNum; // <-- ERROR
Console.Write(rndNum + ", ");
}
I thought that you would only get that Error if you haven't initialized your variable or array. I would love someone explain the error to me and how to avoid/fix it! Thanks!
Here you can access the entire code (Error in line 203):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Lottery
{
internal class Program
{
// Global Variables:
// Playing
public static int playoption;
public static int betoption;
public static int gameAmount;
public static int gameCost = 10;
public static int superNumCost = 5;
public static string includeSuperNum;
public static int tickets;
public static int superNumTickets;
// Used for the Lotto Numbers
public static int[] correctList = new int[5];
public static int[] randomList = new int[5];
public static int[] manualList = new int[5];
// Indicators if you have correct numbers
public static int userCorrect;
public static int userSuperCorrect;
// Bank
public static int bankoption;
public static int deposit;
public static int withdrawal;
public static int balance = 0;
public static int cash = 300;
static void Main()
{
// Variables
// Menu
int menuoption;
Console.Clear();
Console.WriteLine("=== LOTTO! 6 out of 49 ===");
Console.WriteLine(" 1. Play");
Console.WriteLine(" 2. Bank Menu");
Console.WriteLine(" 3. Go work");
Console.WriteLine(" 4. Quit");
WrongMenu:
Console.Write("\nEnter your option by typing out the number: ");
menuoption = Convert.ToInt32(Console.ReadLine());
switch (menuoption)
{
case 1:
PlayMenu();
break;
case 2:
Bank();
break;
case 3:
Work();
break;
case 4:
break;
default:
Console.WriteLine("Invalid option - Enter your option again: ");
goto WrongMenu;
}
}
// All code for playing Lotto:
static void PlayMenu()
{
Console.Clear();
Console.WriteLine("=== PLAY MENU ===");
Console.WriteLine(" 1. Buy Tickets");
Console.WriteLine(" 2. Check Tickets");
Console.WriteLine(" 3. Back to Main Menu");
WrongPlayMenu:
Console.Write("\nEnter your option to continue: ");
playoption = Convert.ToInt32(Console.ReadLine());
switch (playoption)
{
case 1:
Console.Clear();
Console.WriteLine("=== PRIZES ===");
Console.WriteLine(" Lottery ticket = " + gameCost + " Euro");
Console.WriteLine(" Super Number Addon = " + superNumCost + " Euro");
Console.Write("\nHow many lottery tickets do you want to buy?: ");
gameAmount = Convert.ToInt32(Console.ReadLine());
if ((gameCost * gameAmount) <= cash)
{
cash = cash - (gameCost * gameAmount);
Console.WriteLine("Successfully bought " + gameAmount + " lottery tickets!");
if (cash - (gameAmount * superNumCost) >= 0)
{
Console.Write("\nDo you want to buy the Super Number Addon to maximize your potencial winnings? (Y/N): ");
includeSuperNum = Console.ReadLine();
while (includeSuperNum != "Y" && includeSuperNum != "N")
{
Console.WriteLine("Invalid answer - Type in your answer again only using Y for Yes or N for No.");
Console.Write("\nDo you want to buy the Super Number Addon to maximize your potencial winnings? (Y/N): ");
includeSuperNum = Console.ReadLine();
}
if (includeSuperNum == "Y")
{
cash = cash - (gameAmount * superNumCost);
superNumTickets += gameAmount;
Console.WriteLine("Successfully bought Super Number Addon for your ticket/s!");
}
else
{
tickets = tickets + gameAmount;
Console.WriteLine("No Super Number Tickets bought - Transaction done");
}
}
}
Console.WriteLine("\nPress any key to go back to Play Menu");
Console.ReadKey();
PlayMenu();
break;
case 2:
Console.Clear();
if (tickets == 0 && superNumTickets == 0)
{
Console.WriteLine("You have no tickets - Go buy some!");
Console.WriteLine("Press any key to go back to Play Menu");
Console.ReadKey();
PlayMenu();
}
if (tickets >= 1)
{
Console.WriteLine("\nYou have " + tickets + " normal tickets");
}
if (superNumTickets >= 1)
{
Console.WriteLine("You have " + superNumTickets + " tickets with the Super Number Addon.\n");
}
Console.WriteLine("=== BETTING ON TICKETS ===");
Console.WriteLine(" 1. Bet on normal tickets");
Console.WriteLine(" 2. Bet on Super Number tickets");
Console.WriteLine(" 3. Back to Play Menu");
BetWrong:
Console.Write("\nEnter your option by typing out the number: ");
betoption = Convert.ToInt32(Console.ReadLine());
switch (betoption)
{
case 1:
Bet();
break;
case 2:
SuperBet();
break;
case 3:
PlayMenu();
break;
default:
Console.WriteLine("Invalid answer - Try typing it again.");
goto BetWrong;
}
break;
case 3:
Main();
break;
default:
Console.WriteLine("Invalid answer - Try typing it again.");
goto WrongPlayMenu;
}
}
static void Bet()
{
Console.WriteLine("Your tickets:\n");
for (int x = 1; x <= tickets; x++)
{
Console.WriteLine(" Normal ticket Nr. " + x);
}
Console.Write("\nEnter the ticket number to bet on it: ");
int ticketNum = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\nSuccessfully opened ticket Nr. " + ticketNum);
WrongRandomOption:
Console.Write("Do you want to randomize your 6 Numbers or write them out? Enter 1 for random or 2 for manual: ");
int chooseIfRandom = Convert.ToInt32(Console.ReadLine());
Random rnd = new Random();
switch (chooseIfRandom)
{
case 1:
Console.WriteLine("\nRandomized 6 numbers: ");
for (int z = 0; z <= 5; z++)
{
int rndNum = rnd.Next(1, 50);
randomList[z] = rndNum;
Console.Write(rndNum + ", ");
}
Console.WriteLine("\nThe correct Numbers are: ");
for (int c = 1; c <= 5; c++)
{
int correctNum = rnd.Next(1, 50);
correctList[c] = correctNum;
Console.Write(correctNum + ", ");
}
for (int h = 0; h <= 6; h++)
{
if (randomList[h] == correctList[h])
{
userCorrect++;
}
}
Console.WriteLine("You got " + userCorrect + " correct Numbers");
switch (userCorrect)
{
case 1:
Console.WriteLine("You won 3 Euros!");
cash += 3;
break;
case 2:
Console.WriteLine("Nice! You won 7 Euros!");
cash += 7;
break;
case 3:
Console.WriteLine("Wow! You won 12 Euros!");
cash += 12;
break;
case 4:
Console.WriteLine("Amazing! You won 50 Euros!");
cash += 50;
break;
case 5:
Console.WriteLine("Incredible! You won 4.200 Euros!");
cash += 4200;
break;
case 6:
Console.WriteLine("JACKPOT! You won 830.000 Euros!");
cash += 830000;
break;
}
userCorrect = 0;
break;
case 2:
for (int m = 0; m <= 6; m++)
{
ManualWrong:
Console.WriteLine("Enter your " + (m + 1) + ". number: ");
manualList[m] = Convert.ToInt32(Console.ReadLine());
if (manualList[m] >= 50 || manualList[m] < 1)
{
Console.WriteLine("Entered number is either too high or low - Enter again (Between 1 and 49)\n");
goto ManualWrong;
}
}
Console.WriteLine("\nYour numbers are: ");
for (int k = 0; k <= 6; k++)
{
Console.Write(manualList[k] + ", ");
}
Console.WriteLine("\nThe correct Numbers are: ");
for (int l = 1; l <= 6; l++)
{
int correctNum = rnd.Next(1, 50);
correctList[l] = correctNum;
Console.Write(correctNum + ", ");
}
for (int m = 0; m <= 6; m++)
{
if (manualList[m] == correctList[m])
{
userCorrect++;
}
}
Console.WriteLine("You got " + userCorrect + " correct Numbers");
switch (userCorrect)
{
case 1:
Console.WriteLine("You won 3 Euros!");
cash += 3;
break;
case 2:
Console.WriteLine("Nice! You won 7 Euros!");
cash += 7;
break;
case 3:
Console.WriteLine("Wow! You won 12 Euros!");
cash += 12;
break;
case 4:
Console.WriteLine("Amazing! You won 50 Euros!");
cash += 50;
break;
case 5:
Console.WriteLine("Incredible! You won 4.200 Euros!");
cash += 4200;
break;
case 6:
Console.WriteLine("JACKPOT! You won 830.000 Euros!");
cash += 830000;
break;
}
break;
default:
Console.WriteLine("Invalid answer - Only answer 1 or 2!");
goto WrongRandomOption;
}
Console.WriteLine("Press any key to go back to Play Menu.");
Console.ReadKey();
PlayMenu();
}
static void SuperBet()
{
Console.WriteLine("Your Super Number tickets:\n");
for (int y = 1; y <= superNumTickets; y++)
{
Console.WriteLine(" Super Number ticket Nr. " + y);
}
Console.Write("\nEnter the ticket number to bet on it: ");
int superTicketNum = Convert.ToInt32(Console.ReadLine());
}
// The Bank Menu
static void Bank()
{
Console.Clear();
Console.WriteLine("=== BANK MENU ===");
Console.WriteLine(" 1. Check balance");
Console.WriteLine(" 2. Deposit");
Console.WriteLine(" 3. Withdraw");
Console.WriteLine(" 4. Invest (Coming Soon)");
Console.WriteLine(" 5. Back to Main Menu");
WrongBankMenu:
Console.Write("\nEnter your option by typing out the number: ");
bankoption = Convert.ToInt32(Console.ReadLine());
switch (bankoption)
{
case 1:
Console.WriteLine("\nYour current bank balance is: " + balance + " Euros.");
Console.WriteLine("Your current balance of cash is: " + cash + " Euros.");
Console.WriteLine("\nPress any key to go back to Bank Menu.");
Console.ReadKey();
Bank();
break;
case 2:
NotEnoughCash:
Console.Write("Deposit amount: ");
deposit = Convert.ToInt32(Console.ReadLine());
if (deposit <= cash)
{
balance += deposit;
cash -= deposit;
Console.WriteLine("Successfully deposited " + deposit + " Euros!");
}
else
{
Console.WriteLine("You dont have enough to deposit this amount.");
Console.WriteLine("Your current maximum deposit amount is: " + cash + " Euros.\n");
goto NotEnoughCash;
}
Console.WriteLine("Press any key to go back to Bank Menu.");
Console.ReadKey();
Bank();
break;
case 3:
NotEnoughBalance:
Console.Write("Withdraw amount: ");
withdrawal = Convert.ToInt32(Console.ReadLine());
if (withdrawal <= balance)
{
balance -= withdrawal;
cash += withdrawal;
Console.WriteLine("Successfully withdrawn " + withdrawal + " Euros.");
}
else
{
Console.WriteLine("Your balance is smaller than your withdraw amount!");
Console.WriteLine("Your current maximum withdraw amount is: " + balance + " Euros.\n");
goto NotEnoughBalance;
}
Console.WriteLine("Press any key to go back to Bank Menu.");
Console.ReadKey();
Bank();
break;
case 4:
Console.WriteLine("This feature is coming soon!\n");
Console.WriteLine("Press any key to go back to Bank Menu.");
Console.ReadKey();
Bank();
break;
case 5:
Main();
break;
default:
Console.WriteLine("Invalid option - Enter your option again: ");
goto WrongBankMenu;
}
}
// All Code for working:
static void Work()
{
}
}
}

Related

Receipt like output in c#

int choice, quanti, decide, total, cash;
double change;
string dcount;
while (true)
{
Console.Clear();
string w = "WELCOME ";
Console.SetCursorPosition((Console.WindowWidth - w.Length) / 2, Console.CursorTop); // for setting string output on center top
Console.WriteLine(w);
Console.WriteLine("");
System.Threading.Thread.Sleep(2000); //time delay
string p = "HERE'S OUR MERCHANDISES! ";
Console.SetCursorPosition((Console.WindowWidth - p.Length) / 2, Console.CursorTop); // for setting string output on center top
Console.WriteLine(p);
System.Threading.Thread.Sleep(2000);//time delay
string[] products = { "[1]BLACKPINK Lightstick ", "[2]DREAMCATCHER Seasons Greetings",
"[3]RED VELVET Summer Package"};
for (int g = 0; g < products.Length; g++)
{
Console.WriteLine(products[g]);
}
Dictionary<int, int> ProductList = new Dictionary<int, int>();
while (true)
{
{
Console.Write("Pick your product: ");
choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
Console.WriteLine("BLACKPINK Lightstick 1500php");
break;
case 2:
Console.WriteLine("DREAMCATCHER Seasons Greetings 920php");
break;
case 3:
Console.WriteLine("RED VELVET Summer Package 980php");
break;
}
Console.WriteLine("Quantity of product: ");
quanti = int.Parse(Console.ReadLine());
if (!ProductList.ContainsKey(choice))
ProductList.Add(choice, quanti);
else
ProductList[choice] += quanti;
System.Threading.Thread.Sleep(2000);//time delay
Console.WriteLine("[1] Add more products \t [2] Pay: ");
decide = int.Parse(Console.ReadLine());
if (decide == 2)
break;
}
}
total = 0;
foreach (int key in ProductList.Keys)
switch (key)
{
case 1:
total += ProductList[key] * 1500;
break;
case 2:
total += ProductList[key] * 920;
break;
case 3:
total += ProductList[key] * 980;
break;
default:
total += 0;
break;
};
Console.WriteLine("To Pay: " + total);
Console.Write("Cash: ");
cash = Convert.ToInt32(Console.ReadLine());
Console.Write("Discount[s]suki [v]voucher: ");
dcount = Console.ReadLine();
if (dcount == "s")
{
change = (cash - total) - 0.7;
Console.WriteLine("Change: " + change);
}
else if (dcount == "v")
{
change = cash -(total - 0.5) ;
Console.WriteLine("Change: " + change);
}
else
{
change = cash- (total - 0.7) ;
Console.WriteLine("Change: " + change);
}
Console.WriteLine("Another shopping? [1]Yes [2] No");
choice = int.Parse(Console.ReadLine());
if (choice == 2)
break;
}
}
}
}
Good day, I'm doing a project for school. I've already asked earlier about my code and someone help me, thanks to him, unfortunately I still have a problem with my code. After the users inputs and giving her a change, it was supposed to output a receipt like, wherein it contains users purchased products. I've tried outputting the variables that have been used in acquiring users input but to my dismay, it can only output the user's first input product, it can't Output all the users purchase. The receipt like output was supposed to contain the user's products purchased, quantity of each product, total, cash, discount and change in horizontal line/tabular.
Quick way of printing out products and quantity for each would be to put after dcount = Console.ReadLine(); something like:
foreach(var entry in ProductList)
{
Console.WriteLine(products[entry.Key].Substring(3) + "......." + entry.Value);
}
I'll leave the amount of dots and cursor position to You.
Also, when dealing with currency it's better to use decimal due to higher precision (maybe not needed in this example.) And try to use Math.Round() function when displaying money amount - limit decimal places.

Vending machine repeat menu after option is chosen?

Here is my vending machine. I now need to be able to be able to repeat the menu at the end of the switch to allow the user to go back into the vending machine or exit the program.
Would I use a while loop or an if/else statement. I tried nesting the whole thing in a while loop but then it repeated the the purchase option.
int iNumCrisps = 10;
int iCrispsBought;
int iNumChocbars = 20;
int iChocbarsBought;
int iNumSweets = 30;
int iSweetsBought;
double dTotalMoney = 0;
int iChoice;
{
//display the choices
Console.WriteLine("Vending Machine");
Console.WriteLine("1 - Buy chocbars");
Console.WriteLine("2 - Buy crisps");
Console.WriteLine("3 - Buy sweets");
// get the users choice
Console.Write("Enter your choice: ");
iChoice = Convert.ToInt32(Console.ReadLine());
//validate user input
while (iChoice < 1 || iChoice > 3)
{
Console.Write("Incorrect option. Please Re-Enter: ");
iChoice = Convert.ToInt32(Console.ReadLine());
}
switch (iChoice)
{
case 1: //user has chosen chocbars
Console.WriteLine();
Console.Write("How many chocbars do you wish to purchase?");
iChocbarsBought = Convert.ToInt32(Console.ReadLine());
iNumChocbars = iNumChocbars - iChocbarsBought;
dTotalMoney = dTotalMoney + (iChocbarsBought * 0.25);
Console.WriteLine("There are now" + iNumChocbars + " chocbars in the machine");
break;
case 2: //User has chosen crisps
Console.WriteLine();
Console.Write("How many crisps do you wish to purchase?");
iCrispsBought = Convert.ToInt32(Console.ReadLine());
iNumCrisps = iNumCrisps - iCrispsBought;
dTotalMoney = dTotalMoney + (iCrispsBought * 0.30);
Console.WriteLine("There are now" + iNumCrisps + " crisps in the machine");
break;
case 3: //user has chosen sweets
Console.WriteLine();
Console.Write("How many sweets do you wish to purchase?");
iSweetsBought = Convert.ToInt32(Console.ReadLine());
iNumSweets = iNumSweets - iSweetsBought;
dTotalMoney = dTotalMoney + (iSweetsBought * 0.20);
Console.WriteLine("There are now " + iNumSweets + " sweets in the machine");
break;
default:
Console.WriteLine("You must enter a number from 1 to 3");
break;
}// end switch
//validate user input
while (iChoice < 1 || iChoice > 3)
{
Console.Write("Incorrect option. Please Re-Enter: ");
iChoice = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("There is now" + dTotalMoney + "p in the machine");
Console.WriteLine();
Console.WriteLine("Press any key to close");
Console.WriteLine();
Console.ReadKey();
}
}
}
}
I guess you are quite new to programming.
What you need to do is place the menu in a function. This is a block of code that you can call from elsewhere in the code. I'm guessing this code comes from the main function?
private static int ShowMenu ()
{
int iChoice = 0;
//display the choices
Console.WriteLine("Vending Machine");
Console.WriteLine("1 - Buy chocbars");
Console.WriteLine("2 - Buy crisps");
Console.WriteLine("3 - Buy sweets");
// get the users choice
Console.Write("Enter your choice: ");
iChoice = Convert.ToInt32(Console.ReadLine());
return iChoice;
}
You would then use this line to show the menu and get the choice
iChoice = ShowMenu();
You could then look at checking that the user's input was a valid number and things like that as part of this function

Calculating average of sequential numbers in c#

I want to create sequential numbers and when the user inputs "0", it should stop and keep the numbers in the memory and then ask the user whether to show the total of these numbers or show the average. The total looks good but when I choose average my console is not responding, it crashes.
using System;
class ETA11
{
public static int Main()
{
ETA11_3();
return 0;
}
public static void ETA11_3()
{
int number = 0, total = 0, option = 0, counter = 0, average = 0;
do
{
Console.WriteLine("Input a number (zero for stop): ");
number = Int16.Parse(Console.ReadLine());
total += number;
if (number == 0) break;
} while (option != 2);
Console.WriteLine("Choose an option: ");
Console.WriteLine("1 - Total");
Console.WriteLine("2 - Average");
counter++;
option = Int16.Parse(Console.ReadLine());
switch (option)
{
case 1:
Console.WriteLine("Total: {0}", total);
break;
case 2:
Console.WriteLine("Total: {0}", total / number);
break;
default:
Console.WriteLine("Invalid Option");
break;
}
}
}
when you choose option 2, you are dividing 0
Console.WriteLine("Total: {0}", total / number);
I believe you wanted to divide by counter
Console.WriteLine("Total: {0}", total / (decimal) counter);
however, you need to put counter++ inside your whileloop too
As Neverever mentioned, you were dividing by number which was 0 causing a DividedByZeroException. I also incorporated the correct counter into your loop and cleaned up your do {} while() loop (which was being used incorrectly).
Here is the corrected method:
public static void ETA11_3()
{
int number = 0, total = 0, option = 0;
double counter = 0d;
while (true)
{
Console.WriteLine("Input a number (zero for stop): ");
number = Int16.Parse(Console.ReadLine());
total += number;
if (number == 0) break;
counter++;
}
Console.WriteLine("Choose an option: ");
Console.WriteLine("1 - Total");
Console.WriteLine("2 - Average");
option = Int16.Parse(Console.ReadLine());
switch (option)
{
case 1:
Console.WriteLine("Total: {0}", total);
break;
case 2:
Console.WriteLine("Total: {0}", total / counter);
break;
default:
Console.WriteLine("Invalid Option");
break;
}
}

c#....my while loop keep repeating [duplicate]

This question already exists:
c# programming constructs - my while loop wont stop working when i want it to? [closed]
Closed 9 years ago.
i am trying to get my while loop to ONLY keep repeating till all subjects have been answered, then it should stop and display the bonus and final score. but don't know why its not doing that? help please.
namespace Assignment
{
class Class1
{
public static int attempt, sum, AptScore, GenScore, MathScore, EngScore, bonus, TotalScore, FinalScore, choice = 0;
public static string ans;
static void Main(string[] args)
{
bool stop = false;
Console.WriteLine("Welcome to this Salisbury University IQ Test game");
Console.WriteLine();
Console.WriteLine("How many times have you attempted this test?");
attempt = Convert.ToInt32(Console.ReadLine());
while (true)
if (attempt > 1)
{
Console.WriteLine("You cannot take this test");
}
else
{
Console.WriteLine(" \n1. Aptitude \n2. English. \n3. Math \n4. Gk \n5. Exit");
choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 1:
Console.WriteLine(" What was the name of the lebanon tyrant who ruled for years unending before he was toppled due to civil war? \nA. Osama Bin laden \nB. Gaddafi \nC. Jonathan ");
ans = Console.ReadLine();
if (ans == "B" || ans == "b")
{
AptScore += 10;
}
break;
case 2:
Console.WriteLine(" What is the antonym of Pleasure? \nA. Pain \nB. Ecstacy \nC. Wonder");
ans = Console.ReadLine();
if (ans == "A" || ans == "a")
{
EngScore += 10;
}
break;
case 3:
Console.WriteLine(" What is the sum of 435 and 345? \nA. 799 \nB. 780 \nC. 600 ");
ans = Console.ReadLine();
if (ans == "B" || ans == "b")
{
MathScore += 10;
}
break;
case 4:
Console.WriteLine(" What year did Nigeria become a republic? \nA. 1960 \nB. 1963 \nC. 1990 ");
ans = Console.ReadLine();
if (ans == "B" || ans == "b")
{
GenScore += 10;
}
break;
case 5:
Environment.Exit(0);
break;
}
if (stop)
break;
TotalScore = MathScore + GenScore + EngScore + AptScore;
Console.WriteLine("Your total score is : " + TotalScore);
if (TotalScore == 10)
{
Console.WriteLine(" You have no Bonus point ");
}
else if (TotalScore == 20)
{
bonus += 2;
Console.WriteLine("Your Bonus is {0}", bonus);
}
else if (TotalScore == 30)
{
bonus += 5;
Console.WriteLine("Your Bonus is {0}", bonus);
}
else if (TotalScore == 40)
{
bonus += 10;
Console.WriteLine("Your Bonus is {0}", bonus);
}
else
{
FinalScore = TotalScore + bonus;
Console.WriteLine("Your finalscore is : " + FinalScore);
}
switch (FinalScore)
{
case 10:
if (FinalScore >= 10)
{
Console.WriteLine("Your IQ level is below average");
}
break;
case 22:
if (FinalScore >= 22)
{
Console.WriteLine("Your IQ level is average");
}
break;
case 35:
if (FinalScore >= 35)
{
Console.WriteLine("You are intelligent");
}
break;
case 40:
if (FinalScore == 40)
{
Console.WriteLine("You are a genius");
}
break;
default:
break;
}
}
}
}
}
if (stop)
break;
This never happens.
I see:
bool stop = false;
and also:
if (stop)
break;
But I never see a stop = true;
Where do you intend to set stop to true?

C# How do you count the number of inputs to find the average in a switch loop?

Here is my loop that asks for the group number then the donation. I'm wondering how to count the number of donations to find the average for each group.
using System;
public class TotalPurchase
{
public static void Main()
{
double total4 = 0;
double total5 = 0;
double total6 = 0;
int myint = -1;
while (myint != 0)
{
string group;
Console.WriteLine("Please enter group number (4, 5, or 6)");
Console.WriteLine("(0 to quit): ");
group = Console.ReadLine();
myint = Int32.Parse(group);
switch (myint)
{
case 0:
break;
case 4:
double donation4;
string inputString4;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString4 = Console.ReadLine();
donation4 = Convert.ToDouble(inputString4);
total4 += donation4;
break;
case 5:
double donation5;
string inputString5;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString5 = Console.ReadLine();
donation5 = Convert.ToDouble(inputString5);
total5 += donation5;
break;
case 6:
double donation6;
string inputString6;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString6 = Console.ReadLine();
donation6 = Convert.ToDouble(inputString6);
total6 += donation6;
break;
default:
Console.WriteLine("Incorrect grade number.", myint);
break;
}
}
Console.WriteLine("Grade 4 total is {0}", total4.ToString("C"));
Console.WriteLine("Grade 5 total is {0}", total5.ToString("C"));
Console.WriteLine("Grade 6 total is {0}", total6.ToString("C"));
}
}
Any help would be appreciated.
Not sure if I fully understand your question -- but you could just add a simple counter for each group:
int donations4 = 0;
int donations5 = 0;
int donations6 = 0;
And then increment that counter in each of your switch cases, ex:
switch(myInt)
{
case 4:
...
donations4++;
break;
case 5:
...
donations5++;
break;
case 6:
...
donations6++;
break;
}
Then when you're done - simply do the math to find the average.
Although this is probably the simplest way, a better way would be to treat each group as its own object, and have the object internally track the # of donations, as well as the sum and average.
-- Dan
using System;
public class TotalPurchase
{
public static void Main()
{
double total4 = 0;
double total5 = 0;
double total6 = 0;
int numberOfInputForTotal4 = 0;
int numberOfInputForTotal5 = 0;
int numberOfInputForTotal6 = 0;
int myint = -1;
while (myint != 0)
{
string group;
Console.WriteLine("Please enter group number (4, 5, or 6)");
Console.WriteLine("(0 to quit): ");
group = Console.ReadLine();
myint = Int32.Parse(group);
switch (myint)
{
case 0:
break;
case 4:
double donation4;
string inputString4;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString4 = Console.ReadLine();
donation4 = Convert.ToDouble(inputString4);
total4 += donation4;
numberOfInputForTotal4++;
break;
case 5:
double donation5;
string inputString5;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString5 = Console.ReadLine();
donation5 = Convert.ToDouble(inputString5);
total5 += donation5;
numberOfInputForTotal5++;
break;
case 6:
double donation6;
string inputString6;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString6 = Console.ReadLine();
donation6 = Convert.ToDouble(inputString6);
total6 += donation6;
numberOfInputForTotal6++;
break;
default:
Console.WriteLine("Incorrect grade number.", myint);
break;
}
}
Console.WriteLine("Grade 4 total is {0}", total4.ToString("C"));
Console.WriteLine("Grade 5 total is {0}", total5.ToString("C"));
Console.WriteLine("Grade 6 total is {0}", total6.ToString("C"));
Console.WriteLine("Grade 4 average is {0}", (total4 / numberOfInputForTotal4).ToString("C"));
Console.WriteLine("Grade 5 average is {0}", (total5 / numberOfInputForTotal5).ToString("C"));
Console.WriteLine("Grade 6 average is {0}", (total6 / numberOfInputForTotal6).ToString("C"));
}
}
As you can see, there are 3 extra variables (one for each group) that can be used to figure out the number of inputs provided. Using that you can divide the total for each group by the number of input in each group separately.
Just declare count for each group as well as total and increment in the case statement:
case 4:
double donation4;
string inputString4;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString4 = Console.ReadLine();
donation4 = Convert.ToDouble(inputString4);
total4 += donation4;
count4++; // HERE!!!!
break;
Alternatively, you can use List<int> which will calculate your average as well:
List<int> list4 = new List<int>();
and
case 4:
double donation4;
string inputString4;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString4 = Console.ReadLine();
donation4 = Convert.ToDouble(inputString4);
list4.Add(donation4);
break;
and
Console.WriteLine(list4.Average());
Just keep track of the count yourself with another variable. count4, count5, etc.
For bonus points in your homework assignment:
1) Sanitize your group number input - ie check to see if the user typed in a valid number.
2) Don't call the variable myInt. Call it groupNum, or something that describes the function, not the implementation of the variable.
3) Use an array for donation totals and counts
ie,
int[] donationCount= new int[MAX_GROUP+1]; // figure out yourself why the +1
int[] donationTotal= new int[MAX_GROUP+1];
// initialize donationCount and donationTotal here
then in your loop (don't even need switch):
++donationCount[groupNum];
donationTotal[groupNum] += donationAmount; // did you notice that you moved the reading of donationAmount out of the switch?
I would go with changing your doubles to List and using the Sum() and Average() methods on your Lists at the end. Your code would look like this after this change.
using System;
using System.Collections.Generic;
using System.Linq;
public class TotalPurchase
{
public static void Main()
{
List<double> total4 = new List<double>();
List<double> total5 = new List<double>();
List<double> total6 = new List<double>();
int myint = -1;
while (myint != 0)
{
string group;
Console.WriteLine("Please enter group number (4, 5, or 6)");
Console.WriteLine("(0 to quit): ");
group = Console.ReadLine();
myint = Int32.Parse(group);
switch (myint)
{
case 0:
break;
case 4:
double donation4;
string inputString4;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString4 = Console.ReadLine();
donation4 = Convert.ToDouble(inputString4);
total4.Add(donation4);
break;
case 5:
double donation5;
string inputString5;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString5 = Console.ReadLine();
donation5 = Convert.ToDouble(inputString5);
total5.Add(donation5);
break;
case 6:
double donation6;
string inputString6;
Console.WriteLine("Please enter the amount of the contribution: ");
inputString6 = Console.ReadLine();
donation6 = Convert.ToDouble(inputString6);
total6.Add(donation6);
break;
default:
Console.WriteLine("Incorrect grade number.", myint);
break;
}
}
if(total4.Count > 0)
Console.WriteLine("Grade 4 total is {0}; Average {1}", total4.Sum().ToString("C"), total4.Average().ToString("C"));
if(total5.Count >0)
Console.WriteLine("Grade 5 total is {0}; Average {1}", total5.Sum().ToString("C"), total5.Average().ToString("C"));
if (total6.Count > 0)
Console.WriteLine("Grade 6 total is {0}; Average {1}", total6.Sum().ToString("C"), total6.Average().ToString("C"));
}
}

Categories