2

espero que estén bien.

Quisiera que me ayudaran por favor en leer números separados por comas en lenguaje C++, se que en java se utiliza la funcion split pero soy nuevo en c++ y no se como hacerlo.

Es para agregarlos a una matriz con su transpuesta, por ejemplo:

Si el usuario ingresa: 1,2,3,4,5,6,7,8,9

la matriz es de:

1 2 3
4 5 6 
7 8 9

y su transpueesta es:

1 4 7
2 5 8
3 6 9

Lo he hecho de esta manera:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()

{
    int i;//Variable to columns of the matrix
    int j;//Variable to rows of the matrix
    int n;//Variable to define the matrix
    int numero;
    cout<< "Defina el tamaño de la matriz"<<endl;



    cin>>n;//Read the length of the matrix
    int matriz[n][n];
    cout<<"Introduzca los numeros: ";

    for(i =0; i<n;i++)
    {
        for(j=0; j<n;j++)
        {
            cin>>numero;//Read the numbers in the console.
            matriz[i][j]=numero;//Add to the matrix the numbers
        }

    }

    cout<<"La matriz original es"<<endl;

    //Print the original matrix
    for(i =0; i<n;i++)
    {
            for(j=0; j<n;j++)
            {
                cout<<matriz[i][j]<<" ";
            }
               cout<<""<<endl;
    }

    cout<<"La transpuesta de esta matriz es"<<endl;

    //Print the transpose of the matrix
    for(i =0; i<n;i++)
    {
            for(j=0; j<n;j++)
            {
                cout<<matriz[j][i]<<" ";
            }
                 cout<<""<<endl;
     }

    return 0;

    }

Pero no logro que los numeros sean ingresados por comas, si no que los lee de manera comun (1 enter, 2 enter, 3 enter...)

Gracias de antemano.

Yesith
  • 61
  • 2
  • 9
  • Las matrices bidimensionales no se declaran como crees, necesitas constantes para los tamaños, no variables. – PaperBirdMaster Dec 05 '17 at 16:39
  • Muchas gracias a todos :D hare mas programas en c++ tomando en cuenta sus consejos para fortalecerme en este lenguaje, gracias por sus explicaciones de errores en código y grandes ideas, de paso a resolver mi duda en cuanto a la sucesion de numeros ingresados por el usuario. Muchas gracias a todos nuevamente. – Yesith Dec 05 '17 at 19:29

3 Answers3

2

El proceso de separar una cadena de caracteres en diferentes piezas se conoce como "Tokenización". Para tokenizar habitualmente uso una plantilla:

template <typename char_type>
using string_collection = std::vector<std::basic_string<char_type>>;

template <typename char_type>
string_collection<char_type> split(const std::basic_string<char_type> &text)
{
    using string = std::basic_string<char_type>;

    std::basic_stringstream<char_type> reader(text);
    string_collection<char_type> result;
    string token;

    while (std::getline(reader, token, ','))
        result.push_back(token);

    return result;
}

Puede parecer compleja pero en realidad es bastante simple:

  1. Recibe una cadena por parámetros.
  2. Usa la cadena para construir un flujo lector de cadenas (std::stringstream).
  3. Llama a la función std::getline pasando como carácter separador la coma (,).
  4. Guarda cada una de las cadenas tokenizadas en un vector de cadenas y lo devuelve.

No logro que los números sean ingresados por comas, si no que los lee de manera común.

Tu código tiene multitud de problemas además del que mencionas. Intentaré mencionarlos todos.

  1. Los arreglos no se pueden declarar con variables, debe ser con constantes (consulta estas preguntas para saber por qué), tu código:

    int value;
    int i=0;//Variable to columns of the matrix
    int j=0;//Variable to rows of the matrix
    int n;//Variable to define the matrix
    cout<< "Defina el tamaño de la matriz"<<endl;
    cin>>n;//Read the length of the matrix
    int matriz[n][n];
    

    Debería ser:

    int n;//Variable to define the matrix
    std::cout << "Defina el tamaño de la matriz\n";
    std::cin >> n;//Read the length of the matrix
    auto matriz = new int*[n];
    
    for (int v = 0; v < 10; ++v)
        matriz[v] = new int[n];
    

    No olvides borrar la memoria al acabar.

  2. Para leer los datos, usa la función split presentada antes:

    std::cout << "Introduzca los numeros: ";
    std::string str;
    std::cin >> str;
    int indice = 0;
    
    for (const auto &numero : split(str))
    {
        matrix[indice % n][indice / n] = std::stoi(numero);
        ++indice;
    }
    
  3. <stdio.h> y <string.h> son cabeceras de C no de C++, lee en este hilo por qué no deberías usarlas.
  4. Evita usar using namespace std a no ser que sea estrictamente necesario (no suele serlo), lee este hilo para saber por qué.
  5. Evita usar std::endl a no ser que sea estrictamente necesario (no suele serlo) lee este hilo para saber por qué.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
2

Si el usuario introduce los números tal que 1,2,3,... la lectura puede ser tan sencilla como el código que sigue:

for(int i=0; i<n;i++)
{
    for(int j=0; j<n;j++)
    {
        cin>>matriz[i][j];   // Se lee el numero
        cin.ignore(1); // Se descarta el separador
    }
}

Eso sí, nota que utilizando cin, la secuencia no será procesada hasta que no se introduzca un salto de línea (enter para que nos entendamos).

En cuanto a los problemas de tu código, me remito a la respuesta de @PaperBirdMaster

eferion
  • 49,291
  • 5
  • 30
  • 72
0

Prueba ingresando los números con comas en una variable de tipo string, Tendrías algo de este estilo

string numeros;
cout << "Ingrese los números " << "\n" << endl;
cin >> numeros;

Luego vas extrayendo elemento a elemento en la cadena, conviertes a tipo int e ingresas a la matriz. Espero haber ayudado.