#Makefile para compilar todos los modulos
all: primers
llista.o:llista.cpp llista.h
g++ -c llista.cpp
node.o:node.cpp node.h
g++ -c node.cpp
ppal.o:ppal.cpp
g++ -c ppal.cpp
primers:llista.o node.o ppal.o
g++ llista.o node.o ppal.o -o primers
/****************************llista.cpp******************************/
#include "llista.h"
int llista::esFi()
{
//pequenna diferencia con el programa que hace lo mismo en C
//aqui miramos cuando act apunta a NULL, por tanto, nos
//hemos pasado del final, el otro lo hace cuando estamos sobre
//el ultimo numero, pero para el caso gracias a la raiz
//cuadrada da el mismo numero
return (act == NULL);
}
llista::llista()
{
//funcion constructora, ponemos los punteros a NULL
pri = NULL;
act = NULL;
ult = NULL;
}
void llista::Insereix(int i)
{
//inserimos al final de la lista
node *n;
//definimos el puntero al objeto
n = new node(i);
//instanciamos el objecto, pasandole de parametro el numero
if (n != NULL) {
//si hemos podido pedir memoria
n->ModificaSeg(NULL);
//siempre lo annadimos al final, valdra por tanto
//NULL el puntero al siguiente
if (pri == NULL) {
//si pri==NULL estamos en una lista vacia
pri = n;
ult = n;
act = n;
//todo tiene que apuntar al nuevo numero
} else {
ult->ModificaSeg(n);
//el que era ultimo antes tendra que apuntar
//al nuevo ultimo
ult = n;
//y ult tiene que apuntar al nuevo ultimo tambien
}
} else {
cout << "Error de memoria" << endl;
//nos ha faltado memoria
}
}
void llista::VesPrincipi()
{
act = pri;
//rebobinamos la lista :-)
}
node llista::Consulta()
{
return (*act);
//devolvemos el node que apuntamos
}
int llista::ConsultaNum()
{
node n;
n = Consulta();
return (n.ConsultaNum());
//cojemos el node y devolvemos el numero que contiene
}
void llista::Avanca()
{
act = act->ConsultaSeg();
//avanzamos uno
}
/**************************llista.h******************************/
#ifndef _LLI
#define _LLI
#include "node.h"
#include <iostream.h>
//definiremos la clase que controla la lista
class llista {
node *pri;
node *act;
node *ult;
//3 punteros privados para el control
public:
llista();
//funcion constructora
void VesPrincipi();
//para ir al principio de la lista
void Avanca();
//para avanzar un numero
node Consulta();
//devuelve el node apuntado por act
int ConsultaNum();
//devuelve el numero apuntado por act
void Insereix(int i);
//inserta elementos
int esFi();
//asi sabremos si llegamos al final de la lista
};
#endif /* _LLI */
/*****************************node.cpp**************************/
#include "node.h"
node::node()
{
//constructor sin parametros, lo ponemos todo a 0
seg = NULL;
num = 0;
}
node::node(int i)
{
seg = NULL;
num = i;
//asignamos el numero que nos pasan
}
int node::ConsultaNum()
{
return num;
//devolvemos el numero que contiene el node
}
node *node::ConsultaSeg()
{
return (seg);
//devolvemos el puntero al siguiente
}
void node::ModificaNum(int i)
{
num = i;
//por si necesitamos modificar el numero
}
void node::ModificaSeg(node * n)
{
seg = n;
//por si necesitamos modificar el puntero al siguiente elemento
}
/**************************node.h********************************/
#ifndef _NOD
#define _NOD
#include <iostream.h>
//definimos la clase node y las operaciones que podemos hacer con ella
class node { node *seg;
int num;
public:
node(int i);
node();
int ConsultaNum();
node *ConsultaSeg();
void ModificaNum(int i);
void ModificaSeg(node * n);
};
#endif
/****************************ppal.cpp************************/
#include "llista.h"
#include "node.h"
#include <iostream.h>
int esPrimer(int n, llista l);
void main()
{
llista l;
int n;
l.Insereix(2);
//inserimos el numero 2
cout << "2-";
//y lo imprimimos por pantalla
n = 3;
//empezaremos comprobando el numero 3
l.VesPrincipi();
//rebobinamos la lista
while (n < 2000000) {
//iremos hasta el numero 2 000 000
if (esPrimer(n, l) == 1) {
//si es primero, lo imprimimos y lo inserimos
cout << n << "-";
l.Insereix(n);
}
n = n + 2;
//vamos comprobando los numeros impares
}
}
int esPrimer(int n, llista l)
{
int ret = 1;
//pensamos que en principio es primero
l.VesPrincipi();
//rebobinamos
while (ret == 1 && l.esFi() == 0
&& l.ConsultaNum() * l.ConsultaNum() <= n + 1) {
//mientras sea primero, no estemos en final de lista y estemos
//comprobando un numero menor de la raiz cuadrada del numero a
//comprobar iremos haciendo
if (n % l.ConsultaNum() == 0)
ret = 0;
//eps! no es primero
else
l.Avanca();
//avanzamos
}
return ret;
}