Ordenar alfabéticamente array de punteros a char (lenguaje C)

Iniciado por DanielPy, 5 Enero 2015, 23:52 PM

0 Miembros y 2 Visitantes están viendo este tema.

DanielPy

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.

#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).-


#include <stdio.h>
#include <string.h>

#define ELEMENTOS 15

int main(void){
char *provincias[ELEMENTOS] = {"Tucuman", "Santa Fe", "Buenos Aires", "Rio Negro", "Neuquen",
"Misiones", "Catamarca", "Santa Cruz", "Jujuy", "Chaco",
"Formosa", "Corrientes", "Salta", "La Rioja", "Cordoba"};
char *temp;
int i, j;

printf("\n provincias Argentinas desordenadas\n\n" );
for(i=0; i<ELEMENTOS; i++){
printf(" %s\n", provincias[i]);
}

for(i=0; i<ELEMENTOS-1; i++){
for(j=i+1; j<ELEMENTOS; j++){
if(strcmp(provincias[i], provincias[j]) > 0){
temp = provincias[i];
provincias[i] = provincias[j];
provincias[j] = temp;
}
}
}

printf("\n Ordenadas alfabeticamente\n\n" );
for(i=0; i<ELEMENTOS; i++){
printf(" %s\n", provincias[i]);
}

printf("\n Pulse [Enter] para finalizar..."); getchar();
return 0;
}


Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

crack81

#1
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

   #include <stdio.h>
   #include <string.h>


   void MostrarLista(char *data[],const int tamano){//muestra la lista
       int i;
       for(i=0;i<tamano;i++){
         printf(" %s\n", data[i]);
       }
   }

   void OrdenarLista(char *data[],const int tamano){//ordena la lista todo es pasado por "referencia"
      char *temp;
      int i,j;

       for(i=0; i<tamano-1; i++){
           for(j=i+1; j<tamano; j++){
               if(strcmp(data[i], data[j]) > 0){
                   temp = data[i];
                   data[i] = data[j];
                   data[j] = temp;
               }
           }
       }
   }


   int main(void){
   char *provincias[] = {"Tucuman", "Santa Fe", "Buenos Aires", "Rio Negro", "Neuquen",
   "Misiones", "Catamarca", "Santa Cruz", "Jujuy", "Chaco",
   "Formosa", "Corrientes", "Salta", "La Rioja", "Cordoba"};

   const int Elementos=sizeof(provincias)/sizeof(char*);//te da el tamaño del arreglo en este caso 15

   printf("\n provincias Argentinas desordenadas\n\n" );
   MostrarLista(provincias,Elementos);

   OrdenarLista(provincias,Elementos);

   printf("\n Ordenadas alfabeticamente\n\n" );
   MostrarLista(provincias,Elementos);

   printf("\n Pulse [Enter] para finalizar..."); getchar();
   return 0;
   }



saludos si tienes alguna duda o cuestionamiento hazmelo saber saludos..
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

rir3760

Cita de: DanielC# en  5 Enero 2015, 23:52 PMComo 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:
size_t num_elem = sizeof a / sizeof a[0];
Donde "a" es el identificador del array.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola crack81.
Citarsaludos 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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en  6 Enero 2015, 18:31 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:
#include <stdio.h>

int main(void)
{
   puts("Hola, mundo");
   system("pause");
   
   return 0;
}

Como ahí la llamada coincide con la declaración no hay problema.

Pero en otros casos no es así, por ejemplo con atof:
#include <stdio.h>

int main(void)
{
   double d = atof("3.0");
   
   printf("%.2f\n", d);
   
   return 0;
}

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language