liuki77
Newbie
Karma: +0/-0
Scollegato
Messaggi: 3
|
 |
« 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  .. potreste darmi una mano? grazie mille!  #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
Messaggi: 5
|
 |
« Risposta #1 inserita:: Marzo 15, 2010, 08:01:24 pm » |
|
Ciao, benvenuta nel mondo della programmazione  . 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!  #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
Messaggi: 2115
Discrete And Combinatorial Mathematics
|
 |
« 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. 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
Messaggi: 3
|
 |
« Risposta #3 inserita:: Marzo 15, 2010, 10:28:38 pm » |
|
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
Messaggi: 5
|
 |
« 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 
|
|
|
|
|
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
Messaggi: 2115
Discrete And Combinatorial Mathematics
|
 |
« 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.  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
Messaggi: 5
|
 |
« Risposta #6 inserita:: Marzo 16, 2010, 12:04:58 am » |
|
Ehm... si chiamava Boole, George Boole.  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! 
|
|
|
|
|
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
Messaggi: 2115
Discrete And Combinatorial Mathematics
|
 |
« Risposta #7 inserita:: Marzo 16, 2010, 01:24:14 am » |
|
Vabbè... ci siamo capiti dai!  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...  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. 
|
|
|
|
|
Registrato
|
I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.Un blog? Io?
|
|
|
tmm360
Newbie
Karma: +0/-0
Scollegato
Messaggi: 5
|
 |
« Risposta #8 inserita:: Marzo 16, 2010, 01:56:00 am » |
|
Colpito ed affondato!  Essi che avrei anche dovuto evitare di commettere errori visto che era fra gli argomenti di uno degli ultimi esami dati! 
|
|
|
|
|
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
Messaggi: 2115
Discrete And Combinatorial Mathematics
|
 |
« 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.  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 2 31 -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: #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 ?  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
Messaggi: 3
|
 |
« Risposta #10 inserita:: Marzo 16, 2010, 04:37:19 pm » |
|
Gazie mille a tutti:) ora è tutto piu chiaro!
|
|
|
|
|
Registrato
|
|
|
|
|