¿Alguna manera para guardar resultados de un for?

Iniciado por LuisUvtol, 3 Mayo 2020, 23:03 PM

0 Miembros y 1 Visitante están viendo este tema.

LuisUvtol

Hola a todos, tengo una pregunta, ¿Como puedo guardar los resultados de un for?
para que me entiendan les dejo este codigo:
Código (cpp) [Seleccionar]
   for (int i = 0; i < 10; ++i) {
  cout<<x[i];
}


como puedo guardar todos los resultados de x en una sola variable?
si mi programa imprime: 1 2 3 4 5
como guardar esos datos en una variable?
Gracias!

cpu2

Hola

Pues con un puntero ya tendrias suficiente desde mi punto de vista. En este caso con el 1 2 3 4 5, con un puntero de 5 elementos int, y en cada ciclo del for se guarde el valor.

Saludos.


K-YreX

Cita de: cpu2 en  3 Mayo 2020, 23:29 PM
Hola

Pues con un puntero ya tendrias suficiente desde mi punto de vista. En este caso con el 1 2 3 4 5, con un puntero de 5 elementos int, y en cada ciclo del for se guarde el valor.

Saludos.
Aunque la idea se entiende, no es del todo correcta tal y como está explicada. Un puntero es eso, un puntero, apunta a una variable, no a 2, ni 3, ni 5,...
Lo que se ve que has querido decir es un array. Y el nombre del array funciona como un puntero que apunta al elemento 0 del array.

Código (cpp) [Seleccionar]

const int SIZE = 10;

int main(){
  int arrayEstatico[SIZE]; // array creado con memoria estatica
  int *arrayDinamico = new int [SIZE]; // puntero que apunta a un array dinamico
  // Una vez creados ambos arrays funcionan igual
  for(int i = 0; i < SIZE; ++i){
    arrayEstatico[i] = i;
    arrayDinamico[i] = i;
  }
  // Un array reservado con memoria dinamica tiene que ser liberado:
  delete [] arrayDinamico;
}





Otra opción que tienes es usar un string (que no deja de ser un array de char) y en este caso los valores se guardarían como caracteres, no como enteros:
Código (cpp) [Seleccionar]

const int SIZE = 10;
int main(){
  string resultado = "";
  for(int i = 0; i < SIZE; ++i){
    resultado += i + " "; // concatena cada valor de i seguido de un espacio
  }
}

Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

@XSStringManolo

Array de la STL (Std Template Library)

Este array es un wrapper sobre el array de C. Es lo más recomendado para lo que buscas porque añade métodos a los arrays de C que te simplifican y amplifican la funcionalidad de los arrays de C en C++.

Código (cpp) [Seleccionar]
#include <iostream>
#include <array>

using namespace std;

int main() {

  array<int, 10> numeros;

  for (int i = 0; i < 10; ++i) {
    numeros[i] = i;
  }

  cout << numeros[0] << endl; /* 0 */
  cout << numeros[1] << endl; /* 1 */
  cout << numeros[3] << endl; /* 3 */
  cout << numeros[8] << endl; /* 8 */
  cout << numeros[9] << endl; /* 9 */

  cin.get();

  return 0;
}




Vector de la STL
El vector es un wrapper sobre el array anterior. Cuando no sepas el tamaño de un array en tiempo de ejecución puedes utilizar el vector para que maneje la memoria automáticamente de forma dinámica. En resumen, no necesitas saber el tamaño de un array para usarlo.

Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>

using namespace std;

int main() {

  vector<int> numeros;

  for (int i = 0; i < 10; ++i) {
    numeros.push_back(i);
  }

  cout << numeros[0] << endl; /* 0 */
  cout << numeros[1] << endl; /* 1 */
  cout << numeros[3] << endl; /* 3 */
  cout << numeros[8] << endl; /* 8 */
  cout << numeros[9] << endl; /* 9 */

  cin.get();

  return 0;
}



String de la STL
Este es muy similar al vector pero más adecuado para trabajar con texto.
En este caso no debería usarse el string porque se almacenan todos lo números en línea y si fuesen números de 2 cifras, se te descuadrarían en donde están las posiciones. Tendría fácil solución, como añadir un espacio tras cada número y recorrer todo el string imprimiendo los números entre espacios.

Te pongo el string de la STL porque a parte de que se puede usar para tu tarea es de los contenedores más sencillos y versátiles.

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>

using namespace std;

int main() {

  string numeros = "";

  for (int i = 0; i < 10; ++i) {
    numeros += i;
  }

  cout << static_cast<int>(numeros[0]) << endl; /* 0 */
  cout << numeros[1] << endl; /* 1 */
  cout << numeros[3] << endl; /* 3 */
  cout << numeros[8] << endl; /* 8 */
  cout << numeros[9] << endl; /* 9 */

  cin.get();

  return 0;
}



A parte de estos mencionados tienes otros de la STL como MAP, SET, LIST... Cada uno sirve para una tarea en concreto y tiene ventajas de velocidad en algunos aspectos, desventajas en otros y ciertas características y métodos únicos.

También tienes tipos de datos básicos de C/C++. Incluso podrías usar la memoria directamente con punteros, que básicamente es lo que hacen los arrays y similares, aritmética de punteros.

Lo mejor es que te pilles un libro bueno para que sepas lo que tienes que ir aprendiendo y en que orden.
Si sabes leer en inglés en el foro de dudas generales tienes un listado de libros de C++ entre otras cosas.

LuisUvtol

creo que seria muy util usar el string, como podria convertir ese string a un int[]
he usado funciones como atoi pero solo me convierte hasta que encuentra una coma, ejemplo

string ejemplo("2,2,1,3")
Si uso la funcion atoi solo me convierte en entero el primer 2
hay alguna forma u otra funcion?
Gracias a todos por sus respuestas!

@XSStringManolo

Si te fijas en el ejemplo te puse un casteo de string a int.

static_cast<int>(numeros[0])

Puedes sumar numeros así.
int numero = static_cast<int>(numeros[6]) + static_cast<int>(numeros[4]);





RayR

¿Cuál es la razón de usar una cadena? Usando array, vector, o manejo dinámico de memoria te evitas conversiones. Y si quieres imprimir los números por pantalla, en un bucle directamente muestras variable[ i ], y listo. Y nada impide que agregues un cout << "," si quieres separarlos. Si forzosamente quieres poder imprimirlos todos en una sola instrucción y por eso te gustó la idea de la cadena, te va a tomar algo de trabajo, porque el ejemplo de arriba con una cadena, en realidad no te sirve. La línea

Código (cpp) [Seleccionar]
    numeros += i;

no está metiendo en numeros los caracteres '0', '1', sino los valores numéricos 0, 1, etc., que no representan caracteres válidos (el 0, por ejemplo, es el nulo, o fin de cadena). Por lo tanto, numeros no es una cadena válida, y no vas a poder imprimirla directamente. La única ventaja que te aportaba el uso de string aquí se pierde, así que no hay razón para hacerlo.

Si aún así en verdad quieres usar una cadena, lo primero es que, como ya te recomendaron, tomes un manual y leas al menos lo básico de string y la STL en general. Aunque hay varias maneras de hacer las conversiones que quieres y no es difícil, no veo mucho sentido a ponerte código de eso, dado que, con poco que lo toques, seguramente te dará problemas y tendrás más dudas que al principio. La STL podrá tener ciertas ventajas, pero no es fácil ni amigable. De hecho, desde el punto de vista de la usabilidad, a muchos nos parece una atrocidad, aunque una vez que agarras un poco de experiencia no es tan mala.

Otra opción menos complicada podría ser la función strtok, pero tiene sus inconvenientes. Puedes buscarla en Google y ver si la quieres usar, pero insisto en que son más recomendables las otras alternativas. Y siempre puedes convertir los números a cadena (mucho más fácil que lo contrario) con la función to_string(). Por ejemplo, esto:

Código (cpp) [Seleccionar]
cadena += to_string(vec[i]);

convierte el valor del elemento i de un vector, en un string y lo añade al final de cadena. De esta manera tienes el vector para acceder a los valores individuales, y la cadena para imprimirlos en una sola instrucción (aunque reitero, no es nada difícil y sólo toma un par de líneas imprimir todos los elementos manualmente).