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