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

Problema con programa de ordenamiento (usando apuntadores a funciones)

Estas en el tema de Problema con programa de ordenamiento (usando apuntadores a funciones) en el foro de C/C++ en Foros del Web. Pues... el problema no debería suceder según yo :|... al ejecutarlo sólo me pide que introduzca 1 o 2, cuando lo hago y aprieto enter... ...
 
Antiguo 14/12/2012, 23:05
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 15 años, 3 meses
Puntos: 8
Pregunta Problema con programa de ordenamiento (usando apuntadores a funciones)

Pues... el problema no debería suceder según yo :|... al ejecutarlo sólo me pide que introduzca 1 o 2, cuando lo hago y aprieto enter... me imprime "Elementos de datos en el orden original" y de ahí... NO PASA NADA!, así se queda...

¿Hay algún error? ¿O qué está sucediendo ._.?

Código C++:
Ver original
  1. // Ordenamiento multipropósito que usa apuntadores a funciones.
  2.  
  3. #include <iostream>
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7.  
  8. #include <iomanip>
  9. using std::setw;
  10.  
  11. void ordenamientoSeleccion(int[], const int, bool (*)(int, int));
  12. void intercambiar(int * const, int * const);
  13. bool ascendente(int, int);
  14. bool descendente(int, int);
  15.  
  16. int main()
  17. {
  18.   const int tamanioArreglo = 10;
  19.   int orden; // 1 = ascendente, 2 = descendente
  20.   int contador; // subíndice del arreglo
  21.   int a[tamanioArreglo] = {2, 6, 4, 8, 10, 12, 89, 68, 45, 37};
  22.  
  23.   cout << "Escriba 1 para orden ascendente,\n"
  24.     << "Escriba 2 para orden descendente: ";
  25.  
  26.   cin >> orden;
  27.  
  28.   cout << "\nElementos de datos en el orden original\n";
  29.  
  30.   for(contador = 0; contador < tamanioArreglo; contador++)
  31.     cout << setw(4) << a[contador];
  32.  
  33.   if(orden == 1)
  34.   {
  35.     ordenamientoSeleccion(a, tamanioArreglo, ascendente);
  36.     cout << "\nElementos de datos en orden ascendente\n";
  37.   }else
  38.   {
  39.     ordenamientoSeleccion(a, tamanioArreglo, descendente);
  40.     cout << "\nElementos de datos en orden descendente\n";
  41.   }
  42.  
  43.   for(contador = 0; contador < tamanioArreglo; contador++)
  44.     cout << setw(4) << a[contador];
  45.  
  46.   cout << endl;
  47.   return 0;
  48. }
  49.  
  50. void ordenamientoSeleccion(int trabajo[], const int tamanio, bool(*compara)(int, int))
  51. {
  52.   int menorOMayor;
  53.  
  54.   for(int i = 0; i < tamanio - 1; i++)
  55.   {
  56.     menorOMayor = i;
  57.    
  58.     for(int indice = i + 1; indice < tamanio; i++)
  59.       if(!(*compara)(trabajo[menorOMayor], trabajo[indice]))
  60.     menorOMayor = indice;
  61.      
  62.     intercambiar(&trabajo[menorOMayor], &trabajo[i]);
  63.   }
  64. }
  65.  
  66. void intercambiar(int * const elemento1Ptr, int * const elemento2Ptr)
  67. {
  68.   int contenido = *elemento1Ptr;
  69.   *elemento1Ptr = *elemento2Ptr;
  70.   *elemento2Ptr = contenido;
  71. }
  72.  
  73. bool ascendente(int a, int b)
  74. {
  75.   return a < b;
  76. }
  77.  
  78. bool descendente(int a, int b)
  79. {
  80.   return a > b;
  81. }

Última edición por reethok; 14/12/2012 a las 23:10
 
Antiguo 15/12/2012, 08:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 14 años
Puntos: 83
Respuesta: Problema con programa de ordenamiento (usando apuntadores a funciones)

Una cosa, solo he mirado un poco por encima tu codigo (ni lo he compilado ni he intentado averiguar que hace), pero me parece que tienes dos bucles 'for' y desde el segundo incrementas el contador del primero

Código:
for(int i = 0; i < tamanio - 1; i++) {
    ...
    for(int indice = i + 1; indice < tamanio; i++) {//esta es la 58
        ...
    }
}
"...el problema no debería suceder según yo..."
Ok, segun 'yo' ¿cuando se detiene el segundo bucle si no incrementas la variable 'indice' que hace de fin de carrera?

Saludos
vosk
 
Antiguo 15/12/2012, 17:57
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 15 años, 3 meses
Puntos: 8
Respuesta: Problema con programa de ordenamiento (usando apuntadores a funciones)

Gracias, pero eso me deja con la duda... el primer ciclo for, por qué no se imprime? :S

Me refiero a:

Código C++:
Ver original
  1. cout << "\nElementos de datos en el orden original\n";
  2.  
  3.   for(contador = 0; contador < tamanioArreglo; contador++)
  4.     cout << setw(4) << a[contador];

Debería forzarlo con un endl? (si corrijo el problema del otro for sí se imprime, pero si no, no ._.)
 
Antiguo 15/12/2012, 20:56
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 13 años, 8 meses
Puntos: 16
Respuesta: Problema con programa de ordenamiento (usando apuntadores a funciones)

Al quitar el setw(4) me lo ha imprimido.
Un saludo.
 
Antiguo 16/12/2012, 06:20
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 14 años
Puntos: 83
Respuesta: Problema con programa de ordenamiento (usando apuntadores a funciones)

"...el primer ciclo for, por qué no se imprime?..."

El primer for si que se imprime (o al menos a mi me lo imprime), pero luego en la funcion 'ordenamientoSeleccion' entra en un bucle infinito: el 'for(int i' no lo detiene porque nunca llega a salir del otro bucle 'for(indice'

Código:
void ordenamientoSeleccion(int trabajo[], const int tamanio, bool(*compara)(int, int)) {
    int menorOMayor;
    int indice;
    
    for(int i = 0; i < tamanio - 1; i++) {
        menorOMayor = i;
        printf("I=%d\n", i);            //aqui
        
        for(indice = i + 1; indice < tamanio; i++)
            printf("\tindice=%d, i=%d\n", indice, i);      //y aqui
            
        if(!(*compara)(trabajo[menorOMayor], trabajo[indice]))
            menorOMayor = indice;
        
        intercambiar(&trabajo[menorOMayor], &trabajo[i]);
    }
}
Supongo que ya lo has probado, indice siempre es 1 porque solo entra una vez desde i=0, luego ya nunca sale del segundo bucle que incrementa de forma infinita la variable 'i'

Saludos
vosk

Etiquetas: apuntadores, funcion, int, ordenamiento, programa, usando
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 19:06.