Sinus zeichnen lassen



  • Ich hab ihn jetzt mal ausprobiert, aber ich bekomm eine Endlosschleife... An was liegt das jetzt? Die Bedingungen der beiden for-Schleifen hab ich doch richtig gesetzt... Die Endlosschleife produziert mir auch nur die zweite Schleife, also die, die mir die Elemente in 2. Dimension reinschreibt... Versteh ich nicht.


  • Mod

    bandchef schrieb:

    Warumm will ich mein 2-dimensionales Feld komplett auf 0 setzen?

    Ich dachte, dies sei deine Ursprungsidee gewesen, dass im Array hinterher so etwas steht:

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

    Ich hätte das zwar niemals so gemacht, aber das war das was du beschrieben hast.

    Hier mein Code, der hoffentlich das leistet was du sagst:

    Das tut er nicht annähernd. Ich habe dir sogar schon ganz genau gesagt wie es geht.



  • Das Array initialisiert man üblicherweise gleich bei der Definition mit 0, z.B.

    char array[21][41] = {0};
    

    und das wegen der besseren Lesbarkeit auch global/statisch.



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



  • @SeppJ:

    Ich hab jetzt mein Array auf 0 gesetzt, und zwar so wie Wutz gezeigt hat; nämlich gleich bei der Deklaration.

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

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

    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?



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


Anmelden zum Antworten