C Was genau macht dieses Programm

DieAnfängerin

Cadet 1st Year
Registriert
Okt. 2015
Beiträge
9
Hallo,

vor 2 Wochen habe ich folgendes Programm, zu einer vorgelegten Aufgabe geschrieben.
Jetzt weiß ich garnicht mehr was genau dieses Programm macht. Ich komme nicht ganz auf den Mathepart und würde aber gerne das PaP dazu erstellen.

Dann habe ich nochkleiner Fragen zum Code.

- Was bedeutet " <= " ?

- Was bezweckt ((double)*(double)i) und wieso muss ich meine double in Klammern schreiben ?

- Wie kann ich ,sqart(6 * calculate_summe(n))) verstehen, was macht genau dieser Abschnitt im Programm.
(das sqart die Wurzel zieht verstehe ich und es wir etwas innerhalb der Wurzel mal 6 gerechnet...aber ich denke solange ich die Rechnung nicht kenne verstehe ich auch nicht genau was da passiert)

Code:
#include<stdio.h>
#include<math.h>

double calculate_summe(int n)
{
	double Summe = 0.0;
	int i;
	for (i = 1; i <= n; i++)
	{
		Summe = Summe + 1.0 / ((double)i*(double)i);
	}

	return Summe;
}

int main()
{
	int n;

	printf("\n\nGebe sie n ein:");
	scanf("%d", &n);
	printf("Pi: %lf", sqrt(6 * calculate_summe(n)));

	return 0;
}

ich hoffe ihr könnt mir helfen, wieder zu verstehen was ich vor zwei Wochen selbest gemacht habe :/
 
<= bedeutet "kleiner oder gleich". (double) musst du in Klammern schreiben, weil du keine Variable erstellest, sondern i vom Typ int zum Typ double castest.

Der Rest sollte sich daraus herleiten lassen.
 
Zuletzt bearbeitet:
Alternative Version: Du hast das Programm bekommen und möchtest jetzt wissen, was es macht. Ich bezweifle, dass du es geschrieben hast und man bei der geringen Menge an Code in 2 Wochen wieder vergisst was es macht.

Abgesehen davon ist das hier kein Hausaufgabenforum, was auch deutlich oben angepinnt steht.
 
DieAnfängerin schrieb:
vor 2 Wochen habe ich folgendes Programm, zu einer vorgelegten Aufgabe geschrieben.

Möglich, aber unwahrscheinlich.

Jetzt weiß ich garnicht mehr was genau dieses Programm macht. Ich komme nicht ganz auf den Mathepart und würde aber gerne das PaP dazu erstellen.

Code:
printf("Pi: %lf",

Was meinst Du denn, was da steht?

- Wie kann ich ,sqart(6 * calculate_summe(n))) verstehen, was macht genau dieser Abschnitt im Programm. (das sqart die Wurzel zieht verstehe ich und es wir etwas innerhalb der Wurzel mal 6 gerechnet...aber ich denke solange ich die Rechnung nicht kenne verstehe ich auch nicht genau was da passiert)
Du sagtest:
"vor 2 Wochen habe ich folgendes Programm, zu einer vorgelegten Aufgabe geschrieben."​

Really?
 
Doch das Programm habe ich geschrieben aber mit Hilfestellung, dies war eine Aufgabe die wir im Testat machen mussten, aber ich alleine nicht geschafft habe (bin auch durchgefallen), möchte diese Aufgabe aber gerne für mich verständlich in meinen Ordner abheften und ich glaube das Fällt nicht unter Hausaufgabe, wenn ich wirklich nur etwas verstehen möchte für mich selbst :)

Und wenn ich etwas nicht verstanden habe bzw. nicht ganz nachvollziehen kann, kann ich mir das leider nicht merken.
 
DieAnfängerin schrieb:
vor 2 Wochen habe ich folgendes Programm, zu einer vorgelegten Aufgabe geschrieben.
Jetzt weiß ich garnicht mehr was genau dieses Programm macht. Ich komme nicht ganz auf den Mathepart und würde aber gerne das PaP dazu erstellen.

ich hoffe ihr könnt mir helfen, wieder zu verstehen was ich vor zwei Wochen selbest gemacht habe :/

comedy gold
 
DieAnfängerin schrieb:
dies war eine Aufgabe die wir im Testat machen musste

Wie lautete denn die Aufgabe? Und was genau von dem Quelltext ist wirklich von Dir?
 
Ganz ehrlich, schau dir alles nochmal von vorne an!
Wenn dir jetzt jemand sagt was es genau macht, dann wirst du es auch nicht verstehen...

Selbst mit Hilfestellung müsstest du trotzdem wissen wofür du dieses Programm geschrieben hast und daraus dann ableiten was es denn macht.

Gruß
 
Wenn du wirklich lernen willst solltest du dir die Grundlagen von C noch einmal ganz genau anschauen und das Programm Schritt für Schritt durchdenken.
Zur Veranschaulichung ist es auch immer sehr hilfreich, wenn man den Code mit einem Debugger durchgeht.

Zu deiner eigentlichen Frage, das Programm macht das gleiche wie das hier:
Pi.gif

Gruß
BlackMark
 
Vielen dank ca. so habe ichs auch aus dem Code herleiten können...
aber ich versteh Sinn und Zweck nicht und das Pi in diesen Fall ist auch nicht die Zahl Pi ?! also diese Formel... aber diese Mathe Frage kläre ich wohl lieber wo anders.


Trotzdem danke und die anderen die mir nicht glauben das dies ein Code aus dem Testat ist, deren Aufgabe ich nicht habe...
Es gibt auch Leute wie mich ,die sich in Programmieren sehr schwer tun und auch in Mathe aber versuchen, die schon versemmelten Übungen zu verstehen :) aber trz vielen lieben dank
Ergänzung ()

Ah das ist die Formel für Pi und um so höcher mein n desto näher komme ich an die wirkliche Zahl pi heran..also wird mir der Nährwert ausgegeben. :o
 
DieAnfängerin schrieb:
Hallo,

vor 2 Wochen habe ich folgendes Programm, zu einer vorgelegten Aufgabe geschrieben.
Jetzt weiß ich garnicht mehr was genau dieses Programm macht.
So was kenne ich. Schreibe erst einen megageilen Programmcode, der was total tolles macht, und irgendwann später, wenn ich mir den nochmal angucke (z.B. um das tolle, was das Programm macht, noch toller zu machen), kapiere ich gar nichts mehr.

Ich habe jedoch festgestellt, dass es zwei Dinge gibt, die da wahre Wunder wirken:
1. Code kommentieren
2. Code aufräumen

Wenden wir das mal auf deinen Code an:
Code:
#include<stdio.h>
#include<math.h>

// Summe berechnen
// Parameter n: Summenglied, bis zu dem die Summe berechnet werden soll
double calculate_summe(int n)
{
        // Summe mit 0 initialisieren
	double Summe = 0.0;
        // Zählervariable
	int i;
        // Summenglieder bis zum n. berechnen
	for (i = 1; i <= n; i++)
	{
                // Zählervariable in double-Wert umwandeln
                double valueAsDouble = (double) i;
                // Davon das Quadrat berechnen (i^2)
                double valueAsDoubleSquared = valueAsDouble * valueAsDouble;
                // 1/i^2 der Summe aufaddieren
                Summe += 1.0 / valueAsDoubleSquared;
	}
        // die errechnete Summe als Funktionsrückgabewert zurückgeben
	return Summe;
}

int main()
{
        // Abschneide-Summenindex aus Eingabe lesen
	int n;
	printf("\n\nGebe sie n ein:");
	scanf("%d", &n);

        // die Summe bis Index n berechnen
        double summe = calculate_summe(n);

        // PI-Approximation entsprechend 
        // pi^2 / 6 = summe <=> pi = sqrt(6 * summe)
        double myPI = sqrt(6 * summe);
	printf("Pi: %lf", myPI);

	return 0;
}
Ergänzung ()

BlackMark schrieb:
Zu deiner eigentlichen Frage, das Programm macht das gleiche wie das hier:
Anhang anzeigen 524350
Nicht ganz. Wenn das Programm wirklich bis zum Index i = unendlich rechnen würde, würde es dafür sicherlich sehr lange brauchen ;)
 
Sculletto schrieb:
Ergänzung ()

Nicht ganz. Wenn das Programm wirklich bis zum Index i = unendlich rechnen würde, würde es dafür sicherlich sehr lange brauchen ;)

Nicht nowendigerweise!
 
Sculletto schrieb:
Nicht ganz. Wenn das Programm wirklich bis zum Index i = unendlich rechnen würde, würde es dafür sicherlich sehr lange brauchen ;)
Ich habe nicht gesagt, dass das Programm bis unendlich zählt, ich habe gesagt es macht das gleiche wie die Formel und das ist Pi approximieren ;)

Gruß
BlackMark
 
^Das stimmt, andernfalls würde es sich schon bald aufhängen, weil der Wert nicht zu ende definiert ist,
und der PC den Range variablen-WERT nicht versteht dann gibt es einen overflow, eine schlechte Programmierung.
Btw danach suchen die Hacker, um diesen zustand zu erzwingen und sich access zu verschaffen, n fail stack,buffer ... overflow.


//Offtopic, daher hier der edit an asdfman


Nicht in diesem Code du hast es richtig bemerkt. Deswegen stand dort im Satz >
aber in anderen Fällen, weil jemand oben das Wort "overflow" erwähnt hat, wollte ich es näher beschreiben. Was passieren "könnte" wenn man danach speziell sucht und das ist eben die Lücke die dir Access verschafft, daher, das
als Andeutung. Du hast da zu viel jetzt rein interpretiert, obwohl es klar ist, was gemeint war.
 
Zuletzt bearbeitet:
moshimoshi schrieb:
^Das stimmt, andernfalls würde es sich schon bald aufhängen, weil der Wert nicht zu ende definiert ist,
und der PC den Range variablen-WERT nicht versteht dann gibt es einen overflow, eine schlechte Programmierung.
Btw danach suchen die Hacker, um diesen zustand zu erzwingen und sich access zu verschaffen, n fail stack,buffer ... overflow.

Dann erklär mal, wie in dem Programm ein Buffer Overflow auftreten kann, wenn gar kein Puffer allokiert wird. Und wie ein Integer Overflow auftreten kann, wenn nur maximal bis zu einem bekannten Integer gezählt wird.

Und wie dieses Programm dann dem Hacker ACCESS verschaffen könnte.
 
Wenn das Ergebnis einigermaßen genau sein soll, würde ich übrigens die Reihenfolge, wie da aufsummiert wird, umdrehen:
Code:
for (i = n; i > 0; i--)
Also die kleinen Zahlen zuerst aufaddieren.
Das kann bei sehr großen n einen Unterschied machen, weil man nicht so heftige Rundungsfehler erzeugt.

Für eine Übungsaufgabe aber wohl nebensächlich ;)
 
BlackMark schrieb:
Ich habe nicht gesagt, dass das Programm bis unendlich zählt, ich habe gesagt es macht das gleiche wie die Formel und das ist Pi approximieren ;)
Ich glaube kaum, dass die genannte Formel Pi approximiert, ich würde eher sagen, die gilt exakt. Approximiert wird Pi erst, wenn nach einem endlichen Index mit dem weiteren Summieren aufgehört wird.
 
Das Programm berechnet, wie bereits erwähnt eine Approximation von Pi.

Die Funktion calculate_sum berechnet einen approximativen Wert von (pi^2)/6.
Würde man n gegen Unendlich laufen lassen, so erhält man den Grenzwert der Reihe und dieser ist exakt (pi^2)/6.

Da kein Computer, auch kein Mensch, unendlich viele Zahlen aufsummieren kann, werden diese Werte näherungsweise berechnet. Das Summieren muss beispielsweise durch Schleifen realisiert werden, dies wurde von Sculletto in seinem Beitrag innerhalb des Codes beschrieben.

Um aus diesem Zwischenergebnis eine Approximation von pi zu erhalten, muss nun mit 6 multipliziert werden, d.h. wir bekommen näherungsweise 6*(pi^2)/6 = pi^2.

Zum Schluss wird noch die Quadratwurzel gezogen, und man erhält sqrt(pi^2)=pi.

Würde man den Grenzwert der Summe bilden, diese mit 6 multiplizieren und daraus die Wurzel ziehen, erhält man pi.

Für Interessierte, es handelt sich bei der Summe um die Auswertung der Riemannschen Zeta-Funktion an der Stelle 2.
 
Zurück
Oben