#include#include enum boolean {FALSE, TRUE}; typedef struct _primos{ //Así lo puedo referenciar aquí dentro unsigned long int num; struct _primos *siguiente; //Aún no está definido el tipo } primos; //Nombre del nuevo tipo primos *primero, *ultimo; //Estas son las variables globales void imprimir_primos (); void liberar(); boolean esprimo (unsigned long int i); boolean insertar_primo (unsigned long int x); void leer_fichero_txt (); void guardar_fichero_txt(); void menu(); void contar(); void main() { unsigned long int i=3, max; char opcion; boolean salir = FALSE; clock_t start, end; start = clock(); //1 primo// primero = (primos *) malloc (sizeof (primos)); primero -> siguiente = NULL; primero -> num = 1; ultimo = primero; ///// insertar_primo (2); /*caso raro, para tener referencia*/ do{ // clrscr(); //No es ANSCI C menu(); fflush (stdin); opcion = getc(stdin); switch (opcion) { //Esta función la he comentado por no ser ANSIC por el kbhit()// /* case '1': puts ("CALCULANDO..."); start = clock(); for (; !kbhit(); i+=2 ) { if (esprimo(i)) { if (!insertar_primo (i)) break;; } } end = clock(); printf ("\aFINALIZADO\n\nÚltimo nº comprobado: %li\nTiempo empleado: %f\nPresiona una tecla para continuar" , i, (end-start)/ CLK_TCK); fflush(stdin); getc(stdin); // break; */ case '2': printf ("\n Hasta qué nº quieres buscar? "); scanf ("%li", &max); puts ("CALCULANDO..."); start = clock(); for (; i < max; i=i+2 ) { if (esprimo(i)) { if (!insertar_primo (i)) break; } } end = clock (); printf ("\aFINALIZADO\n\nÚltimo nº comprobado: %li\nTiempo empleado: %f\nPresiona una tecla para continuar", i, (end-star t) / CLK_TCK); fflush(stdin); getc(stdin); break; case '3': leer_fichero_txt (); break; case '4': guardar_fichero_txt (); break; case '5': imprimir_primos (); break; case '6': salir = TRUE; break; case '7': contar(); break; default : puts ("OPCION INCORRECTA"); } } while (!salir); liberar(); } boolean esprimo (unsigned long int i) { unsigned long int max; primos *aux; max = (long int) (sqrt (i)); //Probamos los menores o igual a la raíz aux = primero->siguiente; /*apunto al 2*/ while (aux -> num <= max) //aux no puede ser NULL pq nunca será el último elemento { if (i % aux -> num == 0) return FALSE; aux = aux -> siguiente; } return TRUE; } void imprimir_primos () { primos *aux; aux = primero; while (aux -> siguiente != NULL) { printf ("%5li ",aux->num); aux = aux -> siguiente; } getc(stdin); } boolean insertar_primo (unsigned long int x) { primos *aux; if ((aux = (primos *) malloc (sizeof (primos)))!=NULL) //reservo memoria para siguiente primo { ultimo -> siguiente = aux; //último apunta al siguiente ultimo = aux; //último primo es el nuevo ultimo -> num = x; //inserto el número en último ultimo -> siguiente = NULL; //último apunta a NULL return TRUE; } else { printf ("\n\nOUT OF MEMORY\n"); return (FALSE); } } void liberar() { primos *aux, *ant; ant = primero; for (aux = primero->siguiente; aux != NULL; aux = aux->siguiente) { free (ant); ant = aux; } } void menu() { puts ("\nMenu"); puts ("====\n"); //puts ("1-Calcular números primos hasta que presionemos una tecla"); //La opción1 utiliza kbhit que no es ANSIC puts ("2-Calcular hasta un nº primo"); puts ("3-Cargar fichero de números primos"); puts ("4-Guardar primos en fichero"); puts ("5-Imprimir números primos calculados hasta el momento"); puts ("6-Salir"); puts ("7-Contar memoria"); } void leer_fichero_txt () { unsigned long i; FILE *f; if ((f = fopen ("primos.txt", "rt")) != NULL) { fscanf (f, "%li ", &i); fscanf (f, "%li ", &i); //as¡ ya he leido hasta el 2 printf ("\n\nLeyendo fichero primos.txt"); while (!feof(f)) { fscanf (f, "%li ", &i); insertar_primo(i); } printf ("\nFichero leido\nPresiona cualquier tecla para continuar"); fclose(f); } else printf ("\n\nERROR AL ABRIR EL FICHERO"); getc(stdin); } void guardar_fichero_txt () { primos *aux; FILE *f; if ((f = fopen ("primos.txt", "wt")) != NULL) { printf ("\n\nGuardando primos.txt"); for (aux = primero; aux != NULL; aux = aux -> siguiente) { fprintf (f, "%li ", aux -> num); } printf ("\nFichero guardado\nPresiona cualquier tecla para continuar"); fclose(f); } else (printf ("\n\nERROR AL GUARDAR EL FICHERO")); getc(stdin); } void contar () { primos *aux; unsigned long i = 0; for (aux = primero; aux != NULL; aux = aux -> siguiente) { i++; } printf ("\n\nHay un total de %li nums primos\n Ocupan %li * %i bytes = %li bytes", i, i, sizeof(primos), i*sizeof(primos)); getc(stdin); }//malloc, free #include //#include //kbhit, clrscr (No es ANSIC) #include
Buscar este blog
16 de enero de 2010
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario