[C] Array
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:
Probabilmente sono scemo io perchè il programma smette di funzionare subito dopo l'esecuzione
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
Risposte
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.
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++;
}
}
Stavo provando a riscrivere il tuo programma ma ho fatto davvero fatica a leggerlo, alla fine ho deciso di riscriverlo.
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.
#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.
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
Essendo agli inizi per me queste cose non sono proprio banali