Práctico 11: funciones y arreglos

Parte 1: Primeras funciones con arreglos

En un programa arreglos.c definir una constante MAX para el tamaño de todos nuestros arreglos:

#define MAX 10

Definir las funciones siguientes:

Luego, en el main, declarar un arreglo, llenarlo con llenar_random y mostrarlo con mostrar.

Luego, definir una función void invertir(const int a[], int b[]), que no modifique la lista a y que escribe en la lista b el inverso de a.

Usarla desde la funcion main de la forma siguiente:

...
int x[MAX];
int y[MAX];
...
llenar_random(x);
mostrar(x);
invertir(x,y);
mostrar(y);
...

Parte 2: Posición de un elemento

En un programa busqueda.c, definir una constante ERROR con el valor -1.

Implementar la función int buscar(const int arr[], const int elem), que realiza la búsqueda de un elemento en un arreglo.

Esta función devuelve un valor de tipo int, que tiene que ser:

Unos ejemplos:

arr elem buscar(arr,elem)
[2,10,4] 2 0
[2,10,4] 4 2
[3,7,7] 7 1
[3,7,3] 3 0
[3,7,3] 4 ERROR

Probar esta función desde el main sobre dos arreglos definidos manualmente.

Parte 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 y ejecutarlo. Globalmente, ¿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. La única acción que puede hacer el duende (aparte moverse) es intercambiar 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. 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.

  2. 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.