2016-10-13 3 views
0

Also muß ich eine Methode, um die zwei ASCII-Bilder nimmt, die ich erstellt und druckt sie nebeneinander, so dass der Methodenaufruf:C++: Wie drucke ich zwei ASCII-Bilder nebeneinander?

concatHz(Picture l, Picture r); 

Wo Bild ist ein Objekt, das ASCII-Bild als String speichert in den Feldern l.result und r.result.

Wenn r war

+------+ 
|This | 
|is the| 
|String| 
+------+ 

und l war:

This 
is the 
String 

dann wäre das Ergebnis:

This +------+ 
is the|This | 
String|is the| 
     |String| 
     +------+ 

Ich habe gedacht Möglichkeiten dies zu tun, aber sie scheinen zu kompliziert und es könnte einen einfacheren Weg geben. Ich dachte daran, for loops zu benutzen, um durch jede Zeichenkette zu gehen und die erste und dann die zweite Zeichenkette zu drucken, aber dann kommt das Problem eines Indexierungsfehlers wie im obigen Beispiel auf. Gibt es eine einfache Möglichkeit, dies zu tun, an die ich nicht denke? Hier

ist die Methode, die die zugrunde liegende ASCII Bild erzeugt:

Picture Picture::create(std::vector<std::string> v){ 
    Picture c; //default constructor called without parenthesis 
    c.picList=v; 
    c.result=""; 
    int max1=0; 
    for(int i=0;i<v.size();i++){ 
     if(v.at(i).length()>max1){ 
      max1=v.at(i).length(); 
     } 
     c.rows++; 
     c.result+=v.at(i)+"\n"; 
    } 
    c.maxLen=max1; 
    return c; 
} 
+1

Was Sie denken an ist so einfach, wie es sein könnte. Sie müssen nur Dinge richtig "indexieren" und eine Reihe von Leerzeichen anstelle der nicht vorhandenen Zeile für das erste Bild für die letzte Zeile drucken. Das ist keine Raketenwissenschaft. Nur eine einfache Größe in der Logik. –

+1

Es hängt davon ab, wie die 'Bild'-Datenstruktur aussieht. –

+0

Die Hauptsache ist, dass es eine Zeichenkette namens result als Repräsentation dieser Ascii mit \ n für die neuen Zeilen speichert. –

Antwort

1

Generieren Sie nicht das vollständige Bild als einzelnes std::string, Sie benötigen Zugriff auf die einzelnen std::string Werte, die jeweils std::vector bilden. Auf diese Weise können Sie eine einzelne Schleife ausführen, wobei jede Iteration die nächste l Zeichenfolge ausgibt, die auf l.maxLen Zeichen aufgefüllt ist. Anschließend gibt sie die nächste r Zeichenfolge aus und gibt dann einen Zeilenumbruch aus. Beenden Sie die Schleife, wenn beide Bilder verbraucht sind.

Zum Beispiel:

#include <string> 
#include <vector> 

class Picture 
{ 
private: 
    std::vector<std::string> picList; 
    std::size_t maxLen; 
public: 
    Picture(); 
    Picture(const std::vector<std::string> &v); 

    static Picture create(const std::vector<std::string> &v); 

    std::size_t getMaxRowLen() const; 
    std::size_t getRows() const; 
    std::string getRow(std::size_t index) const; 

    // just in case you really need it 
    std::string getResult() const; 
}; 

#include <iostream> 
#include <sstream> 
#include <iomanip> 

Picture Picture::create(const std::vector<std::string> &v) 
{ 
    return Picture(v); 
} 

Picture::Picture() 
    : maxLen(0) 
{ 
} 

Picture::Picture(const std::vector<std::string> &v) 
    : picList(v), maxLen(0) 
{ 
    for(std::vector<std::string>::const_iterator iter = picList.begin(); iter != picList.end(); ++iter) { 
     if (iter->length() > maxLen) { 
      maxLen = iter->length(); 
     } 
    } 
} 

std::size_t Picture::getMaxRowLen() const 
{ 
    return maxLen; 
} 

std::size_t Picture::getRows() const 
{ 
    return picList.size(); 
} 

std::string Picture::getRow(std::size_t index) const 
{ 
    std::string row; 
    if (index < picList.size()) { 
     row = picList[index]; 
    } 
    std::ostringstream oss; 
    oss << std::setw(maxLen) << std::left << std::setfill(' ') << row; 
    return oss.str(); 
} 

std::string Picture::getResult() const 
{ 
    std::ostringstream oss; 
    for(std::vector<std::string>::const_iterator iter = picList.begin(); iter != picList.end(); ++iter) { 
     oss << std::setw(maxLen) << std::left << std::setfill(' ') << *iter << "\n"; 
    } 
    return oss.str(); 
} 

void concatHz(const Picture &l, const Picture &r) 
{ 
    std::size_t rows = std::max(l.getRows(), r.getRows()); 
    for (std::size_t i = 0; i < rows; ++i) { 
     std::cout << l.getRow(i) << r.getRow(i) << "\n"; 
    } 
} 
0

Du bereits einen Vektor von Strings zu Bildschirminhalt darstellen.

Speichern Sie einfach Ihre beiden ASCII-Art Bilder in einem solchen Vektor, dann ausgegeben.

Alternativ können Sie die Cursorpositionierung über z. ncurses-Bibliothek.