Sinus zeichnen lassen



  • Du wirst jedoch feststellen, dass nur der Eintrag array[0][0] ein Leerzeichen ist, der Rest ist 0.

    So sollte aber jetzt jedes Element ein ' ' haben, oder?

    #include<iostream>
    #include<math.h>
    using namespace std;
    
    int main()
    {
     int i, j;
     char array[21][41];
    
     for(i=0; i<21; i=i+1)
     {
              for(j=0; j<41; j=j+1)
              {
               array[i][j] = ' ';
              }
     }
    
    system("pause");
    return 0;
    }
    

  • Mod

    bandchef schrieb:

    Angenommen meine Zahl zwischen 0 und 40 wäre x, was wäre eine passende Zahl zwischen 0 und 2*pi?:

    Ich denke, es sollte folgen: (2*pi)/x, wobei x aus [0,40]

    Ok, rechnen wir mal nach:
    x=0 ➡ unendlich
    x=1 ➡ 2*pi
    x=2 ➡ pi
    x=3 ➡ 2/3 *pi
    ...
    x=40 ➡ 1/20 *pi

    Das liegt zwar, bis auf x=0, alles zwischen 0 und 2*pi, aber eigentlich wäre es doch schöner etwas zu haben, wo 0 auf 0 abgebildet wird und die 40 auf 2*pi und die Zahlen dazwischen in regelmäßigen Abständen liegen.

    So sollte aber jetzt jedes Element ein ' ' haben, oder?

    Fast. Achte auf die Grenzen.



  • Fast. Achte auf die Grenzen.

    Sorry, fürS nacheditieren. Da hat sich wohl was überschnitten.

    Das liegt zwar, bis auf x=0, alles zwischen 0 und 2*pi, aber eigentlich wäre es doch schöner etwas zu haben, wo 0 auf 0 abgebildet wird und die 40 auf 2*pi und die Zahlen dazwischen in regelmäßigen Abständen liegen.

    dann vielleicht so: y=sin(x)



  • Nur so als kleiner Tipp, du solltest dir die x- und y-Dimensionen als Konstanten definieren, da du sie später auf jeden Fall wieder brauchst. Wenn man etwas verändern möchte, verändert man lediglich die Konstanten und kompiliert neu.
    Wenn du es so machst, vertust du dich auch nicht so leicht mit den Grenzen (wie bei dir geschehen).

    const int xdim = 41;
    const int ydim = 21;
    char array[xdim][ydim];
    int i, j;
    // gleich alles Initialisieren, 32 ist der ASCII-Wert des Leerzeichens
    memset(si,32,sizeof(char)*xdim*ydim);
    
    for(i=0; i<xdim; ++i)
    { // hier den Sinus berechnen und '#' in das Array eintragen
    }
    
    // in einer doppelten Schleife ausgeben
    

    Hier ist eine ASCII-Tabelle.

    Statt i und j würde ich als Zählvariablen auch bezeichnende Namen wie x und y verwenden.


  • Mod

    bandchef schrieb:

    dann vielleicht so: y=sin(x)

    Nicht raten, denken.



  • Jetzt aber: y = sin(x/(2*pi))



  • Vicious Falcon schrieb:

    const int xdim = 41;
    const int ydim = 21;
    char array[xdim][ydim];
    int i, j;
    // gleich alles Initialisieren, 32 ist der ASCII-Wert des Leerzeichens
    memset(si,32,sizeof(char)*xdim*ydim);
    

    Das ist C99 und klappt somit z.B. nicht mit MSVC, außerdem sieht

    memset(array,32,sizeof array);
    

    besser aus.



  • bandchef schrieb:

    Jetzt aber: y = sin(x/(2*pi))

    Wohl auch nicht. Der Sinus verlangt als Eingabe Werte von 0 bis 2*pi. Du hast in Deiner Schleife x-Werte von 0 bis 40. Also?

    bandchef schrieb:

    Hier ein Link zur Originalskizze: http://yfrog.com/jjunbenanntpsj

    Ist das (oben, s. Link) die Vorlage von Eurem Lehrer? Mannomann. Er verlangt doch 41 Werte in der Breite, nicht? Zudem rundet er falsch. Denke eher an sowas (OK, ohne die schicke Achse):

    #####                            
           #     #                           
          #       #                          
         #         #                         
        #           #                        
       #             #                       
    
      #               #                      
     #                 #                     
    
    #-------------------#-------------------#
    
                         #                 # 
                          #               #  
    
                           #             #   
                            #           #    
                             #         #     
                              #       #      
                               #     #       
                                #####
    


  • Das oben ist in der Tat die VORGABE unseres Professors(!).

    Ich komm mir langsam echt ungeeigent für das Studium vor...

    Ich tappe im dunklen; ist es so: y(x)=sin((2*pi)/x) Das ist aber auch k****, da Division durch 0...



  • minastaros schrieb:

    bandchef schrieb:

    Jetzt aber: y = sin(x/(2*pi))

    Wohl auch nicht. Der Sinus verlangt als Eingabe Werte von 0 bis 2*pi.

    Nö, der Sinus ist nur 2π-periodisch, aber du darfst beliebige komplexe Zahlen reinwerfen.

    bandchef schrieb:

    y(x)=sin((2*pi)/x)

    Du willst gleiche Abstände zwischen den einzelnen Werten. Das riecht nicht nach nem Sinus, denn der Sinus ist ne Welle statt ner Geraden.



  • Heißt das ich soll den arcus sinus verwenden?



  • Um Gottes Willen, noch kursiver kann ich Gerade nicht schreiben. Vielleicht Gerade? Oder soll ich Streckung brüllen?



  • Michael E. schrieb:

    Nö, der Sinus ist nur 2π-periodisch, aber du darfst beliebige komplexe Zahlen reinwerfen.

    Im Allgemeinen, ja. Aber in diesem Fall ist die Vorgabe (s. Link von bandchef) ziemlich eindeutig: Wir bilden genau eine Periode ab, also 2pi.

    @bandchef: Nicht verzweifeln. 2pi ist ja nur eine Konstante. Was in Deiner Rechnung noch fehlt, ist die 40.

    Also, mal langsam: Dein ganzer Sinus will am Ende 2*pi haben. Deine Schleife geht wohl von 0 bis 40 (weil Du 41 Teile hast inklusive dem ersten und dem letzten). 40 ist aber zu groß, also mußt Du Dein x, was dann 40 hat, irgendwie auf 2pi kriegen...

    Übrigens noch ein Gedanke (hoffe, das verwirrt jetzt nicht zu viel...): Wenn man den Zeilenarrays am Ende noch ein extra Character spendiert und das richtige Zeichen reinsetzt, dürfte das Drucken dieser Zeile ein Kinderspiel werden. Und wenn man hinter das ganze Array auch noch ein extra Zeichen spendiert, wird die Ausgabe von allen Zeilen ein Kinderspiel...



  • Sorry, aber was hat eine "Streckung" (was auch immer das auch ist...; hab ich in Mathe noch nie gehabt!) mit dem Sinus der Darstellung zu tun? Und unter Geraden stelle ich mir das hier vor: y=m*x+t



  • @minastaros:

    @bandchef: Nicht verzweifeln. 2pi ist ja nur eine Konstante. Was in Deiner Rechnung noch fehlt, ist die 40.

    Welche Rechnung meinst du? Die y = sin(x/(2*pi)), y=sin(x) oder y(x)=sin((2*pi)/x)?



  • bandchef schrieb:

    Welche Rechnung meinst du? Die y = sin(x/(2*pi)), y=sin(x) oder y(x)=sin((2*pi)/x)?

    In allen. Du hast eine Laufvariable x, ein 2*pi und da muss jetzt noch die 40 dazu. Ist übrigens auch eine Konstante in dem Spiel. V.Falcon hat vorgeschlagen, das als xdim rauszuziehen. Richtig so (nur vorsicht mit den off-by-one-Fehlern, vor denen auch Profs offensichtlich nicht gefeit sind...)



  • minastaros schrieb:

    Michael E. schrieb:

    Nö, der Sinus ist nur 2π-periodisch, aber du darfst beliebige komplexe Zahlen reinwerfen.

    Im Allgemeinen, ja. Aber in diesem Fall ist die Vorgabe (s. Link von bandchef) ziemlich eindeutig: Wir bilden genau eine Periode ab, also 2pi.

    Ich gehe immer noch von SeppJs Aufgabe aus, [0, 40] auf [0, 2pi] linear zu projizieren. Aber meinetwegen können wir direkt den Sinus mitnehmen...



  • Kein Einwand hinsichtlich der Projektion. Die Funktion an sich ist ja austauschbar.

    "Der Sinus" meinte ich mit Betonung als Der Sinus, also genau der, der zu zeichnen wäre... 😉


  • Mod

    Mag jetzt hart klingen:

    bandchef schrieb:

    Ich komm mir langsam echt ungeeigent für das Studium vor...

    Erstes Semester?

    Brich das Studium ab, solange du noch nicht zu viel Zeit verschwendet hast.



  • Könnt ihr mir nicht noch einmal draufhelfen? Wie bilde ich denn nun den Sinus auf 0-40 ab?

    Geht's so: ((2*PI)/40)*i

    #include<iostream>
    #include<math.h>
    #define M_PI 3.141592654
    using namespace std;
    
    int main()
    {
     int i, j, k, l;
     double sinus[41], array[21][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] = ' ';
              }
     }
    
     for(k=0; k<41; k=k+1)
     {
    	 sinus[k] = ((2*M_PI)/40)*k;
     }
    
    system("pause");
    return 0;
    }
    

    Mit meinem obigen Code lass ich mir jetzt die 41 Werte in ein neues 1-dim Array reinschreiben. Bringt mich das jetzt weiter?

    Die y-Werte auf 0-20 skalieren geht doch dann eigentlich so, oder: y=10*sin(((2*PI)/40)*i)+10?


Anmelden zum Antworten