# Summenzeichnen in C++ ?



## Stephan Liebig (13. Dezember 2007)

Und wieder habe ich eine Frage bezüglich einer Aufgabe:

Ich habe die Formel angehängt, die ich in C++ realisieren soll.


```
double summe(int n, double t) { 0.5 - ( 1/pi * sum( sin(2*pi*j*t )/ j )}
```

Wobei ich hier einfach mal so das sum für das Summenzeichen verwendet habe.

Die ganze Aufgabe sieht dann wie folgt aus:

Es ist eine Funktion double summe(int n, double t) gemäß der angehängten Formel zu
programmieren.

Erstellen Sie ein Testprogramm, welches den Testplan für beide Funktionen überprüfen kann.
Da sich mathematisch zeigen lässt, dass summe eine Näherung für u darstellt, d.h. für große Werte
von n wird die Differenz zwischen u(t) und summe(n,t) „klein“, soll das Testprogramm wiederholt
Werte für n und t einlesen und als Ergebnis die Funktionswerte von summe(n,t), u(t) und die
Differenz der beiden Werte am Bildschirm anzeigen. Verwenden Sie hierzu IO-Manipulatoren.

Die andere Formel ist:


```
#include <iostream>
using namespace std;


int main() {
	double pi = 3.14;
	double t(0);
	int u(0);

	cout << "   Praktikum 4.1" << endl;
	cout << "----------------------------------------------------------" << endl;
	cout << "   Bitte geben Sie ein t ein: ";
	cin >> t;
	
	double res = t - static_cast<int>(t);
	if(res == 0)
		res = 1;
	cout << endl << "An der Stelle " << t << "Betraegt u(t) = " << res;

	system("Pause");

	return 0;

}
```


----------



## MCoder (13. Dezember 2007)

Hallo,

die Summenbildung läuft einfach über eine forlaufende Addition in einer Schleife:

```
double dSumme = 0.0;

for( int j = 1; j <= n; j++ )
{
    dSumme += sin(2*pi*j*t ) / j;
}

dSumme = 0.5 - (1/pi * dSumme);
```
Gruß
MCoder


----------



## Stephan Liebig (13. Dezember 2007)

Okay, super das passt soweit. Aber was meint man denn hiermit:



> *Erstellen Sie ein Testprogramm, welches den Testplan für beide Funktionen überprüfen kann.*



[edit]
Okay, obere Frage hat sich erledigt. Aber wie sieht es aus mit dem IO-Manipulator? Was ist damit gemeint?


----------



## vault-tec (13. Dezember 2007)

Hallo Stefan.




Stephan Liebig hat gesagt.:


> *Erstellen Sie ein Testprogramm, welches den Testplan für beide Funktionen überprüfen kann.*


Damit ist (vermutlich) das folgende gemeint: Mach einen Testplan für beide Funktionen deines Programms und lass die darin enthaltenen Tests durch ein weiteres (von dir zu erstellendes) Programm durchlaufen/prüfen und die Ergebnisse ausgeben.

*Grundlagen eines Testplans:*
Ein Testplan ist im Grunde nichts anderes als ein Vergleich der durch deine Funktionen berechneten Ergebnisse mit den (anderweitig berechneten) erwarteten Ergebnissen, also ein Ist-/Soll-Vergleich. Um einen Testplan zu erstellen musst du dir also Testfälle für deine Funktionen definieren sowie die zu erwartenden Resultate der einzelnen Testfälle.

Gerade im Bereich der Numerik bzw. der Erforschung der Fehlerfortpflanzung macht es Sinn, zu beobachten, wie genau Näherungsformeln an das gewünschte / erwartete Ergebnis herankommen. Aber auch in der IT gehört zu sauberer Softwareentwicklung, dass man sich Gedanken darüber macht, wie das jeweilige Programm / die jeweilige Funktion auf verschiedene Eingaben reagiert bzw. was man erwartet, was als Ergebnis und/oder Reaktion dabei herauskommt.

Dazu solltest du aber eigentlich auch Informationen in deinen Vorlesungsunterlagen bzw. Unterrichtsunterlagen finden. 


Lieben Gruß, Niko


----------



## Stephan Liebig (13. Dezember 2007)

Ich muss sagen, dass sich unsere Vorlesungen weit von den dazugehörigen Praktikas unterscheiden.

Aber das habe ich mittlerweile gelöst. Habe ein drittes Programm geschrieben, dass einfach die beiden Sachen ausrechnet und dann voneinander Stubtrahiert um dann die Differenz der beiden Ergebnisse anzeigt.

Aber was mache ich denn mit dem IO-Manipulator? Hier mein Drittes Programm:


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


int main() {

	// Sägezahn
	double pi = 3.14;
	double t(0), differenz(0);
	int u(0);
	int n(0);

	cout << "   Praktikum 4.1 Testprogramm" << endl;
	cout << "----------------------------------------------------------" << endl;
	cout << "   Bitte geben Sie ein t ein: ";
	cin >> t;
	cout << "   Bitte geben Sie ein n ein: ";
	cin >> n;

	
	double res = t - static_cast<int>(t);
	if(res == 0)
		res = 1;
	cout << endl << "   An der Stelle " << t << " Betraegt u(t) = " << res << endl;
	
	
	//Summenformel
	double dSumme = 0.0;
	
	for( int j = 1; j <= n; j++ )
	{
		dSumme += sin(2*pi*j*t ) / j;
    }
    dSumme = 0.5 - (1/pi * dSumme);

	cout << "\n   Ergebnis der Summenformel: " << dSumme << endl;
	

	//Subtraktion

	differenz = res - dSumme;
	cout << "   Differenz: " << differenz << endl;
	
	cout << "   ";
	cout << system("Pause");

	return 0;
}
```


----------



## vault-tec (13. Dezember 2007)

Stephan Liebig hat gesagt.:


> Ich muss sagen, dass sich unsere Vorlesungen weit von den dazugehörigen Praktikas unterscheiden.


Lass mich raten: Du studierst an einer Uni? Das (der Unterschied zwischen Vorlesung und Praktikum) hat mich letzten Endes dann an die FH gebracht. 




Stephan Liebig hat gesagt.:


> Aber das habe ich mittlerweile gelöst. Habe ein drittes Programm geschrieben, dass einfach die beiden Sachen ausrechnet und dann voneinander Stubtrahiert um dann die Differenz der beiden Ergebnisse anzeigt.


Öhm... Ja gut, aber das ist noch kein Testplan. Dafür müsstest du erstmal mehrere Testfälle definieren: beispielsweise mit verschiedenen Eingabewerten deine Funktionen testen und die dabei herauskommenden Ergebnisse mit denen von der Referenzrechnung z.B. auf Papier vergleichen (lassen). Oder beispielsweise testen, wie sich die eventuelle Invalidität der Benutzereingaben auswirkt.




Stephan Liebig hat gesagt.:


> Aber was mache ich denn mit dem IO-Manipulator?


Wie ich bereits oben schrieb: Überleg dir mit welchen Eingabe-Parametern dein Programm wie umgehen soll bzw. was dabei heraus kommen soll. Pack einzelne Szenarien in Testfälle und diese wiederum mit den zu tätigenden Eingaben und den erwarteten Ergebnissen in einen Testplan.

Zum Beispiel: Wie reagiert dein Programm, wenn der Benutzer (= der Tester) für t anstatt dem erwarteten Double-Wert einen Integer-, Float- oder gar String-Wert eingibt? Wie soll das Programm darauf reagieren (=Soll-Wert) und wie reagiert es dann wirklich (=Ist-Wert) ? Wie wirkt sich dann z.B. eine Implizite Umformung von Int zu Double auf das zu berechnende Ergebnis der Manipulations-Formel aus?

Was gibt dein Programm aus, wenn du es mit einer Standard-Testeingabe fütterst (für t und n z.B. alle Werte von 0,00 bis 99,00) und was erwartest du was es ausgibt? Diese beiden Ergebnisse musst du dann miteinander vergleichen. 


Lieben Gruß, Niko


----------

