Criba de Eratostenes en C con funciones.

Iniciado por estudiante_1, 30 Julio 2015, 01:04 AM

0 Miembros y 1 Visitante están viendo este tema.

estudiante_1

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:
#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

ivancea96

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.

estudiante_1

#2
Aquí trato de tachar los múltiplos, pero no me funciona.
#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:
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. Collins

#3
#include<stdio.h>
#include<stdlib.h>

void criba(int *v, int n){
int i,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=0;i<n;i++){
v[i]=i;
printf("%d\n",v[i]);
   }
   criba(v, n);
   for(i=2;i<n;i++){
if(v[i]!=0) printf("%10d\n",v[i]);
    }

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

}


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.

estudiante_1


joecarl

#5
Cita de: T. Collins en 30 Julio 2015, 02:03 AMPor 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 (cpp) [Seleccionar]

int n;
scanf("%d",&n);
int v[n];//esto no puede hacerse en C estándar


Lo correcto sería:

Código (cpp) [Seleccionar]

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

furciorifa

Cita de: joecarl en 30 Julio 2015, 13:06 PM
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 (cpp) [Seleccionar]

int n;
scanf("%d",&n);
int v[n];//esto no puede hacerse en C estándar


Lo correcto sería:

Código (cpp) [Seleccionar]

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

En Linux corre a la perfección con ansi c