C Erzeugte Zahlen aufsummieren

Felix_krueger

Ensign
Registriert
Sep. 2007
Beiträge
186
Hi Leute,

ich werde für die Uni bald C lernen müssen. Deshalb dachte ich mir, dass ich schon mal ein wenig rumprobiere.

Ich möchte ein Programm schreiben das mir die Zahl Pi nach folgender Formel berechnet: Pi = Wurzel aus (6*(Summe über (1/x²))).

Ich habe es hinbekommen Zahlen von 0 bis x zu erzeugen und auszugeben - das konnte ich recht einfach googeln und in Büchern nachlesen.
Der nächste Schritt wäre auf die erzeugten Zahlen zuzugreifen und diese aufzusummieren. Gibt es da Befehle die ich verwenden kann?

Liebe Grüße
 
Du müsstest die erzeugten Zufallszahlen in einer Variable speichern. Dann kannst du die Zahlen addieren. Das wäre jetzt so was ich machen würde. Hast du dich zu Variablen schon ein bisschen eingelesen? ;)
 
Du könntest auch versuchen pi schrittweise aufzusummieren:
mit einer sog. "for"-Schleife: dann ungefähr so : (Summe=Summe + 1/i) und das i mal und jedes mal i erhöhen.
als letztes Pi=6*Summe
 
Ahaaa! Das ist ein guter Tipp, damit wäre mein Problem deutlich kleiner!
Besten Dank bambadidi, ich versuche mal mein Glück mit den Variablen :-)

---
Auch vielen Dank an Dich, Downsite!
Ergänzung ()

Bei dem Befehl "printf" muss man immer "%f" oder "%d" oder "%d." eingeben:

Bspw. so: printf("Der 3. Buchstabe ist %c.\n", MyArray[2]);

Meine Frage ist: Woher weiß ich welcher Buchstabe hinter das % kommt? Und was bedeutet der Punkt dahinter den man bei manchen Programmen liest?
 
Zuletzt bearbeitet:
Wenn es für die Uni sein soll (Informatik etc?), lern erst mal Java. Wenn du da mit einem Anfänger Buch durch bist, kannst schon mal das 1 Semester halbwegs chillen. Wenn ihr mit C anfangt, dann erst C Buch danach das Java Zeug.

- Rekursion
- noch mal Rekursion
- und noch mal !
- Listen / Bäume (LinkedList add() Funktion etc. überschreiben, iterativ und rekursiv)

Wenn du das kannst, geh zu C über und lern:

- Structs, Typedef, Pointer
- String Arrays
- Strings "verbinden"
- Encoding von Dateien, auch wie UTF-8 etc. gespeichert und ausgelesen wird (encoding tabellen)
- Rekursion
- Listen / Bäume
- Benutzung der math.h library

Du wirst merken das Strings in C nicht mehr so easy sind wie in Java. Allerdings weißt du danach was im Speicher passiert. Vor allem GANZ WICHTIG die Rekursion + Listen/Bäume und zwar nicht einfach libraries benutzen, sondern selber entwickeln (Programmier einen Suchbaum mit add(), find(), replace() Funktionen, gib dann die preorder, postorder und inorder davon aus)! Daran zerschellen 50-60% der Studenten.

Wer das durchblickt hat, der packt auch den Rest. Dann hat sich die nötige Denkweise eingependelt.
 
Zuletzt bearbeitet:
Oha oha, das klingt nach einer Menge Zeug!

Also ich will nicht Informatik studieren, sondern muss nur einen Kurs belegen in dem wir die Basics in C lernen.

Ich werde wohl erst mal die ersten Stunden abwarten und hoffe, dass sie da die Dinge so erklären, dass man es auch versteht. (Aber die Erfahrung zeigt, dass "hoffen, dass die Dinge so erklärt werden, dass man es versteht" eher nach hinten losgeht. Deshalb wollte ich schon mal vorarbeiten.


Aber das mit printf oder scanf und "%f" oder "%d" würde mich schon mal interessieren. Wonach richtet sich der Buchstabe hinter dem prozentzeichen?
 
Felix_krueger schrieb:
Und was bedeutet der Punkt dahinter den man bei manchen Programmen liest?

Nichts, es ist nur ein Punkt (genau so wie ein beliebiges Satzzeichen).
 
An alle Interessierten:

Die Lösung des Rätsels zu dem %d oder %f ist folgende: Im ersten Fall müssen wird %d schreiben, weil wir eine Dezimalzahl von dem Programm ausgeben lassen wollen. Im zweiten Fall haben wir eine Gleitkommazahl. Also müssen wir %f schreiben.

Code:
int main ()
{
   int Z1, Z2, Erg;
   Z1 = 1.1;
   Z2 = 3.3;
   Erg = Z1+Z2;
   printf("Zahl1 + Zahl2=, %d", Erg);
   return 0;
}

Code:
int main ()
{
   float Z1, Z2, Erg;
   Z1 = 1.1;
   Z2 = 3.3;
   Erg = Z1+Z2;
   printf("Zahl1 + Zahl2=, %f", Erg);
   return 0;
}
 
Zuletzt bearbeitet: (Korrektur nach Backslashs Anmerkung (s.u.))
Das ist falsch. Der Format-String, den du printf übergibst, bestimmt lediglich was ausgegeben wird und hat keinerlei Einfluss auf die Berechnung. Dass mit Ganz-/Fließkommazahlen gerechnet wird, hast du bei der Deklaration der Variablen als int oder float festgelegt.
Mehr Informationen über die Format-Strings und diverse Platzhalter findest du in dem oben von mir geposteten Link.

Nur so am Rande: wenn dir die Tatsache, dass die Seite Englisch ist Schwierigkeiten bereitet, dann solltest du besser an deinem Englisch arbeiten als zu versuchen Programmieren zu lernen, das wird im Studium wesentlich hilfreicher sein.
 
Zuletzt bearbeitet:
In deinem Link steht doch aber gerade was ich zuvor geschrieben hatte: Je nachdem ob wir einen int, float, character oder was auch immer benutzte haben, müssen wir entsprechend den Platzhalter bei dem Befehl printf () %d, %f, %c oder was auch immer einsetzen.

Zu deiner Randbemerkeung: Es ist keine Wahl von mir C zu lernen. Ich muss es lernen, da führt kein Weg dran vorbei. :freaky:
 
C wird dir aber im Studium beigebracht ;)

"weshalb wir dem Programm den Hinweis geben müssen, dass es eine Gleitkommazahl berechnen soll." <- Das ist der Teil der so einfach falsch ist.
 
Ich wollte mich schon mal ein wenig mit der Materie vertraut machen, weil man im Studium ja doch oft ins kalte Wasser geworfen und -ich zumindest- dann schnell abgehängt werde. Deshalb wollte ich mich vorbereiten.

Danke für die Richtigstellung meines Posts! :-)

Funktionieren die Dinge die in cplusplus.com beschrieben sind, denn auch in C, oder sollte ich mich besser auf die Seite http://www.cplusplus.com/reference/cstdio/printf/ beschränken ?
 
Die Infos von cplusplus.com treffen eigentlich immer auch auf C zu, da C++ auf C aufbaut und daher die Standardheader aus C übernommen hat.
Der "offizielle" C Header ist immer der mit .h am Ende und der für C++ der <cstdio>. Die für C++ laufen nicht unter C (da in C++ alle C Deklarationen afaik im std Namespace liegen).

Wenn du gerade PI aufsummieren willst, denk dran, dass a+b+c != c+b+a.
double's haben eine begrenzte Genauigkeit, daher solltest du immer möglichst gleich große Zahlen addieren und daher deine Formel rückwärts durchlaufen.
Code:
for(int i=max;i>0;i--)
sum+=1.0/(i*i);
Dadurch kannst du u.U. einige Nachkommastellen besser an PI rankommen.
 
Das sind gute Tipps, danke Hancock. Ich werde mich dann mal dran machen es mit deiner Methode zu probieren, denn bei der Genauigkeit hänge ich gerade noch fest.

Bislang sieht mein - endlich funktionierender - Code so aus:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>


int main()
{
    printf("Wie gross ist Pi? \n\n \n");
    unsigned int n;
    double j,m,s,k,erg;                                


    printf("Bis welche Zahlen moechten Sie von 1 an aufsummieren?\n\n");
    scanf("%u", &n);  
    j, k = 0;

    for (j=1; j<=n; j=j++) {
            k = k+(1/(j*j));    //k ist = summe von (k=0) bis n über 1/x²

    }
    printf("Kehrwert aus dem Quadrat der Summe 'k' ist: %lf\n\n",k);

    erg = sqrt(6*k);
    printf("Pi ist ungefaehr: %lf\n\n\n", erg);


    return 0;
    }

Ich komme bis auf 3,141592. Danach ist schluss. Meine überlegung wäre jetzt gewesen irgendwie einen Datentyp zu nehmen der mehr Nachkommastellen ausgeben kann. Long Double z.B.(?), aber das habe ich nicht hinbekommen. Ich vermute, dass ich Probleme mit den Platzhaltern habe.
 
printf gibt standardmäßig nur sechs Nachkommastellen aus. Auf der Referenzseite (cplusplus.com) steht diese Info in der Tabelle die oben links mit .precision beschriftet ist.
 
Zurück
Oben