如何解决我的项目过时的bottleCounter错误?

时间:2019-05-17 09:44:37

标签: c# arrays

我对编程非常陌生,我正在为我上的课程设计一个项目。它大多数都能工作,但这是我无法解决的最后一件事。问题是战斗柜台。我真的不明白这是怎么回事,但它给出了例外

  

系统索引超出范围

当我尝试在add_soda方法中添加苏打水时。

当我更改bottleCounter = 1时,它可以工作。但是随后计数出错。 (对不起我的英语不好,但我希望你能理解我的意思)

namespace Slutprojekt_SODACRATE
{

class Bottles //Klassen Bottles för att hantera värden av en flaska
{
    public string name { get; set; } //använder mig av automatiska propertys
    public int price { get; set; }
    public string type { get; set; }
}
class Sodacrate
{
    public Bottles[] sodaCrate = new Bottles[24]; //skapar vektor som håller flaskorna
    public int bottleCounter = 0; //Håller reda på antal flaskor 

    public void Run()
    {
        Console.WriteLine("Välkommen till den fantastiska läskback-simulatorn!");

        int temp = 0;
        do
        {
            Console.WriteLine("Välj ett alternativ:");
            Console.WriteLine("[1] Lägg till en flaska i backen");
            Console.WriteLine("[2] Skriv ut allt innehåll i backen");
            Console.WriteLine("[3] Beräkna totala värdet av backen");
            Console.WriteLine("[4] Sök efter en flaska");
            Console.WriteLine("[5] Sortera flaskorna efter pris");
            Console.WriteLine("[0] Avsluta programmet");
            try
            {
                temp = int.Parse(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("Mata endast in heltal. Försök igen: ");
                temp = int.Parse(Console.ReadLine());
            }

            switch (temp)
            {
                case 1:
                    add_soda();
                    break;
                case 2:
                    print_crate();
                    break;
                case 3:
                    calc_total();
                    break;
                case 4:
                    Console.WriteLine("Skriv in namet på flaskan: ");
                    var position = find_soda(Console.ReadLine());
                    if (position == 0)
                        Console.WriteLine("Finns ej i listan.");
                    else if (position == 1)
                        Console.WriteLine("Backen är tom");
                    else
                        Console.WriteLine("Flaskan finns på plats " + position);
                    break;
                case 5:
                    sort_sodas();
                    break;
                case 0:
                    Console.WriteLine("Programmet avslutas");
                    temp = 0;
                    break;
                case 99: //detta är inget som användaren ska använda utan är till för att kunna testköra programmet
                    Console.WriteLine("Array Fill");
                    fillArray();
                    break;
                default:
                    Console.WriteLine("Felaktig inmatning. Försök igen: ");
                    break;
            }
        }
        while (temp != 0);
    }

    private void add_soda()
    {
        counter();

        if (bottleCounter > 23)
        {
            //Om backen är full frågar vi vilken plats man vill byta ut
            Console.WriteLine("Läskbacken är full. Vilken flaska vill du ta bort? Välj en plats mellan 1 och 24.");
            Console.WriteLine("Vill du veta vad du har i backen. Skriv \"Titta\"."); //Ger användaren möjlighet att se vad som finns i backen
            string input = Console.ReadLine();
            if (input == "Titta")
            {
                print_crate(); //använder metoden print crate för att skriva ut allt innehåll
                Console.WriteLine("Vilken flaska vill du ta bort? Välj en plats mellan 1 och 24.");
                input = Console.ReadLine();
            }

            int bottlePosition = int.Parse(input);
            sodaCrate[bottlePosition - 1] = null;

            Bottles bottle = new Bottles(); //Skapar ett objekt från klassen Bottles

            Console.WriteLine("Skriv in namnet på vilken flaska du vill lägga till: ");
            bottle.name = Console.ReadLine();

            Console.WriteLine("Skriv in vad flaskan har för pris (kr): ");
            bottle.price = int.Parse(Console.ReadLine());

            Console.WriteLine("Skriv in om flaskan är läsk, öl eller vatten: ");
            bottle.type = Console.ReadLine();

            sodaCrate[bottlePosition - 1] = bottle; //flaskan är nu tillagd med önskade egenskaper och vi placerar den på önskad plats i back-vektorn
        }
        else
        {
            //om backen har tomma platser lägger vi in en flaska direkt
            Console.WriteLine("Skriv in namnet på vilken flaska du vill lägga till: ");
            Bottles bottle = new Bottles(); //Skapar ett objekt från klassen Bottles
            bottle.name = Console.ReadLine();

            Console.WriteLine("Skriv in vad flaskan har för pris (kr): ");
            int inputPrice = int.Parse(Console.ReadLine());
            bottle.price = inputPrice;

            Console.WriteLine("Skriv in om flaskan är läsk, öl eller vatten: ");
            bottle.type = Console.ReadLine();

            sodaCrate[bottleCounter - 1] = bottle;
            bottleCounter++;
        }
    }

    private void print_crate() //Metod som skriver ut alla flaskor i vektorn
    {
        counter();
        foreach (var bottle in sodaCrate)
        {
            if (bottle != null)
                Console.WriteLine("Namn: " + bottle.name + ". Pris: " + bottle.price + ". Typ: " + bottle.type + ".");
            else
                Console.WriteLine("Tom plats");
        }
    }

    private void calc_total() //Metod som räknar ut det sammanlagda priset för alla flaskor i backen
    {
        counter();
        var totalValue = 0;
        foreach (var bottle in sodaCrate)
        {
            if (bottle != null)
                totalValue = totalValue + bottle.price;
        }

        Console.WriteLine("Total värde: " + totalValue + " kr");
     }

    private int find_soda(string name) //Metod som söker efter en flaskas namn som sedan returnerar platsen
    {
        counter();
        if (bottleCounter > 0)
        {
            for (int i = 1; i < sodaCrate.Length; i++)
            {
                if (sodaCrate[i].name == name)
                    return i + 1;
            }
            return 0;
        }
        else
            return 1;
    }

    public void sort_sodas() //Metod som sorterar elementen efter pris
    {
        counter();
        int max = sodaCrate.Length - 1;

        for (int i = 0; i < max; i++) //skapar en yttre loop som går igenom hela vektorn
        {
            int nrLeft = max - 1; // antal element som inte redan sorterats
            for (int j = 0; j < nrLeft; j++)
            {
                if (sodaCrate[j].price > sodaCrate[j + 1].price)
                {
                    //byter plats på flaskornas pris
                    Bottles temp = sodaCrate[j];
                    sodaCrate[j] = sodaCrate[j + 1];
                    sodaCrate[j + 1] = temp;
                }
            }
        }
        //Skriver ut att flaskorna är sorterade
        Console.WriteLine("Flaskorna är nu sorterade efter pris");
    }

    //Skapar här en metod för att direkt fylla backen med flaskor. Detta för att kunna testköra programmet. Inget som användaren ska använda.
    private void fillArray()
    {
        counter();
        for (int i = 1; i <= sodaCrate.Length; i++)
        {
            Bottles bottle = new Bottles();
            bottle.name = "läsk nr " + i;
            bottle.price = i; //sätter priset till i eftersom det inte spelar så stor roll vad flaskan får för pris
            bottle.type = "exempeltyp";
            sodaCrate[bottleCounter - 1] = bottle;
            bottleCounter++;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var sodacrate = new Sodacrate(); //Skapar ett objekt av klassen Sodacrate
        sodacrate.Run(); //anropar metoden run för att starta programmet och visa menyn
        Console.Write("Press any key to continue . . . ");
        Console.ReadKey();
    }
}
}

0 个答案:

没有答案