Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Differenze nel codice
Forum - C/C++ - Differenze nel codice

Avatar
Nophiq (Founder Member)
Expert


Messaggi: 537
Iscritto: 15/11/2004

Segnala al moderatore
Postato alle 14:26
Mercoledì, 25/05/2005
Potete spiegarmi come mai un programma scritto in C sul computer a scuola non funziona sul mio??? Devo correggerlo il codice per adattarlo per il mio PC. Per esempio:

Scuola --> vet=random(100)+1
E' una parte di codice dentro ad un ciclo "for"

Casa mia --> vet=rand()%1000;

E questo ? solo uno dei casi che mi capita per lavorare a casa col C. Potete dirmi come si fa a risolvere questo problema???

PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 0:57
Giovedì, 26/05/2005
rand() ? la funzione per generare numeri casuali. random(x) ? una macro di "stdlib.h", cio? come un #DEFINE, che all'occorrenza di random(x) sostituisce la funzione rand().
Probabilmente, a casa ti sei dimenticato la direttiva al preprocessore #INCLUDE<stdlib.h>

In tutti i casi, io personalmente ti suggerisco di usare la funzione nuda e cruda rand() ;)

P.S.: per vet intendevi vet, vero? :-|

Quali sarebbero altre anomalie di C?

PM Quote
Avatar
Nophiq (Founder Member)
Expert


Messaggi: 537
Iscritto: 15/11/2004

Segnala al moderatore
Postato alle 14:23
Giovedì, 26/05/2005
Testo quotato

Postato originariamente da Zizzius:

Probabilmente, a casa ti sei dimenticato la direttiva al preprocessore INCLUDE<stdlib.h>



No Zizzius, l'avevo messa la libreria <stdlib.h> la funzione rand() veniva accettata, ma random() no! Preferirei usare random() perch? come argomenti posso mettergli da quale numero partire e quale finire per generare numeri causali.

Con vet[x]=random(100)+1; i numeri venivano generati casualmente da 1 a 100; con vet[x]=rand()%100; i numeri che si generano dovrebbero essere da 0 a 100, ma il fatto sta che i numeri che genera sono sempre quelli, non me li cambia... ovvero in vet[0] mette sempre 5 (per esempio) e cos? via per tutte le altre posizioni.

Forse se riesci a dirmi come faccio ad utilizzare la funzione random() correttamente ? meglio...

PS: nel computer della scuola per attivare la funzione random(); ho dovuto utilizzare randomize() (ho provato anche randomizer() ma ho lo stesso risultato), il computer che ho non me lo accetta...

Ultima modifica effettuata da Nophiq il 26/05/2005 alle 14:24
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 14:27
Giovedì, 26/05/2005
Intanto non ? il computer, ma il compilatore.

E' evidente che hai due versioni diverse del compilatore (oppure qualche libreria diversa). Le differenze da un compilatore all'altro non sono eccessive, ma tuttavia ognuno ha le sue caratteristiche specifiche.

Il numero ? sempre lo stesso perch? devi richiamare una funzione che resetti il seme per la generazione dei numeri casuali (che altrimenti resta sempre lo stesso, generandoti numeri sempre uguali). Guarda tra la documentazione del compilatore per trovare la funzione da chiamare.

Il C++ ? fatto cos?, abituatici (senn? resta a Java, l? non hai problemi di compatibilit? :asd: ).


Il mio blog: https://piero.dev
PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 23:07
Giovedì, 26/05/2005
Innanzitutto, bisogna precisare che non tutti i compilatori seguono gli standard dettati dall?ANSI C (come avrai intuito, un protocollo per gli standard di C). Io personalmente non so se la macro random sia stata inclusa dall?ANSI C, o viceversa se i compilatori dei computer a scuola siano conformi all?ANSI C.

Certamente, la funzione rand causa meno problemi di portabilit?.
Per generare un numero casuale da 1 a 100 con rand devi scrivere:
vet = (rand() % 100) + 1;
in questo modo viene generato un numero casuale da 0 a RAND_MAX (una costante, che secondo l?ANSI C deve essere maggiore o uguale di 32767); il simbolo % rappresenta l?operatore modulo, che fornisce il resto della divisione tra il valore di ritorno di rand e il fattore di scala (in questo caso, 100). Dunque, il risultato sar? compreso tra 0 e 99, e addizionato di 1 per ottenere un numero casuale compreso tra 1 e 100.
Ma non ? finita: prima di richiamare la funzione rand, ? opportuno richiamare la funzione di randomizzazione srand (dichiarata in stdlib.h), che accetta come argomento un seme (del tipo unsigned int), che ?insemina? la funzione rand, in modo da indurla a generare una diversa sequenza di numeri casuali ad ogni esecuzione del programma, a patto che sia fornito ogni volta un seme diverso.
Come ovviare per? a questo ultimo inconveniente?
Puoi fornire come argomento a srand l?orario in quell?istante, letto dall?orologio interno del computer da parte della funzione time, dichiarata in time.h.
Dunque, il frammento del programma di cui ci stiamo occupando sar? il seguente:
#include <stdlib.h>
#include <time.h>
?
srand(time(NULL));
vet = (rand() % 100) + 1;
?

Se il tutto ti sembra piuttosto macchinoso, puoi dichiarare tu stesso la macro random:
#define random(x) rand() % x
e fare lo stesso con la funzione di randomizzazione:
#define randomize srand((unsigned)time(NULL))
E in questo modo, nel programma potrai scrivere semplicemente
?
randomize;
vet = random(100) + 1;
?

CONLUDENDO, e rispondendo (spero) ai tuoi dubbi, posso dire che:
1. se rand genera sempre lo stesso numero, allora ti sei dimenticato di richiamare srand;
2. random pu? rendere il programma meno portabile;
3. in tal caso, e se ti trovi bene con random e randomize (che ricordano lo stile ?colloquiale? del Pascal), puoi benissimo dichiarare tu stesso le macro;
4. randomizer non esiste (perlomeno, non negli standard dell?ANSI C).

Spero di essere stato chiaro. Se ti potesse essere utile, nella sezione programmi ? C/C++ ho inserito un programma che utilizza queste funzioni.
Ciao. :k:


Ultima modifica effettuata da Zizzius il 26/05/2005 alle 23:11
PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 23:13
Giovedì, 26/05/2005
Mi rendo conto ora che a scrivere vet [ i ] ("vet di indice i") ho fatto diventare mezzo post in corsivo :asd:

PM Quote
Avatar
Nophiq (Founder Member)
Expert


Messaggi: 537
Iscritto: 15/11/2004

Segnala al moderatore
Postato alle 14:16
Venerdì, 27/05/2005
Perfetto Zizzius ha risolto pienamente i tuoi dubbi e adesso riesco a confrontare il listato fatto a scuola con quello che devo creare a casa.

Siamo a posto... :k:

PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 19:51
Venerdì, 27/05/2005
Sempre a disposizione ;) (quando sono in grado di rispondere)

PM Quote