【问题标题】:Program.Mattor(): not all code paths return a value. How do I solve this?Program.Mattor():并非所有代码路径都返回一个值。我该如何解决这个问题?
【发布时间】:2023-04-03 14:26:01
【问题描述】:
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 方法。我已经用瑞典语写了所有内容,所以如果您需要翻译,我会这样做!

谢谢!

【问题讨论】:

  • Not all code paths return a value 意味着你有一个不返回值的路径,通过一个声明包含返回类型的函数。具体来说,static int Mattor() 承诺它将返回一个int,但如果在遇到return 语句之前将mattaVäg 设置为false,则控制将脱离while 循环并且不会有要返回的值。您应该在 while 循环之后添加 return 语句(或者如果更合适,则添加 Exception)。
  • 编译器报告什么?您在哪一行收到警告?只需查看这些位置并跟踪数据流就可以帮助您充分回答您的问题(或者让您看看哪里出了问题)。

标签: c# methods return


【解决方案1】:

因为您所有的 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);
}

【讨论】:

  • 嗨!谢谢你的回复,你太客气了!我现在已经尝试了您的解决方案,但它似乎不起作用,问题仍然存在。正如我在上面的评论中所写,我只需要在案例 1 中返回值 b,因为值 b 计算用户执行“do while”循环的次数。
  • 你能把你修改后的代码粘贴到那里吗?
  • 感谢您和其他人,我现在已经成功了!非常感谢:) 我首先看错了你的代码,但现在我看到你把 return b;在“Do-While”之外,现在它可以工作了。但是为什么它会这样工作,为什么我不能选择什么时候想要返回一个值,什么时候不想要呢?
  • 您在创建方法时选择了返回值。 static int Mattor(),如果您不想返回,请将其更改为 void。或者……我给你看别的东西。 1 分钟,再给你写一段代码。
  • 我能以某种方式感谢您的帮助吗?也许投票给你或其他什么?我最近才开始使用这个网站。 :)
【解决方案2】:

在外部while循环完成后移动语句return b;。当您在每个 switch case 中完成计算时,请确保在最后添加 break。这将始终返回 b,无论它是 0(默认)还是在 while 循环中更改。

static int Mattor()
{
  ...
  while (mattaVäg) {
    switch(mattaVal) {
      case 1: 
        // do work
        break;     <==== here

      default:
        // default work
        break;     <==== here
    }
  }
  return b;    <=== here
}

【讨论】:

  • 嗨!感谢您的评论。我想我不明白你在做什么。我的问题是我想返回我的值 b。这是我在案例 1 中执行“do while”循环的次数。我真的不需要为任何其他案例返回值。你明白我的意思吗?
  • 我愿意...当您有一个必须返回值的方法时,您无法选择哪种情况会返回值,哪种情况不会。当您将 return 语句移至结束时,您确保返回一个值,无论是默认值还是根据特定情况计算
  • 好的,现在我明白了!太感谢了!所以我不能选择哪种情况会返回值,哪种情况不会。这是为什么呢?
猜你喜欢
  • 2018-12-28
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多