Sinus zeichnen lassen



  • Bandchef, was Dir ein wenig fehlt, ist der Biss und der Ehrgeiz, es erstmal alleine zu versuchen. Und Freude daran zu haben!

    Später im Beruf kannst Du Deine Kollegen mal fragen, wenn Du auf dem Schlauch stehst, aber es wird Dich keiner zum Ziel tragen. Man bezahlt Dich dann dafür, dass Du derjenige bist, der die Probleme löst und Lösungen findet.

    Es ist kein Thema, mal was nicht zu wissen. Aber "haben wir in der Schule nicht gehabt" ist im Studium kein Grund mehr, denn man kann (man muss) versuchen, in Literatur und Internet nach Informationen zu suchen und sich erstmal über der Hintergrund von den Sachen, mit denen man arbeitet, auseinanderzusetzen, bis man sie wirklich verstanden hat (in Deinem Fall: For-Schleifen, Arrays, double, int. Lies bitte nochmal in Deinem Lehrbuch zu diesen Themen!).

    Was Du tust ist, einmal gehörte Dinge zusammenzuwürfeln und zu hoffen, dass es irgendwie klappt. Und andere zu fragen, ob das nun richtig ist.

    Nicht, dass andere Dir nicht gerne helfen. Allein, es fehlt ein wenig der "Spirit" zur Eigeninitiative - und zur Mitarbeit. Und Ratschläge anzunehmen. Vicious Falcon hat Dir bereits zweimal etwas Wesentliches geschrieben. Das solltest Du wirklich umsetzen.

    Und als Tip von mir: Lese nochmal nach, wie man ein double in ein int umwandelt und was es hierbei zum Thema "Runden" zu beachten gilt...



  • Mein Code jetzt:

    #include<iostream>
    #include<math.h>
    #define M_PI 3.141592654
    using namespace std;
    
    int main()
    {
     int i, j, k;
     int y_array[41];
     double x_array[41];
     char leerarray[21][41];
    
     //Array mit Leerzeichen(' ') auffüllen
     for(i=0; i<21; i=i+1)
     {
              for(j=0; j<41; j=j+1)
              {
               leerarray[i][j] = ' ';
              }
     }
    
     //y-Werte berechnen
     for(j=0; j<41; j=j+1)
     {
    	 y_array[j] = 10*sin(((2*M_PI)/40)*j)+10;
     }
    
     //x-Werte berechnen
     for(k=0; k<41; k=k+1)
     {
    	 x_array[k] = ((2*M_PI)/40)*k;
     }
    
    system("pause");
    return 0;
    }
    

    Das ich für die y-Werte kein double brauche ist mir jetzt auch klar. Wie geht das dann aber für die x-Werte? Wenn ich hier auch wieder ein int Array verwende, dann bekomm ich 7 mal eine Null hintereinander. Was bei einer Umwandlung von double nach int geschieht weiß ich. Es werden Nachkommastellen abgeschnitten ohne auf korrekte Rundung zu achten. Genau das will man ja bei der Berechnung der y-Werte ja zum Beispiel.



  • Du entfernst dich immer mehr von einem sinnvollen Ansatz.

    Warum denn jetzt schon wieder ein x_array. Deine x werte sind 0, 1, 2, 3, .. 40

    Mal kurz ein paar Vorschläge aus dem Thread zusammengefügt:
    (aber nicht nicht ausprobiert).

    #include <stdio.h>
    #include <math.h>
    #define M_PI 3.141592654 
    
    int main()
    {
     int i, j, k;
     char array[21][41];
    
     //Array mit Leerzeichen(' ') auffüllen
     for(i=0; i<21; i=i+1)
     {
              for(j=0; j<41; j=j+1)
              {
                array[i][j] = ' ';
              }
     }
    
     //y-Werte berechnen
     for(j=0; j<41; j=j+1)
     {   y = (int)(10*0.0+10);  // Achse-Einzeichnen
         array[y][j] = '-';
         y = (int)(10*sin(((2*M_PI)*j/40))+10);  // Sinus-Einzeichnen
         array[y][j] = '#';
     }
    
     for(k=0; k<21; k=k+1)
     {
         printf("%41.41s\n", array[k]); //Zeile k mit 41 Zeichen ausgeben
     }
    
    return 0;
    }
    


  • bandchef schrieb:

    Es werden Nachkommastellen abgeschnitten ohne auf korrekte Rundung zu achten. Genau das will man ja bei der Berechnung der y-Werte ja zum Beispiel.

    Genau das glaube ich nicht. Wenn wir 21 Zeilen haben, gehe ich davon aus, dass genau in der Mitte der mittleren davon die X-Achse verläuft. Also muss ich die Funktionswerte korrekt algebraisch runden, sonst wird die Darstellung nachher asymetrisch. Du hast richtig erkannt, dass double --> int das nicht macht.

    Egal, probier es einfach aus. Wenn Du nachher Deinen Sinus mal ausgedruckt hast, wirst Du sehen, was ich meine (vor allem, wenn Du die Achse mit im Bild hast wie in Beraters Beispiel).



  • Hej, kleine Zwischenfrage. Wie läuft es mit dem Projekt? Klappt alles?



  • Er hat schon ein neues Projekt.



  • Naja, dann kann ich ja noch meine eindimensionale Variante hinterherschieben. Für die, die es noch interessiert...

    #include <stdio.h>
    #include <math.h>
    #define PI2 (2 * 3.14159265)
    
    int main( )
    {
        const int X_SIZE   = 40;   // Teile einer ganzen Periode
        const int Y_FACTOR = 10;
    
        int yValues[ X_SIZE + 1 ];
    
        // Berechne Funktionswerte (multipliziert mit y-Faktor und gerundet)
        for( int x = 0; x <= X_SIZE; ++x )
        {
            double sine = sin( PI2 * x / X_SIZE );
            yValues[ x ] = sine * Y_FACTOR + ( ( sine >= 0 ) ? +0.5 : -0.5 );
        }
    
        // Gebe Funktionswerte Zeile für Zeile aus
        for( int y = Y_FACTOR; y >= -Y_FACTOR; --y )
        {
        	char background = ( 0 == y ) ? '-' : ' ';		// X-Achse, sofern in richtiger Zeile
            for( int x = 0; x <= X_SIZE; ++x )
            {
                putchar( ( yValues[ x ] == y ) ? '#' : background );
            }
            putchar( '\n' );
        }
    
        return 0;
    }
    

Anmelden zum Antworten