[C++] Problema con bucle en Eclipse

Iniciado por HijoDePuta, 9 Agosto 2013, 17:49 PM

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

HijoDePuta

Buenas de nuevo,

Abro este tema ya que es diferente del anterior y no consigo encontrar nada parecido.

El caso es que estoy trabajando con Eclipse y estoy realizando un ejercicio.

Este consiste en leer una secuencia de números hasta que vea el -1 y almacenarlos en un Array para luego ya trabajar con ellos.

Este es el código básico que tengo para no poner cosas que no interesan:

#include <iostream>
using namespace std;

const int numero = 100;
typedef int Valores[numero];



void leer_array(Valores array, int& contador)
{
int numero;

do
{
cout<< "Introduzca el valor [" << contador << "] del vector \n";
cin >> numero;
array[contador] = numero;
contador++;

}while(numero!=-1);


}


int main()
{
int contador=0;

Valores array;

leer_array(array,contador);

return 0;
}




Mi problema está en que si yo pongo esta entrada:

Citar1 8 7 3 4 8 5 9 5 0 0 4 8 4 5 3 2 8 -1

La salida es esta:

CitarIntroduzca el valor [ 0 ] del vector
//entrada
Introduzca el valor [1] del vector
Introduzca el valor [2] del vector
...
Introduzca el valor [18] del vector
//me deja seguir metiendo valores

Y el problema es ese, que la consola de Eclipse me deja seguir metiendo valores pero a partir de ahí ya no sale "Introduz...". He comprobado mediante "couts" que no sale del bucle y no sé por qué es.

Estoy un poco a la desesperada y ya he probado varios valores en la condición del bucle y nada, sigue igual, en cuanto le pones el valor condición para que salga del bucle, no sale.

¿Alguna idea?

Un saludo y Gracias.

avesudra

A mí me funciona bien, ¿quizás pueda ser por el eclipse? , aquí tienes mi salida:
Introduzca el valor [0] del vector
43
Introduzca el valor [1] del vector
3
Introduzca el valor [2] del vector
3
Introduzca el valor [3] del vector
3
Introduzca el valor [4] del vector
3
Introduzca el valor [5] del vector
3
Introduzca el valor [6] del vector
3
Introduzca el valor [7] del vector
3
Introduzca el valor [8] del vector
3
Introduzca el valor [9] del vector
3
Introduzca el valor [10] del vector
4
Introduzca el valor [11] del vector
3
Introduzca el valor [12] del vector
4
Introduzca el valor [13] del vector
3
Introduzca el valor [14] del vector
4
Introduzca el valor [15] del vector
2
Introduzca el valor [16] del vector
32
Introduzca el valor [17] del vector
3
Introduzca el valor [18] del vector
-1

Process returned 0 (0x0)   execution time : 9.995 s
Press any key to continue.
Regístrate en

HijoDePuta

Vale he localizado la fuente del problema.

Después de reescribir en otro archivo el mismo código de forma aislada, he visto que funciona bien, pero es que al parecer quién causa el problema es una función que no tiene nada que ver con la entrada o la salida:



#include <iostream>
using namespace std;

const int numero = 100;
typedef int Valores[numero];

typedef int repeticion[numero];



void leerarray(Valores array, int& contador)
{
int numero;

do
{
cout<< "Introduzca el valor [" << contador << "] del vector \n";
cin >> numero;
array[contador] = numero;
contador++;
}while(numero!=-1);


}



void contar_repes(Valores array,repeticion repes,int contador)
{


for(int i=0;i<10;i++)
{
for(int j=0;j<contador;i++)
{
if(i==array[j])
{
repes[i]++;
}
}

}

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

cout <<" "<< i << ":" << repes[i] << " ";

}

}

int main()
{
int contador=0;

Valores array;
repeticion repes;



leerarray(array,contador);

contar_repes(array,repes,contador);



return 0;
}


Como podéis ver ahora hay una función "Contar_repes" que lo que hace en teoría es contar los números del 0 al 9 y cuántas veces están, y se almacena en el array repes.

Por algún motivo, que esto se ejecute causa algún fallo y Eclipse no sale del bucle de la función leer_array (porque no sale, lo he comprobado) y me sigue pidiendo valores ya que la consola no finaliza el procedimiento.

No entiendo como una función posterior puede crear un problema a la anterior sinceramente.

Un saludo y gracias Avesudra por al menos probar que funcionaba, cuando lo he visto me ha subido el ánimo para seguir indagando :D

avesudra

#3
Hola buenas otra vez, el problema era un bucle infinito en la función contar repes la otra función está perfecta, fíjate que en el segundo for de la funcion contar repes concretamente en este:
Código (cpp) [Seleccionar]
for(int j=0; j<contador; i++)
{
      if(i==array[j])
        {
            repes[i]++;
        }
}

Aumentas la variable i por lo cual la variable j siempre será menor que contador y creará un bucle infinito. Aquí está tu codigo arreglado(le he puesto un par de comentarios, leete sobre todo el de inicializar los valores a 0 en la funcion contar repes, quita esa parte del codigo y mira lo que pasa):
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

const int numero = 100;
typedef int Valores[numero];

typedef int repeticion[numero];



void leerarray(Valores array, int& contador)
{
   /// Inicializa numero a 0, pues su contenido al principio podría ser -1 y no
   /// entraría al bucle.
   int numero = 0;

   do
   {
       cout<< "Introduzca el valor [" << contador << "] del vector \n";
       cin >> numero;
       array[contador] = numero;
       contador++;
   }while(numero != -1);


}



void contar_repes(Valores array,repeticion repes,int contador)
{
   ///Inicializa los valores a 0 para que no salgan números extraños
   ///al ser puestos por el compilador aleatoriamente.
   for(int i = 0; i < 10; i++)
       repes[i] = 0;

   for(int i = 0; i < 10; i++)
   {
       for(int j=0; j < contador; j++)
       {
           if(i == array[j])
           {
               repes[i]++;
           }
       }

   }

   for(int i = 0; i < 10; i++)
       cout <<" "<< i << ":" << repes[i] << " ";


}

int main()
{
   int contador=0;

   Valores array;
   repeticion repes;



   leerarray(array,contador);

   contar_repes(array,repes,contador);

   return 0;
}


¡Un saludo!  ;)
Regístrate en

HijoDePuta

Ay Dios que no había visto esa "i" intrusa en el segundo "for". Y mira que he repasado el programa cincuenta veces.


Muchas gracias por localizarlo, me iba a pegar un tiro ^^" Y respecto a la inicialización de variables a 0, en mi código completo está hecho así, simplemente no quería complicar la lectura y por eso no los he puesto, pero ya estaban hechos :D

Un saludo y muchas gracias ^^ Puedo seguir programando con tranquilidad jajaja