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);
}
}
}
您需要从以下方法返回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();
}