Zum Inhalt springen

Rechnen mit Brüchen (war: Nachhilfe bei hausaufgaben ^^)


GaZa

Empfohlene Beiträge

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 :rolleyes:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 !

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Klotzkopp
QUOTE- durch CODE-Tags ersetzt
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

.....

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....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von GaZa
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...