PDA

Visualizza versione completa : SuperEnalotto in C++


Downloader
02-08-2004, 19.58.50
Stamattina mi sono messo a fare un programmino, cosi tanto per divertirmi sul superenalotto, penso di aver scritto un buon codice ma non so perchè qualche volta 2 numeri di ripetono sempre.



#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

void main()
{
int num[6]= {0,0,0,0,0,0};
int i,f,a=0,k;


do { // Inizio ciclo per rieseguire il programma

randomize();

clrscr();


for (i=0;i<7;i++)
{
num[i]=random(89)+1;

do { a=0;

for (f=0;f<7;f++)
{
if (num[i]==num[f])
{
num[i]=random(89)+1;
a++;
}
}

} while (a>=2);
}

for (i=0;i<7;i++)
{
if (i==6)
cout<<"Il numero jolly Š: "<<num[6];

else
cout<<"Il "<<i+1<<"ø numero estratto Š: "<<num[i]<<endl;
}


cout<<endl;
cout<<"Vuoi rieseguire il programma? (si=1 - no=2)";
cin>>k;

} while(k==1); // Fine ciclo per rieseguire il programma
getch();
}

P8257 WebMaster
03-08-2004, 08.55.43
Hai provato a spostare la chiamata di 'randomize()' dentro al primo for .... ?

Bye :cool:

Downloader
03-08-2004, 10.13.35
Si, ma è addrittura peggio.

Dav82
03-08-2004, 10.24.25
Prova a dare un'occhiata qui (http://www.wintricks.it/forum/showthread.php?s=&threadid=69699&perpage=10&pagenumber=32)

Anch'io come il Web mi ricordavo la buona randomize() :confused:

Downloader
03-08-2004, 10.36.48
Dav come vedi mi ci sono rimesso un po' sul c.

Ho risolto il problema, non sapevo proprio come risolvere perchè non avevo mai visto un'istruzione simile.

Tnx! ;)

Downloader
03-08-2004, 14.28.24
Noooooooooooo :(

Ho cantato vittoria troppo presto.

Ho messo l'istruzione " srand((unsigned)time( NULL )); " prima della for ma il risultato è lo stesso.

LoryOne
03-08-2004, 15.37.42
Guarda che può tranquillamente capitare.
Non è detto che i numeri debbano necessariamente essere tutti diversi tra loro. A volte capita ed a volte no.

Questo piccolo programmino


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

main(void){
srand(time(NULL));
for(short int i = 0; i < 10; i++ )
printf( "Numero casuale #%i: %i\n", i, rand()%90+1);
getch();
}


genera 10 numeri presi a casaccio da 1 a 90.
A volte sono tutti diversi, a volte ci possono essere due numeri ripetuti ed a volte persino adiacenti.

Se hai necessità di tirare fuori x numeri casuali tutti diversi tra loro devi effettuare un controllo dei doppioni.

Downloader
03-08-2004, 15.42.22
Io ci ho provato a fare il controllo in questo modo:


for (i=0;i<7;i++)
{
num[i]=random(89)+1;

do { a=0;

for (f=0;f<7;f++)
{
if (num[i]==num[f])
{
num[i]=random(89)+1;
a++;
}
}

} while (a>=2);
}

E a me sembra fatto bene, ma non funge.

In pratica (azzerati prima tutti i valori dell'array) ogni volta che viene creato un valore viene subito controllato.

Alhazred
03-08-2004, 16.56.00
In C lo aveva già fatto NS-1 qui (http://www.wintricks.it/forum/showthread.php?s=&postid=679490#post679490).

LoryOne
03-08-2004, 17.14.37
Se non sono del tutto fuso a quest'ora (ma poco ci manca), così dovrebbe andare:


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

short int IsDouble(short int *,short int);

short int IsDouble(short int *num,short int idx){
short int i,d=1;

for(i=0;i<idx;i++){
if(num[i]==num[idx]){
d=0;
break;
}
}
return d;
}

main(void){
short int c[6],i,k,d;
srand(time(NULL));
for(i = 0; i < sizeof(c)/sizeof(short int); i++ ){
do{
c[i]=rand()%90+1;
}while(IsDouble(c,i)==0);
printf( "Numero casuale #%i: %i\n", i+1,c[i] );
}
getch();
}

Downloader
03-08-2004, 19.38.52
No, non lo avrei mai poutto fare, questo codice che stai usando non lo conosco, ma appena a scuola gli faccio due maroni cosi al prof :p

LoryOne
03-08-2004, 21.35.45
Scusa non sapevo fosse un esercizio di informatica alle superiori.
Lascia stare i maroni del prof :D a meno che tu poi sappia spiegargli cosa hai scritto.

In sostanza, il controllo dei doppioni lo devi fare su tutti i valori precedenti l'ultimo.

Io ho usato una funzione ma tu ne puoi fare a meno.
In pratica se il valore è già presente, pone a 0 la variabile d ed esce dal ciclo in modo prematuro.
Questa è una bella comodità ma sapendo programmare bisognerebbe sempre farne a meno dei break.

Downloader
04-08-2004, 10.41.04
Infatti non mi è stato dato come compito, l'ho fatto io cosi.

:)

P8257 WebMaster
04-08-2004, 11.21.04
LoryOne ha scritto:
bisognerebbe sempre farne a meno dei break.

IMHO, se per il "goto" c'é la legge del taglione, per il "break" usato male può partire dal mignolo della mano o del piede, fino al medio compreso .. :D

Bye :cool:

Dav82
04-08-2004, 11.51.38
Originariamente inviato da P8257 WebMaster
IMHO, se per il "goto" c'é la legge del taglione,

Intendi tutta la mano o... proprio il "taglione"? :D

P8257 WebMaster
04-08-2004, 11.54.55
Dav82 ha scritto:


Intendi tutta la mano o... proprio il "taglione"? :D

Ah no guarda .. per il "goto" c'é proprio il taglione ... :D

Bye :cool: