Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Procedura per creare array[5] di int diversi

    ciao a tutti,
    mi sto esercitando a scrivere il gioco Mastermind in c++ con interfaccia testuale(roba da primo anno di informatica) e ho una procedura che dà problemi. Ve la riporto:

    Codice PHP:
    void creaNumeri(int numeri[5]){
        
    unsigned seed time(NULL);
        
    srand(seed);
        for(
    int i 0i<5i++){
            
    numeri[i] = rand() % 10;
            for(
    int j=i-1j>=0j--){
                while(
    numeri[i]==numeri[j]) {
                    
    numeri[i]=rand() % 10;
                }
            }
        }

    il problema è che ogni tanto nell'array ci finiscono due cifre uguali(es. 42001)...

    potete aiutarmi a risolvere?

    thanks!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Procedura per creare array[5] di int diversi

    Originariamente inviato da COMANDANTE SPACE
    mi sto esercitando a scrivere il gioco Mastermind in c++ con interfaccia testuale(roba da primo anno di informatica) e ho una procedura che dà problemi. Ve la riporto:

    Codice PHP:
    void creaNumeri(int numeri[5]){
        
    unsigned seed time(NULL);
        
    srand(seed);
        for(
    int i 0i<5i++){
            
    numeri[i] = rand() % 10;
            for(
    int j=i-1j>=0j--){
                while(
    numeri[i]==numeri[j]) {
                    
    numeri[i]=rand() % 10;
                }
            }
        }

    il problema è che ogni tanto nell'array ci finiscono due cifre uguali(es. 42001)...
    Certo, perché la funzione rand non ti garantisce l'unicità della estrazione. Devi realizzare un "vero" sistema di estrazione. In pratica devi avere un "pool" ("pozza", tradotto letteralmente) di numeri da 0 a 9. Quando ne estrai uno, lo devi togliere dal pool in modo da non ripescarlo più.

    Tradotto in codice "C", si può fare così (secondo la mia personale implementazione):
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef struct
    {
        int num[10];
        int size;
    } ESTRAZIONE;
    
    void EstrazioneInit (ESTRAZIONE *e)
    {
        int i;
    
        for (i = 0; i < 10; i++)
            e->num[i] = i;
    
        e->size = 10;
    }
    
    int EstrazioneGet (ESTRAZIONE *e)
    {
        int i, n;
    
        if (e->size == 0)
            return -1;
    
        i = rand () % e->size;
        n = e->num[i];
    
        for (e->size--; i < e->size; i++)
            e->num[i] = e->num[i+1];
    
        return n;
    }
    
    int main (void)
    {
        int i;
        ESTRAZIONE e;
    
        srand ((unsigned int) time (NULL));
    
        EstrazioneInit (&e);
    
        /*---- Estrae 5 numeri da 0 a 9 ----*/
        for (i = 0; i < 5; i++)
            printf ("%d ", EstrazioneGet (&e));
    
        printf ("\n");
    
        return 0;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Re: Procedura per creare array[5] di int diversi

    Originariamente inviato da andbin
    codice:
    for (e->size--; i < e->size; i++)
        e->num[i] = e->num[i+1];
    Come ottimizzazione, si può sostituire il ciclo for con questo codice:
    codice:
    if (--e->size > 0)
        e->num[i] = e->num[e->size];
    In questo modo, invece di spostare fisicamente gli elementi successivi all'indice selezionato, si riempie semplicemente il "buco" con l'ultimo elemento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    innanzitutto grazie della risposta!
    intrigante il codice che hai postato;avrei un paio di domande da novellino da farti:
    1)per fare il tutto in c++ sono indispensabili stdlib.h e time.h (stdio.h lo cambio con iostream.h)?
    2)typedef struct{/*qualcosa*/} NOMEARBITRARIO; è identico al struct NOMEARBITRARIO {/*qualcosa*/}; che sono abituato a usare?
    3)for (e->size--; i < e->size; i++) una roba del genere non l'avevo mai vista...il primo parametro(non si chiama parametro, ma sinceramente non conosco il nome corretto) del for non dovrebbe essere l'elemento da confrontare,cioè i, che è anche quello su cui agisce il terzo parametro? cioè io al posto di e->size-- potrei metterci una cosa qualunque,chessò int boh=2222222;?



    Se non ti dispiace poi, vorrei tornare un attimo al codice che avevo scritto nel primo post(mi stava simpatico, vorrei vederlo funzionare), in pratica serve (almeno nelle intenzioni) a generare un numero casuale, metterlo nell'array(primo ciclo for) e confrontarlo con i numeri che lo precedono(secondo ciclo for nidificato); se esiste già lo cambio finchè non esce un numero diverso(nel while). Però, ora che mi ci hai fatto ragionare su, l'errore logico è che ogni volta che cambio numero nel while dovrei ricontrollarlo da capo con tutti i numeri, mentre io continuo il controllo solo coi numeri che restano, come se niente fosse.....
    variando leggermente il codice, è uscita sta roba qua(ho l'impressione di aver impapocchiato tutto):

    codice:
    void creaNumeroComputer(int computer[5]){
        for(int i = 0; i<5; i++){
            computer[i] = rand() % 10;
            for(int j=i-1; j>=0; j--){
                int k=j;
                while(computer[i]==computer[j]) {
                    computer[i]=rand() % 10;
                    k=i-1;
                }
                j=k;
            }
        }
    }
    solo che addirittura a volte mi salta fuori un numero(array) di 4 cifre invece che 5...

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Scusa ... non ho controllato tutto ... ma se scrivi

    for(int i = 0; i<5; i++){

    intendendo che inizialmente i valga 0 e poi scrivi

    for(int j=i-1; j>=0; j--){

    assumi che j debba valere -1 (ovvero i-1) e non mi sembra ci sia un elemento dell'array con indice -1.

    Ancora peggio quando i varra' 1 ... 2 ...

    Forse e' meglio che rivedi la logica del codice ...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da COMANDANTE SPACE
    1)per fare il tutto in c++ sono indispensabili stdlib.h e time.h (stdio.h lo cambio con iostream.h)?
    Sì. Per l'I/O, scegli quello che vuoi, se sei in C++ puoi usare le classi specifiche per l'I/O (es. cout).

    Originariamente inviato da COMANDANTE SPACE
    2)typedef struct{/*qualcosa*/} NOMEARBITRARIO; è identico al struct NOMEARBITRARIO {/*qualcosa*/}; che sono abituato a usare?
    Sì, con una piccola differenza.
    struct NOME { ... };
    dichiara una struttura di nome NOME. Ogni volta che devi dichiarare una variabile di questa struttura devi mettere:
    struct NOME var_a;
    struct NOME var_b;
    ecc...

    Usando:
    typedef struct { ... } NOME;
    basta poi usare:
    NOME var_a;
    NOME var_b;

    Insomma, il typedef crea un nuovo tipo.

    Originariamente inviato da COMANDANTE SPACE
    3)for (e->size--; i < e->size; i++) una roba del genere non l'avevo mai vista...il primo parametro(non si chiama parametro, ma sinceramente non conosco il nome corretto) del for non dovrebbe essere l'elemento da confrontare,cioè i, che è anche quello su cui agisce il terzo parametro? cioè io al posto di e->size-- potrei metterci una cosa qualunque,chessò int boh=2222222;?
    In generale il for ha questa sintassi:
    codice:
    for (inizializzazione ; condizione ; incremento)
       istruzione/i
    Quello che si mette nelle 3 espressioni ... sono affari del programmatore.
    Potresti anche fare:
    codice:
    for (;;)
        istruzione
    Che equivarrebbe a un ciclo infinito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Originariamente inviato da oregon
    Scusa ... non ho controllato tutto ... ma se scrivi

    for(int i = 0; i<5; i++){

    intendendo che inizialmente i valga 0 e poi scrivi

    for(int j=i-1; j>=0; j--){

    assumi che j debba valere -1 (ovvero i-1) e non mi sembra ci sia un elemento dell'array con indice -1.
    esatto, infatti il primo elemento(ad es. 2 _ _ _ _) non lo devo confrontare con nessun altro elemento(non ce ne sono altri),quindi non entra proprio nel for interno(che controlla una cifra con le precedenti).
    Ancora peggio quando i varra' 1 ... 2 ...
    quando i vale 1(es. 2 5 _ _ _), j sarà uguale solo a 0 nel for, cioè confronto computer[1] con computer[0](es. 2 5 _ _ _).
    quando i vale 2(es. 2 5 3 _ _), j diventa prima 1 (confronto computer[2] con computer[1],es. 2 5 3 _ _) e nel secondo passaggio del for diventa 0(confronto computer[2] con computer[0],es. 2 5 3 _ _ ).
    e avanti così fino a i=4, che confronta computer[4] in sequenza con computer[3], computer[2], computer[1] e computer[0].
    Se ad esempio computer[3](i=3 e j=2) risulta uguale a computer[1], assegno un altro valore a computer[3] e riporto j (che nel frattempo era sceso a 1) a 2, facendo in questo modo ricominciare il for nidificato che ricontrolla da capo se il nuovo computer[3] è diverso dai precedenti.
    Questo almeno è quello che speravo di ottenere; in realtà capita ancora che ci siano due cifre uguali ed anzi capita addirittura che la procedura dia 4 cifre invece che 5.....

    Sì, con una piccola differenza.
    struct NOME { ... };
    dichiara una struttura di nome NOME. Ogni volta che devi dichiarare una variabile di questa struttura devi mettere:
    struct NOME var_a;
    struct NOME var_b;
    ecc...

    Usando:
    typedef struct { ... } NOME;
    basta poi usare:
    NOME var_a;
    NOME var_b;

    Insomma, il typedef crea un nuovo tipo.
    ma questa differenza vale anche per il c++? non ho mai usato typedef eppure mi è sempre andata bene con un codice tipo:
    codice:
    struct tipoDiDato{};
    tipoDiDato variabile;

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da COMANDANTE SPACE
    esatto, infatti il primo elemento(ad es. 2 _ _ _ _) non lo devo confrontare con nessun altro elemento(non ce ne sono altri),quindi non entra proprio nel for interno(che controlla una cifra con le precedenti).
    Ma cosa te lo fa pensare?

    Perche' non dovrebbe entrare nel ciclo piu' interno se i e' uguale a 0 ?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da COMANDANTE SPACE
    ma questa differenza vale anche per il c++? non ho mai usato typedef eppure mi è sempre andata bene con un codice tipo:
    codice:
    struct tipoDiDato{};
    tipoDiDato variabile;
    Il typedef crea semplicemente un nuovo tipo di dato (e questo vale sia in C che C++).

    Se fai typedef struct { ... } NOME; non devi più "portarti dietro" la parola struct nelle dichiarazioni delle variabili.

    EDIT
    In C++ la parola struct nella dichiarazione delle variabili, è ridondante. In C++ la definizione di una struttura crea già un nuovo tipo di dato (non è così in C).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da COMANDANTE SPACE
    ma questa differenza vale anche per il c++? non ho mai usato typedef eppure mi è sempre andata bene con un codice tipo:
    codice:
    struct tipoDiDato{};
    tipoDiDato variabile;
    No. Il C e il C++ si differenziano in questo.

    In C si deve esplicitamente usare la keyword struct, in C++ non e' necessario.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.