Kleinste Zahl in c#?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Sofern du deine Variablen richtig erzeugst (minWert, maxWert, Index, Zahlen), funktioniert es. Siehe dazu hier: https://ideone.com/yEalRC

Allerdings würde ich dir empfehlen, noch einiges zu ändern.

  • Verwende die for-Schleife, sie passt besser, da du ja kontrolliert zählst.
  • Zähle nicht bis 5 sondern bis zur Länge des Arrays. Letzteres mag zwar denselben Wert haben, doch so bindest du das Array direkt an die Laufbedingung der Schleife und stellst sicher, dass es nicht zu einem Overflow kommen kann (angenommen, das dir gelieferte Array hat doch nur 3 Elemente, würde der Index also aus dem Rahmen laufen).

Resultat:

int[] zahlen = new int[5] { 3, 2, 1, 4, 5 };       
int minWert = zahlen[0]; 

for (int i = 0; i < zahlen.Length; ++i) { if (zahlen[i] < minWert) { minWert = zahlen[i]; } }
int maxWert = zahlen[0];
for (int i = 0; i < zahlen.Length; ++i) { if (zahlen[i] > maxWert) { maxWert = zahlen[i]; } }
Console.WriteLine("Minimalwert: {0}", minWert); Console.WriteLine("Maximalwert: {0}", maxWert);

1. Die Deklaration und Initialisierung der Variablen fehlt komplett.

minWert bzw. maxWert brauchen einen Datentyp und einen Intialwert, z.b. 0 oder 5. Man kann ja nichts vergleichen, wenn die Variablen keinen Wert haben.

Du hast die Semikolons hinter den geschweiften Klammerpaaren bei den while-Schleifen vergessen.

Welche Auswirkungen das hat, weiß ich nicht. Wundert mich nur, dass die IDE da nicht wenigstens eine Warnung ausspuckt.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

PWolff  24.11.2017, 11:07

Hab's ausprobiert. Schadet nichts. (M. E. ein Bug in C#)

Bitte schreib mal die Variablendeklarationen und die Initialisierung von Zahlen[] mit rein sowie die Ausgabe.

0
PWolff  24.11.2017, 11:11
@PWolff

Hier mal meine komplette main() zum Ausprobieren:

    static void Main(string[] args) {
int Index;
double minWert, maxWert;
double[] Zahlen;

Zahlen = new double[] { 2.5, 2.9, 2.1, 2.8, 2.2 };

{ minWert = -2.5; } // fehlendes Semikolon hinter Paar geschweifter Klammern wird toleriert ... merkwürdig ...

Index = 0;
minWert = Zahlen[0];
while (Index < 5) {
if (Zahlen[Index] < minWert) {
minWert = Zahlen[Index];
} // hier sollte ein Syntaxfehler gemeldet werden: fehlendes Semikolon
Index = Index + 1;
} // hier sollte ein Syntaxfehler gemeldet werden: fehlendes Semikolon

Index = 0;
maxWert = Zahlen[0];
while (Index < 5) {
if (Zahlen[Index] > maxWert) {
maxWert = Zahlen[Index];
} // hier sollte ein Syntaxfehler gemeldet werden: fehlendes Semikolon
Index = Index + 1;
} // hier sollte ein Syntaxfehler gemeldet werden: fehlendes Semikolon

Console.WriteLine("Minimalwert: {0}", minWert);
Console.WriteLine("Maximalwert: {0}", maxWert);

Console.WriteLine(); Console.Write("Press any key to exit..."); Console.ReadKey();
}
0
silverelite31  24.11.2017, 13:01

man Schreibt hinter } kein semikolon ....

0
PWolff  24.11.2017, 13:16
@silverelite31

sagt wer?

Bei Pascal musste man hinter das END eines Blocks ein Semikolon schreiben, und ich sehe nicht ein, diese Gewohnheit nicht auf Sprachen mit C-ähnlicher Syntax aufzugeben. Zumal ich überflüssige Inkonsistenzen hasse.

0
PWolff  24.11.2017, 13:24
@PWolff

Scheint tatsächlich so zu sein. Das "erklärt" auch, wieso man (eigentlich unerklärlicherweise) hinter Methoden- Klassen- etc. -definitionen KEIN Semikolon setzen darf.

Warum zum Henker nimmt man nicht das Semikolon generell als Abschluss eines Codeblocks?!

0
PWolff  24.11.2017, 13:48
@PWolff

Ach so ... ist mir grade wieder eingefallen: Unix-Typen sind notorisch tippfaul (z. B."umount" statt "unmount"). Ich frage mich nur, warum man in C "main" ausschreiben statt "mn" oder so zu verwenden. [/rant]

0
regex9  24.11.2017, 14:00
@PWolff

Weil sich der Code-Block bereits selbst abschließt. Dazu sind Gruppierungen da - sie umklammern etwas und wirken dabei als Delimiter für Anfang und Ende. Semantisch da noch ein Semikolon anzuhängen, wäre ohne Sinn.

Da innerhalb von Klassen keine Anweisungen erlaubt sind, darfst du nach einem Methodenblock auch kein Semikolon setzen. Das Gleiche gilt für den Raum außerhalb von Klassen. Anweisungen sind nur innerhalb einer Methode / einem Code-Block erlaubt.

0
PWolff  24.11.2017, 14:08
@regex9

Eine Variablendeklaration ohne Initialisierung ist auch keine Anweisung. Das ist nur ein Hinweis an den Compiler.

Ich empfinde auch eine Definition als eine Anweisung. OK, ist Interpretationssache.

Wenn hinter {...} KEIN Semikolon kommt, ist das "{...}"-Konstrukt also NICHT eine Zusammenfassung mehrerer Anweisungen zu einer einzigen Anweisung, sondern ein besonderes, eigens zu lernendes idiomatisches Syntaxelement.

0
regex9  24.11.2017, 14:50
@PWolff

Eine Variablendeklaration ohne Initialisierung ist auch keine Anweisung.

Da hast du recht, Zuweisungen müssen in dieser Definition ausgeklammert werden.

Die geschweiften Klammern stellen einen eigenen Code-Block dar, der über einen eigenen Kontext verfügt. Er kann unbenannt/anonym sein oder im Fall einer Funktion/Methode benannt. Auch die Begriffe wie if, while, for stellen lediglich eine Art leitenden Guard dar, welcher einen anonymen Code-Block kontrolliert.

Die Zusammenfassung zu einer Anweisung geschieht wohl erst durch Benennung des Code-Blocks, da er ja sonst nicht an anderen Stellen aufgerufen werden kann.

In einer Sprache wie Java wird ein anonymer Code-Block innerhalb der Klasse dem Konstruktor zugefügt. Um die Neugier an dieser Stelle gleich zu befriedigen: Die Ausgabe dieses Beispiels wäre Hallo du da!

class Base {
public Base(int a) {
System.out.print("Hallo ");
}
}
class Child extends Base {
{ System.out.println("du "); }

public Child() {
super(2);
System.out.println("da!");
}

Wenn man eine anonyme Klasse nutzt, kann man daher Code-Blöcke nutzen, um diese zu initialisieren.

0
PWolff  24.11.2017, 15:01
@regex9

Würde mich mal interessieren, wie viele Zweige so ein Compiler hat, um Semikola und geschweifte schließende Klammern zu behandeln.

0
PWolff  24.11.2017, 15:10
@regex9

Es geht hier nicht um den Quellcode den der Compiler übersetzt, sondern um den Compiler selbst.

Wenn der Parser auf ein Semikolon oder auf eine schließende geschweifte Klammer stößt - wie viele Abfragen zieht das nach sich (zur Laufzeit des Compilers)?

Genauer: Wie viele Möglichkeiten hat der Compiler, darauf zu reagieren?

0
regex9  24.11.2017, 16:07
@PWolff

Achso. Das kann ich selbst leider nicht beantworten, da wäre tiefgründigere Recherche gefragt.

0
regex9  24.11.2017, 13:58

Es sind auch keine Semikolons nach den geschweiften Klammern notwendig, sie würden nur als leere Anweisung interpretiert werden.

1
PWolff  24.11.2017, 14:01
@regex9

Ja, soweit bin ich inzwischen auch vorgedrungen.

Ich kann mich nicht erinnern, davon gehört zu haben, als ich irgendwelche "C-flavored" Sprachen gelernt habe.

Interessanterweise wird bei "do {...} while" KEIN implizites Semikolon hinter "}" gesetzt.

0
regex9  24.11.2017, 14:31
@PWolff

Wieso sollte bei do-while dort ein Semikolon gesetzt werden?

0
PWolff  24.11.2017, 14:59
@regex9

Weil dort, wo Anweisungen stehen, sonst immer ein "}" zusätzlich das Äquivalent eines Semikolons ist.

0
regex9  24.11.2017, 15:13
@PWolff

Mh, nein. Die geschweiften Klammern stellen nicht den Abschluss einer Anweisung dar sondern nur den einer Anweisungsgruppe. Nur das Semikolon kann eine Anweisung beenden (oder in manchen Fällen eine runde Klammer - siehe die Iterationsanweisung bei for, wobei das wohl einfach ein festes, vereinfachtes Sprachkonstrukt ist).

do {
  tudies();
  tudas();
}
while(true);
0
PWolff  24.11.2017, 15:16
@regex9

Ach so, ich denke, ich beginne die Auffassung von geschweiften Klammern zu verstehen. Die sind demnach so was ähnliches wie Labels in Assemblersprachen.

0
regex9  24.11.2017, 16:02
@PWolff

Fast, eher die Sektion nach dem Label. Die Sprungmarke bzw. das Label selbst wäre bei do-while das do, bei if-else das else oder bei while/for halt while/for. Wäre dem nicht so, würde ja die Bedingung sonst immer übersprungen werden.

0
Mikkey  24.11.2017, 21:39

Du bist offenbar nicht fit in C#, wenn Du die Frage nicht beantworten kannst, ist es nicht sinnvoll, über Syntaxfeinheiten zu sinnieren.

Pascal hat keine C-ähnliche Syntax, es lehnt sich eher an Algol an ( ":=" und das vor "else" verbotene Semikolon weisen darauf hin).

0
PWolff  24.11.2017, 23:24
@Mikkey

Nein, ich bin nicht in C# fit, nur im Programmieren im Allgemeinen und ein ganz, ganz klein wenig in .NET.

0