sinus funktion darstellen



  • Hallo

    ich habe von einem c++ buch den quellcode zur darstellung der sinuskurve abgeschrieben, aber die kurve wird entweder falsch oder gar nicht angezeigt...

    hier mal der code:

    #include <iostream.h>
    #include "math.h"
    
    #define CLS     //(cout << "\033[2J")
    #define LOCATE(z,s) // (cout << "\033[" <<(z) << ";" << (s) << "H")
    #define PI      3.1415926
    #define START   0.0
    #define ENDE     (2.0 * PI)
    
    #define PKT     64
    #define SCHRITT ((ENDE - START) / PKT)
    #define xA      12
    #define yA      10
    
    int main()
    {
        int zeile, spalte;
    
        CLS;
        LOCATE(2,25);
    
        cout << "------- Die Sinus Funktion -------";
    
        cout << "\n\n";
    
        LOCATE(xA, 1);
        for(spalte = 1; spalte < 78; ++spalte)
        {
            cout << ((spalte - yA) % 8 ? "\304" : "\305");
        }
        cout << "\020";
        LOCATE(xA - 1, yA + 64); 
        cout << "2PI x";
    
        for (zeile = 5; zeile < 24; ++zeile)
        {
            LOCATE(zeile, yA);
            cout << "\305";
        }
    
        LOCATE(4,yA); 
        cout << "\036 sin(x)";
        LOCATE(xA - 8, yA + 1); cout << " 1";
        LOCATE(xA + 8, yA + 1); cout << " -1";
    
        int anfsp = yA, endsp = anfsp + PKT;
    
        for(spalte = anfsp; spalte <= endsp; ++spalte)
        {
            double x = (spalte - yA) * SCHRITT;
            zeile = (int)(xA - 8 * sin(x) + 0.5);
            LOCATE(zeile, spalte); cout << "*";
        }
    
        LOCATE(25,1);
        return 0;
    }
    

    der code wurde eigentlich für das neue visual studio 7 geschrieben, aber er müsste doch eigentlich auch beim 6er funktionieren oder?

    fällt euch irgendwas auf was man daran ändern muss/sollte??
    wär echt nett.

    mfg



  • das programm funktioniert prima.

    natürlich nur, wenn du die entscheidenden sachen wieder einkommentierst: nämlich:

    #define CLS     (cout << "\033[2J")
    #define LOCATE(z,s)  (cout << "\033[" <<(z) << ";" << (s) << "H")
    

    und das geht natürlich nur, wenn du einen windows 98 rechner hast, und dann - wie in der konsolenfaq beschrieben - die ansi.sys einbindest.

    wirst du aber nicht haben. darum musst du dir die positionierung über die in -ebenfalls im konsolenfaq befindliche- improved konsole, und daraus die positionierungsmöglichkeit selber programmieren.

    mach dir einfach eine funktion LOCATE(z,s), die nach den oben zu findenden code zu bauen ist.

    dann sieht es richtig nett aus 😉



  • scheine heute langeweile zu haben.. aber so sieht es dann aus, nur zur ansicht, ohne anspruch, daß es schöner sein könnte:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    #include <cmath>
    
    void gotoxy(const int y, const int x);
    
    #define PI      3.1415926
    #define START   0.0
    #define ENDE     (2.0 * PI)
    #define PKT     64
    #define SCHRITT ((ENDE - START) / PKT)
    #define xA      12
    #define yA      10
    
    int main()
    {
        int zeile, spalte;  
        gotoxy(2,25);
    
        cout << "------- Die Sinus Funktion -------";
    
        cout << "\n\n";
        gotoxy(xA, 1);
        for(spalte = 1; spalte < 78; ++spalte)
        {
            cout << ((spalte - yA) % 8 ? "\304" : "\305");
        }
        cout << "\020";
        gotoxy(xA - 1, yA + 64);
        cout << "2PI x";
    
        for (zeile = 5; zeile < 24; ++zeile)
        {
            gotoxy(zeile, yA);
            cout << "\305";
        }
        gotoxy(4,yA);
        cout << "\036 sin(x)";
        gotoxy(xA - 8, yA + 1); cout << " 1";
        gotoxy(xA + 8, yA + 1); cout << " -1";
        int anfsp = yA, endsp = anfsp + PKT;
    
        for(spalte = anfsp; spalte <= endsp; ++spalte)
        {
            double x = (spalte - yA) * SCHRITT;
            zeile = (int)(xA - 8 * sin(x) + 0.5);
            gotoxy(zeile, spalte); cout << "*";
        }
        gotoxy(25,1);
    }
    
    void gotoxy(const int y, const int x){
       COORD coords;
    
       HANDLE Hnd = GetStdHandle(STD_OUTPUT_HANDLE);
       if (Hnd == INVALID_HANDLE_VALUE)
          return;
    
       coords.X = (x - 1);
       coords.Y = (y - 1);
       SetConsoleCursorPosition(Hnd, coords);
    }
    

    für weitere schönheit ins konsolenfaq schaun.

    ps: damit keiner durcheinanderkommt: der einfachheit halber musste ich das x, y aus der gotoxy umkehren.. hat was mit den ansi sequenzen zutun.
    würde ich perspektivisch wieder umdrehen.



  • hi

    danke. mit dem letzten code funktionierts bei mir auch... kannst du mir mal genauer erklären was du genau verändert hast?? ich mein optisch seh ich die änderungen schon, aber kapieren...nicht wirklich...

    mfg



  • nein, das erklär ich mal nicht, weil es wunderbar erklärt in dem

    --->>> KONSOLENFAQ <<<--- steht

    wie ich mehrfach betonte 😉

    wenn du nach schmökern ein konkretes problem hast, können wir weiterreden 🙂



  • ja ok 😉
    ich hab mir die konsolen faq mal angeschaut, aber ich weiss ned wo ich hin muss...
    steh heut irgendwie auf der leitung 😃



  • dann verkürz ich mal die leitung. 😉

    dort stehen einige abhandlungen zu positionierung auf der konsole.

    da du sicherlich windows benutzt, und sicherlich kein win98, wie ich hier u.a. habe, und damit keine ansi.sys einbinden kannst, musst du auf die consolen-api (siehe dortigen msdn link) zurückgreifen, um zu positionieren.
    du kannst dir auch die "improved console" mal anschauen.

    wisse: farben und positionierung sind abhängig vom compiler und betriebssystem

    ps: falls du das plotten der sinus funktion meinst, da musst du dir die idee im programm mal durchsteppen


Anmelden zum Antworten