Problem mit C++ Programm

Gobo939

Bastler
07. Februar 2006
800
0
13.091
Ich hab folgendes Programm für Info geschrieben es soll den arccot über eine Summenformel berchnen (Formel s.h. Bild). das Programm wird zwar Problemlos kompiliert und gibt auch bei beträgen größer 5 aus das der Betrag zu groß ist, aber wenn ich z.b. 0.5 eingebe passiert einfach garnichts mehr ich vermute das ich irgendwo ne endlosschleife hab weeis aber nicht wo. wär cool wenn mir jemand helfen könnt.

mfg Gobo939

#include<iostream>
#include<cstdlib>
#include<cmath>

using namespace std;

int main()
{
float x,a;
int k;
double fac;
double zaehler,nenner,epsilon;
double glied_davor,glied_aktuell,summe;
const double pi = 3.14159265;
bool epsilon_unterschritten;

cout<< "Dieses Programm dient dem berechnen der Arcuscotangens Funktion y=f(x)=arccot(x)"<<endl;
cout<< "================================"<<endl;
cout<< "fuer Eingaben von |x|<1";
cout<< "Bitte geben sie einen Wert x ein"<<endl;
cin>> x;
cout <<"Bitte geben sie ein Abbruchkriterium Epsilon ein\n";
cout <<"Hinweis: Wenn Epsilon groesser als 0.000001 ist wird es auf 0.0000001 festgesetzt\n";
cin >> epsilon;

if (epsilon > 0.000001) // Festlegen des Abbruchkriteriums
{ epsilon = 0.0000001;}

if((x>1)||(-x>1))//abfrage ob Betrag x größer 1
{
cout<< "Der Arcuscotangens ist für diesen x Wert nicht definiert."<<endl;
cout<< "Bitte starten sie das Programm erneut und geben sie einen anderen Wert für x ein"<<endl;
return 1;
}
else
{
k=1;
fac = -1;
zaehler=x*x*x;
nenner=3;
glied_davor=zaehler/nenner;
summe=pi/2-x+glied_davor;
epsilon_unterschritten=false;
k++;

do
{
zaehler=zaehler*(-(x*x));
nenner=(2*k+1);
glied_aktuell=zaehler/nenner;
k++;
if(glied_davor-glied_aktuell<=epsilon)
{
epsilon_unterschritten == true;
cout << "Ergebnis :" << summe << endl;
cout <<"Anzahl der Durchläufe k = (" << k << ")\n";
cout <<"Kontrolle durch <cmath> mit der Formel: (pi/2)-arctan(x)\n";
cout <<"arccot(x) =" << (pi/2)-atan(x) << endl;
system("pause");

}
else
{
summe = summe + fac*glied_aktuell;
glied_davor = glied_aktuell;
fac=fac*-1;
}
}

while(k<=20);

cout << "\nErgebnis:" << endl;
cout << "==============" << endl;
cout << "arccot(x) = " << summe << endl;
cout << "(Anzahl der Durchläufe in der Summenformel: k = " << k << " )" << endl;
cout <<"Kontrolle durch <cmath> mit der Formel: (pi/2)-arctan(x)\n";
cout <<"arccot(x) =" << (pi/2)-atan(x) << endl;
}

system("PAUSE");
}
 
Zuletzt bearbeitet:
Extrem umständlich geschrieben.

In die erste if-Abfrage einfach eine return-Anweisung rein und den else-Zweig ohne das else schreiben.
Do while-Schleifen benutzt man eigentlich auch nimmer. Mach lieber eine ordentliche while-Schleife draus.
Und der Fehler liegt hier:

epsilon_unterschritten == true;

== ist ein Vergleichs- und kein Zuweisungsoperator. 😉

Edit: Achso und die Wertzuweisungen für die Variablen gleich bei der Deklaration machen int k(1); und nicht mitten im Quellcode.
 
Zuletzt bearbeitet:
@ebenfalls OT, an Wolkenmann:
Ist gar nicht so schlimm. 😉 Im Informatikstudium ist das da oben unterm Standard der Erstsemester. Die schreiben lieber so nette Progrämmchen, mit denen du herausfinden kannst, was die minimalste Zugzahl eines Schachpferdes ist, das von A nach B will. 😀
Ach ja, und die Profs bringen absolut keine Programmiersprachen bei, sondern nur das Programmieren an sich. Die Sprachen mußt du schon autodidaktisch lernen, je nach dem, was gerade gefordert wird... 😛cwhack:
 
Noch ein paar Anmerkungen zum Quellcode.
- Warum hast du im Code 2mal "k=k+1;" drinstehen? Ich würde es in der Schleife hinter das "a=a*x;" setzen, spart Codezeilen und sieht übersichtlicher aus.

- Damit gleich weiter zum nächsten Punkt, in der Schleife definierst du "a=a*x;". Laut der von dir angegebenen Formel sollte sich bei jedem folgenden Glied von a das x in der Potenz 2 erhöhen, sprich es sollte lauten "a=a*x*x;". Darüber hinaus scheinst du das alternierende Vorzeichen der Glieder nicht zu berücksichtigen, also müsste es in der Endfassung korrekt lauten a=a*x*(-x);

- Dann ist ein deiner Schleife noch folgendes "glied_aktuell=zaehler/nenner", da fehlt doch das aktuelle a drin oder? Müsste also lauten "glied_aktuell=zaehler/nenner*(a)"?

Das sind jetzt die Sachen die mir so auf den ersten Blick aufgefallen sind, andere Korrekturen hast du ja auch schon bekommen.

MfG
Durfast von Mordrak