Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

La solución del profe...

El profe, Juan Andres, nos ha pasado su solucion, la cual la vamos a estudiar ya que explica mas cosas sobre C.

Nuevas cosas:  Crea una nueva cabecera llamda "main.h"

main.h:
// Creamos la contantante TAMANO con valor 10
#define TAMANO 10

// Declaración de funciones usadas a lo largo del programa
void mostrarTabla(int [TAMANO]);        // equivalente a void mostrarTabla(int *);
void mostrarMenu();

void cargarTabla(int *);
void cargarTablaOrdenada(int *);
void rotarIzquierda(int *);
void rotarDerecha(int *);
void ordenarAsc(int *);
void ordenarDesc(int *);
int compararAsc(const void *, const void *);
int compararDesc(const void *, const void *);
void cargarAleatorio(int *);

int pedirNum(char *);




Y en el  main.c:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

#include "main.h"


// Entrada al programa
int main(int argc, char **argv) {
    int op = 1;
    int tabla[TAMANO];
   
    // Valores iniciales aleatorios
    cargarAleatorio(tabla);
   
    // 0 = Salir
    while(op != 0) {
        // Muestra el estado de la tabla, el menú y solicita la opción al usuario
        mostrarTabla(tabla);
        mostrarMenu();
        op = pedirNum("Indique la opción deseada ");
        // Procesa la opción seleccionada
        switch(op) {
            case 1:
                cargarTabla(tabla);
                break;
            case 2:
                cargarTablaOrdenada(tabla);
                break;
            case 3:
                rotarIzquierda(tabla);
                break;
            case 4:
                rotarDerecha(tabla);
                break;
            case 5:
                ordenarDesc(tabla);
                break;
            case 6:
                ordenarAsc(tabla);
                break;
            case 7:
                cargarAleatorio(tabla);
                break;
            case 0:        // No se hace nada
                break;
            default:
                printf("Opción no válida\n");
        }
    }
    return 0;
}

// Muestra la tabla
void mostrarTabla(int tabla[TAMANO]) {        // tambien se puede poner void mostrarTabla(int *tabla)
    int c;
   
    for(c = 0; c < TAMANO; c++) {
        printf("%7d",tabla[c]);            // %7d = %d que ocupa 7 posiciones, rellena con espacios
    }
    printf("\n");
}

// Carga la tabla desde teclado (Opción 1)
void cargarTabla(int *tabla) {
    int c;
   
    for(c = 0; c < TAMANO; c++) {
        tabla[c] = pedirNum("Introduzca un número ");
    }
}

// Carga la tabla con 10 números, insertando cada número en la posición adecuada (Opción 2)
void cargarTablaOrdenada(int *tabla) {
    int c;
    int c1;
    int pos = 0;
    int num = 0;
   
    // Pone INT_MAX en todos los elementos de la tabla para que el número introducido siempre sea menor
    for(c = 0; c < TAMANO; c++) {
        tabla[c] = INT_MAX;
    }
   
    for(c = 0; c < TAMANO; c++) {
        pos = 0;
        num = pedirNum("Introduzca un número ");
        // Busca la posición correcta para insertar el número en la tabla
        while(tabla[pos] < num && pos < (TAMANO-1)) {
            pos++;
        }
        // Corre posición de los elementos de la tabla si es necesario
        for(c1 = TAMANO - 1; c1 > pos; c1--) {
            tabla[c1] = tabla[c1 - 1];
        }
        // Guarda el numero en la posición correcta
        tabla[pos] = num;
    }
}

// Desplaza los elementos de la tabla 1 posición a la izquierda. (Opción 3)
void rotarIzquierda(int *tabla) {
    int c = 0;
    // Guardamos el primer elemento en el auxiliar
    int aux = tabla[0];
    // Movemos todos los demás
    for(c = 0; c < TAMANO - 1; c++) {
        tabla[c] = tabla[c + 1];
    }
    // Pasamos el auxiliar al último elemento
    tabla[TAMANO - 1] = aux;
}

// Desplaza los elementos de la tabla 1 posición a la derecha. (Opción 4)
void rotarDerecha(int *tabla) {
    int c = 0;
    // Guardamos el último elemento en el auxiliar
    int aux = tabla[TAMANO - 1];
    // Movemos los demás
    for(c = TAMANO ; c > 0; c--) {
        tabla[c] = tabla[c - 1];
    }
    // Pasamos el auxiliar a la primera posición
    tabla[0] = aux;
}

// Ordena la tabla de forma descendente usando qsort (Opción 5)
void ordenarDesc(int *tabla) {
    qsort(tabla, TAMANO, sizeof(int), &compararDesc);
}
int compararDesc(const void *n1, const void *n2) {
        return (*(int *)n2 - *(int *)n1);
}

// Ordena la tabla de forma ascendente usando qsort (Opción 6)
void ordenarAsc(int *tabla) {
    qsort(tabla, TAMANO, sizeof(int), &compararAsc);
}
int compararAsc(const void *n1, const void *n2) {
        return (*(int *)n1 - *(int *)n2);
}

// Carga la tabla con 10 números aleatorios entre 1 y 100 (Opción 7)
void cargarAleatorio(int *tabla) {
    int c = 0;
   
    // Inicializa secuencia de numeros aleatorios
    srand(time(NULL));
   
    for(c = 0; c < TAMANO; c++) {
        tabla[c] = 1+(int) (100.0*rand()/(RAND_MAX+1.0));
    }
}

// Muestra las opciones del menú
void mostrarMenu() {
    printf("1 - Cargar la tabla con 10 números\n");
    printf("2 - Cargar la tabla con 10 números ordenados de menos a mayor\n");
    printf("3 - Rotar la tabla una posición a la izquierda\n");
    printf("4 - Rotar la tabla una posición a la derecha\n");
    printf("5 - Ordenar la tabla descendente\n");
    printf("6 - Ordenar la tabla ascendente\n");
    printf("7 - Rellenar la tabla con números aleatorios\n");
    printf("0 - Salir\n");
}

// Pide un número entero por teclado. Muestra el texto indicado
int pedirNum(char *texto) {
    int num = 0;
    printf("%s", texto);
    scanf("%d", &num);
    return num;
}

No hay comentarios:

Publicar un comentario