athlet1 Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Zusatzaufgabe: Schreiben sie das Programm ohne eine einzige If-Anweisung! Murcks Ich bezog mein Posting auf diese Aussage. Naja, für mich ist die Aufgabenstellung eindeutig so, dass diese Funktionen nicht erlaubt sind (siehe 2.) vllt. soll das auf irgernd eine mathematische funktion abzielen? Da sind wir wieder bei Funktionen Es bleibt halt ein gewisser Interpretationsfreiraum. Zitieren
Guybrush Threepwood Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Nich wirklich eine mathematische Funktion ist z.B. sowas: f(x) = 2y und nicht irgendeine Funktion einer Programmiersprache Ich sehe auch keine Möglichkeit das ohne if und ähnliches zu lösen. Man könnte zwar auch anderes rausbekommen welche zahl von zweien die kleinere/größere ist, aber irgendwie muss man ja am Ende das Ergebnis auswerten... Zitieren
Murcks Geschrieben 6. Februar 2006 Autor Geschrieben 6. Februar 2006 Also, um nochmal Klarheit in die Sache zu bringen: Es handelt sich, wie schon geschrieben, um eine alte Klausuraufgabe. Man darf nur das benutzen, was bis dahin auch im Unterricht durchgenommen wurde, und das war zu dem Zeitpunkt: iostream.h Datentypen: void, int, char, float, double, (unsigned/short/long) Operatoren: !, ~, +, -, ++, --, *, /, %, <<, >>, <, >, =, ==, !=, &, && |, ||, gekoppelte Zuweisungen wie += oder -= cout cin (If-Anweisung, für den zweiten Teil der Aufgabe ja nicht mehr!) Und nochmal die Aufgabe wie sie tatsächlich gestellt wurde: AUFGABE Schreiben Sie ein C++-Programm, welches folgende Funktionalität hat: Es sollen drei Zahlen (Datentyp float) über die Tastatur eingelesen werden. Anschließend sollen das Minimum und das Maximum der drei Zahlen auf dem Bildschirm angezeigt werden. Zusatz 1: Benutzen Sie bei der Umsetzung genau drei If-Anweisungen. Zusatz 2: Schreiben Sie das Programm ohne eine einzige If-Anweisung zu benutzen. Würde mich daher SNOWMAN anschließen: Es müsste über eine mathematische Funktion zu lösen sein... Zitieren
Guybrush Threepwood Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Yup ein interessante Lösung dazu (und hoffentlich bald noch ein paar weitere) gibts hier: http://www.fun-soft.de/showtopic.php?threadid=14146 Zitieren
Klotzkopp Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Auf etwas ähnliches war ich auch gerade gekommen. Der Schlüssel ist die implizite Konvertierung von bool in "echte" Zahlentypen. Zitieren
Ntl Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Öhm, in einem der Lösungsbeispiele steht folgendes: std::cout << "max: " << a*(a>b && a>c)+b*(b>a && b>c)+c*(c>a && c> << std::endl; std::cout << "min: " << a*(a<b && a<c)+b*(b<a && b<c)+c*(c<a && c< << std::endl;[/code] Was machen diese Zeilen genau? Kann mir das jemand erklären? Zitieren
marcom Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Ich denk mal, dass nur dieser Abschnitt unklar ist, gell? "a*(a>b && a>c)+b*(b>a && b>c)+c*(c>a && c>b)" Betrachten wir mal nur "a*(a>b && a>c)" - der Ausdruck "(a>b && a>c)" ist logisch 1 wenn a größer als b ist und gleichzeitig a größer als c ist. somit ergibt die Gleichung nichts weiteres als "a*1" sprich a. Die restlichen 2 Abschnitte machen das gleiche - nur halt mit b und mit c (und dort wird geprüft, ob b größer als der Rest ist bzw ob c größer als der Rest ist) Angenommen, a sei die größte Zahl, so ist der 2. logische Teil 0 und der dritte auch - somit ergibt sich a*(1) + b*(0) + c*(0) und das ist nichts weiteres als a! Beim Minimum wird das gleiche gemacht, nur eben statt ">" "<". Ganz wichtig: die größte Zahl bzw. die kleinste Zahl darf nicht doppelt vorkommen! Denn sonst wären die logischen Teile immer 0! Assemblermäßig kommt der gleiche Code raus, ob man nun if(a> schreibt oder man das "if" einfach weglässt - es wird immer noch a mit b verglichen und die entsprechenden Register werden gesetzt. Somit ist der Algorithmus zwar korrekt, aber es muss ausgeschlossen sein, dass zwei/drei identische Zahlen eingegeben werden! Zitieren
Bubble Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Wenn die Eingabe in einen assoziativen Container ( würde ein set<float> nehmen) geschrieben wird, wird sie automatisch in aufsteigender Reihenfolge gespeichert. Und nun rate mal wie der Container ein Element einordnet... ...richtig: Durch Vergleiche. Zitieren
athlet1 Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Und nun rate mal wie der Container ein Element einordnet... ...richtig: Durch Vergleiche. Danke für den Hinweis Es ging um die Implementierung durch Murcks und nicht den internen Aufbau einer Bibliotheksfunktion. Mal davon abgesehen das (wie in den letzten Posts zu sehen) dieser Vorschlag wie auch andere (std::min usw.) als Lösung nicht in Betracht kamen. Zitieren
SNOWMAN Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Ha! ich wussts doch, dass da ne math. funktion gefragt ist. ich bin zwar n mathen00b und wäre da nie drauf gekommen, aber ich wusste zumindest wo ich ansetzen musste :cool: Zitieren
Bubble Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Danke für den Hinweis Es ging um die Implementierung durch Murcks und nicht den internen Aufbau einer Bibliotheksfunktion. Vielleicht hätte ich es diplomatischer ausdrücken können, aber es ging bei der Aufgabe halt nicht darum die "if"s in Funktionen zu verstecken (oder fertige Funktionen zu nutzen). Zitieren
gajUli Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Zur allgemeinen Belustigung noch eine Variante, die mir ein Freund schickte: int main() { float a, b, c; cin >> a >> b >> c; cout << "Maximum " << (a >? b >? c) << endl; cout << "Minimum " << (a <? b <? c) << endl; } Soll aber nur mit GNU C++ funktionieren und ist darum eigentlich off topic wegen Standardnichtkonformitaet. Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Ja stimmt der VC++6 übersetzt das wie erwartet nicht. Allerdings verstehe ich das Auch nicht so ganz wie das funktionieren soll? Zitieren
Klotzkopp Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Das sind Compilererweiterungen. Für C++ hat der GCC zwei zusätzliche binäre Operatoren, <? und >?, Minimum und Maximum. Zitieren
athlet1 Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Vielleicht hätte ich es diplomatischer ausdrücken können Simmt. Bin aber nicht beleidigt;) 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.