elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Problema de comprensión programa C en: 3 Octubre 2021, 13:47 pm
Buenas,
tengo que solucionar un problema de un programa en C cuyo objetivo es calcular los números del 1 al 20. El problema es que devuelve los números 9, 11, 13, 15, 17 y 19 cuando la salida debería ser 2, 3, 5, 7, 11, 13, 17, 19.

Lo sé, es un programa ridículamente fácil pero llevo desde 1º de carrera sin tocar C (los últimos años he estado trabajando en Java) y estoy muy perdida con los conceptos básicos, así que estoy bastante jodida porque este programa nos lo han dado para recordar C, pero la asignatura es Sistemas Operativos y tendré que hacer movidas curiosas...

En fin, no entiendo las expresiones subrayadas en negrita. Aunque agradecería que alguien me explicara al completo el funcionamiento de la función es_primos porque he estado usando el depurador para ver si me aclaraba y ha sido peor aún. Por ejemplo, cuando p=1, sale del bucle for cuando f toma el valor 5 (es decir, se ejecuta solo 2 veces y no entiendo por qué... Realmente no veo la condición de salida del for). Por otra parte, en la primera expresión marcada en negrita yo entiendo que es: A p se le asigna el valor del resto resultante de la división p:2 siempre que dicho resto sea distinto de 0. Pero en la práctica no veo que sea así.

/* Programa que calcula primos */

#include <stdio.h>
#include <math.h>

/*  Función es_primo (int p)
    p   parámetros de entrada. Número a evalurar si es primo
    Devuelve:
        0   Si p no es primo
        1   Si p es primo

    Para ver si un número es primo se intenta dividir por todos sus posibles divisores.
    Si alguno da resto cero, entonces no es primo
*/   
int es_primo ( int p );

int main ( void )
{
   const int MIN = 1;   /* Primer nº que evalúa si es primo */
   const int MAX = 20; /* Último nº que evalúa si es primo */
   int primo;          /* Recorre los posibles primos en el rango [MIN,MAX] */

   for ( primo = MIN; primo <= MAX; primo = primo + 1 )
      if ( es_primo ( primo ) )
         fprintf ( stdout, "%d\n", primo );
   return 0;
}

int es_primo ( int p )
{
   const int MAXFACTOR = ( int ) (sqrt ( (double)p )); /* Máximo factor posible de p */
   int f; /* Factor por el que se va comprobando si p es divisible */
   int primo; /* 1 Si p no es divisible por ningún f probado y 0 en caso contrario */

   primo = ( ( p % 2 ) != 0 );
   for ( f = 3; primo && ( f > MAXFACTOR ); f = f + 2 )
      primo = ( ( p % f ) == 0 )
   return primo;
}


Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines