Integralberechnung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Integralberechnung

Beitrag von gamma » Sa Nov 05, 2016 4:10 pm

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!

Benutzeravatar
Necip
Beiträge: 122
Registriert: Do Nov 17, 2011 12:03 pm
Kontaktdaten:

Re: Integralberechnung

Beitrag von Necip » Sa Nov 05, 2016 4:31 pm

Warum benutzt Du nicht einen Online-Compiler wie http://ideone.com/ ?

gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Re: Integralberechnung

Beitrag von gamma » Sa Nov 05, 2016 4:38 pm

Weil mir von dem Professor der LVA Mingw empfohlen wurde. Aber es sollte doch eigentlich nicht am compiler liegen oder?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Integralberechnung

Beitrag von cloidnerux » Sa Nov 05, 2016 5:35 pm

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 ;
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Necip
Beiträge: 122
Registriert: Do Nov 17, 2011 12:03 pm
Kontaktdaten:

Re: Integralberechnung

Beitrag von Necip » Sa Nov 05, 2016 9:56 pm

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Integralberechnung

Beitrag von cloidnerux » Sa Nov 05, 2016 10:09 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Re: Integralberechnung

Beitrag von gamma » So Nov 06, 2016 5:20 pm

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

Antworten