2017-05-09 2 views
-1

J'essaie de recevoir une chaîne de points comme ceci (2,4), (5,8), (12,7), (15,54,3.65) et le séparer en x tableau et tableau y s'il vous plaît aider encore un débutant, je l'ai essayé et il est désastreuxséparation de chaîne en tableaux de x et y

string polygons; 
int i = 0; 
int length = polygons.length(); 
string x[10000]; 
int index = 0; 
int k = 0; 
getline(cin, polygons); 

for (i = 0; i < length; i++) 
{ 
    if (polygons[i] == '(') 
    { 
     k = polygons.substr(i + 1, 20).find_first_of(","); 

     x[index] = polygons.substr(i + 1, ((k + i) - (i + 1))); 
     index++; 
    } 
} 

int a = 0; 
string y[10000]; 
int index2 = 0; 
int c = 0; 

for (a = 0; a < length; a++) 
{ 
    if (polygons.substr(a) == ",") 
    { 
     c = polygons.substr(a + 1, 20).find_first_of(")"); 
    } 

    y[index2] = polygons.substr(a + 1, ((c + a) - (a + 1))); 
    index2++; 
} 
+2

Recommandez de trier les parenthèses et de fournir un [mcve] – user4581301

+0

Recommandation: cassez le travail. [Utilisez 'std :: string :: find'] (http://en.cppreference.com/w/cpp/string/basic_string/find) pour vous aider à trouver le '(' et ')', puis imprimer le contenu entre eux. Une fois que vous avez ce travail, remplacez le code d'impression avec ['std :: stringstream'] (http://en.cppreference.com/w/cpp/io/basic_stringstream) et' std :: getline' pour diviser en numéros qui étaient entre les parenthèses et imprimer les numéros. Lorsque tout cela fonctionne correctement et que vous avez un flux de paires de nombres, trouvez un bon moyen de stocker les paires. – user4581301

+0

merci je vais essayer ceci – Antonio

Répondre

0

pour convertir des points d'être une chaîne aux points avec des valeurs numériques, vous pouvez utiliser .find_first_of() et std::stod(). C'est mon code pour convertir votre chaîne de points en valeurs numériques.

#include <string> 
#include <iostream> 
#include <vector> 

using std::string; 
using std::vector; 
using std::cout; 
using std::endl; 

class Point 
{ 
public: 
    Point(double x= 0, double y= 0) : m_x(x), m_y(y) {} 
    inline double getX() const { return m_x; } 
    inline double getY() const { return m_y; } 
private: 
    double m_x, m_y; 
}; 

vector<Point> strPoints2NumPoints(const string& strPoints) 
{ 
    vector<Point> points; 

    for (int i(0); i < strPoints.size(); ++i){ 

     if (strPoints[i] == '('){ 
      // extract X & Y values as string 
      string temp = strPoints.substr(i+1, strPoints.find_first_of(")",i)-i-1); 
      // convert X as strig to double 
      double X = std::stod( temp.substr(0,temp.find(','))); 
      // convert Y as string to double 
      double Y = std::stod( temp.substr(temp.find(',')+1)); 
      points.push_back(Point(X,Y)); 
     } 
    } 

    return points; 
} 


int main(int argc, char* argv[]) 
{ 
    string strPoints("(2,4),(5,8),(12,7),(15.54,3.65)"); 
    vector<Point> numPoints; 

    cout << "Points as string: " << strPoints << endl; 

    numPoints = strPoints2NumPoints(strPoints); 

    cout << "Points as numbers: " << endl; 
    for(int i(0); i < numPoints.size(); ++i){ 
     cout << "Point:<" << numPoints[i].getX() << "," << numPoints[i].getY() << ">" << endl; 
    } 


    return 0; 
} 

La sortie du code précédent est

Points as string: (2,4),(5,8),(12,7),(15.54,3.65) 
Points as numbers: 
Point:<2,4> 
Point:<5,8> 
Point:<12,7> 
Point:<15.54,3.65> 
+0

merci pour votre temps c'est élégant – Antonio

+0

@Antonio, si vous pensez que cette réponse a résolu votre problème, plaît l'accepter en cliquant sur la coche. Bravo – CroCo

0

Selon vos codes et la logique, j'ai modifié les codes et la manipulation des bugs:

string polygons; 
int i = 0; 
string x[10000]; 
int index = 0; 
int k = 0; 
getline(cin, polygons); 
int length = polygons.length(); 

for (i = 0; i < length; i++) 
{ 
    if (polygons[i] == '(') 
    { 
     // k = polygons.substr(i + 1, 20).find_first_of(","); 
     k = polygons.find_first_of(",", i); 

     // x[index] = polygons.substr(i + 1, ((k + i) - (i + 1))); 
     x[index] = polygons.substr(i + 1, k - i - 1); 
     index++; 
    } 
} 

int a = 0; 
string y[10000]; 
int index2 = 0; 
int c = 0; 

for (a = 0; a < length; a++) 
{ 
    /* 
    if (polygons.substr(a) == ",") 
    { 
     c = polygons.substr(a + 1, 20).find_first_of(")"); 
    } 

    y[index2] = polygons.substr(a + 1, ((c + a) - (a + 1))); 
    index2++; 
    */ 
    if (polygons[a] == ',' && polygons[a + 1] != '(') 
    { 
     k = polygons.find_first_of(")", a); 
     y[index2] = polygons.substr(a + 1, k - a - 1); 
     index2++; 
    } 
} 

Voici mon code, il suffit d'améliorer et de simplifier votre style de code:

#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::string Polygons; 
    getline(std::cin, Polygons); 

    std::vector<std::string> XCoords; 
    for (int i = 0; i < Polygons.length(); ++i) 
    { 
     if (Polygons[i] == '(') 
     { 
      auto CommaIndex = Polygons.find_first_of(",", i); 

      XCoords.push_back(Polygons.substr(i + 1, CommaIndex - i - 1)); 
     } 
    } 

    std::vector<std::string> YCoords; 
    for (int i = 0; i < Polygons.length(); ++i) 
    { 
     if (Polygons[i] == ',' && Polygons[i + 1] != '(') 
     { 
      auto Index = Polygons.find_first_of(")", i); 

      YCoords.push_back(Polygons.substr(i + 1, Index - i - 1)); 
     } 
    } 

    return 0; 
} 

J'espère que c'est utile.

+0

merci et merci pour votre temps qui était exactement ce que je cherchais t – Antonio