Buscar este blog

16 de enero de 2010

#include 
#include //malloc, free
#include 
//#include  //kbhit, clrscr (No es ANSIC)
#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);
}

No hay comentarios:

Publicar un comentario