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... ...
  #1 (permalink)  
Antiguo 14/12/2012, 23:05
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
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
  #2 (permalink)  
Antiguo 15/12/2012, 08:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
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
  #3 (permalink)  
Antiguo 15/12/2012, 17:57
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
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 ._.)
  #4 (permalink)  
Antiguo 15/12/2012, 20:56
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Problema con programa de ordenamiento (usando apuntadores a funciones)

Al quitar el setw(4) me lo ha imprimido.
Un saludo.
  #5 (permalink)  
Antiguo 16/12/2012, 06:20
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
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 22:04.