Asrin Geschrieben 13. April 2009 Geschrieben 13. April 2009 Hallo Leute, ich habe folgenden Code zu ermittelung von min und max aus drei Werten geschrieben, doch erhalte ich bei der Ausgabe nicht die gewünschten min und max Werte. Ich hoffe es kann mir jemand weiterhelfen. #include <stdio.h> #include <stdlib.h> /*programm, was seiten eines Quaders abfragt(kommazaheln sind möglich, negative zahlen nicht) und die Länge des kürzesten bzw. der Längsten Seite ausgibt.Weiterhin berechnet das Programm ob der Rauminhalt des Quaders ein Kubikmeter beträgt und gib es aus. */ main(void) { float hoehe, breite,laenge,raum_inhalt; /*Die Eingabe*/ do{ printf("Geben sie die Hoehe(>=0) ein:"); scanf("%f",&hoehe); } while(hoehe<0); do{ printf("Geben sie die breite(>=0) ein:"); scanf("%f",&breite); } while(breite<0); do{ printf("Geben sie die laenge(>=0) ein:"); scanf("%f",&laenge); } while(laenge<0); /*Die Berechnung*/ raum_inhalt = hoehe*breite*laenge; /*Ermittelung von Minimum und Maximum*/ float max = 0; float min = 0; if (hoehe > max) {max=hoehe;} else if (breite > max) {max=breite;} else {max=laenge;} if (hoehe < min) {min=hoehe;} else if(breite < min) {min=breite;} else {min=laenge;} printf("Die laengste Seite ist:%2.2fMeter\t",max); printf("Die kuerzeste Seite ist:%2.2fMeter\n",min); /* Abfrage ob Rauminhalt einen Kubikmeter beträgt */ if (raum_inhalt >=1 ) { printf("raum_inhalt ist groesser als 1 Kubikmeter."); } else { printf("Rauminhalt ist nicht groesser als 1 Kubikmeter.\n"); } system("pause"); Zitieren
unbenannt Geschrieben 13. April 2009 Geschrieben 13. April 2009 if (hoehe > max) {max=hoehe;} else if (breite > max) {max=breite;} else {max=laenge;} Du initialisierst "max" mit 0 und erwartest bei "hoehe" einen Wert >=0. Insofern nun "hoehe > 0" vorliegt, so wird die erste Bedingung wahr und die Abfrage ist beendet - es werden also weder "else if"- noch "else"-Zweig geprüft. Analog natürlich auch beim Minimum. Du brauchst jeweils drei voneinander unabhängige Abfragen, da sonst beispielsweise "max = laenge" nur erreicht werden kann, wenn sowohl "breite" als auch "hoehe" 0 sind. Zitieren
Asrin Geschrieben 13. April 2009 Autor Geschrieben 13. April 2009 /*Ermittelung von Minimum und Maximum*/ float max = 0; float min = 0; if (hoehe > max) {max=hoehe;} if (breite > max) {max=breite;} if( laenge > max) {max=laenge;} if (hoehe < min) {min=hoehe;} if(breite < min) {min=breite;} if(laenge < min) {min=laenge;} printf("Die laengste Seite ist:%2.2fMeter\t",max); printf("Die kuerzeste Seite ist:%2.2fMeter\n",min); so erhalte ich den Maximum richtig, aber keinen minimum!! Zitieren
flashpixx Geschrieben 14. April 2009 Geschrieben 14. April 2009 Hilfestellung: float min = 0; if (hoehe < min) {min=hoehe;} Phil Zitieren
TDM Geschrieben 14. April 2009 Geschrieben 14. April 2009 Ich würde ehrlich gesagt, die Variablen vorher gar nicht mit 0 initialisieren... float max = ((hoehe > breite) ? hoehe : breite); max = ((max > laenge) ? max : laenge); float min = ((hoehe < breite) ? hoehe : breite); min = ((min < laenge) ? max : laenge); :hells: Zitieren
Asrin Geschrieben 14. April 2009 Autor Geschrieben 14. April 2009 @flashpixx ich habe das doch genauso!! @TDM ich habe es auch mit deinem Code vorschalg versucht.Da erhalte ich für min und max immer nur das maximum.... Zitieren
TDM Geschrieben 14. April 2009 Geschrieben 14. April 2009 @TDM ich habe es auch mit deinem Code vorschalg versucht.Da erhalte ich für min und max immer nur das maximum.... Sch**ß Copy&Paste... float max = ((hoehe > breite) ? hoehe : breite); max = ((max > laenge) ? max : laenge); float min = ((hoehe < breite) ? hoehe : breite); min = ((min < laenge) ? [B]min[/B] : laenge); Zitieren
DominikJ Geschrieben 14. April 2009 Geschrieben 14. April 2009 (bearbeitet) Huhu, wenn ich da mal drüber gucke und deinen Kommentar lese ist das mit min doch kein Wunder. /*programm, was seiten eines Quaders abfragt(kommazaheln sind möglich, negative zahlen nicht) und die Länge des kürzesten bzw. der Längsten Seite ausgibt.Weiterhin berechnet das Programm ob der Rauminhalt des Quaders ein Kubikmeter beträgt und gib es aus. */ Du initalisierst min mit 0. Ein Quader jedoch kann keine Seite haben, welche < 0 ist. Somit ist diese Prüfung natürlich immer False. Lösung: min den maximal möglichen Wert geben oder mit max vorbelegen. Dann sollte alles so funktionieren ... float max = 0; float min = 0; if (hoehe > max) {max=hoehe;} if (breite > max) {max=breite;} if( laenge > max) {max=laenge;} min=max; if (hoehe < min) {min=hoehe;} if(breite < min) {min=breite;} if(laenge < min) {min=laenge;} printf("Die laengste Seite ist:%2.2fMeter\t",max); printf("Die kuerzeste Seite ist:%2.2fMeter\n",min); Edit: oder natürlich TDM's Lösung nehmen iif is eh viel toller (nagut... aber auch unübersichtlicher) Bearbeitet 14. April 2009 von DominikJ Vorposting Zitieren
Asrin Geschrieben 14. April 2009 Autor Geschrieben 14. April 2009 @TDM vielen Dank...so funktioniert es... aber kannst du mir den code auch erklären...ich sehe die Variante zum ersten mal.. Heisst etwa das Fragezeichen gleich und der Doppelpukt ungleich oder wie??? kann ich das auch einfach mit gleich und umgleich zeichen machen???? @DominikJ Danke dir auch... Ja blöd von mir, dass ich min = 0 gesetzt habe...so funktioniert es auch. Zitieren
Klotzkopp Geschrieben 14. April 2009 Geschrieben 14. April 2009 aber kannst du mir den code auch erklären...ich sehe die Variante zum ersten mal.. Heisst etwa das Fragezeichen gleich und der Doppelpukt ungleich oder wie??? Das ist der "Conditional Operator". Einfach gesagt, der Ausdruck a ? b : chat den Wert des Ausdrucks b, wenn a wahr ist (also ungleich 0), und den Wert des Ausdrucks c, wenn a falsch ist. Sinngemäß: Wenn a, dann b, sonst c. Es gibt dann noch ein paar komplizierte Regeln für die erlaubten Typkombinationen von b und c. kann ich das auch einfach mit gleich und umgleich zeichen machen????Du brauchst nicht 3 oder 4 Fragezeichen zu machen, wir verstehen auch so, dass das eine Frage ist Der Ausdruck a kann ein beliebiger arithmetischer, Enum- oder Zeiger-Ausdruck sein, also auch einer mit == oder !=. Zitieren
DominikJ Geschrieben 14. April 2009 Geschrieben 14. April 2009 (bearbeitet) @TDM vielen Dank...so funktioniert es... aber kannst du mir den code auch erklären...ich sehe die Variante zum ersten mal.. Heisst etwa das Fragezeichen gleich und der Doppelpukt ungleich oder wie??? kann ich das auch einfach mit gleich und umgleich zeichen machen???? @DominikJ Danke dir auch... Ja blöd von mir, dass ich min = 0 gesetzt habe...so funktioniert es auch. Conditional Operator Bedeutet soviel wie: test = (var1) ? true : false; // ^Prüfung ^Wahr ^Falsch // entspricht: if (var1) { test = true; } else { test = false; } Man hilft ja gerne Edit: ziemlich sinnloses Beispiel Bearbeitet 14. April 2009 von DominikJ Beispiel Zitieren
TDM Geschrieben 14. April 2009 Geschrieben 14. April 2009 @TDM vielen Dank...so funktioniert es... aber kannst du mir den code auch erklären...ich sehe die Variante zum ersten mal.. Heisst etwa das Fragezeichen gleich und der Doppelpukt ungleich oder wie??? kann ich das auch einfach mit gleich und umgleich zeichen machen???? case ? truepart : falsepart Tenärer Operator: wenn case (bool'sch) == true, dann nimm truepart, wenn false, dann nimm falsepart. Edit: oder natürlich TDM's Lösung nehmen iif is eh viel toller (nagut... aber auch unübersichtlicher) iif ist doch VB, oder?! Da muss man immer casten, das müffelt. geht aber zum glück auch einfacherer: #define iif(c,t,f) ((c)?(t):(f)) Der Ausdruck a kann ein beliebiger arithmetischer, Enum- oder Zeiger-Ausdruck sein, also auch einer mit == oder !=. Betonung liegt hier definitiv auf kann. Ich hab es mir angewöhnt, soweit wie möglich nur bool'sche Ausdrücke (von Bitoperationen mal abgesehen) zu verwenden, da diese nur den Status true oder eben false haben können. Aber das ist wohl Geschmackssache. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.