Oppure

Loading
25/05/05 12:26
Nophiq
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[i]=random(100)+1
E' una parte di codice dentro ad un ciclo "for"

Casa mia --> vet[i]=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???
aaa
25/05/05 22:57
Zizzius
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[i], vero? :-|

Quali sarebbero altre anomalie di C?
aaa
26/05/05 12:23
Nophiq
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 26/05/05 12:24
aaa
26/05/05 12:27
pierotofy
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: piero.dev
26/05/05 21:07
Zizzius
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 26/05/05 21:11
aaa
26/05/05 21:13
Zizzius
Mi rendo conto ora che a scrivere vet [ i ] ("vet di indice i";) ho fatto diventare mezzo post in corsivo :asd:
aaa
27/05/05 12:16
Nophiq
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:
aaa
27/05/05 17:51
Zizzius
Sempre a disposizione ;) (quando sono in grado di rispondere)
aaa