Komischer Fehler bei C-Programm

Slin61

Mitglied
Zuerst einmal den Fehler: -1.IND00 . Ich habe ein Programm geschrieben, das PI bestimmen soll. Aber wenn das Ergebnis ausgegben werden soll kommt nur der oben genannte Wert. Beim googeln habe ich dann als Lösung gesehen, dass ich eine falsche Klammer gesetzt haben könnte, welche ich auch gefunden habe, aber das Ergebnis änderte sich nicht. Hier ist der Programmcode(Ich habe versucht es übersichtlich darzustellen):

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

double a,s,A_umschrieben,A_eingeschrieben;

const PI_rech = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609;

a_bestimmen(unsigned long int zahl)
{
    a = 2*sin((360/zahl)*(PI_rech/180));
}

s_bestimmen(unsigned long int zahl)
{
    s = 2*(1/tan((360/zahl)*(PI_rech/180)));
}

a_eingeschrieben(unsigned long int zahl, double seite)
{
    A_eingeschrieben = zahl*(seite/2);
}

a_umschrieben(unsigned long int zahl, double seite)
{
    A_umschrieben = zahl*((seite*seite) / 4*tan((seite/2)*(PI_rech/180)));
}



int main()
{
    double PI;
    unsigned long int n;
    printf("Geben Sie die Zahl der Ecken ein:\n");
    scanf("%li",n);

    a_bestimmen(n);
    s_bestimmen(n);
    a_eingeschrieben(n,a);
    a_umschrieben(n,s);

    PI = A_umschrieben/A_eingeschrieben;

    printf("angenaehert bertraegt PI:\n");
    printf("%lf",PI);

    return PI;
}
 
Hi

zuerst eine Frage zum Sinn des Programms:
Wie sinnvoll ist eine Berechnungsmethode für PI, bei der man PI zum rechnen braucht?

Zu PI_rech: Der Variablentyp (zB double) fehlt.
Du solltest dir auch die Compilerwarnungen anschauen, nicht nur die Fehler.
Ausserdem ist es komplett sinnlos, soviel Kommastellen anzugeben.
Die eingebauten Variablentypen von C können den Wert sowieso nicht so genau speichern.
20 Kommastellen sind mehr als genug.

Zu den 4 Funktionen: Rückgabetyp fehlt.
Und statt globalen Variablen sollte man diese Returnmöglichkeit auch nutzen.
Und wenn du zahl als int übergibst, kann es nicht schaden, das in der Rechnung zu double zu casten.

Zu main:
Beim scanf sollte statt %li %u rein, und &n statt n.
Bekommst du so keinen Absturz?
Bei den 4 Funktionsaufrufen bitte, wie schon gesagt, Rückgabewerte verwenden.
Und beim return sollte ein "int main" kein double zurückgeben.
Übehaupt sollte ein Programm 0 zurückgeben, wenn es erfolgreich bis zum Ende gekommen ist.

Gruß
 
Ich arbeite gerade an einer Lösung, um PI_rech wegzulassen und das Ganze mit dem Bogenmass zu rechnen, aber das war eigentlich nur für den Übergang bestimmt, dass ich sehe ob die Methode funktioniert. Ich werde mein Programm entsprechend verändern und gucken, ob der Fehler immernoch besteht. Vielen Dank für die vielen Hinweise
 
Ich hab das Programm soweit geändert. Es kommen zwar nicht die Werte raus, die ich gerne hätte, aber das liegt an den Formeln. Also hier ist der Code, dann wenn das n-Eck mehr als 360 Ecken hat, bekomme ich diesselbe Fehlermeldung, wie zum Anfang. Hat jemand eine Idee warum?

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



const double PI_rech = 3.1415926535897932384626433;

double a_bestimmen(unsigned long int zahl)
{
    double i;
    i = 2*(sin((360/zahl))*(180/PI_rech));
    return i;
}

double s_bestimmen(unsigned long int zahl)
{
    double i;
    i = 2*((1/tan((360/zahl)))*(180/PI_rech));
    return i;
}

double a_eingeschrieben(unsigned long int zahl, double seite)
{
    double i;
    i = zahl*(seite/2);
    return i;
}

double a_umschrieben(unsigned long int zahl, double seite)
{
    double i;
    i = zahl*((seite*seite) / 4*(tan((seite/2))*(180/PI_rech)));
    return i;
}



int main()
{
    int true = 1;
    while(true)
    {


    double a,s,A_umschrieben,A_eingeschrieben,PI;
    unsigned long int n;
    printf("\nGeben Sie die Zahl der Ecken ein:\n");
    scanf("%u",&n);

    a = a_bestimmen(n);
    s = s_bestimmen(n);
    A_eingeschrieben = a_eingeschrieben(n,a);
    A_umschrieben = a_umschrieben(n,s);

    PI = A_umschrieben / A_eingeschrieben;

    printf("angenaehert bertraegt PI:\n");
    printf("%lf",PI);

    /*return 0;*/
    }
}
 
Hallo,

in der Funktion 's_bestimmen' bekommst du eine Division durch Null, wenn der Parameter 360 ist ( tan(0) = 0 ). Möglicherweise passiert an anderen Stellen Ähnliches - ich habe den Code nicht so genau angeschaut. Du solltest dir auch mal die Zwischenergebnisse anschauen. Am besten mal mit dem Debugger durchsteppen.

Gruß
MCoder
 
Zuletzt bearbeitet:
Also ich bekomm - mit meiner Codeversion - keinen #ind-fehler bei Werten über 360.
Mathematisch stimmt das Ergebnis zwar nicht, aber es ist eine Zahl.

Zum PI-berechnen würde ich übrigens nichts von der Rechenmethode abändern,
sondern gleich einen der Algorithmen von Wikipedia implementieren.
Wozu die ganze Denkarbeit für eine Methode, bei der man PI braucht?

Nochwas: mit den C-Datentypen wirst du nicht weit kommen.
Wenn du mehr als 10 genaue Kommastellen willst/brauchst,
schau dir Librarys wie die Gnu MP an.

C++:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const double PI_rech = 3.14159265358979323846;

double a_bestimmen(unsigned long int zahl)
{
    return 2.0 * sin(2.0 / (double)zahl * PI_rech);
}
 
double s_bestimmen(unsigned long int zahl)
{
    return 2.0 / tan(2.0 / (double)zahl * PI_rech);
}
 
double a_eingeschrieben(unsigned long int zahl, double seite)
{
    return (double)zahl * seite / 2.0;
}
 
double a_umschrieben(unsigned long int zahl, double seite)
{
    return (double)zahl * seite * seite / 4.0 * tan(seite * PI_rech / 360.0);
}

int main()
{
    double PI;
    unsigned long int n;
    printf("Geben Sie die Zahl der Ecken ein:\n");
    scanf("%u", &n);
 
    PI = a_umschrieben(n, s_bestimmen(n)) / a_eingeschrieben(n, a_bestimmen(n));
 
    printf("angenaehert bertraegt PI:\n");
    printf("%lf",PI);
 
    return 0;
}

Hab die 4 Funktionen etwas vereinfacht, zB 360/180 gleich als 2 geschrieben usw.

Gruß
 
Zuletzt bearbeitet:
Zurück