Vertikales (Balken-)Diagramm, Konsolenapplikation



  • Hi!

    Folgendes Problem: Die Anzahl an Elementen pro Zahl soll wie folgt als Balkendiagramm vertikal ausgegeben werden.

    . | .
    . | |
    | | |
    | | |
    0: 1: 2: ...

    Meine Frage dazu ist: Wie kann ich das am besten (einfachsten)Lösen? (ohne die Punkte 🙂 )
    Ich verfüge schon über ein Array mit der häufigkeit der Zahlen, bzw. kann das Diagramm horizintal ausgeben.



  • Unter Windows kannst du SetConsoleCursorPosition (WinAPI) zur Positionsbestimmung verwenden und dann einfach das Zeichen ausgeben.
    Unter Unix steht die Funktion curs_move (ncurses) zur Verfügung.
    Alternativ gibt es noch die Escape Sequenzen.



  • Danke werds mal damit versuchen 🙂



  • gar nicht nötig. kannst doch auch zeilenweise schreiben.



  • volkard schrieb:

    gar nicht nötig. kannst doch auch zeilenweise schreiben.

    Will ich aber nicht :p


  • Mod

    volkard schrieb:

    gar nicht nötig. kannst doch auch zeilenweise schreiben.

    Genau. Aber ich hole mal etwas weiter aus, weil ich nicht denke, dass das als Tipp reicht: Berechne im Voraus, was du zeichnen möchtest. Dann weißt du, wie jede einzelne Zeile aussieht und kannst diese nacheinander ausgeben.

    Ein einfacher Trick dafür wäre einfach ein 2D char-Array. In dem kannst du rumspringen wie du möchtest, hinterher gibst du es dann einfach zeilenweise aus.



  • SeppJ schrieb:

    volkard schrieb:

    gar nicht nötig. kannst doch auch zeilenweise schreiben.

    Genau. Aber ich hole mal etwas weiter aus, weil ich nicht denke, dass das als Tipp reicht:

    Fürchte ich auch, daß der Tipp nicht reichte. Die Antwort war ja recht ignorant.

    SeppJ schrieb:

    Berechne im Voraus, was du zeichnen möchtest. Dann weißt du, wie jede einzelne Zeile aussieht und kannst diese nacheinander ausgeben.

    Ein einfacher Trick dafür wäre einfach ein 2D char-Array. In dem kannst du rumspringen wie du möchtest, hinterher gibst du es dann einfach zeilenweise aus.

    Sehe ich eigentlich nicht:

    //maximum suchen
    int max=0;
    for(i=0;i<size;i++)
       if(a[i]>max)
          max=a[i];
    
    //zeichnen
    for(;max>0;max--)
       for(i=0;i<size;i++)
          if(a[i]>=max)
             puts(" | ");
          else
             puts(" . ");
       puts("\n");
    
    //Beschriften
    for(i=0;i<size;i++)
       printf("%2d:",i);
    puts("\n");
    

  • Mod

    Klar, mit der eleganten Methode geht's auch.

    Die Arraymethode ist halt relativ narrensicher, wenn man auf obiges nicht kommt oder schwierigere Probleme lösen möchte. Damit kann der Threadersteller nämlich genau das machen, was er möchte: Genaues Setzen des "Cursors", ohne zeilenweise denken zu müssen.


Log in to reply