Kleinste Zahl in c#?
Im Programm funktioniert die Ausgabe der größten Zahl, aber nicht die kleinste Wieso?
Index = 0;
minWert = Zahlen[0];
while (Index < 5)
{
if (Zahlen[Index] < minWert)
{
minWert = Zahlen[Index];
}
Index = Index + 1;
}
Index = 0;
maxWert = Zahlen[0];
while (Index < 5)
{
if (Zahlen[Index] > maxWert)
{
maxWert = Zahlen[Index];
}
Index = Index + 1;
}
Console.WriteLine("Minimalwert: {0}", minWert);
Console.WriteLine("Maximalwert: {0}", maxWert);
3 Antworten
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.
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);
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).
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.
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.
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.
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.
Diese Frage wurde hier, wenn ich mich recht entsinne, einmal von TeeTier beantwortet, wobei es ganz sicher sprach-/compilerabhängig ist.
Hier wird von 127 Verschachtelungen für C geschrieben: https://softwareengineering.stackexchange.com/questions/213910/maximum-nesting-for-loops-and-conditionals
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?
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.
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();
}
Es sind auch keine Semikolons nach den geschweiften Klammern notwendig, sie würden nur als leere Anweisung interpretiert werden.