C Programm: Näherungswert der Leibnitz-Reihe als Referenzparameter übergeben.

jasam

Grünschnabel
Hallo.

Ich habe hier die Leibnitz-Reihe und muss noch dazu eine Funktion Schreiben wo der Näherungswert der Leibnitz-Reihe als Referenzparameter in die main übergeben wird. Und die Funktion darf keinen Rückgabewert haben.

Leider denke ich immer in zu komplizierten Schritten und habe jetzt ein Blackout.
Kann mir einer Helfe.
C:
#include<stdio.h>
#include<math.h>
double gesucht (int n)
{
long int i;
double sum=0.0, term, pi;
for(i=0;i< n;i++)
{
term = pow(-1, i) / (2*i+1);
sum += term;
}
pi = 4 * sum;
return pi;
}


int main()
{
long int n;
double pi;
printf("Wie viele Durchläufe soll es werden? Bitte eingeben:");
scanf("%ld", &n);
pi = gesucht (n);
printf("\nPI = %.6lf", pi);
return 0;
}
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Uhmmm???
C:
void gesucht(int n, double& pi)
C:
/* in Main */
gesucht(n, pi);
und lokale variable pi in "gesucht" entfernen
 

jasam

Grünschnabel
Meinst du so etwa?
C:
#include<stdio.h>
#include<math.h>

double gesucht (int n)
{
    long int i;
    double sum=0.0, term, pi;
    for(i=0;i< n;i++)
    {
        term = pow(-1, i) / (2*i+1);
        sum += term;
    }
    pi = 4 * sum;
return pi;
}

void ref_pi(int n, double & pi){
   
    long int i;
    double sum=0.0, term, pi;
    for(i=0;i< n;i++)
    {
        term = pow(-1, i) / (2*i+1);
        sum += term;
    }
    pi = 4 * sum;
}

int main()
{
    long int n;
    double pi;

    printf("Wie viele Durchläufe soll es werden? Bitte eingeben:");
    scanf("%ld", &n);

    pi = gesucht (n);
    printf("\nPI = %.6lf", pi);
   
    ref_pi(n, pi);
    printf("\n ref_pi = %.6lf", pi);

return 0;
}
1654158373476.png
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
C:
void ref_pi(int n, double& pi){  /*Leerzeichen zwischen double und & entfernt */
   
   long int i;
   double sum=0.0, term;  /*Das hier meinte ich mit lokal, kein pi hier */
   for(i=0;i< n;i++)
   {
       term = pow(-1, i) / (2*i+1);
       sum += term;
   }
   pi = 4 * sum;
}
btw: Du machst es dir einfacher, wenn du Variablen-Bezeichnungen verwendest, wie sie auch in der Mathematik verwendet werden.
Anstatt i hätte ich k genommen....

Alles gesagt: Bin kein C-ler, so das obendrüber kann absoluter Schmarrn sein
 

Zvoni

Erfahrenes Mitglied
dann halt "double &pi" *schulterzuck*
Was'n das für ein compiler welcher gültige C-Notation anmeckert?

EDIT: Ich trottel.
"double& pi" ist C++. In C ist "&" der Adress-Operator
In C gibt's kein "pass-by-reference". Kann nur mit Zeigern "simuliert" werden
ungetestet
C:
void ref_pi(int n, double* pi){  /* pi ist hier ein Zeiger */
 
   long int i;
   double sum=0.0, term;
   for(i=0;i< n;i++)
   {
       term = pow(-1, i) / (2*i+1);
       sum += term;
   }
   *pi = 4 * sum;
}
/* in main */
ref_pi(n, &pi);  /* &-Operator --> nehme Adresse der Variablen pi */
 
Zuletzt bearbeitet:

jasam

Grünschnabel
Ich glabe das war es:
C:
#include<stdio.h>
#include<math.h>
double gesucht (int n)
{
    long int i;
    double sum=0.0, term, pi;
    for(i=0;i< n;i++)
    {
        term = pow(-1, i) / (2*i+1);
        sum += term;
    }
    pi = 4 * sum;
return pi;
}


void ref_pi (int n, double* pi){
   
    long int i;
    double sum=0.0, term;
    for(i=0;i< n;i++)
    {
        term = pow(-1, i) / (2*i+1);
        sum += term;
    }
    *pi = 4 * sum;
}

int main()
{
    long int n;
    double pi;
    //double rpi;
    printf("Wie viele Durchläufe soll es werden? Bitte eingeben:");
    scanf("%ld", &n);
pi = gesucht (n);
    printf("\nPI = %.6lf", pi);
   
    ref_pi(n, &pi);
    printf("\n\nref_pi = %.6lf", pi);
return 0;
}
 
Zuletzt bearbeitet:

jasam

Grünschnabel
Jetzt habe ich die Aufgaben 1 und 2 fertig und sitze seit zwei Stunden an der 3 nur um zu verstehen was hier mit der Schranke und Epsilon gemeint ist. In meinen Unterlagen steht so was nicht.

Wie ich es verstehe ist Epsilon das hier: #define PI 3.141592654 und man muss dann die beiden pi-Werte von Nr.1 und Nr.2 zusammen addieren. Doch würde da irgendwie keinen Sin für mich ergeben: " um weniger als Epsilon unterscheiden "

Aufgaben:
Implementierung von drei Funktionen zur Berechnung der Näherung
Implementieren Sie drei Versionen einer Funktion zur Berechnung einer Näherung der Kreiszahl pi .
1. Version: Eingabewert ist die Anzahl n der Summanden, die in der Leibniz-Reihe ausgewertet
werden. Rückgabewert ist der damit berechnete Näherungswert der Kreiszahl pi .
2. Version: Eingabewert ist wieder die Anzahl n der Summanden, die in der Leibniz-Reihe ausgewertet
werden. Aber die Funktion hat keinen Rückgabewert; stattdessen wird der Näherungswert
als Referenzparameter übergeben.
3. Version: Eingabewert ist die positive Schranke epsilon; die Leibniz-Reihe wird so lange ausgewertet
bis sich der Näherungswert und die Kreiszahl pi im Betrag um weniger als epsilon
unterscheiden. Rückgabewert ist wieder der berechnete Näherungswert der Kreiszahl pi .
4. Test
Implementieren Sie geeignete Aufrufe der drei Funktionen in main(), um die Funktionen zu
testen.
 

Zvoni

Erfahrenes Mitglied
Nein, Epsilon ist dein Grenzwert für die Differenz zwischen pi und deinem Näherungswert.
Bsp.
PI = 3.141592654
Epsilon = 0.002
DeinPI = 3.14568523 (Das ist jetzt ein Bogus-Wert)
DeinPi - PI = 0.004092576 --> Liegt also "ausserhalb" deines Epsilons --> Also mache weiter
DeinPI = 3.14268962 (Wieder willkürlich)
DeinPI - PI = 0.001096966 --> Liegt also "innerhalb" deines Epsilons --> Programm fertig

Epsilon gilt hierbei "absolut"
Bsp.
DeinPI = 3.140364856 (willkürlich)
DeinPI - PI = -0.001227798 (Negativ!) --> liegt aber auch "innerhalb" des Epsilons
Fehlerschranke – Wikipedia

Tip: Für Version 3 brauchst du eine "do...while"-Schleife
 
Zuletzt bearbeitet:

jasam

Grünschnabel
Hallo.
Leider komme ich bei der letzten aufgabe nicht weiter:
Simulation und Auswertung einer Fahrradtour
Verwenden Sie das Feld dfs aus der Aufgabe 1.1 Implementierung einer abschnittsweise definierten
Funktion als die vom Tachometer erzeugte Messreihe ts. Dazu sind die x-Werte der Funktion f (x) als
Strecken in Meter zu lesen und die Funktionswerte als Zeitangaben in Sekunden. Der Umfang des
Reifens beträgt U = 2 m. Die Anzahl der Zeilen N der Matrix data muss entsprechend angepasst werden.
Führen Sie Ihr oben entwickeltes Programm aus, wenn Sie das Feld ts mit dfs initialisieren. Interpretieren
Sie die Matrix data und beschreiben Sie, welche Bewegungsformen Sie in den drei Abschnitten
der Funktion f (x) erkennen.
1654270522216.png
1654270552165.png


Kann jemand ein Tipp geben? Ich setze irgend etwas falsch ein. Bitte:)

C:
//Simulation einer Fahrradtour

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

//Auswertung der Messdaten eines Tachometers

#define N 651

double f(double x)
{
    if(x>=0 && x<=250)
    {     
        return sqrt(10*x);
    }
    if(x>250 && x<=550)
    {     
        return (50+(x-250))/10;
    } 
    if(x>550 && x<=650)
    {     
        return 100-2*sqrt(100-(x-550));
    }
}


int main(int* args)
{
    double s;
    double fs[651];         //double-Feld fs
    for(int x=0;x<=651;x=x+1)
    {     
        f(x) = fs[x]; //= f(x);   //f(x) = Zeit
        //printf("fs = %f \n", fs[x]);
    }

    double ts[650] = {((fs[x]/2))}; /*vom Tachometer gemessene Zeitdauer pro Reifenumdrehung*/
//2)
    double U = 2; /* Umfang des Reifens U mit 2 initialiesiert*/

//3)
    double data[N][6]; /* 6 Spalten für gemessene und berechnete Größen (ZEILEN VORNE; SPALTEN HINTEN)*/
   
/*4)  aus ts und U werden weitere größen berechnet und in der Matrix gespeichert*/
    double deltaT = 0;
    double v = 0;

    for(int i = 0; i < N ; i++)
    {
        /*ausrechnen der gewünschten Werte von 2.1*/
        deltaT = ts[i];
        data[i][0] = deltaT; //1.0;//TS;
        v = U / deltaT;
        data[i][1] = v;     //2.0;//moment;
        data[i][2] = U;     //3.0;//strecke;
        data[i][3] = ts[i]; //4.0;//Zeit;
        v = (i)/(ts[i]);
        data[i][4] = v; //5.0;//m/s;
        v= (v/1000)*3600;
        data[i][5] = v;//6.0;//km/h;
    }

    if(N < 25) /* Ausgabe der Matrix data in weniger als 25 Zeilen*/
    {
        for(int i = 0; i < N ; i++)
        {
            printf ("Zeile %d: Ts: %f moment: %f strecke: %f Zeit: %f m/s: %f km/h: %f \n", i, data[i][0], data[i][1], data[i][2], data[i][3], data[i][4], data[i][5]);
        }
    }
    else /* Ausgabe der Matrix data in 25 schritten 25.,50.,75., ...*/
    {
        for(int i = 0; i < N ; i+=25)
        {
        printf ("Zeile %d: Ts: %f moment: %f strecke: %f Zeit: %f m/s: %f km/h: %f \n", i, data[i][0],data[i][1],data[i][2],data[i][3],data[i][4],data[i][5]);
        }
    }
return 0;
}
1654270575074.png
 
Zuletzt bearbeitet: