C#排序-并非所有代码路径都返回一个值

本文关键字:返回 一个 路径 排序 代码 | 更新日期: 2023-09-27 18:00:03

感谢所有的答案,正如我之前所说,我是一个初学者,所以也许我会试着从另一个角度来展示我的问题。一开始我写了一个如下的工作程序,但后来我意识到我的任务是使用密封类,这对我来说现在太难了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Projekt_1__konsola
{
sealed class Element
{
    int val;
    public Element(int e)
    {
        val = e;
    }
    public int v
    {
        get
        {
            return val;
        }
    }
}
class Program
{
    static void UstawienieStylu()
    {
        Console.Title = "Projekt";
        Console.BackgroundColor = ConsoleColor.White;
        Console.ForegroundColor = ConsoleColor.Black;
        Console.Clear();
    }
    static void PodajLiczbę(string komunikat, out int liczba)
    {
        while (true)
        {
            Console.Write(komunikat);
            string str = Console.ReadLine();
            try
            {
                liczba = int.Parse(str);
                break;
            }
            catch (FormatException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Wprowadzono liczbę w złym formacie");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            catch (OverflowException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Wartość jest za duża albo za mała");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            catch (ArgumentNullException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Napotkano koniec strumienia");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            Console.WriteLine("Spróbuj jeszcze raz");
        }
    }
    static void Sortuj(int[] tablica)
    {
        for (uint i = 1; i < tablica.Length; i++)
        {
            uint j = i;
            int buf = tablica[j];
            while ((j > 0) && (tablica[j - 1] > buf))
            {
                tablica[j] = tablica[j - 1];
                j--;
            }
            tablica[j] = buf;
        }
    }
    static void Main(string[] args)
    {
        UstawienieStylu();
        int liczba;
        PodajLiczbę("Podaj liczbę elementów do posortowania: ", out liczba);
        int element, i;
        int[] tablica = new int[liczba];
        for (i = 0; i < liczba; i++)
            {
                PodajLiczbę("Podaj element [" + i + "]: ", out element);
                tablica[i] = element;
            }
        Sortuj(tablica);
        Console.WriteLine("Posortowane elementy: ");
        for (i = 0; i < liczba; i++)
        {
            Console.WriteLine("Element [{0}] = {1}", i, tablica[i]);
        }
    }
}
}

我有一项任务要写一个程序,使用开头写的类。如果没有它,它会很容易,但现在不是了,因为我是编程的初学者,尤其是对象的初学者。我做错了什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Projekt_1__konsola
{
sealed class Element
{
    int val;
    public Element(int e)
    {
        val = e;
    }
    public int v
    {
        get
        {
            return val;
        }
    }
}
class Program
{
    static void UstawienieStylu()
    {
        Console.Title = "Projekt 1";
        Console.BackgroundColor = ConsoleColor.White;
        Console.ForegroundColor = ConsoleColor.Black;
        Console.Clear();
    }
    static Element[] WczytajDaneZKonsoli()
    {
        while (true)
        {
            string str = Console.ReadLine();
            int element;
            try
            {
                element = int.Parse(str);
                break;
            }
            catch (FormatException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Wprowadzono liczbę w złym formacie");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            catch (OverflowException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Wartość jest za duża albo za mała, pamiętaj że możesz podać liczby z zakresu 1 do 4294967295");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            catch (ArgumentNullException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Napotkano koniec strumienia");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            Console.WriteLine("Spróbuj jeszcze raz");
        }
    }
    static void Sortowanie(Element[] tablica)
    {
        for (uint i = 1; i < tablica.Length; i++)
        {
            uint j = i;
            int buf = tablica[j].v;
            while ((j > 0) && (tablica[j - 1].v > buf))
            {
                tablica[j].e = tablica[j - 1].v;
                j--;
            }
            tablica[j].e = buf;
        }
    }
    static void WyświetlDane(Element[] elementy)
    {
        Console.WriteLine("Posortowane elementy: ");
        for (int i = 0; i < elementy.Length; i++)
        {
            Console.WriteLine("Element [{0}] = {1}", i, elementy[i].v);
        }
    }
    static void Main(string[] args)
    {
        UstawienieStylu();
        Element[] elementy = WczytajDaneZKonsoli();
        Sortowanie(elementy);
        WyświetlDane(elementy);
    }
}

}

C#排序-并非所有代码路径都返回一个值

您需要从以下方法返回Element[]

static Element[] WczytajDaneZKonsoli()

注意:您的函数WczytajDaneZKonsoli()似乎什么都没做,所以您需要创建一个Element[]并返回它。

您可能需要添加以下代码来创建Element[]阵列,如下所示:

static Element[] WczytajDaneZKonsoli()
{
    Element [] myElements = new Element[10]; //size depends on your equirements
   //or you can use Lis<Element> if you don't know the size
    int count = 0;
    while (true)
    {
        string str = Console.ReadLine();
        int element;
        try
        {
            element = int.Parse(str);
            myElements[count]=new Element(element);
            count++;
            break;
        }
     return myElements;

从函数返回Element[]

static Element[] WczytajDaneZKonsoli()

函数WczytajDaneZKonsoli签名表示它返回Element[],但您没有返回任何内容。正如错误消息所说,该函数的所有代码路径都必须返回一个值(或者由于异常而终止)。

另一种选择是更改签名,但您必须确保无论在哪里调用它,它都不希望它返回任何内容。例如,在Program.Main()

更改签名的示例。

static void WczytajDaneZKonsoli()

您的代码是错误的。

您应该在WczytajDaneZKonsoli方法中填充一个元素集合(用户输入的数字),但现在您在用户输入的第一个数字之后就突破了无限的while循环,因此他们不可能输入超过1的元素。

显然,对由单个元素组成的数组进行排序是毫无意义的。

其他建议的解决方案(目前)并没有解决这个问题。

你需要让你的用户决定他们是完成了还是想再添加一个数字。

一旦您做到了这一点,初始化Element的集合(可能是List<Element>,因为您事先不知道会有多少元素),并继续向集合中添加更多元素。在用户决定不再有号码后返回list.ToArray()

工作解决方案:

    static Element[] WczytajDaneZKonsoli()
    {
        List<Element> elements = new List<Element>();
        Console.WriteLine("Keep on entering numbers, enter X once you're done");
        Console.WriteLine("Podawaj liczby. Wpisz X aby zakończyć i przejść do sortowania.");
        while (true)
        {                
            string str = Console.ReadLine();
            if (str == "X")
            {
                break;
            }
            int element;
            try
            {
                element = int.Parse(str);
                elements.Add(new Element(element));
            }
            catch (FormatException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Wprowadzono liczbę w złym formacie");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            catch (OverflowException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Wartość jest za duża albo za mała, pamiętaj że możesz podać liczby z zakresu 1 do 4294967295");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            catch (ArgumentNullException)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Napotkano koniec strumienia");
                Console.ForegroundColor = ConsoleColor.Black;
            }
            Console.WriteLine("Spróbuj jeszcze raz");
        }
        return elements.ToArray();
    }
相关文章: