Práctico 12: más funciones

1. Anunciar números primos

cantidad de participantes 1 o 2 participantes.

Considerar el programa siguiente en PythonTutor https://goo.gl/yo1x3j.

Agregar a este programa una función llamada void anunciarSiPrimo(int n), tal que se pueda reescribir el main como sigue, manteniendo el comportamiento del programa:

main(){
  anunciarSiPrimo(49);
  anunciarSiPrimo(13);
}

La función anunciarSiPrimo tiene que ser la más general posible, es decir, tiene que andar con cualquier valor entero positivo como parámetro.

Nota: el programa del link arriba es:

int esPrimo(int n){
    int i;

    // buscamos si n tiene divisor
    for(i=2; i <= n/2; i=i+1)
    {
        if (n%i == 0)
            return 0;
    }
    // si llegamos aca es que no tiene divisor, es primo
    return 1;
}

main(){
 if ( esPrimo(49) )
   printf("49 es primo.\n");
 else
   printf("49 no es primo.\n");
 if ( esPrimo(13) )
   printf("13 es primo.\n");
 else
   printf("13 no es primo.\n");

}

2. Sumas y productos usando recursión

Hacer este ejercicio dentro de JSLinux, y con el editor de texto vi.

int sumar(int n){
    if (n != 0)
        return n + sumar(n-1);
    else
        return n;
}

main(){
    int max=10;
    printf("La suma de 1 a %d vale %d.", max, sumar(max));
}

Imitando la función sumar, agregar una función fact que calcule la factorial del entero dado como parámetro, usando recursión. Imprimir el resultado de esa función desde el main.

3. Ordenar un arreglo

Hacer este ejercicio dentro de JSLinux, y con el editor de texto vi.

Copiar el código siguiente en un programa llamado gnome.c.

#define MAX 8
#define VERDE   "\x1b[102m"
#define MAGENTA "\x1b[105m"
#define RESET   "\x1b[0m"

/* https://es.wikipedia.org/wiki/Algoritmo_Fisher-Yates */
void mezclar(int a[]){
    int i,j,t;
    for (i=0; i<MAX; i = i+1){
        a[i] = i;
    }
    for(i=MAX-1; i>0; i = i-1){
        j = rand() % (i+1);
        t = a[j];
        a[j] = a[i];
        a[i] = t;
    }
}

void mostrar_color(const int a[]){
  int i;
  for(i=0; i<MAX; i=i+1)
    printf("%s%02d%s%s",(i<1||*(i+a)>=*(i-1+a))?VERDE:
      MAGENTA,a[i],RESET,(i<(MAX-1))?",":"");
  printf("\n");
}

main(){
    int lista[MAX];
    srand(time(0));
    mezclar(lista);
    mostrar_color(lista);
}
  1. Compilar este programa. ¿Qué hacen las funciones mezclar y mostrar_color?

Este ejercicio consiste en implementar una función que haga el ordenamiento del arreglo, siguiendo el algoritmo “Gnome Sort”.

La idea de este algoritmo es imaginarse un duende del jardín ordenando macetas. Los únicos intercambios que puede hacer son dos macetas una al lado de la otra.

El duende empieza por el principio del arreglo (posición 0) y termina cuando llega al final:

El duende repite este proceso hasta que llegue al final del arreglo.

  1. Escribir el algoritmo del Gnome Sort (sobre papel). Pensar bien en cuál es la condición de repetición del bucle.

  2. Agregar al programa una función void gnome_sort(int a[]), que consiste en ordenar el arreglo dado como parámetro, siguiendo el algoritmo Gnome Sort.

  3. Hagamos más visual y dramático a este programa. Dentro de la función gnome_sort, agregar una llamada a color_ord después de cada intercambio de valores en el arreglo.

    Probar aumentando el valor de la constante MAX.

    Usar la función usleep en el bucle de la función gnome_sort para hacerlo más lento.