Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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:

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 !

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

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.

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?

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.

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

.....

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

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.

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.

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

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

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

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

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

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

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

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.

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

  • 2 Wochen später...

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:

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.