首页 > 解决方案 > Program.Mattor():并非所有代码路径都返回一个值。我该如何解决这个问题?

问题描述

class Program
{
    static void Main(string[] args)
    {
        /// </summary>
        /// Tapet:

        // Följande ska användaren kunna mata in:
        // 1. Väggens mått: Längd och bredd.
        // 2. Jämförelse av upp till 8 st tapeter.

        // Programmet ska även kunna skriva ut en lista av alla tapet där man tydligt ser namn, antal rullar och pris. 

        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        ///Mattor:

        // Användaren ska kunna mata in golvets bredd och längd.

        // Användaren ska sedan kunna mata in olika areor på mattor tills det täcker golvets yta.  

        // Vi ska bestämma när antalet mattor har täckt golvet, samt hur många mattor det tog.

        //.......

        // Variabeln menyKörs sätts till true så vi kan skapa en While-loop som hela tiden körs om. Detta avbryter vi genom att sätta den till
        // false ifall användaren väljer att avsluta programmet. 
        bool menyKörs = true;
        while (menyKörs)
        {
            //Ett programm som hjälper anändaren att tappetsera en vägg eller lägga mattor på användarens golv

            Console.WriteLine("Hej! Välkommen till programmet som hjälper dig med att tappetsera och lägga golvmattor ");
            // Menyval för användaren att välja väg i programmet. Beroende på val skickas användaren till olika metoder som utreder specifika uppgifter. 

            Console.WriteLine("Meny: ");
            Console.WriteLine("Välj V för att tappetsera en vägg, M för att lägga mattor eller A för att avsluta programmet! ");
            Console.WriteLine("Tappetsera vägg (V)");
            Console.WriteLine("Lägga mattor (M)");
            Console.WriteLine("Avsluta programm (A)");
            Console.WriteLine("\r\n:");

            string val = Console.ReadLine().ToUpper();

            //Anänver mig av en "switch" för att gå olika vägar beroende på användarens val i menyn. 
            switch (val)
            {
                //Tar in värdena bredd och längd och skickar in detta i metoden "tapeter".
                case "V":
                    {
                        Console.WriteLine("Vad är måtten på väggen du ska tappetsera? (Skriv i meter) ");
                        Console.WriteLine("Bredden: ");
                        double måttBredd = double.Parse(Console.ReadLine());
                        Console.WriteLine("Längden: ");
                        double måttLängd = double.Parse(Console.ReadLine());
                        Console.WriteLine($"Din area på väggen blir: {måttBredd * måttLängd}m^2 ");

                        Tapeter(måttBredd, måttLängd);
                        break;
                    }

                //Skickas direkt till metoden "mattor" som sedan returnar hur många mattor det krävdens
                case "M":
                    {
                        Console.WriteLine($"Det krävdes {Mattor()} antal mattor för att täcka golvets yta! ");
                        break;
                    }
                case "A":
                    {
                        menyKörs = false;
                        break;
                    }

                //Avbryter koden genom att skickas till metoden "Felmeddelande"
                default:
                    {
                        Felmeddelande();
                        break;
                    }

            }

        }

    }

    /// <summary>
    /// En metod som berättar för användaren att ett felaktigt värde blivit angivet. Detta görs i en metod då vi minskar upprepning. 
    /// </summary>
    private static void Felmeddelande()
    {
        Console.WriteLine("Du skrev in ett felaktigt värde, testa igen! ");
    }

    /// <summary>
    /// Räknar ut antal tapeter för en vägg och skriver ut dem
    /// </summary>
    /// <param name="måttBredd">Den bredd väggen har</param>
    /// <param name="måttLängd">Den längd som väggen har</param>
    private static void Tapeter(double måttBredd, double måttLängd)
    {
        //Tapet
        //Olika lister där inmatning utav olika värden från användaren sparas för senare utskrivning
        List<int> listaTapet = new List<int>();
        List<string> listaNamn = new List<string>();
        List<double> listaPris = new List<double>();
        List<double> listaPrisTotal = new List<double>();


        int a = 0;
        bool tapetVäg = true;
        while (a <= 9 && tapetVäg)
        {
            //Menyval där användaren kan välja att lägga till en tapet för jämförelse, skriva ut tapeterna eller avsluta programmet. 
            Console.WriteLine("Vad vill du göra? Klicka 1, 2, respektive 3 för att välja: ");
            Console.WriteLine("Tänk på att du enbart kan jämföra !MAX! 8 st olika tapeter. ");
            Console.WriteLine("1: Lägga till en tapet");
            Console.WriteLine("2: Skriva ut listorna av tapeterna");
            Console.WriteLine("3: Avsluta programm");

            int valdVäg = int.Parse(Console.ReadLine());

            switch (valdVäg)
            {
                case 1:
                    {
                        Console.Clear();
                        Console.WriteLine("Vad heter din tapet? ");
                        string namnTapet = Console.ReadLine();
                        listaNamn.Add(namnTapet);

                        /*Räknar ut det antal rullar som användaren behöver. Detta görs utan hänsyn till mönster eller att tapeten ska sitta rätt.
                        Uträkningen görs genom att först dividera väggens bredd, (måttBredd), med tapetens bredd (tapetBredd), 
                        vilket ger oss antalet rullar vi behöver för att täcka väggens bredd med tapeter (antalRullar bredd). 
                        Detta värde avrundas uppåt då vi inte kan köpa halva tapetrullar. 
                        
                        Sedan multipliceras det antal tapeter som behövs för att täcka väggens bredd, (antalRullar bredd), med väggens längd, (måttLängd). Slutligen divideras detta med
                        tapetens längd, (tapetLängd), vilket ger oss totala antalet rullar vi behöver för att täcka hela väggen, (antalRullarVägg). 
                        Även detta värde, (antalRullarVägg), avrundas uppåt av samma anledning som innan. 
                        */

                        Console.WriteLine("Hur bred är tapeten? (meter) ");
                        double tapetBredd = double.Parse(Console.ReadLine());
                        Console.WriteLine("Hur lång är tapeten? (meter) ");
                        double tapetLängd = double.Parse(Console.ReadLine());
                        double antalRullarBredd = (måttBredd / tapetBredd);
                        int kolumnRullar = Convert.ToInt32((Math.Ceiling(antalRullarBredd)));
                        int antalRullarVägg = Convert.ToInt32((Math.Ceiling((antalRullarBredd * måttLängd) / tapetLängd)));
                        Console.WriteLine($"Totala antal rullar du behöver blir {antalRullarVägg} st");
                        listaTapet.Add(antalRullarVägg);

                        //Det totala priset blir antalet rullar tapet multiplicerat med vad en rulle tapet kostar. 
                        Console.WriteLine("vad kostar tapeten? (kr/rulle) ");
                        double tapetPris = double.Parse(Console.ReadLine());
                        double prisTotal = antalRullarVägg * tapetPris;
                        Console.WriteLine($"Det totala priset för din tapet blir därmet: {prisTotal} kr ");
                        listaPris.Add(tapetPris);
                        listaPrisTotal.Add(prisTotal);

                        Console.WriteLine("Tryck Enter för att fortsätta: ");
                        Console.ReadLine();
                        Console.Clear();

                            break;
                    }

                case 2:
                    { 
                        Console.Clear();
                        Console.WriteLine("Här kommer dina tapeter som en lista: ");

                        //Räknar upp listorna i ordning med hjälp av en "foreach" där loopen körs tills det inte finns något mer i listan "listaNamn".
                        //Då listan "listaNamn" och alla andra listor är lika stora så kommer loopen skriva ut allt i listorna. 
                        for (int i = 0; i < listaNamn.Count; i++)
                        {
                            Console.Write("Namn: ");
                            Console.WriteLine(listaNamn[i]);
                            Console.Write("Antal tapetrullar: ");
                            Console.WriteLine(listaTapet[i]);
                            Console.Write("Kr/Rulle: ");
                            Console.WriteLine(listaPris[i]);
                            Console.Write("Totalt pris för tapet: ");
                            Console.WriteLine(listaPrisTotal[i]);
                            Console.Write("");
                        }

                            break;
                    }

                case 3:
                    {
                        tapetVäg = false;
                            break;
                    }
                        
                default:
                    {
                        Felmeddelande();
                            break;
                    }
            }

            a++;
        }
    }

    /// <summary>
    /// Metod som körs för att täcka golvet med mattor
    /// </summary>
    static int Mattor()
    {
        //Skapar två lister för mattornas längd och bredd. Detta för att jag sedan ska kunna skriva ut mattorna som användaren har använt. 
        List<int> listaMattaBredd = new List<int>();
        List<int> listaMattaLängd = new List<int>();
        int b = 0;
        bool mattaVäg = true;
        while (mattaVäg)
        {
            Console.WriteLine("Meny: ");
            Console.WriteLine("1: Lägga till mattor");
            Console.WriteLine("2: Skriva ut mattorna");
            Console.WriteLine("3: Avsluta programm");
            int mattaVal = int.Parse(Console.ReadLine());

            switch (mattaVal)
            {
                case 1:
                    {
                        Console.WriteLine("Du ska täcka ditt golv med golvmattor. Jag behöver följande: ");
                        Console.WriteLine("Golvets bredd: ");
                        double golvBredd = double.Parse(Console.ReadLine());
                        Console.WriteLine("Golvets längd: ");
                        double golvLängd = double.Parse(Console.ReadLine());
                        Console.WriteLine($"Din area blir: {golvBredd * golvLängd} m^2 ");
                        double golvArea = golvLängd * golvBredd;

                        // "täcktGolv" sätts till noll och adderas varje gång anvädnaren valt att lägga till en matta på golvet. 
                        double täcktGolv = 0;
                        //Använder do-while för att se om mattorna tänker golvarean. Använder även en variabel som räknas efter varje gång loopen utförs för att bestämma antal mattor man behöver. 
                        
                        do
                        {
                            Console.WriteLine("Ta en matta och mata in mattans mått: ");
                            Console.WriteLine("Matta bredd: ");
                            int mattaBredd = int.Parse(Console.ReadLine());
                            listaMattaBredd.Add(mattaBredd);
                            Console.WriteLine("Matta längd: ");
                            int mattaLängd = int.Parse(Console.ReadLine());
                            listaMattaLängd.Add(mattaLängd);

                            täcktGolv = täcktGolv + (mattaBredd * mattaLängd);

                            Console.WriteLine($"Täckt golv blir: {täcktGolv} m^2");
                            b++;
                        } while (täcktGolv < golvArea);
                        return b;
                        
                    }

                case 2:
                    {
                        Console.Clear();
                        Console.WriteLine("Här kommer dina tapeter som en lista: ");

                        //Räknar upp listorna i ordning med hjälp av en "foreach" där loopen körs tills det inte finns något mer i listan "listaMattaBredd". 
                        //Då listan "listaMattaBredd" är lika stor som listan "listaMattaLängd" så kommer loopen skriva ut allt i listorna. 
                        for (int i = 0; i < listaMattaBredd.Count; i++)
                        {
                            Console.Write("Matta Bredd: ");
                            Console.WriteLine(listaMattaBredd[i]);
                            Console.Write("Matta Längd: ");
                            Console.WriteLine(listaMattaLängd[i]);
                            Console.Write("");
                        }
                        return b;
                        
                    }

                case 3:
                    {
                        mattaVäg = false;
                        return b;
                        
                    }


                default:
                    {
                        Felmeddelande();
                        return b;
                        
                    }
                    
            }

            

        }   
    }
}

你好!我需要一些帮助来解决我的问题。我不知道为什么我不能将我的值 b 返回到我的 main 方法。我已经用瑞典语写了所有内容,所以如果您需要一些翻译,我会这样做!

谢谢!

标签: c#methodsreturn

解决方案


因为你们所有人returns都在while循环中。来自 msdn:msdn

  • while 语句:有条件地执行其主体次或多次。

这意味着不能保证while循环内的代码将被执行。它可能只是跳过整个,但returns在它之后没有,这就是你收到错误的原因:"Not all code paths return a value"虽然多个路径returns是一个值,但不是所有路径。

您指定mattaVag变量true在开头,但编译器不知道。如果此循环至少会执行一次,请将其更改为do...while. 或者把return b;你的循环放在外面

static int Mattor() {
    int b = 0;
    bool mattaVäg = true;
    
    do {
        int mattaVal = int.Parse(Console.ReadLine());

        switch (mattaVal) {
            case 1:
                mattaVäg = false;
                break;
            case 2:
                mattaVäg = false;
                break;
            case 3:
                mattaVäg = false;
                break;
            default:
                Felmeddelande();
            break;
        }
    } while (mattaVäg);

    return b;
}

编辑“为什么我不能选择何时返回一个值,何时不返回?” 您可以选择。您选择返回一个int,所以它必须返回一个int

你可以试试这个:

调用方法:Mattor(out int b);

//Note!!! This is now a void method. 
//No return value, but we passed in a variable what you will get back
static void Mattor(out int b) {
    b = 0;
    bool mattaVag = true;

    do {
        int mattaVal = int.Parse(Console.ReadLine());

        switch (mattaVal) {
            case 1: 
                b++;
                mattaVag = false;
                break;
            case 2:
                mattaVag = false;
                break;
            default:
                break;
        }

    } while (mattaVag);
}

推荐阅读