Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: eleon en 23 Enero 2012, 17:59 pm



Título: Secuencias en C++
Publicado por: eleon en 23 Enero 2012, 17:59 pm
Buenas tardes:

Estoy buscando la forma de introducir secuencias en C++, esto es, leer (cin) un texto o una secuencia de números de los cuales no sabemos cuál va a ser el tamaño. He buscado por internet y he encontrado cosas acerca de la librería string pero por lo que he visto es obligatorio indicar el número de elementos que va a tener la secuencia.

Las tablas (o arrays) no me sirven puesto que como ya he comentado la diferencia entre una tabla y una secuencia es que en la secuencia no sabemos cuántos elementos se van a introducir.

Gracias y saludos.


Título: Re: Secuencias en C++
Publicado por: Akai en 23 Enero 2012, 18:20 pm
Usa clases de la STL como list, vector, deque... te permiten modificar su tamaño dinamicamente:

http://cplusplus.com/reference/stl/

concretamente:

http://cplusplus.com/reference/stl/vector/

http://cplusplus.com/reference/stl/list/

http://cplusplus.com/reference/stl/deque/


Título: Re: Secuencias en C++
Publicado por: eleon en 23 Enero 2012, 18:44 pm
Gracias por tu tiempo, en lo que me respondían he seguido buscando por internet y encontré lo esto: http://www.clubdesarrolladores.com/articulos/mostrar/70-cpp-string-class-clase-cpp-para-cadenas-de-caracteres

He compilado el siguiente código usando la información de ese artículo:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6.    string s1;
  7.  
  8.    cin >> s1;
  9.    cout << s1 << endl;
  10.    cout << s1[4];
  11.    cin;
  12.    return 0;
  13. }

Bien, el caso es que no da ningún error y al usar la función "string" no necesito definir el tamaño. Como podéis observar con el "cin" capturo tantos caracteres como introduzca el usuario, luego puedo imprimir el mensaje completo o acceder a solo uno de los elementos.

El único contra que he encontrado es que si introduces un texto con espacios, no guarda lo que haya después de un espacio.

Mi duda es: ¿es correcto el uso de esta forma del "string"?. ¿Hay alguna forma de manipular esta función para que también guarde los espacios y lo que haya después?. ¿Hay algún otro tipo de "string" que lea números-operandos?, es decir, no el caracter "1" sino el número 1 con el que se puede operar.

PD: Le echaré un vistazo a los links Akai.


Título: Re: Secuencias en C++
Publicado por: eleon en 23 Enero 2012, 21:46 pm
Buenas:

A ver si me podéis responder otra duda: en las tablas y strings ¿siempre hay que dejar un último elemento para la marca final (\0)?, quiero decir, si queremos crear una tabla o un string de 30 elementos, hacemos "string cadena[30]", donde podemos usar los espacios del 0 al 29 (30 elementos) pero nunca el último (posición 30), ¿es asi?. Esto lo digo porque en el caso del string me da error si intento utilizar el último elemento, sin embargo en una tabla normal no da error ("char tabla[30]"), suponía que el string era una clase que definía una tabla y unas funciones asi que en cuanto a elementos se debería comportar igual.

Akai, he mirado los links y he encontrado esta otra página donde vienen explicados los vectores de forma más sencilla y en castellano: http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Biblioteca_Est%C3%A1ndar_de_Plantillas/Vectores

Lo que ocurre es que aqui el vector no lo define en una clase sino dentro del main, ¿es lo mismo que lo que tú me has indicado?.

Perdonad las molestias. Saludos!


Título: Re: Secuencias en C++
Publicado por: rir3760 en 24 Enero 2012, 01:28 am
El único contra que he encontrado es que si introduces un texto con espacios, no guarda lo que haya después de un espacio.

Mi duda es: ¿es correcto el uso de esta forma del "string"?
Es correcto. En cuanto a leer una linea de texto puedes utilizar la función "getline", si necesitas ejemplos de su uso utiliza el buscador de los foros.

A ver si me podéis responder otra duda: en las tablas y strings ¿siempre hay que dejar un último elemento para la marca final (\0)?
Solo si se trata de un array de caracteres (por ejemplo "char linea[100]") y en el se piensa almacenar una cadena (el '\0' indica el final de ella).

quiero decir, si queremos crear una tabla o un string de 30 elementos, hacemos "string cadena[30]", donde podemos usar los espacios del 0 al 29 (30 elementos) pero nunca el último (posición 30), ¿es asi?.
Me parece una confusión:

* Con los arrays de caracteres no hay opción mas que reservar un elemento para el cero porque es obligatorio (si no hay '\0' no hay cadena).

* Cuando se declara un array se indica el numero de elementos, por ejemplo:
Código
  1. string linea[100];
Esa declaración indica que el array consta de 100 elementos a los cuales se accede mediante los indices 0 .. 99. El elemento "linea[100]" no existe ya que seria el indice del elemento 101 y no hay tal en el array.

Un saludo


Título: Re: Secuencias en C++
Publicado por: eleon en 24 Enero 2012, 15:46 pm
Citar
Me parece una confusión:

* Con los arrays de caracteres no hay opción mas que reservar un elemento para el cero porque es obligatorio (si no hay '\0' no hay cadena).

* Cuando se declara un array se indica el numero de elementos, por ejemplo:
Código

Código
  1. string linea[100];

Esa declaración indica que el array consta de 100 elementos a los cuales se accede mediante los indices 0 .. 99. El elemento "linea[100]" no existe ya que seria el indice del elemento 101 y no hay tal en el array.

Vale, si me había confundido en ese aspecto, gracias por aclarármelo. Por lo tanto en un string si lo declaramos con 100 elementos (índices del 0 al 99) podremos usar 99 elementos (índices del 0 al 98) ya que el último es la marca de fin.

Lo de cin.getline me ha venido de perlas, gracias por vuestro tiempo. Saludos!