12Dic/082
Criba de Eratostenes en Ada (ACTUALIZADO)
Viendo el panorama que hay en clase con respecto a la practica de Metodología de la Programación de la Criba de eratostenes me decido a crear esta entrada explicando como se realiza dicha practica.
Este es el código, en los comentarios explico cada parte:
----------------------------------------------------------------
-- Nombre: Criba de Eratostenes
-- Fecha: 14/12/2008
-- Descripción: Creación de una lista que contenga todos los
-- primos menores que el numero que el usuario introduce
-- Requiere: Modulo de manejo de listas (lista.ads y lista.adb)
----------------------------------------------------------------
-- Autor: [SkG]
----------------------------------------------------------------
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
with Lista; -- Llamada al modulo de manejo de listas que el profesor nos dio
procedure criba is
----------------------------------------------------------------
-- Declaración de tipos y paquetes
----------------------------------------------------------------
-- Declaramos el paquete ListaCriba como una lista de tipo positivo y
-- la 'usamos' para poder interactuar con ella
package ListaCriba is new Lista(positive); use ListaCriba;
-- Creamos un Subtipo 'LCriba' que sea del tipo de las listas
subtype LCriba is ListaCriba.Tipo;
----------------------------------------------------------------
-- Declaración de funciones y procedimientos
----------------------------------------------------------------
-- Esta funcion la tenemos de practicas anteriores y devuelve si un
-- numero es primo o no mediante True o False (Booleano)
function Primo(N,Div:positive) return boolean is
-- POST: Res = True si not Div(X,N) para todo valor de X|2 < = X < sqrt(N)
begin
if Div > integer(sqrt(float(N))) then
return True;
else
return (N mod Div/=0) and then Primo(N,Div+1);
end if;
end Primo;
-- Esta función devuelve una lista que va construyendo según si el
-- numero es primo o no mediante la función 'Cons' que está en el paquete 'Lista'
-- El parámetro Inc es para saltar los números en tandas de 2, 4, 2, 4 ...
-- y no tener que comprobar los pares superiores al 2 que no son primos
function Criba_Aux(N,Cand,Inc:positive) return LCriba is
begin
if Cand > N then
return Vacia;
elsif Primo(Cand,2) then
return Cons(Cand, Criba_Aux(N, Cand+Inc, 6-Inc));
else
return Criba_Aux(N, Cand+Inc, 6-Inc);
end if;
end Criba_Aux;
-- Incluimos 2 y 3 en la criba y empezamos desde el 5
function Criba(N:positive) return LCriba is
-- POST: Devuelve todos los primos anteriores al numero especificado
begin
----------------------------------------------------------------
-- NOTA: Si usamos el código que dio el profesor no funciona.
-- Como no es posible introducir una lista vacía por teclado
-- no es necesario comprobar si es vacía, si lo intentamos
-- da error y no podemos compilar.
-- También hay que añadir las opciones de si es 2 o 3
-- ya que si pones un numero anterior a 3 devuelve siempre
-- una lista con 2 y 3.
----------------------------------------------------------------
if N = 2 then
return Cons(2,Vacia);
elsif N = 3 then
return Cons(2,Cons(3,Vacia));
else
return Cons(2,Cons(3,Criba_Aux(N,5,2)));
end if;
end Criba;
-- Estas dos funciones SIEMPRE son necesarias si usamos el modulo lista
-- Esta función nos permite sacar por pantalla la lista. Pondríamos como
-- queremos ver los valores como si de la parte ejecutiva se tratase
procedure ImprPrimo(N:positive) is
begin
Put(N,0);
end ImprPrimo;
-- Esta otra es llamada desde la parte ejecutiva y hace que se 'Escriba' la lista,
-- para ello llama a la anterior que es la que devuelve los valores.
procedure ImprLista is new Escribir(ImprPrimo);
----------------------------------------------------------------
-- Declaración de variables y/o constantes
----------------------------------------------------------------
N: natural;
----------------------------------------------------------------
-- Parte ejecutiva
----------------------------------------------------------------
begin
-- Aquí supongo que si sabréis que hacer
Put("Introduce un numero: "); Get(N); New_Line;
-- Pedimos que nos Imprima una lista con la Criba hasta el número 'N'
if N = 0 then
Put("No hay numeros naturales antes del 0");
elsif N < 2 then
Put("No hay numeros primos antes del "); Put(N,0);
else
Put("Primos anteriores a ese numero:"); New_Line;
ImprCriba(Criba(N));
end if;
end criba;
Espero que os sea útil para comprender la práctica.
Saludos.

13 Enero, 2010 - 22:00
ola buenas, veo que manejas sobre ada, me gustaria pedirte haber si sabrias hacer este ejercicio sobre la criba de eratostenes en ada que me a mandado mi profesor, aquí te dejo el enunciado y la plantilla q nos a dado para hacerlo:Para encontrar números primos, a Eratóstenes se le ocurrió un algoritmo que lleva su nombre y que consiste en “cribar” de una tabla de los N primeros números que consideremos, a todos los que no sean primos, de la siguiente manera:
Primero se deja el 1, que es divisor de todos.
Se deja el primero de la tabla.
Se quitan todos sus múltiplos (se criban).
Se toma el siguiente de la tabla y se repite 2, 3 y 4 hasta que no haya más números.
Fijarse en que si, en un momento cualquiera, un número está en la tabla, es porque es primo, ya que si no lo fuera, ha debido ser múltiplo de algún número más pequeño que él y habrá sido cribado en un proceso anterior. La tabla de los N primeros números se puede modelar como sigue:
TYPE Tipo_Conjunto IS ARRAY (1..N) OF Boolean;
donde los números son ¡los índices! del array mientras que sus elementos son los indicativos booleanos de si el número está o no está en el conjunto. Es decir un número está en el conjunto si el elemento de su índice es True y no está si es False. O lo que es lo mismo, incluir el número i equivale a poner a True el elemento i_ésimo y excluir el mismo número equivale a poner a False su elemento correspondiente. De esta manera, el conjunto de los primos de entre los 5 primeros números naturales sería.
.. 1 …… 2 …… 3 …… 4 …… 5 ..
+——-+——-+——-+——–+——-+
| True | True | True | False | True |
+——-+——-+——-+——–+——-+
Se pide redactar un programa iterativo en Ada (sobre esta plantilla) que calcule los números primos de entre los max primeros. El problema principal quedaría especificado por la función:
FUNCTION Criba_Eratostenes RETURN Tipo_Conjunto IS
– PRE: cierto
–POST: resultado = FIL i IN [1,max] . EsPrimo (i)
Se recomienda redactar, en una acción aparte, las operación de criba de los múltiplos de un número dado:
PROCEDURE Excluir_Multiplos (n : IN Natural;
C : IN OUT Tipo_Conjunto) IS
– PRE: cierto
–POST: C_out = FIL i IN (C_in-{n}) . NOT Divide (n,i)
y la plantilla es esta:
——————————————————————–
– CLÁUSULAS DE CONTEXTO
——————————————————————–
WITH ADA.Text_IO; USE ADA.Text_IO;
WITH ADA.Integer_Text_IO; USE ADA.Integer_Text_IO;
——————————————————————–
– CABECERA DEL PROGRAMA
——————————————————————–
PROCEDURE UE9_A3_ENUN_CribaEratostenes IS
——————————————————————–
– ARCHIVO: UE9_A3_ENUN_CribaEratostenes.ADB
– EFECTO: Escribe en la salida estándar los números primos que haya
– entre los N primeros. Utiliza el algoritmo de la Criba de
– Eratóstenes
– AUTOR:
– GRUPO:
– FECHA_CREACIÓN:
– FECHA_ÚLTIMA_MODIFICACIÓN:
——————————————————————–
——————————————————————–
– DECLARACIONES DE CONSTANTES UNIVERSALES, TIPOS Y PAQUETES
——————————————————————–
max : CONSTANT Natural := 100;
TYPE Tipo_Conjunto IS ARRAY (1..max) OF Boolean;
——————————————————————–
– OPERACIONES DE LECTURA Y ESCRITURA
——————————————————————–
PROCEDURE Escribir_Conjunto (C : IN Tipo_Conjunto) IS
– PRE: cierto
–POST: Escribe “C” en la salida estandar
BEGIN
NULL;
END Escribir_Conjunto;
——————————————————————–
– DECLARACIONES DE ACCIONES Y FUNCIONES
——————————————————————–
PROCEDURE Excluir_Multiplos (n : IN Natural;
C : IN OUT Tipo_Conjunto) IS
– PRE: cierto
–POST: C_out = FIL i IN (C_in-{n}) . NOT Divide (n,i)
BEGIN
NULL;
END Excluir_Multiplos;
FUNCTION Criba_Eratostenes RETURN Tipo_Conjunto IS
– PRE: cierto
–POST: resultado = FIL i IN [1,max] . EsPrimo (i)
resultado : Tipo_Conjunto := (OTHERS => True);
BEGIN
RETURN resultado;
END Criba_Eratostenes;
——————————————————————–
– DECLARACIONES DE CONSTANTES DE PRUEBAS
——————————————————————–
——————————————————————–
– DECLARACIONES DE PRUEBAS
——————————————————————–
——————————————————————–
– DECLARACIONES DE VARIABLES
——————————————————————–
——————————————————————–
– BLOQUE DE EJECUCIÓN DE PRUEBAS
——————————————————————–
BEGIN
Put (” Tabla de numeros primos del 1 al “);
Put (max,3);
New_Line;
Escribir_Conjunto (Criba_Eratostenes);
New_Line;
END UE9_A3_ENUN_CribaEratostenes;
es para mañana si podrias entregarmelo oi te lo agradeceria muxisimo
Usando13 Enero, 2010 - 22:17
Siento decirte que no hago los ejercicios a nadie y menos con prisas. Yo puedo ayudar solucionar dudas y demás, pero nunca voy a hacerle nada a nadie de cero. Hay foros de ada en Internet, busca por ahí.
Usando