ejercicio 8, práctico 7

ejercicio 8, práctico 7

de Joaquín Manrique Machín -
Número de respuestas: 4

Buenas tardes, escribo para consultar dos asuntos de la función en este programa. Esto es lo que escribí:

function esprimo (n: INTEGER): BOOLEAN;
var
    primo: BOOLEAN;
    divisor, fin: INTEGER;
begin
    fin := trunc(sqrt(n));
    divisor := 2;
    primo := TRUE;
   
    if n <= 1
    then primo := FALSE
    else begin
    while (divisor <= fin) do
        begin
            if (n mod divisor = 0)
            then primo := FALSE
            else divisor := divisor + 1
        end
    end;
   esprimo := primo
end;

La primera pregunta sobre el funcionamiento del programa, ya que entra en bucle cuando le ingreso un numero que no sea primo, pero no entiendo por que ocurre, si cuando el numero es divisible entre el valor de "divisor" debería simplemente asignarle "false" a la variable "primo".

La segunda pregunta es sobre la estética, organización e indentación del programa. Aparte de agregar comentarios, debería arreglar de alguna forma la estructura del programa para que sea mejor?

Muchas gracias y saludos.

En respuesta a Joaquín Manrique Machín

Re: ejercicio 8, práctico 7

de Mateo Fontoura Abelenda -
Hola Joaquín, en realidad ahí estás teniendo un problema cuando se ingresa al While, porque para salir del While necesariamente divisor > fin, pero en caso de que se cumpla dicha condición por ej tomando n=4, quedaría fin =2, divisor<=fin es cierta, entonces entra al while, se cumple que 4 mod 2 = 0, se le va a asignar a la bandera booleana el False y no se realiza nada con el divisor, es decir va a volver a consultar si divisor <= fin lo cual va a cumplirse va a volver a evaluar 4 mod 2 = 0, se le va a asignar a la bandera booleana el False nuevamente y va a repetir ese ciclo de manera indefinida ya que no va a dar False el hecho de que (divisor <= fin) , en cambio, si le ingresas un primo, como n mod divisor <> 0, se le va a asignar a divisor := divisor + 1; hasta qué divisor > fin. Para salir de ese loop, deberías hacer una doble condición para permanecer en el While, (divisor <= fin ) And (primo). Por las dudas si sale del While por primo, quiere decir que n mod divisor = 0, se le asigno el valor false a primo y gracias al circuito corto, si primo es false, el And da False y sale del While.
En respuesta a Joaquín Manrique Machín

Re: ejercicio 8, práctico 7

de Felipe Miranda Torres De La Llosa -

Hola Joaquín, ¿cómo andas?

Lo que pasa es que cuando encontras un divisor para un número no primo "n mod divisor = 0" va a ser verdadero, entonces a la variable prima le asignas FALSE, pero esto no es parte de la condición del while, y como no modificas la variable divisor (está en el else) la condición va a ser verdadera siempre. Para resolver esto podés repasar como es la estructura de búsqueda por centinela, en las diapositivas de clase y en las soluciones de prácticos anteriores tenés ejemplos para este mismo caso de determinar si un número es primo, y otros similares.

Sobre la indentación lo veo muy bien, se entiende sin problema que está adentro de qué y eso es lo importante.

Saludos, Felipe