Autor Tema: Código C función serie números primos Ambito de variables en lenguajeC CU00548F  (Leído 3175 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes. Expongo una posible solución del ejercicio CU00548F del tutorial de programación C lenguajeC desde cero.

Citar
EJERCICIO

Estudia el código que se muestra más abajo y responde a las preguntas:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int check_prime(int num);

int main(){
   int n1,n2,i,flag;
   printf("Enter two numbers(intervals): ");
   scanf("%d %d",&n1, &n2);
   printf("Prime numbers between %d and %d are: ", n1, n2);
   for(i=n1+1;i<n2;++i)
   {
      flag=check_prime(i);
      if(flag==0)
         printf("%d ",i);
   }
   return 0;
}

int check_prime(int num) {
   int j,flag=0;
   for(j=2;j<=num/2;++j){
        if(num%j==0){
            flag=1;
            break;
        }
   }
   return flag; // Ejercicios aprenderaprogramar.com
}

Citar
a) Sin ejecutar el código (sólo pensando) responde: ¿para qué sirve la función check_prime? ¿Qué resultado devolverá si le pasamos el número 4? ¿Por qué?

Sirve para verificar si el número siguiente al primer entrado por el usuario es divisible por 2. Si le pasaramos 4 devolverá flag=1 y saldrá del bucle debido a la instrucción "break;" porque cumplirá la condición "if(num%j==0)".

Citar
b) En dicha función se usa la siguiente definición de bucle: for(j=2;j<=num/2;++j) ¿Por qué crees que el bucle tiene un valor inicial 2? ¿Por qué crees que el bucle tiene un valor final num/2?

El bucle empieza con un valor inicial 2, porque cada número es divisible por 1 y no tendría sentido, siempre se saldría del bucle entrando en el condicional: "if(num%j==0)". Además los números primos son divisibles por 1, así que dividiendo el número por 1 no comprobaríamos si es primo o no.
También tiene otra razón, comprobamos si el número es divisible por 2 para comprobar primero si es un número par. Todos los números par (menos el 2) no son números primos.

El bucle tiene un valor final num/2 porque si hemos comprobado dividir el num por todos los números hasta su mitad y hemos comprobado que hasta ese momento no tiene un división exacta su otra mitad tampoco lo será. Es decir, si una "cosa" no es exactamente divisible si le añadimos exactamente la misma cantidad de esa "cosa" es como dejarla igual. Nos podemos valer del ejemplo: "2/4=1/2".

Citar
c) ¿La variable flag que se usa en el main es la misma que se usa en la función check_prime? ¿Es posible declarar y usar dos variables con el mismo nombre en la función main? ¿Y declarar y usar dos variables con el mismo nombre en la función main y otra función? ¿Por qué?.

No es la misma variable "flag" que se usa en el "main" que en la función "chek_prime". Son dos variables locales diferentes.

No es posible usar dos variables con el mismo nombre en una misma función.

Es posible declarar y usar dos variables con el mismo nombre en la función "main" y en otra función. Serán dos variables locales diferentes.

Citar
d) Crea una tabla de variables del programa que conste de las siguientes columnas: nombre de variable, ámbito, utilidad. Por ejemplo la variable i tiene nombre de variable i, ámbito la función main, y utilidad servir como índice en el bucle for del main.



Citar
e) Si se introducen como números 11 y 30 ¿Son evaluados 11 y 30? ¿Qué resultado se obtiene? ¿Por qué?

No se evalúa el 11 porque el valor inicial del bucle for de la función "main" ya empieza en: "i=n1+1", con lo cual quiere decir que empezará a partir del 12 y ese valor será el primer parámetro pasado a la función "chech_prime". El 30 tampoco será comprobado porque el bucle de la función "main" sólo se ejecutará hasta que el índice del mismo sea menor que el segundo número entrado por el usuario.

Se optien el resultado: "13 17 19 23 29" porque son los número primos entre 11 y 30 (ambos excluidos de comprobación).

Gracias.

« Última modificación: 11 de Julio 2016, 22:48 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas bien

Lo pensado sin ejecutar el código (verificar divisibilidad por 2) luego veo comprobaste que era para sacar los números primos

Salu2

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenos días, Ogramar.

Gracias por tu tiempo y por el ejercicio corregido. Real mente la función por si sólo sirve para verificar si el número es divisible por 2. Todo el código es para sacar los números primos. ¿O me estoy equivocando?

Saludos.
« Última modificación: 13 de Julio 2016, 11:49 por dimiste »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas la función no es solo para comprobar la divisibilidad por dos

Al tener

Código: [Seleccionar]
int check_prime(int num) {
   int j,flag=0;
   for(j=2;j<=num/2;++j){
        if(num%j==0){
            flag=1;
            break;
        }
   }
   return flag; // Ejercicios aprenderaprogramar.com
}

Lo que está haciendo la función es comprobar si el número es divisible por algún número comprendido entre 2 y la mitad del número, por ejemplo si el número es 17 comprueba si 17 es divisible por 2, por 3, por 4, por 5, por 6... hasta la mitad del número, haciendo un redondeo si es impar

Salu2

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, Ogramar.

Estoy de acuerdo contigo. La función sirve para ello. Me he expresado mal.

Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".