문제

내가 만들려고 노력 생성자를 위한 그래프 등을 허용하는 문자열로 매개 변수를 사용하여 빌드 그래프.

문자열 형식은 다음과 같습니다: |vertex list|Edges list| 예: |1,2,3,4,15|(1->2),(3->2),(4->15)|

아이디어는 생성자를 취할 것이 값을 문자열에서 다음 알 다음 작업을 수행할 수 있습니다(삽입 정점으로 꼭짓점 목록 한 후 삽입하는 가장자리로 가장자리의 목록):

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

나는 그냥 부부의"를"루프 검색,문자열지 무엇을 할지에 대한 이중(또는 그 이상)자리의 숫자입니다.나는 시작을 상상하는 모든 종류 의 심각하게 복잡한 루프와이 여기 나눌 수 있 나와 함께 더 이상 지적인 방법을 추출하고 이 데이터를 사용하여.

도움이 되었습니까?

해결책

당신은 a를 사용할 수 있습니다 stringstream 스트림 추출 연산자를 사용하여 정수를 얻으십시오.

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

이것은 숙제이기 때문에 가능성을 탐구하고 자신을위한 완전한 코드를 알아낼 것을 촉구합니다.

다른 팁

당신은 모든 것을보고 압도당하는 것 같습니다. 그것을 조각으로 나누십시오 ... 작업. 당신이하려는 것은 여기서 별도의 기능인 것 같습니다.

  1. 토큰 화
  2. 구문 분석 정점
  3. 구문 분석 가장자리
  4. 정점에서 실행
  5. 가장자리에서 실행

그것은 5 가지 기능이 더 많거나 없습니다.

파이프 (|)를 기반으로 토큰 화를 원하므로 파이프를 기반으로 하부 문자열을 가져 와서 각면을 적절한 파서로 전달하고 쉼표를 구문 분석하는 등을 전달하십시오.

당신을 위해 그것을하지 않을 것이지만, 나는 당신이 올바른 방향으로 당신을 생각하게 할 수 있기를 바랍니다. 프로그램을 배우는 것은 특정 언어에 관한 것이 아니라 생각의 방식을 바꾸는 것입니다.

전에는 사용한 적이 없지만 향상이 있습니다. 토큰 화기 수업. 당신은 모든 것을 루핑하지 않고도 당신을 위해 구성 요소로 쉽게 분해 할 수 있습니다.

숙제를하지 않고, 이것은 당신에게 좋은 출발을 줄 것입니다. vertex 목록을 구문 분석하기위한 기본 작업 흐름을 제공했습니다. Edge 목록을 직접 수행 할 수 있어야합니다. 또한 ParseverTex ()에서 오류 확인을 남겨두면 잘못된 문자를 만나면 오류가 발생할 수 있습니다.

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"));
}

구문 분석이 이런 종류의 것은 매우 간단(하지만 지루한)재귀적으로 하강 기술입니다.아이디어는 별도의 언어하는 분석되는 논리 단위로,다음 함수를 작성하는 구문 분석의 각 단위입니다.

면 우리는 그림은 예제"|1,2,3,4,15|(1->2),(3->2),(4->15)|" 는 전체 문자열은"다각형",우리는 쓰 parsePolygon(),는 다음과 같이 보일 것이다:

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

가정하자 버퍼 클래스는 실행을 통해 귀하의 문자열입니다.해야 합 두 개의 기본 작업:임에서의 다음 문자 없이 걸리는 그것은,그리고 소비 있습니다.

parseVertices 은 다음과 같이 표시될 수 있습니다.

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

당신이 원하는 오류를 처리하는 훨씬 더 나은,분명합니다.으면 스트림 발생하는 오류를 전달하는 오류 코드가 호출 스택 또는 예외입니다.

두 개의 더 많은 예제...parseVertexList 및 parseNumber 은 다음과 같이 표시될 수 있습니다.

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);
}

이것은 모두 매우 빠르고 더러운,그러나 희망한 아이디어를 제공합니다법이 어떻게 작동합니다.할 수 있는 함께 당신의 처리와 분석,위 그림과 같이 어디 parseVertexList 기능을 실제로는 않 addVertex 호출한다.

내 생각에 이것은 정말 하나의 간단한 방법을 설명서의 분석.이상적으로 우리는 항상 사용할 수 있 생성된 파서 같은 향상이나 pyparsing 또는 lex/yacc,그러나 인생은 항상 좋은,특히 위한 숙제입니다.

도 나는 점은 주목할 만한 가치가 있 위의 기술이 될 수 있습의 많은 과도한 분석 상황입니다.

a stringstream. 해당 페이지의 예제를 istringstream.

나는 확실히이 문제를 가지고 놀 수있는 구실로 사용합니다. 정신을 부스트하십시오! 이 작은 언어를 위해 작은 문법을 쓰는 것은 많은 재미가 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top