Wie kann ich diesen C# Code noch sauberer gestalten?
Ich soll ein Programm schreiben das 5 Zahlen als Input nimmt, diese in einem Array speichert und dann die kleinste Zahl des Arrays mit der größten Zahl addiert und outputted.
Mein Code sieht folgendermaßen aus:
```
static void Main(string[] args)
{
int x = 0;
int[] arr = new int[5]
while (x < arr.Length)
{
int inputs = int.Parse(Console.ReadLine());
arr[x] = inputs;
x++;
}
int min_Max_Sum = arr.Min() + arr.Max();
Console.WriteLine(min_Max_Sum);
}
```
3 Antworten
1) In der Zeile, in der du das Array initialisierst, fehlt ein Semikolon am Zeilenende.
2) Deine Bezeichner würde ich nochmals überarbeiten:
- Das Array könnte mit einem Namen wie numbers konkreter beschrieben werden.
- inputs ist eine Pluralform, aber du liest in diesem Schritt nur eine Eingabe
- Statt snake_style würde ich empfehlen, die übliche PascalCase-Konvention von C# einzuhalten. Aus min_Max_Sum wird demzufolge minMaxSum.
- Für Zählervariablen wäre es besser, entweder einen passenden, aussagekräftigen Namen zu wählen (z.B. index) oder zumindest einen gängigen Namen wie i (= index/iteration).
3) Wenn wir einmal fest davon ausgehen, dass jede Eingabe ausnahmslos eine valide Ganzzahl ist, dann wäre eine for-Schleife besser geeignet, da dann die Zählervariable nur für den Kontext angelegt werden muss, in dem sie tatsächlich benötigt wird.
for (int index = 0; index < numbers.Length; ++index)
{
var input = Console.ReadLine();
numbers[index] = int.Parse(input);
}
In der Praxis ist es aber tatsächlich besser, sich gerade bei Eingaben von außen abzusichern. Bei einer invaliden Eingabe würde die Parse-Methode einen unbehandelten Ausnahmefall auslösen, der zum Programmabsturz führt.
Die TryParse-Methode ist die sichere Option. Wenn sie die Eingabe lesen kann, wird das Resultat in das out-Argument geschrieben und die Methode selbst liefert den Wert true zurück. Bei Misserfolg wäre die Rückgabe false.
Schlussendlich könnte man hier nun gut die do-while-Schleife nutzen:
var index = 0;
do
{
var input = Console.ReadLine();
if (int.TryParse(input, out var number))
{
numbers[index] = number;
++index;
}
}
while (index < numbers.Length);
Natürlich sind while oder for ebenso möglich:
for (var index = 0; index < numbers.Length;)
{
var input = Console.ReadLine();
if (int.TryParse(input, out var number))
{
numbers[index] = number;
++index;
}
}
Ich halte in diesem Fall aber die do-while (zumindest im Vergleich zu for) für die bessere Option, denn man kann an ihr schneller die verfolgte Absicht herauslesen.
Die for-Schleife steht üblicherweise für einen kontrollierten Ablauf, bei dem von vornherein klarer definiert ist, wie oft die Schleife ihren Körper wiederholen wird. Bei while/do-while ist das offener, da der Kopf/Fuß nur eine Bedingung aufnimmt.
Das Ergebnis von ReadLine schreibe ich übrigens in eine eigene Variable, damit man bei Bedarf leichter prüfen kann (z.B. via Debugger), was für ein tatsächlicher Wert von der Konsole gelesen wurde.
4) Deine Lösung, via Linq die Extremwerte herauszusuchen, ist natürlich schön kurz und bei den fünf Zahlen absolut kein Problem.
Behalte dennoch im Auge, dass du damit mehrmals über das Array läufst, obwohl du die gesuchten Werte auch schon beim Einlesen ermitteln könntest. Immerhin bräuchtest du lediglich zwei Variablen (min/max) die mit jeder neuen Eingabe verglichen werden. Ist die Eingabe größer/kleiner, dann wird der Wert der jeweiligen Variable überschrieben.
Müsstest du die Werte nicht in einem Array speichern, sollten Minimum und Maximum definitiv in der Eingabeschleife ermittelt werden.
static void Main(string[] args)
{
int[] arr = new int[5];
for(int i = 0; i < arr.Lenght; i++)
{
int n = 0;
if(int.TryParse(Console.ReadLine(), out n))
arr[i] = n;
}
Console.WriteLine(arr.Min() + arr.Max());
}
C# ist nicht meine Sprache der Wahl, aber aus einem c Hintergrund würde ich es so machen:
static void Main()
{
int[] arr = new int[5];
for (int i = 0; i < arr.Length; i++) {
arr[i] = int.Parse(Console.ReadLine());
}
int min_Max_Sum = arr.Min() + arr.Max();
Console.WriteLine(min_Max_Sum);
}
Erläuterung: Main() nimmt nicht mehr `string[] args`, da es im Programm nicht verwendet wird (ich bin mir aber nicht sicher, ob es in c# auch so richtig ist). Anstelle eines while loops wird ein for loop verwendet. So haben wir kein komisches x im äußeren Scope. Die "inputs" Variable ist auch überflüssig und verbessert Leserlichkeit nicht wirklich. Der Rest ist voll gut. Mir gefällt, dass du die .Min() und .Max() Methoden des Arrays verwendest.
Vielleicht könntest du noch ein oder zwei Kommentare hinzufügen; z. B. über dem Loop und der min max Addition. Das kommt aber darauf an, ob es dir beim Verständnis helfen würde oder eher stören.
ich bin mir aber nicht sicher, ob es in c# auch so richtig ist
Das funktioniert so.