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,

wir sollen folgendes machen:

Es gilt Sin(x)=x-(x^3/3!)+(x^5/5!)... wir sollen ein Programm erstellen, dass einen x Wert ausliest und die Berechnung abbricht, wenn das nächste Glied kleiner als eine einzulesende Genauigkeitsschranke ist.

Das Programm soll eigentlich auch Cos(x) und e^x berechnen, hängen aber schon bei sin(x)...

Dies ist bisher unser Programm:

#include <stdio.h>

#include <math.h>

int main(){

int a;

float x, fak, b, genau, glied, erg, n;

printf("Fuer Sin(x) druecke 1, fuer Cos(x) druecke 2 und fuer e^x 3\n");

scanf("%d", &a);

printf("Bitte x-Wert eingeben!\n");

scanf("%f", &x);

printf("Bitte geben Sie die Genauigkeitsschranke ein!\n");

scanf("%f", &genau);

switch(a)

case 1:

b=3;

erg=x;

glied=x;

for(erg=x; glied>genau; b+2)

{

fak=b;

for(b!=0; b>1; b--)

{

fak=fak*(b-1);

}

printf("%f\n", fak);

glied=pow(x, b)/fak;

erg=erg+glied;

}

printf("%f\n", erg);

return(0);

}

Die erste for-Schleife scheint nicht richtig zu laufen.. irgendwelche Tipps?

So haben nun nochmal etwas verändert. Zum Einen sollte jetzt abwechselnd addiert und subtrahiert werden und zum Anderen haben wir das b+2 geändert. Das Ergebnis ist allerdings immernoch falsch. Die Fakultät scheint er richtig zurechnen, aber dann weiter stimmt es nicht. Tipps?

#include <stdio.h>

#include <math.h>


int main(){

    int a;

    float x, fak, b, genau, glied, erg, n;

    printf("Fuer Sin(x) druecke 1, fuer Cos(x) druecke 2 und fuer e^x 3\n");

    scanf("%d", &a);

    printf("Bitte x-Wert eingeben!\n");

    scanf("%f", &x);

    printf("Bitte geben Sie die Genauigkeitsschranke ein!\n");

    scanf("%f", &genau);

    switch(a)

        case 1:

            b=3;

            erg=x;

            glied=x;

            for(erg=x; glied>genau; b+=2, b=0-

            {

                fak=b;

                for(b!=0; b>1; b--)

                {

                    fak=fak*(b-1);

                }

                    printf("%f\n", fak);


                glied=pow(x, b)/fak;

                erg=erg+glied;

            }

    printf("%f\n", erg);

return(0);

}[/code]

b+=2, b=0-b

Damit wechselst du immer nur zwischen 3 und -5 hin und her.

-5 + 2 = -3

0 - (-3) = 3

Auch bei der Prüfung der Genauigkeit und bei der Fakultätsberechnung hast du nicht beachtet, was passiert, wenn b bzw. glied negativ ist.

Ich würde hier einfach eine weitere Variable einführen, die zwischen 1 und -1 wechselt, und b nur für die Reihe 3, 5, 7... benutzen.

Ok, also das mit dem hin und her wechseln sollte ich hinbekommen haben(denk ich). d habe ich zusetzlich eingefügt, weil b ja sonst in der Fakultätsberechnung verändert werden würde und das sollte ja nicht so sein.

Habe die Wurzelfunktion eingefügt, damit überprüft wird, ob der Betrag kleiner als "1" bzw. "genau" ist, wodurch negative Werte für b und glied ja kein Problem mehr bei der Überprüfung sein sollten..

Jetzt habe ich nur das Problem, dass die Fakultät gar nicht mehr berechnet wird, finde allerdings den Fehler nicht:/

#include <stdio.h>

#include <math.h>


int main(){

    int a, c;

    float x, fak, b, d, genau, glied, erg, n, test, test1;

    printf("Fuer Sin(x) druecke 1, fuer Cos(x) druecke 2 und fuer e^x 3\n");

    scanf("%d", &a);

    printf("Bitte x-Wert eingeben!\n");

    scanf("%f", &x);

    printf("Bitte geben Sie die Genauigkeitsschranke ein!\n");

    scanf("%f", &genau);

    switch(a)

        case 1:

            b=3;

            erg=x;

            glied=x;

            for(c=1; test>genau; b+=2, c=-c)

            {

                b=b*c;

                fak=b;

                d=b;

                for(; test1!=1; d--)

                {

                    fak=fak*(d-1);

                    test1=sqrt(d*d);

                }

                    printf("%f\n", fak);


                glied=pow(x, b)/fak;

                erg=erg+glied;

                test=sqrt(glied*glied);

            }

    printf("%f\n", erg);

return(0);

}

Ok, also das mit dem hin und her wechseln sollte ich hinbekommen haben(denk ich).
Nein, hast du nicht. b wechselt immer noch das Vorzeichen. Dadurch, dass du das aus dem Schleifenkopf in den Rumpf verschoben hast, hast du nichts verbessert.

Lass b und glied immer positiv sein, und verwende c als Faktor beim Aufsummieren des Ergebnisses. Dann kannst du dir diese Wurzelzieherei sparen.

Außerdem solltest du dir dringend angewöhnen, alle Variablen zu initialisieren, ansonsten stehen da irgendwelche Werte drin. Du verwendest test und test1, bevor du ihnen irgendetwas zuweist.

Vielen Dank. Es funktioniert nun alles.

close

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.