Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: estudiante_1 en 30 Julio 2015, 01:04 am



Título: Criba de Eratostenes en C con funciones.
Publicado por: estudiante_1 en 30 Julio 2015, 01:04 am
Hola, ya he conseguido resolver el problema de la criba, ahora mi problema es que no sé cómo poner funciones para que sea mucho mejor el programa. Una ayuda por favor, para las funciones que se me dan horrible. Este es el programa en el main:
Código:
#include<stdio.h>
#include<stdlib.h>






     int main(void){
     int n;
     scanf("%d",&n);
     int v[n];
     int i,j,p;
     for(i=0;i<n;i++){
     v[i]=i;
     printf("%d\n",v[i]);
     }
for(i=2;i<n;i++){
for(j=2;i*j<n;j++){
v[i*j]=0;
}
      printf(" Tachando los multiplos con un 0: %10d\n",v[i]);
}     for(i=2;i<n;i++){
if(v[i]!=0) printf("Los numeros primos son: %4d\n",v[i]);

     }

     system("pause");
     return(0);

     }
Muchas gracias


Título: Re: Criba de Eratostenes en C con funciones.
Publicado por: ivancea96 en 30 Julio 2015, 01:10 am
Trata de tabular bien el código, así es complicado de leer .__.

Las funciones se ponen cuando se necesitan, no por obligación.
La mejor forma de colocar una función ahí es pasarle un array a una función y que la función te rellene la criba. Luego, el algoritmod e la criba en sí, es bastante corto como para ponerse a dividirlo.


Título: Re: Criba de Eratostenes en C con funciones.
Publicado por: estudiante_1 en 30 Julio 2015, 01:24 am
Aquí trato de tachar los múltiplos, pero no me funciona.
Código:
#include<stdio.h>
#include<stdlib.h>

      void criba(int v[],int i,int n, int j){
       for(i=2;i<n;i++){
for(j=2;i*j<n;j++){
v[i*j]=0;
}
}


       }


     int main(void){
     int n;
     scanf("%d",&n);
     int v[n],i,j;
     for(i=2;i<n;i++){
        v[i]=i;
     printf("%d\n",v[i]);
     }
     printf("%d\n",criba(v,i,n,j));



     system("pause");
     return(0);

     }



Ya lo he hecho como me dijsites, pero no me funciona y creo que es por un pequeño error, aquí te dejo el programa:
Código:
include<stdio.h>
#include<stdlib.h>

      void criba(int v[]){
          int i,n,j;
       for(i=2;i<n;i++){
       for(j=2;i*j<n;j++){
      v[i*j]=0;
     }
   }


       }


        int main(void){
        int n;
        scanf("%d",&n);
        int v[n],i,j;
     for(i=2;i<n;i++){
          v[i]=i;
     printf("%d\n",v[i]);
     }
      criba(v);
      for(i=2;i<n;i++){

      if(v[i]!=0) printf("%10d\n",v[i]);

}

     system("pause");
     return(0);

     }


Título: Re: Criba de Eratostenes en C con funciones.
Publicado por: T. Collins en 30 Julio 2015, 02:03 am
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. void criba(int *v, int n){
  5. int i,j;
  6. for(i=2;i<n;i++){
  7. for(j=2;i*j<n;j++){
  8. v[i*j]=0;
  9. }
  10. }
  11. }
  12.  
  13.  
  14. int main(void){
  15.    int n;
  16.    scanf("%d",&n);
  17.    int v[n],i,j;
  18.    for(i=0;i<n;i++){
  19. v[i]=i;
  20. printf("%d\n",v[i]);
  21.    }
  22.    criba(v, n);
  23.    for(i=2;i<n;i++){
  24. if(v[i]!=0) printf("%10d\n",v[i]);
  25.    }
  26.  
  27.    system("pause");
  28.    return(0);
  29.  
  30. }

Te faltaba pasarle a la función criba la variable n. Por cierto, creo que declarar un array de tamaño variable de esa forma no es muy adecuado, deberías usar malloc.


Título: Re: Criba de Eratostenes en C con funciones.
Publicado por: estudiante_1 en 30 Julio 2015, 12:26 pm
Gracias por tu respuesta.


Título: Re: Criba de Eratostenes en C con funciones.
Publicado por: joecarl en 30 Julio 2015, 13:06 pm
Por cierto, creo que declarar un array de tamaño variable de esa forma no es muy adecuado, deberías usar malloc.

De hecho es que no se puede hacer. Si ese programa compila es que no es C, quiza es alguna versión rara de C, pero en C estándar ese código no puede compilar.

Código
  1. int n;
  2. scanf("%d",&n);
  3. int v[n];//esto no puede hacerse en C estándar
  4.  

Lo correcto sería:

Código
  1. int n;
  2. scanf("%d",&n);
  3. int *v = (int*) malloc(n*sizeof(int));
  4. //... hacer tareas
  5. free(v);//al final del programa hay que liberar la memoria, si esto no se hace, quizá no pase nada ya
  6. //que el sistema operativo se encargará de liberarla, pero lo mas adecuado es liberarla aquí.
  7.  


Título: Re: Criba de Eratostenes en C con funciones.
Publicado por: furciorifa en 20 Agosto 2015, 03:16 am
De hecho es que no se puede hacer. Si ese programa compila es que no es C, quiza es alguna versión rara de C, pero en C estándar ese código no puede compilar.

Código
  1. int n;
  2. scanf("%d",&n);
  3. int v[n];//esto no puede hacerse en C estándar
  4.  

Lo correcto sería:

Código
  1. int n;
  2. scanf("%d",&n);
  3. int *v = (int*) malloc(n*sizeof(int));
  4. //... hacer tareas
  5. free(v);//al final del programa hay que liberar la memoria, si esto no se hace, quizá no pase nada ya
  6. //que el sistema operativo se encargará de liberarla, pero lo mas adecuado es liberarla aquí.
  7.  
En Linux corre a la perfección con ansi c