Sinus zeichnen lassen



  • bandchef schrieb:

    0000##00000000000
    000#00#0000000000
    0#00000#000000000
    #0000000#00000000
    000000000#000000#
    0000000000#0000#0
    00000000000#00#00
    000000000000##000

    Das ist zwar das Grundprinzip, aber meine "Zeichnung" in der Aufgabe, zeigt die Rauten, aber keine Nullen.

    Dann solltest du dein Array auch mit ' ' initialisieren und nicht mit 0. Ich würde dir auch dringend raten, das nochmal über Schleifen zu probieren. Der direkte Weg ist zwar sauberer, aber es bringt nichts, dass du dich am nächsten Teil versuchst, wenn du den Umgang mit verschachtelten Schleifen ( ⚠ ) noch nicht verstanden hast.



  • Wenn ich nun mit Leerzeichen intitialisiere, dann sieht mein Code so aus:

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

    Da ich ja anscheinend meine Array nun richtig intialisiert habe wie geht es nun weiter? Muss ich nun die x- bzw- y-Werte des Sinus berechnen lassen?


  • Mod

    bandchef schrieb:

    Ich denke, aber ich kann ja mein Array auch mit " " Leerzeichen initialisieren, oder? Dann erziele ich doch genau den Effekt, oder? Nur isses doch dann ein char, oder?

    Problem ist nur, dass es nicht so einfach ist, ein 2D-Array auf diese Art mit etwas anderem als Null zu initialisieren. Denn an sich, wäre das Leerzeichen (welches ' ' ist, nicht " ") besser als die 0. Deshalb hätte ich die Schleifen bevorzugt.

    Nichtsdestotrotz: Nächste Aufgabe: Wie kann man Werte zwischen 0 und 40 auf das Intervall 0 bis 2*Pi übertragen? Und wie kann man Werte zwischen -1 und +1 auf den Bereich 0 bis 20 umrechnen?



  • ...wäre das Leerzeichen (welches ' ' ist, nicht " ") besser als die 0...

    Beachte meinen letzten Beitrag, ich hab da ' ' stehen...

    Wie kann man Werte zwischen 0 und 40 auf das Intervall 0 bis 2*Pi übertragen?

    Ich schlage das vor (sicher bin ich mir aber nicht): (2*pi)/41

    Und wie kann man Werte zwischen -1 und +1 auf den Bereich 0 bis 20 umrechnen?

    Ich schlage das vor (sicher bin ich mir aber nicht): 1/10; (-1)/10 (Was mit der Nulllinie geschehen soll weiß ich nicht...

    Edit: Ich hab nochmal überlegt, für die y-Werte wärs besser wenn man sagt: -1 bis zu Nulllinie = 0 - 9 und ab der Nulllinie bis +1 = 11 - 20. Die Nulllinie selbst ist dann quasi 10.


  • Mod

    bandchef schrieb:

    ...wäre das Leerzeichen (welches ' ' ist, nicht " ") besser als die 0...

    Beachte meinen letzten Beitrag, ich hab da ' ' stehen...

    Hatte ich noch nicht gelesen. Im vorherigen Beitrag war es noch falsch. Du wirst jedoch feststellen, dass nur der Eintrag array[0][0] ein Leerzeichen ist, der Rest ist 0.

    Wie kann man Werte zwischen 0 und 40 auf das Intervall 0 bis 2*Pi übertragen?

    Ich schlage das vor (sicher bin ich mir aber nicht): (2*pi)/41

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



  • 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]



  • 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


Anmelden zum Antworten