Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Desplegar datos de un array con inicializacion universal c++

Estas en el tema de Desplegar datos de un array con inicializacion universal c++ en el foro de C/C++ en Foros del Web. buenas compañeros tengo un problema, me estoy sumergiendo en la programación c++ el cual es muy emocionante, y voy leyendo mucho pero llegue a este ...
  #1 (permalink)  
Antiguo 14/07/2015, 13:33
 
Fecha de Ingreso: julio-2015
Ubicación: Guatemala
Mensajes: 11
Antigüedad: 9 años, 4 meses
Puntos: 0
Desplegar datos de un array con inicializacion universal c++

buenas compañeros tengo un problema, me estoy sumergiendo en la programación c++ el cual es muy emocionante, y voy leyendo mucho pero llegue a este duda,

declare mi arreglo universal:

Código c++:
Ver original
  1. int x[ ]={10,20,30};

pero intente desplegarlo de la siguiente forma

Código c++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(){
  6.     int x[ ]={10,20,30};
  7.    
  8.     for(int i = 0; i < x[i]; i++){
  9.           cout<<x[i]<<endl;    
  10.          
  11.           }
  12.     cin.get();
  13.     return 0;
  14.    
  15.     }


y lo hace pero mi duda es que en pantalla salen dos datos mas, a que se debe eso? gracias desde ya sus comentarios

espero este bien la forma en que publique el codigo ya que es mi primera vez
  #2 (permalink)  
Antiguo 14/07/2015, 13:49
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Desplegar datos de un array con inicializacion universal c++

porque esto i < x[i] es igual a i < x[0] en la primera pasada, o sea i < 10, luego i < 20 en la segunda y en la tercera i < 30, i siempre será menor que esos valores si van incrementando, no va parar hasta que i sea igual o mayor al valor de la derecha. Es una forma incorrecta de controlar el bucle.

La forma correcta es:
for(int i = 0; i < ( sizeof(x)/sizeof(x[0]) ); i++){
cout<<x[i]<<endl;

}
  #3 (permalink)  
Antiguo 15/07/2015, 10:20
 
Fecha de Ingreso: julio-2015
Ubicación: Guatemala
Mensajes: 11
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Desplegar datos de un array con inicializacion universal c++

Cita:
Iniciado por vangodp Ver Mensaje
porque esto i < x[i] es igual a i < x[0] en la primera pasada, o sea i < 10, luego i < 20 en la segunda y en la tercera i < 30, i siempre será menor que esos valores si van incrementando, no va parar hasta que i sea igual o mayor al valor de la derecha. Es una forma incorrecta de controlar el bucle.

La forma correcta es:
for(int i = 0; i < ( sizeof(x)/sizeof(x[0]) ); i++){
cout<<x[i]<<endl;

}
Te agradezco mucho por la ayuda! me sirvió de mucho! asi voy a terminar siendo tu aprendiz jaja gracias crack.

saludos
  #4 (permalink)  
Antiguo 15/07/2015, 15:01
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Desplegar datos de un array con inicializacion universal c++

sea el aprendiz de eferion entre otros maquinas del foro, esos sí que saben. jajaja


sizeof retorna el tamaño de una variable en bytes. En tu caso sizeof (x) devuelve el total de Bytes del array, o sea 4*3, ya que tienes 3 variables en ese array, luego el segundo sizeof(x[0]) retorna el tamaño de la primera casilla del array, la x[0], si suponemos que son 4 bytes que tiene un entero, entonces primer sizeof devuelve el total que es 12 Bytes y el segundo sizeof devuelve 4, es dividir 12 por 4, eso va dar justo la cantidad de elementos que tienes en el array, o sea 3. entonces i<3 tienes un rango de 0 a 2, que son 3 iteraciones. ;)

El anterior "truquillo" sirve para cualquier tipo de dato.

Suerte
  #5 (permalink)  
Antiguo 15/07/2015, 16:03
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Desplegar datos de un array con inicializacion universal c++

casi que para calcular el tamaño del array usaría una macro

Código C++:
Ver original
  1. #define NUM_ELEMS(x) (sizeof(x)/sizeof(*(x)))

aunque si tiramos de recursos, nos encontramos con una macro un pelín más compleja pero con menos margen de error. Esta macro viene del projecto Google chromium:

Código C++:
Ver original
  1. #define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

La gracia de esta macro es que 0[x] en los compiladores de C equivale al clásico x[0]... pero en los compiladores de C++ se producirá un error si x es una clase que sobrecarga el operador []... vamos que es una especie de seguro que evita que usemos la macro con objetos.

¿Por qué usar una macro aquí? para evitar repetir el código cada dos por tres:

Código C++:
Ver original
  1. for(int i = 0; i < NUM_ELEMS(x); i++){
  2. cout<<x[i]<<endl;

Un saludo
  #6 (permalink)  
Antiguo 15/07/2015, 16:15
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Desplegar datos de un array con inicializacion universal c++

¿vé lo que digo? Jaajaja

Etiquetas: desplegar, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:06.