höchste/niedrigste Zahl mit if abfragen
-
Nein, zumindest nicht mit if, aber das brauchst du ja auch gar nicht.
du legst eine for-schleife folgendermaßen an:
for(int c = 0; c <= 30; c = c + 1){ //Deine Anweisungen }Somit läuft die Schleife 31 mal durch (fängt bei 0 an, wird bis 30 hochgezählt und wenn es auf 30 steht nochmal) statt c = c + 1 kannst du auch c++ schreiben.
wenn du jetz mehrere kriterien eingibst brauchst du ja auch mehrere variablen. dafür ist wahrscheinlich eine while-schleife besser.
Eine solche legst du folgendermaßen an://Variablen die du haben willst while(/*Kriterium wie lange die schleife laufen soll*/){ //Anweisungen was getan werden soll //Hochzählen, sonstiges auf dass deine Kriterien irgendwann erfüllt werden }Gruß
MWJK
-
okay, nach ein wenig probieren, hab ich gemerkt, das ich if hier nicht benutzen kann.
Kann sein, das ich über die For-Schleife ws falsch verstanden habe, aber so wie ich das verstanden hab, wird in diesem Fall:
for(int c = 0; c <= 30; c = c + 1)
die For-Schleife sofort abgebrochen, da als Bedingung gesetzt ist, das der richtige wert kleiner oder gleich dreißig ist. Und null ist ja kleiner als 30, also müsste es ja abgebrochewn werden. Und es vergleicht ja auch nicht die eingegebenen Zahlen.
Ich hätte mir das so vorgestellt, dass ab null angefangen wird hoch zu zählen und jedes mal nachdem 1 dazu gezählt wurde, überprüft wird, ob der Wert der For-Schleife bereits mit einen der eingegebenen Zahlen übereinstimmt.
Und dadurch, das gleich nachdem ersten übereinstimmenden Wert abgebrochen wird, stört es nicht, wenn ein wert mehrfach vorhanden ist. und für die höchste zahl wäre es dann umgedreht.Ich glaube, da ist ne while-Schleife genau das richtige.
Ich werde es mal ausprobieren.
-
sin schrieb:
Kann sein, das ich über die For-Schleife ws falsch verstanden habe, aber so wie ich das verstanden hab, wird in diesem Fall:
for(int c = 0; c <= 30; c = c + 1)
die For-Schleife sofort abgebrochen, da als Bedingung gesetzt ist, das der richtige wert kleiner oder gleich dreißig ist. Und null ist ja kleiner als 30, also müsste es ja abgebrochewn werden.
Verkehrt, das bedeutet nur, dass die for-schleife solange ausgeführt wird, solange c kleiner als 30 ist (oder eben gleich groß).
das heisst die for-schleife wird 31 mal ausgeführt.Gruß
MWJK
-
naja, dann hab ich was falsch verstanden gehabt.
aufjedenfall hab ich mein Problem jetzt gelöst....Wenn auch ziemlich unelegant _
Dieses hab ich jetzt für die niedrigste zahl genommen und es funktioniert einwandfrei. Das selbe werde ich jetzt noch für die höchste Zahl machen.
void __fastcall TForm1::Timer1Timer(TObject *Sender) { R = R + 1; if (Zahl1 == R) {nAlter->Caption = String (Zahl1);Timer1->Enabled = false;} if (Zahl2 == R) {nAlter->Caption = String (Zahl2);Timer1->Enabled = false;} if (Zahl3 == R) {nAlter->Caption = String (Zahl3);Timer1->Enabled = false;} if (Zahl4 == R) {nAlter->Caption = String (Zahl4);Timer1->Enabled = false;} if (Zahl5 == R) {nAlter->Caption = String (Zahl5);Timer1->Enabled = false;} if (Zahl6 == R) {nAlter->Caption = String (Zahl6);Timer1->Enabled = false;} if (Zahl7 == R) {nAlter->Caption = String (Zahl7);Timer1->Enabled = false;} if (Zahl8 == R) {nAlter->Caption = String (Zahl8);Timer1->Enabled = false;} if (Zahl9 == R) {nAlter->Caption = String (Zahl9);Timer1->Enabled = false;} if (Zahl10 == R) {nAlter->Caption = String (Zahl10);Timer1->Enabled = false;} if (Zahl11 == R) {nAlter->Caption = String (Zahl11);Timer1->Enabled = false;} if (Zahl12 == R) {nAlter->Caption = String (Zahl12);Timer1->Enabled = false;} if (Zahl13 == R) {nAlter->Caption = String (Zahl13);Timer1->Enabled = false;} if (Zahl14 == R) {nAlter->Caption = String (Zahl14);Timer1->Enabled = false;} if (Zahl15 == R) {nAlter->Caption = String (Zahl15);Timer1->Enabled = false;} if (Zahl16 == R) {nAlter->Caption = String (Zahl16);Timer1->Enabled = false;} if (Zahl17 == R) {nAlter->Caption = String (Zahl17);Timer1->Enabled = false;} if (Zahl18 == R) {nAlter->Caption = String (Zahl18);Timer1->Enabled = false;} if (Zahl19 == R) {nAlter->Caption = String (Zahl19);Timer1->Enabled = false;} if (Zahl20 == R) {nAlter->Caption = String (Zahl20);Timer1->Enabled = false;} if (Zahl21 == R) {nAlter->Caption = String (Zahl21);Timer1->Enabled = false;} if (Zahl22 == R) {nAlter->Caption = String (Zahl22);Timer1->Enabled = false;} if (Zahl23 == R) {nAlter->Caption = String (Zahl23);Timer1->Enabled = false;} if (Zahl24 == R) {nAlter->Caption = String (Zahl24);Timer1->Enabled = false;} if (Zahl25 == R) {nAlter->Caption = String (Zahl25);Timer1->Enabled = false;} if (Zahl26 == R) {nAlter->Caption = String (Zahl26);Timer1->Enabled = false;} if (Zahl27 == R) {nAlter->Caption = String (Zahl27);Timer1->Enabled = false;} if (Zahl28 == R) {nAlter->Caption = String (Zahl28);Timer1->Enabled = false;} if (Zahl29 == R) {nAlter->Caption = String (Zahl29);Timer1->Enabled = false;} if (Zahl30 == R) {nAlter->Caption = String (Zahl30);Timer1->Enabled = false;} }
-
aber sehr unelegant ^^
machs doch so:
//global: int Zahl[30]; for(int S = 0; S <= 30; S++){ for(int R = 0; R <= 30; R++){ if (Zahl[S] == R) { nAlter->Caption = String (Zahl[S]);R = 30; S = 30; } } }das ist das gleiche nur etwas eleganter gelöst, ohne Timer.
Gruß
MWJK
-
Ich weiß ja nicht ob ich das richtig verstanden habe, aber wenn Du von 30 Zahlen die kleinste und die größte ermitteln willst, würde ich es so oder so ähnlich machen.
int Zahl[29]; // array mit den Zahlen füllen, wie auch immer. //------------- int MIN = Zahl[0]; int MAX = 0; for(int i = 0; i < 29; i++) { if(Zahl[i] > MAX) MAX = Zahl[i]; if(Zahl[i] < MIN) MIN = Zahl[i]; } ShowMessage("höchste Zahl = " + IntToStr(MAX) + "\nniedrigste Zahl = " + IntToStr(MIN));
-
@sin
lies mal das hier
http://tutorial.schornboeck.net/schleifen.htm
oder vielleicht besser gleich das ganze Tutorial.
-
@Oldman: In dein Array passen aber nur 29 Werte
Und außerdem würde ich MAX auch mit dem ersten Array-Element vorinitialisieren (nur für den Fall, daß der User nur negative Werte eingegeben hat).PS: Außerdem empfehle ich mal die STL-Algorithmen min_element() und max_element().
-
1 bis 30 sind 30 und 0 bis 29 ist bei mir auch 30, aber vielleicht lernt man ja heute etwas anderes in der Schule

Mit negativen Zahlen hättest Du recht, aber soweit ich das Label 'nAlter' interprediere, handelt es sich um Altersangaben und ich hab noch niemanden gesehen, der -12 oder so ist.
"min_element() und max_element()" man kan es auch komplizierter machen als es ist.
Aber das muß jeder selber wissen, viele Wege führen nach Rom. Abgesehen davon hatte ich geschrieben, daß ich es so oder so ähnlich machen würde und ist wohl gegenüber dem 'Maraton' code eine Verbesserung.
-
OldMan00 schrieb:
1 bis 30 sind 30 und 0 bis 29 ist bei mir auch 30, aber vielleicht lernt man ja heute etwas anderes in der Schule

Ja richtig, aber bei der Array-Dimension gibst du die Anzahl der Elemente an und nicht den maximal möglichen Index - und ein "int zahl[29];" hat 29 Elemente, die von "zahl[0]" bis "zahl[28]" angesprochen werden.
"min_element() und max_element()" man kan es auch komplizierter machen als es ist.
Was ist daran kompliziert? Solange ich meinen Code nicht bis zum Ende ausoptimieren muß, nehme ich lieber STL-Möglichkeiten als sie von Hand nachzubauen.
Aber das muß jeder selber wissen, viele Wege führen nach Rom. Abgesehen davon hatte ich geschrieben, daß ich es so oder so ähnlich machen würde und ist wohl gegenüber dem 'Maraton' code eine Verbesserung.
Ja, das ist er auf jeden Fall (aber es gibt ja auch kaum eine Möglichkeit, es noch schlechter zu machen :D)
-
Was soll denn an max_element() so kompliziert sein.
int max = *max_element(Zahl, Zahl+29);1 bis 30 sind 30 und 0 bis 29 ist bei mir auch 30,
Es ist bloß so, dass dein Array nur 29 Werte fasst.
[edit]Diesmal zu spät
[edit]
-
Ich sagte nicht, daß es soooo komliziert ist und ist natürlich die elegantere Lösung.
for(int i = 0; i <= 29; i++) oder for(int i = 0; i < 30; i++) ok.
Die Anzahl der Arrayelemente entspricht dem Wert des ganzzahligen Ausdrucks (a[0], ..., a[n–1]) ist natürlich richtig, komischerweise funktionier das letzte trotzdem, also n auch und nicht nur n-1, aber vielleicht kann das mal jemand erklären.
Folgender Testversuch:AnsiString Ergebnis = ""; int zahl[3]; zahl[0] = 4; zahl[1] = 2; zahl[2] = 5; zahl[3] = 9; for (int i = 0; i <= 3; i++) Ergebnis = Ergebnis + IntToStr(zahl[i]) + "\n"; ShowMessage(Ergebnis);zeigt mir in einem mit [3] angegebenen Array 4 richtige Werte (0 - 3)

-
zahl[3] = 9;erzeugt bei dir undefiniertes Verhalten. Das bedeutet nicht, dass dein Programm abstürzt oder irgendwelche Fehlermeldungen kommen. Du beschreibst da einen Speicherbereich, der dir nicht gehört. Wenn dieser Bereich nicht weiter verwendet wird, passiert auch nichts (undefiniertes Verhalten).
-
warum nicht bei mir ?? Hab es wirklich so getestet.

werde es gleich noch mal versuchen.
-
nun habe ich zwar keine Fehlermeldung aber das letzte Array ist die selbe Zahl wie das vorletzte. Komischerweise hat es davor wirklich diese richtige Zahl angezeigt (Zufall ?)Aber richtig íst, wenn ich CodeGuard einschalte bekomme ich einen Hinweis.
Wollte die Richtigkeit von (a[0], ..., a[n–1]) nicht anzweifeln, hatte mich nur gewundert, das es trotzdem funktionierte.
-
Undefiniertes Verhalten bedeutet, dass Alles passieren kann (wirklichs Alles!). Also auch, dass dein Programm funktioniert.
-
Braunstein schrieb:
Undefiniertes Verhalten bedeutet, dass Alles passieren kann (wirklichs Alles!). Also auch, dass dein Programm funktioniert.
das ist richtig.