Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 5 Enero 2015, 23:52 pm



Título: Ordenar alfabéticamente array de punteros a char (lenguaje C)
Publicado por: DanielPy en 5 Enero 2015, 23:52 pm
Hola a todos.
El programa que dejo a continuación funciona correctamente, lo que no logro hacer son 2 cosas que desearía me enseñen a concretarlas.-
Quiero en primer lugar eliminar esta línea.

Código
  1. #define ELEMENTOS 15


Como debo hacer con sizeof para saber cuántos punteros tengo declarado en el array de punteros provincias, me funciona con char, int, pero no con array de punteros.-
Lo otro que no puedo lograr es pasar el array provincias a una función, para que se entienda quiero hacer lo mismo con 2 funciones, una que se llame mostrar y la otra ordenar, en este caso me interesaría más que me escriban un poco de teoría que la sintaxis (si es mucho pedir, mil disculpas).-


Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define ELEMENTOS 15
  5.  
  6. int main(void){
  7. char *provincias[ELEMENTOS] = {"Tucuman", "Santa Fe", "Buenos Aires", "Rio Negro", "Neuquen",
  8. "Misiones", "Catamarca", "Santa Cruz", "Jujuy", "Chaco",
  9. "Formosa", "Corrientes", "Salta", "La Rioja", "Cordoba"};
  10. char *temp;
  11. int i, j;
  12.  
  13. printf("\n provincias Argentinas desordenadas\n\n" );
  14. for(i=0; i<ELEMENTOS; i++){
  15. printf(" %s\n", provincias[i]);
  16. }
  17.  
  18. for(i=0; i<ELEMENTOS-1; i++){
  19. for(j=i+1; j<ELEMENTOS; j++){
  20. if(strcmp(provincias[i], provincias[j]) > 0){
  21. temp = provincias[i];
  22. provincias[i] = provincias[j];
  23. provincias[j] = temp;
  24. }
  25. }
  26. }
  27.  
  28. printf("\n Ordenadas alfabeticamente\n\n" );
  29. for(i=0; i<ELEMENTOS; i++){
  30. printf(" %s\n", provincias[i]);
  31. }
  32.  
  33. printf("\n Pulse [Enter] para finalizar..."); getchar();
  34. return 0;
  35. }

Saludos.
Daniel


Título: Re: Ordenar alfabéticamente array de punteros a char (lenguaje C)
Publicado por: crack81 en 6 Enero 2015, 01:23 am
Buenas compadre te dejo mi version, ojo cuidado con el uso que le das al preprocesador de c ese "define"
en mi punto de vista para este caso son mejor las constantes

en la parte de las funciones les pase por parametros puntero ya que el paso por referencia como tal no existe en c, caso contrario en mi amado c++ XD

Te dejo mi version espero sea de ayuda

Código
  1.    #include <stdio.h>
  2.    #include <string.h>
  3.  
  4.  
  5.    void MostrarLista(char *data[],const int tamano){//muestra la lista
  6.        int i;
  7.        for(i=0;i<tamano;i++){
  8.          printf(" %s\n", data[i]);
  9.        }
  10.    }
  11.  
  12.    void OrdenarLista(char *data[],const int tamano){//ordena la lista todo es pasado por "referencia"
  13.       char *temp;
  14.       int i,j;
  15.  
  16.        for(i=0; i<tamano-1; i++){
  17.            for(j=i+1; j<tamano; j++){
  18.                if(strcmp(data[i], data[j]) > 0){
  19.                    temp = data[i];
  20.                    data[i] = data[j];
  21.                    data[j] = temp;
  22.                }
  23.            }
  24.        }
  25.    }
  26.  
  27.  
  28.    int main(void){
  29.    char *provincias[] = {"Tucuman", "Santa Fe", "Buenos Aires", "Rio Negro", "Neuquen",
  30.    "Misiones", "Catamarca", "Santa Cruz", "Jujuy", "Chaco",
  31.    "Formosa", "Corrientes", "Salta", "La Rioja", "Cordoba"};
  32.  
  33.    const int Elementos=sizeof(provincias)/sizeof(char*);//te da el tamaño del arreglo en este caso 15
  34.  
  35.    printf("\n provincias Argentinas desordenadas\n\n" );
  36.    MostrarLista(provincias,Elementos);
  37.  
  38.    OrdenarLista(provincias,Elementos);
  39.  
  40.    printf("\n Ordenadas alfabeticamente\n\n" );
  41.    MostrarLista(provincias,Elementos);
  42.  
  43.    printf("\n Pulse [Enter] para finalizar..."); getchar();
  44.    return 0;
  45.    }


saludos si tienes alguna duda o cuestionamiento hazmelo saber saludos..


Título: Re: Ordenar alfabéticamente array de punteros a char (lenguaje C)
Publicado por: rir3760 en 6 Enero 2015, 03:23 am
Como debo hacer con sizeof para saber cuántos punteros tengo declarado en el array de punteros provincias, me funciona con char, int, pero no con array de punteros.
Para conocer el numero de elementos en un array sin importar su tipo basta con utilizar:
Código
  1. size_t num_elem = sizeof a / sizeof a[0];
Donde "a" es el identificador del array.

Un saludo


Título: Re: Ordenar alfabéticamente array de punteros a char (lenguaje C)
Publicado por: DanielPy en 6 Enero 2015, 18:31 pm
Hola crack81.
Citar
saludos si tienes alguna duda o cuestionamiento hazmelo saber saludos..
No te das una idea lo que ayuda esa frase a alguien que como yo (63 años) que está tan sólo en este bello camino del aprendizaje de la programación, espero que como tantos otros estés siempre allí para evacuar mis dudas.-
En cuanto al código, perfecto con eso ya me di cuenta como pasar un array de punteros a función, sólo una cosita, ¿qué diferencia hay en hacer las funciones con prototipo y sin prototipo?.-
rir3760, un párrafo aparte para tús aportes, ya son innumerables los códigos distintos que te e copiado, lo tuyo es genial.- ;-) ;-) ;-)
Por último mil disculpas por ser tan poco pragmático en lo que escribí,  no siempre se puede aplicar la fórmula perfecta, 50% mente y 50% corazón, esta vez fue 20 y 80.-     
 
Saludos.
Daniel


Título: Re: Ordenar alfabéticamente array de punteros a char (lenguaje C)
Publicado por: rir3760 en 7 Enero 2015, 18:42 pm
¿qué diferencia hay en hacer las funciones con prototipo y sin prototipo?
Las ventajas del uso de prototipos superan con mucho a las desventajas que no hay razón (de peso) para no utilizarlos.

Aun así si se quiere desarrollar un programa sin prototipos es posible siempre y cuando se cumpla con varios requerimientos: para empezar toda función debe definirse antes de cualquier uso de esta.

Si eso no es posible (por ejemplo en el caso de dos funciones donde una llame a la otra) todavía hay la posibilidad de terminar con un programa funcional pero se deben cubrir dos requisitos: 1) El numero y tipo de parámetros de la función debe coincidir con la llamada (no es posible con funciones con un numero variable de argumentos como printf) y 2) El valor de retorno de la función debe ser de tipo int. Si no se cumplen ambos ya no hay garantías sobre el resultado del programa (comportamiento no definido o UB).

Lo anterior es la razón por la que, de vez en cuando, algunos usuarios comentan que pueden utilizar una función de la biblioteca estándar de C sin incluir el encabezado correspondiente. Un caso común es system:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   puts("Hola, mundo");
  6.   system("pause");
  7.  
  8.   return 0;
  9. }
Como ahí la llamada coincide con la declaración no hay problema.

Pero en otros casos no es así, por ejemplo con atof:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   double d = atof("3.0");
  6.  
  7.   printf("%.2f\n", d);
  8.  
  9.   return 0;
  10. }
Ya que el valor de retorno se asume como int cuando en realidad es double ello resulta en UB (puede funcionar correctamente o no, en mi caso no lo hace e imprime como salida 0.00).

En resumen mejor utilizar prototipos y te olvidas de los dolores de cabeza.

Un saludo