/* +----------------------------+ | PERMUTACIONES DE UN VECTOR | +----------------------------+ Este programa lee los elementos de un vector y escribe todas las permutaciones (combinaciones sin repetición) posibles de los elementos introducidos en el vector. El número de permutaciones de n elementos está determinado por el factorial de n. Observaciones sobre el programa: 1) En el primer elemento del vector (índice 0) se encuentra el número de elementos a permutar. Así pues, los n elementos a permutar están en entre los índices 1 y n el vector. 2) En algunos sitios del programa aparece la expresión: &vector[i] que puede parecer a simple un poco rara para el que no está acostumbrado al C. Expliquémosla: Al ser cada elmento del vector de tipo int, vector[i] se puede considerar como una variable de tipo int, y por lo tanto, podemos hacer con la expresión vector[i] lo que con cualquier variable de tipo entero, y no de estas operaciones es obtener su dirección. Hemos dicho varias veces que el nombre del vector es un puntero al primer elemento, así la siguiente expresión sería cierta: vector == &vector[0], es decir, que vector y &vector[0] es equivalente. 3) Los nombres de las variables punteros, por convención, suelen empezar con p; por este motivo he llamado a los parámetros de la función intercambiar p1 y p2. */ /* Ficheros a incluir: */ #include <stdio.h> /* printf (), puts (), putchar (), scanf () */ #include <conio.h> /* getch () */ #include <stdlib.h> /* exit () */ /* Macros: */ #define NUMERO_MAXIMO_ELEMENTOS_VECTOR 100 #define en(x,x1,x2) ((x) >= (x1) && (x) <= (x2)) /* Declaración de las funciones: */ void rellenar_vector (int vect[]); void escribir_vector (int vect[]); void permutar (int v[], int m); void intercambiar (int *p1, int *p2); /* Definición de las funciones: */ void main (void) { int vector [NUMERO_MAXIMO_ELEMENTOS_VECTOR+1]; /* +1 porque el primer elemento contiene el número de elementos a permutar */ puts ("PERMUTACIONES"); rellenar_vector (vector); permutar (vector, vector[0]); printf ("\nPulsa cualquier tecla para finalizar."); getch (); } void rellenar_vector (int vect[]) { register int i; do { printf ("\nIntroduzca número de elementos de vector (1-%d): ", NUMERO_MAXIMO_ELEMENTOS_VECTOR); scanf ("%d", &vect[0]); } while (! en (vect[0], 1, NUMERO_MAXIMO_ELEMENTOS_VECTOR)); printf ("\nIntroduce los %d elementos a permutar: ", vect[0]); for (i = 1; i <= vect[0]; i++) scanf ("%d", &vect[i]); putchar ('\n'); } void escribir_vector (int vect[]) { static unsigned int numero_de_permutacion = 0; register int i; /* cada 24 movimientos se para la escritura */ if (++numero_de_permutacion % 24 == 0) { printf ("Pulse la tecla ESCAPE para salir o cualquier otra " "tecla para continuar."); /* el código ASCII 27 corresponde a la tecla ESCAPE */ if (getch () == 27) exit (0); /* con estas tres funciones se borra el mensaje anterior */ putchar ('\r'); printf (" " " "); putchar ('\r'); } printf ("Permutación %2u: ", numero_de_permutacion); for (i = 1; i <= vect[0]; i++) printf ("%d ", vect[i]); putchar ('\n'); } void permutar (int v[], int m) { register int i; if (m > 1) for (i = 1; i <= m; i++) { intercambiar (&v[i], &v[m]); permutar (v, m-1); intercambiar (&v[i], &v[m]); } else escribir_vector (v); } void intercambiar (int *p1, int *p2) { int aux; aux = *p1; *p1 = *p2; *p2 = aux; }