IltisvdT Geschrieben 18. November 2010 Geschrieben 18. November 2010 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? Zitieren
Klotzkopp Geschrieben 18. November 2010 Geschrieben 18. November 2010 Der Ausdruck b+2 ändert b nicht. Wenn du hier b um zwei erhöhen möchtest: Das wäre b+=2. Zitieren
IltisvdT Geschrieben 18. November 2010 Autor Geschrieben 18. November 2010 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] Zitieren
Klotzkopp Geschrieben 18. November 2010 Geschrieben 18. November 2010 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. Zitieren
IltisvdT Geschrieben 19. November 2010 Autor Geschrieben 19. November 2010 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); } Zitieren
Klotzkopp Geschrieben 19. November 2010 Geschrieben 19. November 2010 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. Zitieren
flashpixx Geschrieben 19. November 2010 Geschrieben 19. November 2010 Für ein alternierendes Vorzeichen innerhalb einer Schleife kann man auch folgendes nehmen: for(std::size_t i=0; i < stop; ++i) std::pow(-1, i) Zitieren
IltisvdT Geschrieben 25. November 2010 Autor Geschrieben 25. November 2010 Vielen Dank. Es funktioniert nun alles. close 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.