[C] Array

dreaan92
Scrivere un programma C che memorizza in un
array tutti i numeri primi minori di 50 e
successivamente li stampa a video.

Questo è il testo.
Questo è come ho provato per risolverlo:

#include <stdio.h>
void primi (void);

int array[50];
int j=1;
int main (void){
	
	
	array[0]=1;
	primi();
	for (int i=0; i<=j; i++){
		printf ("%d ", array[i]); 
	}
}

void primi (void){
	int d=3;
	while (d<50){
		for (int i=2, e=0; i<d; i++){
		if (d%i!=0){
			e++;
			}
			if (e!=0){
				array[j]=d;
				j++;
                      }
		d++;
	}
    }
}


Probabilmente sono scemo io perchè il programma smette di funzionare subito dopo l'esecuzione :cry:

Risposte
Omega1
Ciao!
Ho letto il programma, e ho apportato alcune modifiche per farlo funzionare.
Io ti sconsiglio di usare variabili globali. Aumentano la complessità del programma.
#include <stdio.h>

void primi (int *, int *, int);


int main (void)
{  
   int array[50];
   int j;
   j=0;
   array[0]=2;
   primi(array, &j, 50);
   int i;
   
   printf("Elenco dei mumeri primi inferiori a 50:\n");
   for (i=0; i<=j; i++){
      printf ("%d \n", array[i]); 
   }
   return 0;
}


//  ridefinisco la funzione:
// vettore: un riferimento all'array 
// j: riferimento all'indice dell'ultimo numero trovato
// fine: dimensione massima del vettore
void primi (int *vettore, int *j, int fine)
{
   int d=3, i, e; // dichiaro variabili locali, anzichè globali.
   while (d<50)
   {
	  e=0;
      for (i=2; i<d; i++)
      {
		if ((d % i) == 0)
		{
			// Solo se il resto è uguale a 0
		    // incremento e.
			 e++; 
		}
	  }
      if (e == 0) 
      {
		// Se e non è stata incrementata, allora d non ha divisori.
		(*j)++;  // inceremento di uno l'indice del vettore
		if (*j >= fine)
			return; // se supero il limite dimensionale del vettore
			        // termino la funzione.
		vettore[*j]=d; 
	  }
	  d++;
    }   
}

andreaciceri96
Stavo provando a riscrivere il tuo programma ma ho fatto davvero fatica a leggerlo, alla fine ho deciso di riscriverlo.
#include <stdio.h>

int is_primo(int n); //ritorna 1 se n e' primo, 0 altrimenti

int main (void) {
    int primi[50];
    int len = 0;

    for (int i = 2; i<50; i++) { //itera sui primi 50 interi
        if (is_primo(i)) { //se l'intero attuale e' primo
            primi[len] = i; //aggiungilo all'array
            len++; //e aumenta la variable che tiene il conto della lunghezza dell'array
        }
    }

    for (int i = 0; i<len; i++) { //stampa l'array
        printf("%d, ", primi[i]);
    }

    return 0;
}

int is_primo (int n) { //ritorna 1 se n e' primo, 0 altrimenti
    for (int d=2; d<n; d++) { //itera sui candidati divisori (in realta' e' superfluo arrivare fino a n)
        if ((n%d) == 0) { //se ne trova uno
            return 0;
        }
    }

    return 1; //se l'esecuzioni arriva fino a qui non sono stati trovati divisori, quindi ritorna 1
}


Qualcuno ha gia' risposto prima che mandassi il messaggio ma a questo punto oramai mando anche la mia versione, e' altamente inefficiente ma ho cercato di essere il piu' semplice e chiaro possibile.
Gia' solo il crivello di Eratostene sarebbe significativamente piu' veloce.

dreaan92
Grazie per le risposte, mi scuso per la scarsa leggibilità del pogramma, in futurò metterò dei commenti per renderlo più comprensibile.
Essendo agli inizi per me queste cose non sono proprio banali

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.