Seite 1 von 1

Integralberechnung

Verfasst: Sa Nov 05, 2016 4:10 pm
von gamma
Hallo...
Ich lerne gerade für einen Test und hab bei einem alten Beispiel Schwierigkeiten es zu lösen.
http://higgs.at/P_5Semester/Datenverarb ... -03-22.pdf
Ich soll ein Programm schreiben welches eine Integralart über eine Summe berechnet. Diese Summe kann rekursiv definiert werden aber als Übung wollte ich ein Programm schreiben welches nur die Summe bis zu einem beliebigen Indizes berechnet.

Code: Alles auswählen

include<iostream>
#include<cmath>
#include<vector>
using namespace std;

int fakultaet(int zahl) {
     if (zahl <= 1) {
         return 1; 
     }
 
     return fakultaet(zahl - 1) * zahl;
 }

int main()
{
	int a{-1},b{2},c{1},d{4},n,g;
	double pi{3.1415},i;
	double z=pow(a,n)*pow(pi/b,b*n);
	double N=fakultaet(b*n)*(d*n+c);
	cout<<"Geben sie einen Wert fuer n ein:"<<endl;
	cin>>n;
	cout<<"n wurde eingegeben"<<endl;
	cout<<"Geben sie eine Intergalgrenze ein"<<endl;
	cin>>g;
	for(int k{0};k<=n; k++)
	{
	i+=z/n*pow(g,4*n+1);
	}
	cout<<"Der Wert des Integrals  ist:"<<i<<endl;
return 0;
}
Vermutlich kann man das Programm einfacher gestallten aber ich lerne ja noch!
Meine Problem ist jetzt das sich das Programm zwar kompelieren lässt, jedoch bei Ausführen die Meldung kommt:""Programmname.exe funktioniert nicht mehr".
Kann mir jemand sagen woran das liegt bzw wie ich das beheben kann? Danke schon mal für die Hilfe!

Re: Integralberechnung

Verfasst: Sa Nov 05, 2016 4:31 pm
von Necip
Warum benutzt Du nicht einen Online-Compiler wie http://ideone.com/ ?

Re: Integralberechnung

Verfasst: Sa Nov 05, 2016 4:38 pm
von gamma
Weil mir von dem Professor der LVA Mingw empfohlen wurde. Aber es sollte doch eigentlich nicht am compiler liegen oder?

Re: Integralberechnung

Verfasst: Sa Nov 05, 2016 5:35 pm
von cloidnerux
Meine Problem ist jetzt das sich das Programm zwar kompelieren lässt, jedoch bei Ausführen die Meldung kommt:""Programmname.exe funktioniert nicht mehr".
Solche Meldungen erscheinen, wenn eine der folgenden Bedingungen auftreten:
Teilen durch 0
Stack Overflow
Segmentation Fault
und andere Hardfaults

Schauen wir uns kurz deinen Code an:

Code: Alles auswählen

int a{-1},b{2},c{1},d{4},n,g;
Du Initialisierst die Variablen, aber nicht alle! Variablen, denen vor der ersten Verwendung kein Wert zugewiesen wird, werden ein undefinierten Wert beinhalten!
Das Problem tritt dann bei der Zeile

Code: Alles auswählen

double N=fakultaet(b*n)*(d*n+c);
auf. Fakultät ist eine rekursive Funktion. Das Problem an rekursiven Funktionen ist, dass jeder Aufruf der Funktion neue Daten auf den Stack legt. Ruft die Funktion sich zu häufig selbst auf, läuft der Stack über und das Programm wird beendet.
Dadurch, dass n keinen Wert zugewiesen bekommt, ist der Wert in n zufällig.
Das Ergebnis von b*n ist damit auch zufällig und meist sehr groß, sodass der Stack Overflow auftritt.

Lösen lässt sich das Problem mit der Initialisierung von n und g, dem entfernen von

Code: Alles auswählen

 double N=fakultaet(b*n)*(d*n+c);
oder dem Umschreiben von "fakultaet(int zahl)" als eine Iterative Funktion, die keinen Stack Overflow erzeugen wird:

Code: Alles auswählen

void fakutlaet(int zahl)
{
    int ergebnis = 1;
    for(; zahl > 1; zahl--)
    {
        ergebnis *= zahl;
    }
    return ergebnis ;
}

Re: Integralberechnung

Verfasst: Sa Nov 05, 2016 9:56 pm
von Necip
gamma hat geschrieben:Weil mir von dem Professor der LVA Mingw empfohlen wurde. Aber es sollte doch eigentlich nicht am compiler liegen oder?
So ein Fehler hatte ich bisher noch nicht. Ich arbeite mit dem C++ Builder XE7. Wenn hier ein Stackoverflow oder schlimmeres passiert bekomme ich i.d.R. eine klare Fehlermeldung mit der Addresse.

Es ist keine schlechte Idee sich mehrere Optionen offen zu halten und zu prüfen, was andere Compiler für Meldungen ausspucken.

Re: Integralberechnung

Verfasst: Sa Nov 05, 2016 10:09 pm
von cloidnerux
So ein Fehler hatte ich bisher noch nicht. Ich arbeite mit dem C++ Builder XE7. Wenn hier ein Stackoverflow oder schlimmeres passiert bekomme ich i.d.R. eine klare Fehlermeldung mit der Addresse.
Das liegt daran, dass das Programm ohne Debugger läuft. Die meisten IDEs machen das von sich aus, wer aber in der Kommandozeile compiliert und ausführt, hat das i.d.r nicht.
Lässt man das Programm mit GDB laufen, erhält man:

Code: Alles auswählen

(gdb) run
Starting program: F:\Downloads\test/test.exe
[New Thread 9560.0x2ca4]
[New Thread 9560.0x21e0]
[New Thread 9560.0x3870]
[New Thread 9560.0x4238]

Program received signal SIGSEGV, Segmentation fault.
0x0040145c in fakultaet(int) ()
Man bekommt also auch gesagt, wo es hapert. Aber nur dann, wenn man den Debugger bemüht.

Re: Integralberechnung

Verfasst: So Nov 06, 2016 5:20 pm
von gamma
Danke cloidnerux deine Erklärung ist ziemlich logisch. Ich habe jetzt die Aufforderung einen Wert für n einzugeben am Anfang gestellt und nun scheint es zu funktionieren. Danke auf alle Fälle für die Hilfe