seltsame printf ausgabe bei Heron Verfahren



  • Ich habe mir die Heron-Formel noch einmal angeschaut, der Fehler liegt nämlich in der Berechnung selbst:

    erg=0.5*(start+(geg/start));
    

    statt

    erg=0.5*(start+(start/geg));
    

    Jetzt kommen auch richtige Ergebnisse raus 😉

    MfG
    Chris_

    EDIT: Mit welchem Compiler ist dein oben gezeigter Code kompilierbar? 😕



  • Ich Idiot 😃
    Ja klar...
    //

    Chris_ schrieb:

    EDIT: Mit welchem Compiler ist dein oben gezeigter Code kompilierbar? 😕

    Ich nutze Dev-C++
    Nicht gut? 🙂



  • Dev-C++ ist meines Wissens veraltet.
    Als bessere Alternative wird hierzu oft die kostenlose Variante (Express Edition glaube ich) von Visual Studio empfohlen. (Womit ich selbst leider keine Erfahrung habe)

    MfG
    Chris_



  • Es gibt seit Sommer neuere Versionen von Dev-C++.
    Die sind aber nicht auf der alten Webseite.
    Steht auch in der FAQ Dev-C++ ist veraltet!



  • k 🙂 Hab jetzt sowieso mal wieder Windoof vertrieben und mir Ubuntu installiert.. ( Gibts denn bei gcc irgendwelche Einwände? 😃 )

    //

    Hab den code jetzt mal was überarbeitet... (hab die rechenschritte in eine funktion gepackt und hab die double- mit floatvariablen ersetzt)

    #include <stdio.h>
    
    float rechnen (float start,float geg);
    void main()
    
    {
    
    int loops,schleife,art,men3,mom=0; //loops=wenn menüpunkt1 wieviele wiederholungen? ; art=menüauswahl für switch ; men3=menüpunkt3 (für while)
    
                                           //geg= gegebene Zahl ; schleife=gegenzahl case 1 ; mom= momentane zahl
    
    float start,erg,test,geg;          // start+start2=Zahlen für Mittelwert ; Erg= errechneter mittelwert ; test=test  für case 2
    
    printf("Zahl:\n");
    
    scanf("%f", &geg);
    
    Idiot:  {
    
    printf("\nVorgehensart? \n 1. bestimmte Anzahl Wiederholungen? \n 2. Bis zum bitteren Ende (nicht empfohlen) \n 3. 1000 Wiederholungen? \n\n ALS ANTWORT BITTE EINFACH 1,2 oder 3 angeben \n");
    
    scanf("%d", &art);  }
    
    start=1;
    
    switch(art) {
    
    case 1:  {
    
    printf("Wie viele?\n");
    
    scanf("%d", &loops);
    
    while(schleife<=loops)  {
    
    start = erg = rechnen(start,geg);
    
    printf("%d: zwichenergebnis: %.9f\n", mom,erg);
    
    schleife++;
    
    mom++; }
    
    printf("\n %d Endergebnis: %.9f \n", mom, erg);
    
    break;  }
    
    case 2:  {
    
    while(geg != test)  {
    
    start = erg = rechnen(start,geg);
    
    printf("zwichenergebnis: %.9f\n", erg);   }
    
    printf("\nEndergebnis: %.9f", erg); 
    
    break;  }
    
    case 3:  {
    
    while(men3 <= 1000) {
    
    start = erg = rechnen(start,geg);
    
    printf("zwichenergebnis: %.9f\n", erg);
    
    men3++;
    
    mom++; }
    
    printf("\nEndergebnis: %.9f", erg);
    
    break;  }
    
    default:  {
    
    printf("Idiot^^ Lesen bildet!");
    
    goto Idiot;
    
    break;          }
    
    }
    
    }
    
    float rechnen(float start,float geg)	{
    return 0.5*(start+(start/geg));	}
    

    gcc zickt nicht un kompiliert das ganze, wenn ich aber dann folgendes mache:

    ~/Arbeitsfläche$ ./a.out
    Zahl:
    8
    
    Vorgehensart? 
     1. bestimmte Anzahl Wiederholungen? 
     2. Bis zum bitteren Ende (nicht empfohlen) 
     3. 1000 Wiederholungen? 
    
     ALS ANTWORT BITTE EINFACH 1,2 oder 3 angeben 
    1
    Wie viele?
    1000
    
     0 Endergebnis: -1.507821083
    

    gibt er mir dennoch ein seltsames Ergebnis... so langsam komm ich mir ziemlich dumm vor... kann mir jemand helfen? 😃



  • Bitte formatier das nochmal anständig, davon bekommt man ja Augencrepes.

    Hinweise unter Einrückungsstil

    Und ich sehe da auch kein double.
    Und versuch unbedingt das goto los zu werden. Das ist da nicht nötig.



  • Du deklarierst die variable "schleife" und vergleichst den Wert der Variable "schleife" ohne sie initialisiert zu haben bzw definiert. Deswegen halte deine Variablen so Lokal wie möglich und definiere sie so schnell wie möglich. Dann passiert so etwas nicht.

    Wenn die Variable sofort einen Wert zugewiesen wird, brauchst du sie nicht zu definieren.

    Z.B:

    int a;
    cin >> a;



  • Überleg dir mal ob du nicht vllt lieber Assembler programmieren möchtest 😃
    Da kannset so viel goto benutzen wie du willst. Und das führt zum Spagetthi Code.

    In C++ gibt es Schleifen dafür z.B for(); oder kopf, fußgesteuerte Schleifen z.B while();

    Ist viel eleganter und nicht so fehleranfällig.



  • In deinem geposteten Code steht immer noch

    return 0.5*(start+(start/geg));
    

    Es muss aber wie gesagt

    return 0.5*(start+(geg/start));
    

    heißen.
    Nach dieser Anpassung und denen meiner Vorredner dürfte dein Code zumindest funktionsfähig sein. 😉

    gcc zickt nicht un kompiliert das ganze

    Das wundert mich doch sehr! zumindest bei "void main" spuckt der gcc normalerweise eine Warnung aus oder? 😕
    Welche Version benutzt du?



  • Vermeide unnötigen Code! Du hast da ja größtenteils 3 mal das selber geschrieben. Das kannst du auch in eine Schleife mit ein paar Flags/Bool-Variablen packen.
    Und goto kann man schon einmal verwenden (mach ich auchmal bei verschachtelten Schleifen) , aber bestenfalls vermeiden 😉



  • Blubberauto schrieb:

    Du deklarierst die variable "schleife" und vergleichst den Wert der Variable "schleife" ohne sie initialisiert zu haben bzw definiert. Deswegen halte deine Variablen so Lokal wie möglich und definiere sie so schnell wie möglich. Dann passiert so etwas nicht.

    Wenn die Variable sofort einen Wert zugewiesen wird, brauchst du sie nicht zu definieren.

    Z.B:

    int a;
    cin >> a;

    Wenn er einen richtigen Compiler verwendet hätte wäre das auch angezeigt worden:

    1>heron.cpp(18): warning C4996: 'scanf': 
      This function or variable may be unsafe. Consider using scanf_s instead.  
    1>heron.cpp(26): warning C4996: 'scanf': 
      This function or variable may be unsafe. Consider using scanf_s instead.  
    1>heron.cpp(42): warning C4996: 'scanf': 
      This function or variable may be unsafe. Consider using scanf_s instead.  
    1>heron.cpp(106): warning C4244: 'return': 
      Konvertierung von 'double' in 'float', möglicher Datenverlust
    1>heron.cpp(44): warning C4700: Die nicht initialisierte lokale Variable "schleife" wurde verwendet.
    1>heron.cpp(62): warning C4700: Die nicht initialisierte lokale Variable "test" wurde verwendet.
    1>heron.cpp(76): warning C4700: Die nicht initialisierte lokale Variable "men3" wurde verwendet.
    

    Bem: Bei gcc lassen sich zumindest alle Warnings einschalten (-Wall -Wconversion -pedantic ...). Leider merkt der gcc vieles dann aber auch noch nicht ...


Anmelden zum Antworten