n° 154
Settembre 2010
Settembre 03, 2010, 04:18:16 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: Usi il PC già da qualche anno? partecipa alla discussione nell'area Retrocomputing
 
   Indice   Linux Windows Internet videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


 SONDAGGIO
Saresti interessato a seguire online dei videocorsi?
Sì | No
Se sì, quali di questi argomenti sarebbero di tuo gradimento?

.NET Framework   PHP
ASP.NET Python
Attività SEO Ruby
C# Silverlight
C/C++ Visual Basic .NET
Java Windows Azure
Java per Android Windows Phone 7
Objective-C (iPhone / iPad) Altri

Attenzione! Per partecipare al sondaggio bisogna essere registrati al forum




* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: estrarre i numeri primi da un array  (Letto 622 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
liuki77
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« inserita:: Marzo 15, 2010, 05:55:11 pm »

Vorrei un parere su questo pogramma in c++.. non sono molto esperta e come scritto nel titolo devo compilare un programma che mi estragga da un array caricato in precedenza tutti i numeri primi e li stampi a video in un altro array. Il programma parte ma non riesco a trovare dove ho sbagliato visto che mi ristampa lo stesso array Triste.. potreste darmi una mano? grazie mille!  Sorriso

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define N 100

int dammi_ele();
carica_array(int[],int);
stampa_array(int[],int);
int primi(int[],int);
stampa (int[],int,int);

main()
{
int ele,vett[N],p;

ele=dammi_ele();
carica_array (vett,ele);
stampa_array(vett, ele);
p=primi(vett,ele);
stampa (vett,p,ele);

getch();
}

int dammi_ele(){int ele; printf ("Quanti elementi? max=%d",N);
scanf ("%d", & ele);return ele;}

carica_array(int ve[],int ele){int i; for (i=0; i<ele;i++) ve[i]=random(10);}

stampa_array(int ve[],int ele)
{for (int i=0; i<ele;i++)
printf("ve[%d]=%d", i, ve[i]);}

int primi(int ve[],int ele)
{int i,j,p;
for (i=0; i<ele;i++)
{for (j=2; j<ve[i];j++)
{if (ve[i]%j==0)(p=1);
else (p=2);
return p; }}

stampa (int ve[],int p,int ele)
{for (i=0;i<ele;i++)
if (p=2) printf("ve[%d]=%d\n",i,ve[i]) ;
}
Registrato
tmm360
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5



Mostra profilo E-mail
« Risposta #1 inserita:: Marzo 15, 2010, 08:01:24 pm »

Ciao, benvenuta nel mondo della programmazione Sorriso . Purtroppo nel programma c'è un po' di casino, ma vediamo di analizzare ogni punto... Partendo con ordine:
come prima cosa lo standard c++ vorrebbe che tu indicassi sempre il tipo di ritorno di una funzione; nel caso in cui non ci sia ritorno si indica con void. Questo vale per le funzioni quanto per il main.
Secondariamente non trovo la funzione random, ma sicuramente l'avrai definita da qualche altra parte. Quello che però non so se sai (dato che non vedo l'inclusione di time.h) è che anche rand di stdlib.h va inizializzato utilizzando srand ed un valore numerico, e di solito si utilizza time(0) preso da time.h. Se non si inizializza, qualsiasi volta che si eseguirà il programma l'ordine dei valori restituito da random (è strano a dirsi...) sarà sempre lo stesso.
Purtroppo nel controllo dei numeri se sono primi o no che fai c'è un sacco di casino. Primo, ogni funzione che è dichiarata come restituente un valore, in ogni suo percorso deve restituire un valore. Ciò non avviene ad esempio della funzione primi. Secondariamente anche la logica è sbagliata. Se tu vuoi restituire una lista di interi, devi restituire una lista, non un singolo solo intero. Questo errore non l'hai trovato forse perchè comunque nel passaggio successivo quando vai a fare stampa invece di fare un confronto di p con 2, ne fai un'assegnazione (la differenza tra = e ==), ed essendo 2 diverso da 0 te la considererà sempre vera, stampandoti tutto l'array.
Questi gli errori se vogliamo "maggiori", ti ho ridato una sistemata al codice in maniera che funzioni, prova a dirmi se capisci e se ci sono ancora eventuali problemi, ciao! Occhiolino

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

#define N 100

int dammi_ele();
int random(int);
void carica_array(int[],int);
void stampa_array(int[],int);
int estraiPrimi(int[], int, int[]);
void stampa (int[],int,int);

void main()
{
    int ele, vett[N], lengthPrimi, primi[N]; // è necessario creare un'ulteriore array di primi se effettivamente ne vuoi visualizzare una lista

srand(time(0)); //inizializzazione delle funzione random()
    
    ele=dammi_ele();
    
    carica_array (vett,ele);
    stampa_array(vett, ele);
    
    getch();

    lengthPrimi = estraiPrimi(vett, ele, primi);
    stampa_array (primi, lengthPrimi);
    
    getch();
}

int dammi_ele()
{
    int ele;
    printf ("Quanti elementi? max=%d",N);
    scanf ("%d", & ele);
    return ele;
}

int random(int maxVal)
{
return rand() % (maxVal + 1); //restituisce un numero intero casuale compreso tra 0 e maxVal compresi
}

void carica_array(int ve[],int ele)
{
    for (int i=0; i<ele;i++)
        ve[i]=random(10);
}

void stampa_array(int ve[],int ele)
{
    for (int i=0; i<ele;i++)
        printf("ve[%d]=%d\n", i, ve[i]);
}

int estraiPrimi(int ve[],int ele, int primi[])
{
    int maxVal = 10, iPrimi = 0;
for(int i = 0; i < ele; i++) //per ogni valore nell'array
{
bool primo = true;
//controllo se è primo
if(ve[i] < 2) //(chiaramente l'algoritmo è migliorabile)
primo = false;
for(int j = 2; j <= ve[i]/2 && primo; j++)
if(ve[i] % j == 0)
primo = false;

//quindi se non è primo non eseguo nulla, mentre se è primo lo aggiungo alla lista dei primi
if(primo)
primi[iPrimi++] = ve[i];
}
return iPrimi;
}
Registrato

Le cose esistono soltanto perchè qualcuno è riuscito ad immaginarle.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #2 inserita:: Marzo 15, 2010, 08:22:48 pm »

...devo compilare un programma che mi estragga da un array caricato in precedenza tutti i numeri primi e li stampi a video in un altro array.

L'implementazione che hai proposto contiene numerosi errori sintattici (incluse alcune parentesi mancanti che rendono l'esempio non compilabile), ma il problema maggiore è l'incompletezza della specifica.

Da quanto scrivi nel tuo sorgente, sembra che i valori disponibili per popolare l'array da esaminare siano solo gli interi compresi tra 0 e 9. Ma se è così, non hai il benché minimo bisogno di scrivere una (contorta) funzione per verificare la primalità dell'elemento esaminato: ti basta una tabella di lookup strutturata come array di booleani (a rigore, un bit array) !!!

I numeri primi inferiori a 10 sono infatti 2, 3, 5, 7.
Codice:
typedef enum {FALSE, TRUE} Boolean;

...
/*                           0      1      2     3     4      5     6      7     8      9   */
static const Boolean Primes[] = {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE};
La funzione IsPrime(int num), utilizzando di volta in volta il valore esaminato come indice (con le dovute cautele, anche se dovrebbe essere sempre corretto per costruzione), non farà altro che restituire il contenuto dell'array sopra delineato.

Naturalmente, anche se la typedef non è contemplata dal programma svolto, è necessario e sufficiente utilizzare nell'array valori nulli per FALSE, e non nulli (sic !) per TRUE. Allo stesso modo, l'uso dell'array (LUT) si prospetta identico anche per altri piccoli intervalli di interi, naturalmente.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
liuki77
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« Risposta #3 inserita:: Marzo 15, 2010, 10:28:38 pm »

Codice:

int random(int maxVal)
{
return rand() % (maxVal + 1); //restituisce un numero intero casuale compreso tra 0 e maxVal compresi
}





int estraiPrimi(int ve[],int ele, int primi[])
{
    int maxVal = 10, iPrimi = 0;
for(int i = 0; i < ele; i++) //per ogni valore nell'array
{
bool primo = true;
//controllo se è primo
if(ve[i] < 2) //(chiaramente l'algoritmo è migliorabile)
primo = false;
for(int j = 2; j <= ve[i]/2 && primo; j++)
if(ve[i] % j == 0)
primo = false;

//quindi se non è primo non eseguo nulla, mentre se è primo lo aggiungo alla lista dei primi
if(primo)
primi[iPrimi++] = ve[i];
}
return iPrimi;
}
[/quote]



grazie mille!! in generale ho capito il funzionamento ma visto che come hai potuto vedere le mie conoscenze sono molto vaghe ahime, potresti dirmi precisamente come funziona la funzione random e l eatto significato di bool? ti ringrazio ancora tantissimo!!:)
Registrato
tmm360
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5



Mostra profilo E-mail
« Risposta #4 inserita:: Marzo 15, 2010, 11:12:46 pm »

Ciao! Random funziona che fa una chiamata a rand(), che è stato precedentemente inizializzato con srand, e restituisce un numero intero compreso tra 0 e 32768. Successivamente con l'operatore % viene fatto il modulo (equivalente al resto nella divisione) di questo valore ottenuto con maxVal + 1. Il risultato sarà ovviamente un valore compreso tra 0 e maxVal compresi.
bool è una cosa semplicissima, deriva direttamente dall'algebra di Bool (per l'appunto) e denota una variabile che può ottenere solamente i valori vero (true) o falso (false).
Tutto qui! Ciao Occhiolino
Registrato

Le cose esistono soltanto perchè qualcuno è riuscito ad immaginarle.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #5 inserita:: Marzo 15, 2010, 11:32:16 pm »

bool è una cosa semplicissima, deriva direttamente dall'algebra di Bool

Ehm... si chiamava Boole, George Boole. Occhi al cielo

Bool è, in genere, abbreviazione dell'aggettivo boolean e individua una variabile logica in grado di assumere unicamente due valori simbolici (tipicamente 0 e 1, Vero e Falso, etc.).
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
tmm360
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5



Mostra profilo E-mail
« Risposta #6 inserita:: Marzo 16, 2010, 12:04:58 am »

Ehm... si chiamava Boole, George Boole. Occhi al cielo

Bool è, in genere, abbreviazione dell'aggettivo boolean e individua una variabile logica in grado di assumere unicamente due valori simbolici (tipicamente 0 e 1, Vero e Falso, etc.).

emh... ops!!

Vabbè... ci siamo capiti dai! Occhiolino
Registrato

Le cose esistono soltanto perchè qualcuno è riuscito ad immaginarle.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #7 inserita:: Marzo 16, 2010, 01:24:14 am »

Vabbè... ci siamo capiti dai! Occhiolino

OT - Sì, o almeno spero: in ogni caso, declino ogni responsabilità se lo spirito di George Boole, sentendosi offeso, verrà a tirarti i piedi nottetempo, mentre Augustus de Morgan ti regge per le spalle (o viceversa, per il famoso teorema) coadiuvati dal buon Gottfried W. Leibnitz che da par suo se la spassa a guardare la scena, nel migliore dei mondi possibili. Blaise Pascal è assente giustificato: troppo intento a rigirarsi nella tomba da quando gli altri gli hanno spiegato che qualcuno ha avuto la pessima idea di associare il suo nome a uno dei peggiori linguaggi di programmazione mai concepiti da mente umana...  Linguaccia

Così intanto, con la scusa dell'OT, abbiamo almeno ripassato chi sono i Padri Nobili della Logica vissuti prima di Frege, Russell, Gödel e gli altri. Ghigno
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
tmm360
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5



Mostra profilo E-mail
« Risposta #8 inserita:: Marzo 16, 2010, 01:56:00 am »

Colpito ed affondato! Ghigno
Essi che avrei anche dovuto evitare di commettere errori visto che era fra gli argomenti di uno degli ultimi esami dati! Linguaccia
Registrato

Le cose esistono soltanto perchè qualcuno è riuscito ad immaginarle.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #9 inserita:: Marzo 16, 2010, 03:08:36 am »

E' ragionevole ritenere che, da ora in avanti, ti ricorderai meglio i nomi di questi giganti del pensiero e la loro opera.  Ghigno

Tornando al topic:
Random funziona che fa una chiamata a rand(), che è stato precedentemente inizializzato con srand, e restituisce un numero intero compreso tra 0 e 32768.

E' forse opportuno spiegare da dove sbuca codesto limite.
Si tratta di RAND_MAX, un valore strettamente dipendente dall'implementazione di rand(), definito nello header stdlib.h: lo standard si limita a garantire che il suo valore minimo sarà pari a 32767, ovvero 0x7FFF cioè il massimo valore positivo per un intero segnato a 16 bit.

Ecco una rapida panoramica delle definizioni presenti nei maggiori compilatori per Windows:

C:\BCC55\include\stdlib.h
/* Maximum value returned by "rand" function
*/
#define RAND_MAX  0x7FFFU

C:\DM\include\stdlib.h
#define RAND_MAX       32767

C:\WATCOM\include\stdlib.h
#define RAND_MAX        32767U

C:\Programmi\Microsoft Visual Studio 9.0\VC\Include\stdlib.h
#define RAND_MAX 0x7fff


Questo implica, tra l'altro, che la funzione rand() così definita non fornirà in alcun caso valori maggior di codesta RAND_MAX, anche se questo non crea problemi nel caso in esame. Peraltro, anche ponendo a margine la questione della LRAND_MAX (tipicamente delle dimensioni di INT_MAX, ossia 231 -1), le magagne del generatore lineare congruenziale universalmente utilizzato nelle implementazioni standard della rand() sono numerose, anche se non è questa la sede adatta per approfondire la questione - gli interessati cerchino ad esempio "George Marsaglia random numbers fall mainly in the planes" sul proprio motore di ricerca preferito.

Di fatto, al di là dei preliminari, la funzione core si riduce a qualcosa come il seguente codice:
Codice:
#define MAXVAL 10
typedef enum {FALSE, TRUE} Boolean;
/*                               0      1      2     3     4      5     6      7     8      9   */
static const Boolean Primes[] = {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE};
...
int estraiPrimi(int ve[], int ele, int primi[])
{
    int NumPrimi = 0;
    int i;

    for(i = 0; i < ele; i++) // per ogni valore nell'array di partenza
    {
        if (Primes[ve[i]]) // se è un numero primo, lo aggiungo all'array di output !
        {
            primi[NumPrimi] = ve[i];
            NumPrimi++;
        }
    }
    return (NumPrimi);
}

Semplicissimo, vero ? Felice
Questo codice contiene ancora delle ridondanze, per renderlo maggiormente leggibile; manca un controllo del limite (normalmente superfluo), e d'altro canto si dà per scontato che tutti i valori immessi siano positivi (ma il tipo int è segnato per default...); inoltre non è strettamente necessario copiare il valore dall'array di partenza a quello di output (a rigore sarebbe sufficiente salvare i valori dell'indice ai quali corrisponde ogni primo), ma ritengo ci si possa accontentare...
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
liuki77
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« Risposta #10 inserita:: Marzo 16, 2010, 04:37:19 pm »

Gazie mille a tutti:) ora è tutto piu chiaro!
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2009 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page