Frage

Ich versuche, einen Konstruktor für eine grafische Darstellung Klasse zu machen, die eine Zeichenfolge als akzeptiert Parameter und verwendet sie, um die Grafik zu bauen.

Der String formatiert ist wie folgt: |vertex list|Edges list| z.B. |1,2,3,4,15|(1->2),(3->2),(4->15)|

Die Idee ist, dass der Konstruktor die Werte aus der Zeichenfolge nehmen und dann kennen Sie die folgenden Aktionen (Einfügen der Eckpunkte in der Eckenliste auszuführen und dann die Kanten in die Kanten Liste einfügen):

addVertex(1)  
addVertex(2)  
addVertex(3)  
addVertex(4)  
addVertex(15)  
addEdge(1,2)  
addEdge(3,2)  
addEdge(4,15)  

ich hätte nur ein paar „für“ made Schleifen um die Zeichenfolge zu scannen, aber ich weiß nicht, was etwa doppelt (oder mehr) stelligen Zahlen zu tun. Ich fange an alle Arten vorstellen, von ernst für Schleifen kompliziert und ich frage mich, ob jemand hier teilen könnten bei mir keine intelligentere Wege zu extrahieren und diese Daten zu verwenden.

War es hilfreich?

Lösung

Sie können einen stringstream verwenden und den Stream-Operator verwenden, um Ihre Zahlen zu bekommen.

string s("12 34");
istringstream ss(s);
int x, y;
ss >> x >> y;

Da diese Hausaufgaben, ich fordere Sie auf, die Möglichkeiten zu erforschen und die komplette herauszufinden Code für sich selbst.

Andere Tipps

Sie scheinen überwältigt werden immer an der ganzen Sache suchen. Brechen sie in Stücke ... Aufgaben. Was Sie versuchen, getrennte Funktionalitäten zu tun scheint, hier zu sein.

  1. Tokenizing
  2. Parsing Vertices
  3. Parsing Kanten
  4. Ausführung auf Vertices
  5. Ausführung auf Kanten

Das ist 5 Funktionen mehr oder weniger.

Sie wollen, basierend auf dem Rohr tokenize (|). So einen Teil nehmen auf dem Rohr basierte und auf jede Seite mit dem entsprechenden Parser übergeben, analysieren auf dem Komma und so weiter

geht nicht um es für Sie tun, aber hoffentlich kann ich Ihnen in die richtige Richtung zu denken. ist nicht so viel über eine bestimmte Sprache zu programmieren lernen, sondern um die Art und Weise Sie denken, zu ändern.

Ich habe es nie benutzt, aber es gibt einen Schub tokenizer Klasse. Sie könnte es in Komponenten für Sie bequem die Sache brechen, ohne all die für-Looping.

Ohne Ihre Hausaufgaben für Sie zu tun, dies wird Ihnen einen guten Vorsprung. Ich habe Ihnen die grundlegenden Arbeitsablauf gegeben Eckenliste zu analysieren, sollten Sie in der Lage sein, sich der Rand der Liste zu tun. Ich lasse auch den Fehler zu Ihnen Überprüfung, zum Beispiel in parseVertex () Sie einen Fehler geben möchten, wenn Sie ungültige Zeichen auftreten.

void skipWhiteSpace(const char*& first , const char* last) {
    // do whatever need to be done to skip white space
}

// parse integer only, no error checking is performed
bool parseVertex(const char*& first , const char* last) {
    skipWhiteSpace(first, last);
    const char* numBegin = first;
    for (; first != last && ::isdigit(static_cast<unsigned char>(*first)); 
        ++first) {}
    if (numBegin != first) {
        std::cout << "addVertex(" << std::string(numBegin, first) << ")" << std::endl;
        return true;
    }

    return false;
}

bool parseComma(const char*& first , const char* last) {
    skipWhiteSpace(first, last);
    if (first != last && ',' == *first) {
        ++first;
        return true;
    }

    return false;
}

// VL := V (, VL)
// a vertex list (VL) is a vertex (V) followed by a comma than another vertex list
bool parseVertexList(const char*& first, const char* last) {
    if (parseVertex(first, last)) {
        parseComma(first, last) && parseVertexList(first, last);
        return true;
    }

    return false;
}
}

void test() {
    const char* str = "1,2,3,4,15";
    parseVertexList(str, str + sizeof("1,2,3,4,15"));
}

diese Art der Sache Parsing ziemlich einfach ist (wenn auch langweilig) mit rekursiven Abstiegs-Techniken. Die Idee ist, die Sprache zu trennen in logische Einheiten analysiert wurde, dann eine Funktion schreiben, jede dieser Einheiten zu analysieren.

Wenn wir im Beispiel Bild "| 1,2,3,4,15 | (1-> 2), (3> 2), (4-> 15) |" dass die gesamte Zeichenfolge ein „Polygon“ ist, würden wir parsePolygon () schreiben, was in etwa so aussehen:

void parsePolygon (Buffer& b)
{
  parseVertices (b);
  parseEdges (b);
}

Nehmen wir an, Buffer eine Klasse, die durch die Zeichenfolge ausgeführt wird. Sie werden zwei grundlegende Operationen benötigen. Blick auf das nächste Zeichen ohne es zu raubend und das nächste Zeichen verbrauchen

parseVertices könnte wie folgt aussehen:

void parseVertices (Buffer& b)
{
  if (b.peek() != '|') { /* error */ }
  b.consume (); // burn the '|'
  parseVertexList (b);
  if (b.peek() != '|') { /* error */ }
  b.consume (); // burn the '|'
}

Sie würden wollen Fehler viel besser, offensichtlich zu handhaben. Wenn der Strom einen Fehler trifft braucht es den Fehlercode auf die Aufrufliste zu übergeben oder eine Ausnahme aus.

Zwei weitere Beispiele ... parseVertexList und parseNumber könnte wie folgt aussehen:

void parseVertexList (Buffer& b)
{
  addVertex (parseNumber (b));
  while (b.peek() == ',')
  {
     b.consume (); // eat the comma
     addVertex (parseNumber (b));
  }
}

int parseNumber (Buffer& b)
{
  char accum[80] = { '0' };  // sensible default in case of failure
  int accumPos = 0;
  while (isDigit (b.peek())
  {
    accum[accumPos++] = b.consume();
  }
  return atoi(accum);
}

Das ist alles sehr schnell und schmutzig, aber hoffentlich es gibt Ihnen eine Vorstellung davon, wie die Technik funktioniert. Sie können Ihre Behandlung mit Ihrem Parsing vermischen, wie oben dargestellt, wobei die parseVertexList Funktion ist eigentlich die addVertex für Sie angerufen werden.

Ich denke, das ist wirklich eine der einfachsten Methoden der manuellen Analyse. Im Idealfall würden wir immer in der Lage sein, erzeugen Parser wie boost Geist oder pyparsing oder lex / yacc zu verwenden, aber das Leben ist nicht immer so gut, vor allem für die Hausaufgaben.

Auch ich nehme an es ist erwähnenswert, dass die obige Technik viel Overkill für einige Parsing Situationen sein kann.

Verwenden Sie ein stringstream . Beachten Sie das Beispiel auf dieser Seite mit einem istringstream in Zahlen zu lesen.

Ich würde dieses Problem als Vorwand verwenden, um mit zu spielen boost Geist ! Schreiben eine wenig Grammatik für diese winzige Sprache soll eine Menge Spaß sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top