GaZa Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 Hallo liebe Info freunde. Ich hab ein mittelschweres Problem und hoffe ihr könnt mir weiterhelfen. Folgendes: Ich muss ein Programm schreiben dass: - Die 4 Grundrechenarten beherrscht - Mit mit 2 Brüchen rechnet - Das Ergebnis 1 mal ungereundet und 1 mal gerundet anzeigt (das mit dem runden füg ich später noch ein) Ich hab mir gedacht ich teile den Grundrechenarten die Zahlen 1 bis 4 zu... (bitte nicht sagen dass das viel zu umständlich ist und dass das viel einfacher geht... ich steh gerade mal am anfang ^^) Programm: #include <stdio.h> #include <stdlib.h> int main() { int z1; int z2; int n1; int n2; double c; int operation; double s; double q; printf("Welche Operation soll ausgefuehrt werden?\n(Addition 1, Subtraktion 2, Multiplikation 3, Division 4)\n\n"); printf("Operation = "); scanf("%d",&operation); fflush(stdin); printf("\nZaehler erste Zahl: "); scanf("%d",&z1); fflush(stdin); printf("\nNenner erste Zahl: "); scanf("%d",&n1); fflush(stdin); printf("\nZaehler zweite Zahl: "); scanf("%d",&z2); fflush(stdin); printf("\nNenner zweite Zahl: "); scanf("%d",&n2); if(operation==1) { /*Addition*/ s=(z1/n1); q=(z2/n2); c=(s+q); printf("Ergebnis = "); printf("%lf",c); } else { if(operation==2) { /*Subtraktion*/ s=(z1/n1); q=(z2/n2); c=(s+q); printf("Ergebnis = "); printf("%d",c); } else { if(operation==3) { /*Multiplikation*/ s=(z1/n1); q=(z2/n2); c=(s+q); printf("Ergebnis = "); printf("%d",c); } else { if(operation ==4) { /*Division*/ s=(z1/n1); q=(z2/n2); c=(s+q); printf("Ergebnis = "); printf("%d",c); } else { /*Error*/ printf("Es wurde ein Fehler festgestellt"); } } } } } z1--> Zähler erste Zahl n1--> Nenner erste Zahl z2--> Zähler zweite Zahl n2--> Nenner zweite Zahl s--> Erster Bruch q--> Zweiter Bruch c--> Ergebnis des Rechenvorgangs Mein Problem: Ich habe das Programm zunächst ohne die fflush eingegeben und ausgeführt.. da kahm allerdings in jedem der 4 fälle 0 als ergebnis raus... ich dachte mir dass es vielleicht am tastaturpuffer liegen könnte... und ich hab nach jeder eingabe mal fflush(stdin); eingebenen... doch das hat nich wirklich was gebracht (das ergebnis blieb 0) =( ich denke mal dass es vielleicht daran liegen könnte dass ich das fflush() falsch benutzt habe.. Kann mir bitte einer auf die sprünge helfen? Ich steh auf dem schlauch Zitieren
flashpixx Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 Du brauchst die Else-Blöcke nicht. Schau Dir mal Deinen Code an: s=(z1/n1); q=(z2/n2); c=(s+q); Dieser Code ist bei allen Operationen Addition, Multiplikation, Division und Subtraktion identisch. Außerdem solltest Du Dir noch einmal Gedanken entweder über den Typ der Variablen machen oder Dir die Gesetze zur Bruchrechnung anschauen und die mathematisch korrekt implementieren ! Zitieren
GaZa Geschrieben 25. Oktober 2009 Autor Geschrieben 25. Oktober 2009 (bearbeitet) ahm... ja ich merks.... ich hab vergessen nach dem kopieren des blocks... die zeichen zu ändern... hier ist das berichtigte: #include <stdio.h> #include <stdlib.h> int main() { int z1; int z2; int n1; int n2; double c; int operation; double s; double q; printf("Welche Operation soll ausgefuehrt werden?\n(Addition 1, Subtraktion 2, Multiplikation 3, Division 4)\n\n"); printf("Operation = "); scanf("%d",&operation); fflush(stdin); printf("\nZaehler erste Zahl: "); scanf("%d",&z1); fflush(stdin); printf("\nNenner erste Zahl: "); scanf("%d",&n1); fflush(stdin); printf("\nZaehler zweite Zahl: "); scanf("%d",&z2); fflush(stdin); printf("\nNenner zweite Zahl: "); scanf("%d",&n2); if(operation==1) { /*Addition*/ s=(z1/n1); q=(z2/n2); c=(s+q); printf("Ergebnis = "); printf("%lf",c); } else { if(operation==2) { /*Subtraktion*/ s=(z1/n1); q=(z2/n2); c=(s-q); printf("Ergebnis = "); printf("%d",c); } else { if(operation==3) { /*Multiplikation*/ s=(z1/n1); q=(z2/n2); c=(s*q); printf("Ergebnis = "); printf("%d",c); } else { if(operation ==4) { /*Division*/ s=(z1/n1); q=(z2/n2); c=(s/q); printf("Ergebnis = "); printf("%d",c); } else { /*Error*/ printf("Es wurde ein Fehler festgestellt"); } } } } } Bearbeitet 25. Oktober 2009 von Klotzkopp QUOTE- durch CODE-Tags ersetzt Zitieren
Klotzkopp Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 Ich habe das Programm zunächst ohne die fflush eingegeben und ausgeführt.. da kahm allerdings in jedem der 4 fälle 0 als ergebnis raus...Zum eigentlichen Problem hat flashpixx schon alles gesagt. Ich hätte noch zwei Anmerkungen: fflush(stdin) erzeugt undefiniertes Verhalten, der Code ist dadurch nicht mehr portabel. Und bitte denk dir für deine Threads aussagekräftige Titel aus. Ich hab den hier mal für dich angepasst. Zitieren
GaZa Geschrieben 25. Oktober 2009 Autor Geschrieben 25. Oktober 2009 kann schon sein dass er den fehler meint... aber ich versteh seinen standpunkt nicht... wieso bauche ich die else nicht? bei mir gibt es 4 verschiedene fälle.. 1 addition 1 subtraktion 1 multipli. und 1 division.. und die arbeitet er der reihe nach durch... addition = 1 sub =2 usw. ich hab 4 fälle und in jedem fall muss er entweder +,-,* oder / rechnen... und die sind ja unterschieden... ich versteh nich warum ich die nich brauche oO? Zitieren
Klotzkopp Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 wieso bauche ich die else nicht? Das ist mehr oder weniger ein Schönheitsfehler. Aber lies doch bitte auch den Rest von flashpixx' Beitrag. Ich vermute übrigens, dass der Sinn dieser Aufgabe ist, dass du das Ergebnis wieder als Bruch ausgibst. Ansonsten wäre das wirklich zu einfach. Zitieren
flashpixx Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 und die sind ja unterschieden... ich versteh nich warum ich die nich brauche oO? Denk mal darüber nach, es wir immer genau ein If-Konstrukt durchlaufen. Ich würde auch Dir zu einem switch-case raten. Deine jetzige Struktur ist nicht falsch, nur sie ist absolut unleserlich. Du willst immer genau eine von 4 Möglichkeiten durchlaufen, das bedeutet auch, wenn es die erste nicht ist, muss es genau eine von den nachfolgenden 3 sein usw., bzw. wenn es die erste nicht ist, sind die anderen egal @Klotzkopp: Ich denke auch die Aufgabe sollte sein 2 Brüche einzugeben und ebenfalls als Ausgabe einen Bruch zu erhalten und diesen ggf in gekürzter Form, d.h. 3/2 * 4/2 = 12/4 = 3/1 = 3 Zitieren
GaZa Geschrieben 25. Oktober 2009 Autor Geschrieben 25. Oktober 2009 ..... ich hab mir sienen beitrag durchgelesen-.. und ich kann mich nur wiederholen.. ich verstehe seinen standpunkt nicht... und ich soll das ergebnis als kommazahl angeben nicht als bruch.... danach soll diese kommazahl gerundet werden... aber das mit dem runden mach ich noch ich will wissen warum da 0 rauskommt... das is das was ich nicht verstehe... ich hab c mit double definiert... wieso kommt da 0.000000 raus? und ich hab vom prof vermittelt bekommen dass beim "if" erst der ja fall kommt und dann der nein fall... den nein fall sollte ich mit else einleiten.. und dann in den nein fall das nächste if einfügen.... Zitieren
flashpixx Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 ich will wissen warum da 0 rauskommt... das is das was ich nicht verstehe... ich hab c mit double definiert... wieso kommt da 0.000000 raus? Weil Deine Deklaration Deiner Variablen so nicht in Ordnung ist ! und ich hab vom prof vermittelt bekommen dass beim "if" erst der ja fall kommt und dann der nein fall... den nein fall sollte ich mit else einleiten.. und dann in den nein fall das nächste if einfügen.... Nimm ein Blatt Papier und schreib es Dir auf: Wenn Multiplikation multipliziere wenn nicht Multiplikation Wenn Addition ..... ist analog zu Wenn Multiplikation multipliziere wenn Addition addiere ..... Der "Else-Zweig" ist optional. Außerdem wäre hier ein Switch-Case Ausdruck angebracht und keine If-Konstrukte. Zitieren
Klotzkopp Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 ich will wissen warum da 0 rauskommt... das is das was ich nicht verstehe... ich hab c mit double definiert... wieso kommt da 0.000000 raus? Wenn du int durch int teilst, kommt dabei wieder int raus. Das Ergebnis dann einem double zuzuweisen, rettet die Rechnung auch nicht mehr. Mindestens einer der Operanden muss ein Fließkommatyp sein. Ein Cast reicht hier aus. Zitieren
GaZa Geschrieben 25. Oktober 2009 Autor Geschrieben 25. Oktober 2009 Die aufgabenstellung hieß schreib nen progi bei dem du zähler und nenner von 2 brüchen seperat eingibst.. mit diesen sollen dann die 4 grundrechenarten realisierbar sein.. sprich +-*/ das ergebniss soll ne kommazahl sein... diese kommazahl soll nach ihrer ausgabe noch einmal gerunden rauskommen.. sprich wenn da 5.823434 raus kommt sollte dies einmal so gedruckt werden... und ein weiteres mal als 5.82 @klotzkopp.. danke ... für den tipp mit den kommastellen... @ flashpixx... was du von mir willst versteh ich immernochnicht oO... ichhab mir das so gedacht.. Addition ordne ich der 1 zu subtraktion der 2 multiplikation der 3 und division der 4... dann lasse ich den benutzer die operation durch eingabe von 1-4 auswählen... wenn das die division sein sollte.. sprich die 4 sieht das bei mir im diagramm so aus: Ist die Operation eine Addition? -->Nein (dann kommt die nächste frage) Ist die Operation eine Subtraktion?--> Nein Ist die Operation eine Multiplikation? --> Nein Ist die Operation eine Division? --> Ja dann rechnet er den zweig für die Division... in dem fall: s=(z1/n1); q=(z2/n2); c=(s/q); printf("Ergebnis = "); printf("%d",c); (den hinweis von klotzkopp.. hab ich da doch nicht verbessert...) fals er eine 5 eingibt... oder 3542.. oder sonnst was... ist keiner der 4 fälle erfüllt und er gibt wie unten geschrieben die Fehlermeldung aus... was is falsch an dem ansatz? also ich hab schon gesagt dass ich mit dem programieren gerade eben erst angefangen habe und was du unter einem switch verstehst.. weiss ich nicht... ich sollte das als "if" machen.. (nur um laut proff ein gefühl dafür zu benutzten...) Zitieren
flashpixx Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 was is falsch an dem ansatz? also ich hab schon gesagt dass ich mit dem programieren gerade eben erst angefangen habe und was du unter einem switch verstehst.. weiss ich nicht... ich sollte das als "if" machen.. (nur um laut proff ein gefühl dafür zu benutzten...) C - Kurs switch Anweisung Du solltest zusätzlich einmal prüfen, was Passiert wenn Du 1/0 + 1/3 eingibst ebenso wie 1/2 / 0/4 Zitieren
chooter696 Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 was flashpixx auserdem meint ist das nach einer if nicht zwingend eine else anweisung kommen muss Else ist rein optional und ein if block ist auch 100% syntax richtig ohne else Zitieren
GaZa Geschrieben 25. Oktober 2009 Autor Geschrieben 25. Oktober 2009 (bearbeitet) ja mir ist schon klar dass ein if block reicht... nämlich das für "true"... wenn da "false" kommt.. macht das ding garnix... in meinem fall SOLL!!! er aber was machen.. und zwar das nächste if starten... verstehst? und mit dem switch ist das auch so ne sache... wir haben das nocht nicht beigebracht bekommen... meine freage an der stelle.. könnte das programm in dem aufbau ÜBERHAUPT funktionieren? sprich darf ich in ein "IF" ein weiteres "IF" einbauen? also dass wer bei true... irrgentwas rechnet und bei false einen weiteres if macht... Bearbeitet 25. Oktober 2009 von GaZa Zitieren
chooter696 Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 natürlich kannst du in eine if eine weitere if reinklatschen. aber du kannst auch einfach if(addition) { } if(subtraktion) { } if(multiplikation) { } if(division) { } warum alles verschachteln wenn es mit 4 if blöcken auch geht Zitieren
flashpixx Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 in meinem fall SOLL!!! er aber was machen.. und zwar das nächste if starten...verstehst? Du solltest mal überlegen, ob das hier so angebracht ist. Im Gegensatz zu Dir sind hier Menschen, die seit Jahren programmieren und Dir einen Ratschlag geben, dass es auch ohne den Else-Block zu einem syntaktisch, sowie semantisch korrekten Ergebnis führt. Dein Else ist zwar syntaktisch korrekt, würde aber bei mir im Tutorium zu Punktabzug führen, da es einen schwer lesbaren Code erzeugt und auch überflüssig ist. und mit dem switch ist das auch so ne sache... wir haben das nocht nicht beigebracht bekommen... Es schadet sicher nicht, es sich einmal anzuschauen. meine freage an der stelle.. könnte das programm in dem aufbau ÜBERHAUPT funktionieren? syntaktisch ist das Programm durchaus mit verschachtelten If-Else korrekt, aber Du solltest auch die Semantik prüfen, denn der Bruch 1/0 liefert bei Dir ein undefiniertes Ergebnis und somit einen Absturz Deines Programms. Ebenso wie die von mir genannte Division Zitieren
Klotzkopp Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 Dein Else ist zwar syntaktisch korrekt, würde aber bei mir im Tutorium zu Punktabzug führen, da es einen schwer lesbaren Code erzeugt und auch überflüssig ist.Ich würde das nicht pauschal abwerten. Ich halte es eher für überflüssig, die nachfolgenden Bedingungen alle noch zu prüfen, wenn eine wahr ergeben hat. Genau das passiert aber, wenn man das ohne else macht. Zitieren
flashpixx Geschrieben 25. Oktober 2009 Geschrieben 25. Oktober 2009 Ich halte es eher für überflüssig, die nachfolgenden Bedingungen alle noch zu prüfen, wenn eine wahr ergeben hat. Genau das passiert aber, wenn man das ohne else macht. Nein, das stimmt auf den heutigen CPUs nicht mehr. Ein If führt dazu, dass der CPU warten muss, bis das Ergebnis des Bool Ausdrucks vorliegt. Darum werden meiste beide Zweige schon voraus berechnet, obwohl das Ergebnis noch nicht feststeht. Bei dem aufgelösten If müsste der Compiler erkennen, dass hier ein Switch-Konstrukt vorliegt und es entsprechend optimieren. Ebenso werden Count-Schleifen, bei denen Beginn und Ende fix ist als duplizierter Code letztendlich kompiliert (Loop Enrollment). Zitieren
Klotzkopp Geschrieben 26. Oktober 2009 Geschrieben 26. Oktober 2009 Bei dem aufgelösten If müsste der Compiler erkennen, dass hier ein Switch-Konstrukt vorliegt und es entsprechend optimieren. Da stecken jetzt aber etliche Annahmen über die Architektur des Zielrechners, die Fähigkeiten und die Verwendung des Compilers drin. Wie auch immer, diese Abwertung sollte meiner Meinung nach nicht mehr gelten, wenn es für Mensch und/oder Compiler nicht mehr so offensichtlich ist, dass die Bedingungen sich gegenseitig ausschließen. Zitieren
GaZa Geschrieben 26. Oktober 2009 Autor Geschrieben 26. Oktober 2009 Dein Else ist zwar syntaktisch korrekt, würde aber bei mir im Tutorium zu Punktabzug führen, da es einen schwer lesbaren Code erzeugt und auch überflüssig ist. also tut mir leid aber ob das bei dir zum punkteabzug kommt oder nicht... is für mich jez an der stelle eigentlich wurst... ich hab meine aufgabenstellung -------------------------------------- Ich habe die Else-blöcke bewusst so rein getan... weil wir das so machen sollten... ich weiss sehr wohl dass man den else block weglassen kann und nur IF { irrgentwas } schreiben kann.. wenn ihr jez her kommt und mir sagt dass das viel zu umständlich und verwirrend ist... und ich das irrgentwie anders mit men "switch" machen soll .. bringt mir das garnichts.. weil wir das mit else machen sollten... ich kann ja nich hingehen und sagen.. was der von mir will da pfeif ich drauf... ich mach das so wie ichs für richtig halte... ich hab meine aufgabenstellung und ich muss die auch so erfüllen.. @ chooter... danke... du bist der erste der mir in diesem threat richtig weitergeholfen hat ^^... jez weiss ich auch dass der aufbau wenigstens semantisch richtig war... Zitieren
Rekon1602 Geschrieben 5. November 2009 Geschrieben 5. November 2009 Warum nicht einfach: if( operation == 1) { //Addition } else if(operation == 2) { //Subtraktion } else if(operation == 3) { //Multiplikation } else if(operation == 4) { //Division } else { //Was du sonst tun willst, wenn keine gültige operation eingegeben wurde } :confused: Zitieren
TDM Geschrieben 5. November 2009 Geschrieben 5. November 2009 Warum nicht einfach Programmierer sind schreibfaul. (ich zumindest) Switch + Enum 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.