You are on page 1of 5

/************************ PROYECTO: generaciondatos04 ***********************/ #include #include #include #include <stdio.h> <stdlib.h> <time.h> <math.

h>

/* Librerias de soporte a SSS */ #include "sss_all.h" /* Libreria ALLEGRO para manejar las diversas funciones de graficos */ #include<allegro.h> #define #define #define #define NUM 200 /* Longitud de los arrays de caracteres */ WIDTH 620 /* Ancho de la ventana grafica */ HEIGHT 480 /* Altura de la ventana grafica */ MARGEN 10 /* Margen para trazar los puntos y graficas en la ventana */

/* MEDIA y VARIANZA Para el generador de numeros aleatorios con distribucion gaussiana, tambien conocida como distribucion normal */ #define MEDIA 0 #define VARIANZA 1 /* El manejo de graficos se hace sabiendo que el pixel en la esquina superior izquierda tiene coordenadas (1,1) y no hay valores de coordenadas negativas, por ejemplo si se crea una ventana grafica de 400x200 pixeles, el pixel en la esquina inferior derecha tendra la coordenada (400,200). Donde 400 es el ancho (WIDTH) y 200 es la altura (HEIGHT) de la ventana grafi ca */ /* Prototipos de las funciones usadas en el programa */ float genera_valor_aleatorio(float,float); void burbuja(float *,int), inicializar_allegro(void), finalizar_allegro(void); int main(void) /* Inicio del programa */ { /* Definicion de las variables a usar */ int num_datos, /* Cantidad de numeros aleatorios a manejar */ i, /* Variable para contador */ ver_valores, /* Switch para ver en pantalla los valores aleatorios generados */ hora=time(NULL); /* Valor para la semilla del generador de numeros aleatorios, con ello evitar la repeticion de la secuencia de los numeros aleatorios generados */ float *datos, /* Puntero para crear con memoria dinamico un arreglo de valores flotantes que almacenaran los valores aleatorios generados */ valor_maximo; /* Variable que almacenara el valor maximo absoluto de los valore s aleatorios generados y con ello graficar en forma correcta los valores aleatorios generados */ char cadena[NUM]; /* Array de caracteres para almacenar las cadenas de texto que se tecleen en el programa */ /* Se le pide al usuario que teclee los datos y opcionets que necesita el progra ma */ printf("\nTeclea el numero de datos aleatorios a generar (maximo %d): ", WIDTH-(2*MARGEN)); gets(cadena); num_datos=atoi(cadena);

printf("\nDesea ver los valores impresos en pantalla?"); printf("\n1 para SI, 0 para NO: "); gets(cadena); ver_valores=atoi(cadena); /* Se crea con memoria dinamica el arreglo de tamanio exacto para almacenar los datos aleatorios generados */ if( (datos=(float *)malloc(num_datos*sizeof(float)))==NULL) { printf("\nFalla de asignacion de memoria dinamica...."); exit(0); } SETSEE(hora); /* Reinicializa la semilla del generador de numeros aleatorios relacionandola con la hora de la computadora; con ello evitar la repeticion de la secuencia de los valores aleatorios generados */ /* Se generan los numeros aleatorios que el usuario haya pedido */ for(i=0;i<num_datos;i++) { datos[i]=genera_valor_aleatorio(MEDIA,VARIANZA); if(ver_valores) /* Switch para mostrar o no en pantalla los valores aleatori os */ printf("\nEl dato aleatorio %d generado fue %f",i+1,datos[i]); } /* Rutina para buscar en los datos aleatorios generados el valor absoluto maximo para graficar en forma adecuada los mismos. Se imprime al final el valor maxi mo absoluto encontrado */ valor_maximo=fabs(datos[0]); for(i=1;i<num_datos;i++) if(fabs(datos[i])>=valor_maximo) valor_maximo=fabs(datos[i]); printf("\nEl valor maximo absoluto de los %d datos es: %f",num_datos,valor_maxim o); /* Se inicia el funcionamiento y manejo de los graficos en el programa */ inicializar_allegro( ); /* Iniciamos y configuramos el modo grafico a usar */ /* Se prepara la ventana grafica para posteriormente graficar los valores aleatorios sin ordenar aun */ rectfill( screen, /* En donde se dibujara el rectangulo relleno */ MARGEN,MARGEN, /* Coordenadas de la esquina sup. izq. */ WIDTH-MARGEN,HEIGHT-MARGEN, /* Coordenadas de la esquina inf. der. */ pallete_color[15]); /* El color para dibujar y rellenar el rectangulo * / line( screen, /* En donde se dibujara la linea */ 0,HEIGHT/2, /* Coordenadas del punto inicial de la linea */ WIDTH,HEIGHT/2, /* Coordenadas del punto final de la linea */ pallete_color[14]); /* El color para dibujar la linea */ /* Se grafican con lineas verticales los valores aleatorios generados */ for(i=0;i<num_datos;i++) line( screen, /* En donde se dibujara la linea */ MARGEN+i,HEIGHT/2, /* Coordenadas del punto inicial de la linea */ /* Coordenadas del punto final de la linea */ MARGEN+i,(HEIGHT/2)-((datos[i]*((HEIGHT/2)-MARGEN))/valor_maximo),

makecol(255,0,0)); /* El color para dibujar la linea */ textout_ex( screen, /* En donde se escribira el texto */ font, /* La fuente del font a usar para escribir el texto */ "Graficacion de datos SIN ORDENAR", /* Cadena de texto a escribir */ 2*MARGEN,2*MARGEN, /* Coordenada en donde comenzara a escribirse el t exto */ pallete_color[0], /* Color con el cual se escribira el texto */ -1); /* Atributo de escritura transparente para escribir el texto */ textprintf_ex( screen, /* En donde se escribira el texto */ font, /* La fuente del font a usar para escribir el texto */ 2*MARGEN,(int) (3.5*MARGEN), /* Coordenada en donde comenzara a esc ribirse el texto */ makecol(0,0,0), /* Color con el cual se escribira el texto */ -1, /* Atributo de escritura transparente para escribir el texto */ "Cantidad de datos graficados: %d", /* Cadena de texto a escribir * / num_datos); /* Contenido de la variable a escribir con la cadena de texto */ /* Se ordenan los datos aleatorios generados mediante el algoritmo iterativo del Metodo de la Burbuja */ burbuja(datos,num_datos); readkey( ); /* Espera alguna tecla para continuar, una pausa */ clear_bitmap(screen); /* Se limpia la ventana de graficos que se abrio */ /* Se prepara la ventana grafica para posteriormente graficar los valores aleatorios ya ordenados */ rectfill( screen, /* En donde se dibujara el rectangulo relleno */ MARGEN,MARGEN, /* Coordenadas de la esquina sup. izq. */ WIDTH-MARGEN,HEIGHT-MARGEN, /* Coordenadas de la esquina inf. der. */ pallete_color[15]); /* El color para dibujar y rellenar el rectangulo * / line( screen, /* En donde se dibujara la linea */ 0,HEIGHT/2, /* Coordenadas del punto inicial de la linea */ WIDTH,HEIGHT/2, /* Coordenadas del punto final de la linea */ pallete_color[14]); /* El color para dibujar la linea */ /* Se grafican con lineas verticales los valores aleatorios generados ya ordenad os */ for(i=0;i<num_datos;i++) line( screen, /* En donde se dibujara la linea */ MARGEN+i,HEIGHT/2, /* Coordenadas del punto inicial de la linea */ /* Coordenadas del punto final de la linea */ MARGEN+i,(HEIGHT/2)-((datos[i]*((HEIGHT/2)-MARGEN))/valor_maximo), makecol(255,0,0)); /* El color para dibujar la linea */ textout_ex( screen, /* En donde se escribira el texto */ font, /* La fuente del font a usar para escribir el texto */ "Graficacion de datos YA ORDENADOS", /* Cadena de texto a escribir */ 2*MARGEN,2*MARGEN, /* Coordenada en donde comenzara a escribirse el t exto */ pallete_color[0], /* Color con el cual se escribira el texto */ -1); /* Atributo de escritura transparente para escribir el texto */

textprintf_ex( screen, /* En donde se escribira el texto */ font, /* La fuente del font a usar para escribir el texto */ 2*MARGEN,(int) (3.5*MARGEN), /* Coordenada en donde comenzara a esc ribirse el texto */ makecol(0,0,0), /* Color con el cual se escribira el texto */ -1, /* Atributo de escritura transparente para escribir el texto */ "Cantidad de datos graficados: %d", /* Cadena de texto a escribir * / num_datos); /* Contenido de la variable a escribir con la cadena de texto */ readkey( ); /* Espera alguna tecla para continuar, una pausa */ finalizar_allegro( ); /* Se cierra el uso de los graficos en el programa */ free(datos); /* Se libera la memoria usada por el arreglo donde se almacenaron l os valores aleatorios generados. Recordar que este arreglo se creo usando memoria dinamica */ } /* Fin del programa */ END_OF_MAIN( ) /* MACRO necesaria cuando se usa la libreria ALLEGRO */ /* Ordenacion por el algoritmo iterativo del Metodo de la Burbuja */ void burbuja(float *elemento,int contador) { register int a,b; register float t; for(a=1;a<contador;++a) { for(b=contador-1;b>=a;--b) { if(elemento[b-1]>elemento[b]) { /* Intercambio de elementos */ t=elemento[b-1]; elemento[b-1]=elemento[b]; elemento[b]=t; } } } } float genera_valor_aleatorio(float media, float varianza) { /* Se usa una distribucion normal o gaussiana como pdf de los datos aleatorios generados */ return RN(media,varianza); } /* Funcion de inicio de ALLEGRO */ void inicializar_allegro(void) { int depth, res; /* Variables para guardar cantidad de colores y la resolucion */ allegro_init( ); /* Prepara el uso de las funciones graficas */ depth=desktop_color_depth(); /* Encuentra el numero de colores validos */ if(depth==0) depth=32; set_color_depth(depth); /* Establece el numero de colores a usar */ /* Prepara la tarjeta de video y el tamanio de la ventana de video a usar */

res=set_gfx_mode(GFX_AUTODETECT,WIDTH,HEIGHT,0,0); if(res!=0) /* Verifica si se puede establecer el modo grafico y el tamanio de la ventana de graficos; acorde a la tarjeta de video */ { /* Manda el mensaje de error en caso de que la tarjeta de video no funcione adecuadamente */ allegro_message(allegro_error); exit(-1); } install_keyboard( ); /* Prepara el teclado para ser usado */ install_mouse( ); /* Prepara el mouse para ser usado */ install_timer( ); /* Inicializa un temporizador */ } /* Funcion para finalizar a ALLEGRO */ void finalizar_allegro(void) { clear_keybuf( ); /* Limpia el buffer o memoria intermedia del teclado */ allegro_exit( ); /* Cierra el entorno y uso de funciones graficas */ }

You might also like