/* * File: main.cpp * Author: Miguel Guanira E. * * Created on 26 de marzo de 2010, 09:33 AM */ #include #include #include void error(void); void leerDatos(char **&, int &); void imprimeDatos(char **, int); int intcmp(char*, char*); int fechcmp(char*, char*); void ordenar (char **, int, int, int(*)(char*, char*)); void intercambiar(char **, int, int); int main(int argc, char** argv) { char **datos; int numElem = 0; int (*ptrFunCmp)(char *, char *); // Verificamos si colocó la opción que indica cómo ordenar if (argc != 2) { // 2 indica que hay un argumento error(); return 0; } else { switch (argv[1][1]) { // Se compara el 2do. caracter del 1er. argumento case 'c': ptrFunCmp = (int(*)(char*, char*))strcmp; // El "cast" se debe a que strcmp no coincide exactamente // con el parámetro de la función ordenar break; case 'n': ptrFunCmp = intcmp; break; case 'f': ptrFunCmp = fechcmp; break; default: error(); return 0; } leerDatos(datos, numElem); ordenar (datos, 0, numElem-1, ptrFunCmp); imprimeDatos(datos, numElem); } return (EXIT_SUCCESS); } void error(void) { // Función que muestra un error al ejecutar el programa printf("Debe ejecutar el programa con un parametro:\n"); printf("\t-c\tPara ordenar nombres alfabeticamente\n"); printf("\t-n\tPara ordenar numeros ascendentemente\n"); printf("\t-f\tPara ordenar fechas cronologicamente\n"); } void leerDatos(char **&datos, int &numElem){ // lee los datos como cadenas de caracteres char *auxDatos[500], cad[100]; int tam, i; while (1){ gets(cad); tam = strlen(cad); if (tam==0) break; //el final delos datos se da con una cadena vacía auxDatos[numElem]=new char[tam+1]; strcpy(auxDatos[numElem],cad); numElem++; } // Pasamos los datos a un arreglo dinámico de capacidad exacta datos = new char*[numElem]; for(i=0; i0 si i1>i2 } int fechcmp(char *s1, char *s2) { // función para comparar las cadenas como // fechas char f1[11], f2[11]; s1[2] = s1[5] = s2[2] = s2[5] = 0; strcpy(f1, &s1[6]); strcpy(f2, &s2[6]); strcat(f1, "/"); strcat(f2, "/"); strcat(f1, &s1[3]); strcat(f2, &s2[3]); strcat(f1, "/"); strcat(f2, "/"); strcat(f1, s1); strcat(f2, s2); s1[2] = s1[5] = s2[2] = s2[5] = '/'; return strcmp(f1, f2); } void ordenar (char **datos, int izq, int der, int(*cmp)(char*, char*)){ int ultimo; if(izq >= der) return; intercambiar(datos, izq, (izq + der)/2); ultimo = izq; for (int i = izq + 1; i <= der; i++) if (cmp(datos[i], datos[izq]) < 0) intercambiar(datos, ++ultimo, i); intercambiar(datos, izq, ultimo); ordenar(datos, izq, ultimo - 1, cmp); ordenar(datos, ultimo + 1, der, cmp); } void intercambiar(char **datos , int i, int j){ char * aux; aux = datos[i]; datos[i] = datos[j]; datos[j] = aux; }