Sinus zeichnen lassen



  • Hey Leute!

    Ich hab wieder eine Aufgabe bei der ich überhaupt nicht weiß wie ich rangehen soll. bzw. mir macht die Umsetzung in C wieder Probleme.

    Folgende Aufgabe:
    Erzeugen Sie ein 2-dimensionales Feld von Zeichen (21 Zeilen a 41 Zeichen) und drucken sie eine Sinuskurve in dieses Feld (siehe Beispielskizze). Geben Sie diese Kurve dann in der Konsole mittels printf() oder cout aus. Benutzen Sie für den Sinus die Funktion double sin(double x) aus math.h.

    So meine "Idee":

    So ne Sinuskurve besteht ja aus x. und y-Werten. D.h., ich muss mir zuerst alle Werte für die x-Richtung (also 41) und alle für die y-Werte (also 21) berechnen lassen. Diese Werte schreib ich dann in ein Array und gib es aus. So wirklich klar kommen tu ich aber dabei mit der Implementierung in C aber nicht. Könnt ihr mir vielleicht stückchenweise helfen?


  • Mod

    bandchef schrieb:

    So ne Sinuskurve besteht ja aus x. und y-Werten. D.h., ich muss mir zuerst alle Werte für die x-Richtung (also 41) und alle für die y-Werte (also 21) berechnen lassen. Diese Werte schreib ich dann in ein Array und gib es aus. So wirklich klar kommen tu ich aber dabei mit der Implementierung in C aber nicht. Könnt ihr mir vielleicht stückchenweise helfen?

    Klar. Das erste Stückchen machst aber du.

    Und darf es C oder C++ sein?

    Für C: Gib uns ein 41 elementiges Array und eine Schleife über all dessen Elemente. Der Datentyp der Arrayelemente sei int[21].
    Für C++: Gib uns einen Vector und eine Schleife die 41 mal abläuft. Der Datentyp der Vectorelemente sei vector<bool>.



  • Es soll c sein.

    Ich hab jetzt mal ein 41-Elemente-Array in einer for-Schleife:

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

    Ich weiß, dass <iostream> keine Standard C-Bibliothek ist, aber ich möchte für die Ausgabe cout benutzen, was durch unseren Prof. so "genehmigt" ist. Ist das für euch/dich in Ordnung?



  • Dann kannst du auch direkt C++ benutzen. Dann ist es auch egal wieviel du von der STL benutzt. Aber was spricht gegen printf wenn du C benutzen musst?



  • Ich sag mal so, mein Prof. wird schon seine Gründe haben, wenn er zu uns sagt wir sollen cout verwenden...


  • Mod

    Trotzdem verschiebe ich dich mal nach C, ein bisschen cout werden die Leute dort schon verkraften, wenn man im C++ Forum dafür dauernd mit den string.h Funktionen zu tun bekommt.

    Zum Thema: Ok, ausgezeichnet. Jetzt willst du dem Array ja noch etwas zuweisen. Und zwar Nullen für alle Felder, außer einem, welches für den Funktionsverlauf steht. Zuerst mal die Nullen: Du brauchst in der Schleife noch eine weitere Schleife bis 21, die alle Einträge des Unterarrays auf Null setzt.

    Und nebenbei kannst du dir noch folgendes überlegen: Der Sinus hat Werte zwischen -1 und 1. Wie könnte man Werte zwischen -1 und 1 wohl auf Werte zwischen 0 und 20 übertragen?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hm, leider haben wir die Beispielskizze nicht zu Verfügung. Gehe ich recht in der Annahme, dass die Kurve aus einzelnen Zeichen (z.B. '#') bestehen soll und dass die "Welle" waagerecht ist? Und sie soll zwischen oben (+10) und unten (-10) hin- und herschwingen?

    Frage: Braucht es denn unbedingt ein zweidimensionales Array? Oder können wir erstmal eindimensional anfangen...





  • Das ist ja cheat...

    Schlage vor, aus dem Grund machen wir das Ganze doch mal horizontal... 😉



  • Mach mal

    char array[21][41];
    


  • Hm, leider haben wir die Beispielskizze nicht zu Verfügung. Gehe ich recht in der Annahme, dass die Kurve aus einzelnen Zeichen (z.B. '#') bestehen soll und dass die "Welle" waagerecht ist? Und sie soll zwischen oben (+10) und unten (-10) hin- und herschwingen?

    Frage: Braucht es denn unbedingt ein zweidimensionales Array? Oder können wir erstmal eindimensional anfangen...

    Es ist genauso. Die Sinuslinie soll mit # dargestellt werden. In meiner Zeichnung hab ich 15 Zeilen...

    Ob es ein zweidimensionales Feld braucht weiß ich nicht. Ich hab mir nur gedacht, dass es ohne ein 2-dim. Feld gar nicht geht, da ich ja für die x-Achse ein Array und ein Array für die y-Achse brauche...

    @SeppJ:

    Zum Thema: Ok, ausgezeichnet. Jetzt willst du dem Array ja noch etwas zuweisen. Und zwar Nullen für alle Felder, außer einem, welches für den Funktionsverlauf steht. Zuerst mal die Nullen: Du brauchst in der Schleife noch eine weitere Schleife bis 21, die alle Einträge des Unterarrays auf Null setzt.

    int main()
    {
     char i, array[21][41];
    
     for(i=0; i<21; i=i+1)
     {
      array[i][41];
     }
    
     for(i=0; i<41; i=i+1)
     {
      array[21][i] = '#';
     }
    

  • Mod

    bandchef schrieb:

    Ob es ein zweidimensionales Feld braucht weiß ich nicht. Ich hab mir nur gedacht, dass es ohne ein 2-dim. Feld gar nicht geht, da ich ja für die x-Achse ein Array und ein Array für die y-Achse brauche...

    Oh. Ich dachte, das wäre die Aufgabenstellung. Eigentlich ist das Vorgehen mit 2D Array extrem umständlich. Willst du mit deiner Idee vom 2D Array weitermachen oder willst du was besseres entwickeln?

    @SeppJ:

    Zum Thema: Ok, ausgezeichnet. Jetzt willst du dem Array ja noch etwas zuweisen. Und zwar Nullen für alle Felder, außer einem, welches für den Funktionsverlauf steht. Zuerst mal die Nullen: Du brauchst in der Schleife noch eine weitere Schleife bis 21, die alle Einträge des Unterarrays auf Null setzt.

    int main()
    {
     char i, array[21][41];
     
     
     
     for(i=0; i<21; i=i+1)
     {
      array[i][41];
     }
     
     
    
     for(i=0; i<41; i=i+1)
     {
      array[21][i] = '#';
     }
    

    Das passt überhaupt nicht. Denk nochmal darüber nach. Und versuch dir etwas mehr Mühe zu geben und mitzudenken. Du willst ein zweidimensionales Array auf 0 setzen. Kann dein Code dies leisten?



  • Oh. Ich dachte, das wäre die Aufgabenstellung.

    SeppJ, da hast Du sogar recht. Habe die Aufgabe gar nicht soo genau gelesen...

    Naja, machen wir halt 2-dimensional weiter.

    Abgesehen davon hielte ich ein Zuerst-die-Werte-Berechnen (eindimensional...), Dann-Werte-ausgeben für didaktisch wesentlich sinnvoller und auch für Anfänger nicht schwerer als die geforderte Brute-Force-Methode.



  • Vielleicht könnt ihr euch aus diesen Code ein paar Ideen holen. Ich hab den mal vor einiger Zeit aus dem IRC gefischt, keine Ahnung mehr von wem 😕 Ist aber imo sehr beeindruckend!

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int plot[25] = {
      ' ', ',', '/', '/', '|',
      '_', '_', '/', '/', '|',
      '\\', ',', '-', '\'', '/',
      '|', '\\', '`', '\'', '\'',
      '|', '\\', '\\', '\'', ' '
    };
    
    double f(double x) {
      return sin(x);
    }
    
    int main() {
      double xn = 0.0,
             xx = 2*M_PI;
      double yn = -1,
             yx = 1;
      double ab, be, up, mi;
      int nx = 75,
          ny = 10;
      int i, j, p;
      double *v = calloc(nx+1, sizeof(double));
      for(i=0; i<=nx; i++) {
        v[i] = f(xn+(xx-xn)/nx*i);
      }
      for(j=0; j<=ny; j++) {
        ab = yn+(yx-yn)*(ny-j)/ny;
        be = yn+(yx-yn)*(ny-j-1)/ny;
        up = be+(ab-be)/3;
        mi = be+(ab-be)*2.0/3;
        for(i=1; i<=nx; i++) {
          if(v[i-1]>=ab) p=4; else if(v[i-1]>=up) p=3; else if(v[i-1]>=mi) p=2; else if(v[i-1]>=be) p=1; else p=0;
          p*=5;
          if(v[i]>=ab) p+=4; else if(v[i]>=up) p+=3; else if(v[i]>=mi) p+=2; else if(v[i]>=be) p+=1;
          putchar(plot[p]);
        }
        putchar('\n');
      }
    }
    


  • Biolunar schrieb:

    Ist aber imo sehr beeindruckend!

    Beeindruckend unverständlich. Der Name "plot" passt übrigens nicht ins Schema, "pt" würde passen 🙄



  • wieso wollen alle sowas auf der console zeichnen? nur weil wir hier im c89/99 subforum sind können wir trotzdem grafiken zeichnen und wenns nur ne *.bmp als ausgabe ist 😡



  • Weil das Ding nicht um Grafik geht sondern eine Übung, wie man seine Daten strukturiert und damit umgeht. Die Ausgabe ist nur Mittel zum Zweck.

    @Biolunar: Ein Programm(code) ist dann gut, wenn er einem (menschlichen) Leser so klar wie möglich beschreibt, was es macht und seine Struktur offenbart. Dazu gehören in erster Linie mal sprechende Variablen- und Funktionsnamen und wenn das nicht reicht der eine oder andere präzise Kommentar.

    Ein solches Programm hier tut all das nicht, und was soll ein Anfänger daraus lernen? Am besten: Wie man keine Programme schreiben sollte.



  • Gut, ich hab gelesen, dass man für mein Übungsprogramm gar kein 2-dimensionales array braucht. Ich würde es dann gerne mit einem 1-dimensionalen Array versuchen. Wie gehe ich da dann vor?

    Passt da mein Schema noch: y- und x-Wert des Sinusberechnen lassen und dann eben ausgeben?

    EDIT: Sorry, wir sollten schon 2-dimensional weitermachen, weil ja die Aufgabe tatsächlich ein 2-dimensionales Feld verlangt.



  • @SeppJ:

    Das passt überhaupt nicht. Denk nochmal darüber nach. Und versuch dir etwas mehr Mühe zu geben und mitzudenken. Du willst ein zweidimensionales Array auf 0 setzen. Kann dein Code dies leisten?

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

    Gut, aber nun, wenn du es sagst, dann mach ich es eben:

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

    for(i=0; i<21; i=i+1)
     {
      array[i][41] = 0;
     }
    
     for(i=0; i<41; i=i+1)
     {
      array[21][i] = 0;
     }
    

Anmelden zum Antworten