Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-05-2009, 12:25   #1
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
Problema algoritmo per combinazioni poker

Ciao a tutti.
Probabilmente sarà un problema non difficile da risolvere ma mi sta mettendo in crisi e mi sta bloccando il progetto in C.

Dopo aver servito le 5 carte al giocatore ,le quali ognuna è una struttura con i campi valore e seme di tipo puntatore a array di caratteri,non riesco a trovare le varie combinazioni del gioco del poker. Avevo pensato ad una funzione che prende un array di Carte e due indici che scorrono l'array e trovano le occorrenze. Dopo aver risolto il problema che il confronto tra le carte non doveva avvenire nel caso i due indici fossero uguali, mi sono bloccato sul fatto che vengono controllate più volte le carte con le combinazioni.

l'array a[1 2 5 10 2]

conterà che 2 c'è 2 volte invece di una sola

mentre a[1 2 4 2 2]

conterà che il 2 c'è 6 volte!

avevo pensato di mettere su un array di interi la posizione delle carte già contate, ma si complica l'algoritmo con cicli annidati ripetutamente.

vi ringrazio per la risposta in anticipo.
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2009, 12:54   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da grollagrolla123 Guarda i messaggi
Ciao a tutti.
Probabilmente sarà un problema non difficile da risolvere ma mi sta mettendo in crisi e mi sta bloccando il progetto in C.

Dopo aver servito le 5 carte al giocatore ,le quali ognuna è una struttura con i campi valore e seme di tipo puntatore a array di caratteri,non riesco a trovare le varie combinazioni del gioco del poker. Avevo pensato ad una funzione che prende un array di Carte e due indici che scorrono l'array e trovano le occorrenze. Dopo aver risolto il problema che il confronto tra le carte non doveva avvenire nel caso i due indici fossero uguali, mi sono bloccato sul fatto che vengono controllate più volte le carte con le combinazioni.

l'array a[1 2 5 10 2]

conterà che 2 c'è 2 volte invece di una sola

mentre a[1 2 4 2 2]

conterà che il 2 c'è 6 volte!

avevo pensato di mettere su un array di interi la posizione delle carte già contate, ma si complica l'algoritmo con cicli annidati ripetutamente.

vi ringrazio per la risposta in anticipo.
Io non passerei dal constrollo delle combinazioni ma
Prednerei l'array delle carte e lo ordinerei secondo il valore
Passeri questo nuovo array ai filtri.
1. C'e' almeno una coppia?
2. C'e' almeno una doppia coppia?
3. C'e' almeno un tris?
4. C'e' almeno una scala?
5. C'e' almeno un full? (Ovvero c'e' almeno un tris e almeno una doppia coppia?)
6. C'e' almeno un colore?
Etc.

Partendo dal presupposto che l'array e' ordinato, tali risposte sono abbastanza semplici.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2009, 13:40   #3
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
Giusta deduzione
L'unica cosa che il valore delle carte non è intero ma bensì è di tipo stringa.

struct carta{
char* seme;
char* valore;
};

Ordinarli per valore è molto più complesso trattandosi di carattari.
Anche aggiungendo un campo intero alla struttura si pottrebbe ordinarli per valore, ma non sono sicuro che sia la strada più giusta.
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2009, 13:47   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da grollagrolla123 Guarda i messaggi
Giusta deduzione
L'unica cosa che il valore delle carte non è intero ma bensì è di tipo stringa.

struct carta{
char* seme;
char* valore;
};

Ordinarli per valore è molto più complesso trattandosi di carattari.
Anche aggiungendo un campo intero alla struttura si pottrebbe ordinarli per valore, ma non sono sicuro che sia la strada più giusta.
Ma puoi anche ordinarli per stringa, la complessita' delle funzioni di cui sopra non dovrebbe cambiare piu' di tanto.
Oppure puoi ordinarli per una funzione custom, che appunto convertira' il valore in intero e assegnera' 11,12,13,14 per fante, donna, re e asso, da usarsi solo per l'ordinamento e subito dimenticato dopo.
Aggiungere il valore alla struttura confermo che non e' cosa buona, meglio avere una funzione con qualche switch-case.

Al limite puoi tenerti una lookup di conversione da valore-->Numero. Una hashtable sarebbe meglio, anche se so gia' che in C e' un 3/4 di suicidio.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 15:57   #5
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
Grazie del suggerimento è stato molto utile.La funzione custom l'ho così implementata.
void custom (Card* w_mano){
char * astring[15]={"zero","uno","due","tre","quattro","cinque","sei","sette","otto","nove","dieci","jack","regina","re","asso"};
int a[15]={0};
int i=0;
int j=0;
int c=0;
printf("funzione custom\n");
for(;i<5;i++) for(j=0;j<=15;j++) if(w_mano[i].valore==astring[j]) a[j]+=1;

for(j=2;j<15;j++)printf("%s==%d\n",astring[j],a[j]);
printf("\n");
for(j=2;j<15;j++){
switch(a[j]){
case 2: printf("coppia di %s\n\n",astring[j]);c+=2;break;
case 3: printf("tris di %s\n\n",astring[j]);c+=3;break;
case 4: printf("poker di %s\n\n",astring[j]);break;

}
}
if(c==4)printf("doppia coppia\n");
if(c==5)printf("full\n");
}
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 16:01   #6
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da grollagrolla123 Guarda i messaggi
Grazie del suggerimento è stato molto utile.La funzione custom l'ho così implementata.
void custom (Card* w_mano){
char * astring[15]={"zero","uno","due","tre","quattro","cinque","sei","sette","otto","nove","dieci","jack","regina","re","asso"};
int a[15]={0};
int i=0;
int j=0;
int c=0;
printf("funzione custom\n");
for(;i<5;i++) for(j=0;j<=15;j++) if(w_mano[i].valore==astring[j]) a[j]+=1;

for(j=2;j<15;j++)printf("%s==%d\n",astring[j],a[j]);
printf("\n");
for(j=2;j<15;j++){
switch(a[j]){
case 2: printf("coppia di %s\n\n",astring[j]);c+=2;break;
case 3: printf("tris di %s\n\n",astring[j]);c+=3;break;
case 4: printf("poker di %s\n\n",astring[j]);break;

}
}
if(c==4)printf("doppia coppia\n");
if(c==5)printf("full\n");
}
Ma in C per comparare stringhe non occorre usare strcmp (o simili)?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 16:07   #7
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
strcmp serve a confrontare la lunghezza della stringa con un'altra,restituisce un intero positivo se la prima è più lunga,zero se sono lunghe uguali e negativo se è più lunga la seconda
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 16:34   #8
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Guarda che ha ragione gugoXX.

E' corretto cio' che hai detto tu, ma riguarda SOLO il valore di ritorno... strcmp compara, carattere per carattere le stringhe e restuituisce 0 in caso di ugiaglianza (e ovviamente lunghezza)... etc.

Con l'operatore "==" su i char *, controlli se sono uguali gli "indirizzi" in cui le stringhe sono allocate.

Se vuoi usare l'operatore "==" devi usare la classe string della STL.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 17:02   #9
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
come è possibile che a me ora funziona perfettamente??

if(w_mano[i].valore==astring[j]) a[j]+=1;

se fosse come dici tu gli elementi dell'array int a[] non verrebero mai incrementati perchè gl'indirizzi di memoria dove è allocato l'array di strutture non concide con l'array di puntatori a carattere char* astring[].

poi il compilatore sentenzia...
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 17:14   #10
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Sicuro?

Prova ad azzerare correttamente gli elementi di a[]

Con una dichiarazione del tipo:
int a[15]={0};

Azzeri solo a[0]... e gli altri elemti hanno valori aleatori... insomma cio' che capita

Se vuoi azzerare TUTTI gli elementi di a[]... devi usare una dichiarazione del tipo:
int a[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

... o un ciclo di for
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 17:32   #11
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
senti vedi Deitel & Deitel capitolo 6.
se uno inizializza un vettore con {0} assegnerà 0 al primo elemento ma in fase di compilazione AUTOMATICAMENTE assegnerà 0 a ogni elemento non inizializato
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 17:44   #12
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
opppsss... su questo hai ragione... e' vero... basta anche solo l'inizializzazione di un SOLO elemento...

Pensavo fosse una feature del C++, ma e' vero anche per il C.

In ogni caso... gia' che ci sei controlla anche strcmp.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 17:45   #13
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
if(w_mano[i].valore==astring[j]) a[j]+=1;

se fosse come dici tu gli elementi dell'array int a[] non verrebero mai incrementati perchè gl'indirizzi di memoria dove è allocato l'array di strutture non concide con l'array di puntatori a carattere char* astring[].
Probabilmente e' il compilatore che ottimizza salvando due stringhe uguali nella stessa posizione (tanto sono costanti).
E' comunque sbagliato usarlo in questo modo.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 18:03   #14
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
assolutamente no.



w_mano[2].valore="due";
astring[2]="due";

printf("w_mano[2].valore==%p astring[2]==%p\n",&w_mano[2].valore,&astring[2]);

l'indirizzo è assolutamente diverso.
uso dev-c++ 4.9.9.2
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 18:05   #15
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Codice:
#include <stdlib.h>

int main()
{
    int i;
    char *string = malloc(5 * sizeof(char));
    char *string2 = malloc(5 * sizeof(char));

    for (i = 0; i < 4; ++i)
    {
        string[i] = 'a';
        string2[i] = 'a';
    }

    string[4] = '\0', string2[4] = '\0';

    printf("%d\n", string == string2);
    free(string), free(string2);
    return 0;
}
Output: 0
Ah, e strcmp ritorna 0 (significa che il contenuto delle stringhe è uguale).

L'operatore == controlla soltanto l'indirizzo. Fine.

Ultima modifica di ||ElChE||88 : 08-05-2009 alle 18:18.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 18:27   #16
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
char* string="prova";
char* string2="prova";

printf("%d\n", string == string2); output 0

if(string==string2) printf("fa l' IF\n"); output fa l' IF

controlla pure te.
spiegami perchè con l' IF funziona e con la printf() no
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 18:31   #17
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da grollagrolla123 Guarda i messaggi
controlla pure te.
spiegami perchè con l' IF funziona e con la printf() no
Controllato. L'output è 1 (stesso indirizzo).

Edit: ah, comunque è impossibile che la stessa comparazione ritorni risultati diversi.

Ultima modifica di ||ElChE||88 : 08-05-2009 alle 18:36.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 18:51   #18
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
int main(){
char* s1="stringa1";
char* s2="srrddddinga1";
printf("%d\n",*s1==*s2);
printf("*********\n %d\n %p %p\n",s1==s2,&s1,&s2);

system("pause");
}

guarda l'output.
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 19:02   #19
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da grollagrolla123 Guarda i messaggi
int main(){
char* s1="stringa1";
char* s2="srrddddinga1";
printf("%d\n",*s1==*s2);
printf("*********\n %d\n %p %p\n",s1==s2,&s1,&s2);

system("pause");
}

guarda l'output.
1 (compari il primo carattere della prima stringa con il primo carattere della seconda stringa)
0 (compari gli indirizzi)

Che cosa c'è di strano?

Ultima modifica di ||ElChE||88 : 08-05-2009 alle 19:04.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 19:11   #20
grollagrolla123
Bannato
 
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
1 (compari il primo carattere della prima stringa con il primo carattere della seconda stringa)
0 (compari gli indirizzi)

Che cosa c'è di strano?
char s1[]="stringa1";
char s2[]="stringa1";

printf("%d\n",s1==s2);

l'output sarà 0

mentre con
char *s1="stringa1";
char *s2="stringa1";

printf("%d\n",s1==s2);

l'output sarà 1

non capisco perchè
grollagrolla123 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Space Pioneer starebbe realizzando un pr...
SpaceX ritirerà ''a breve'' il Fa...
La Luna ha un nuovo cratere di grandi di...
ROG Cronox: ASUS alza l'asticella dei ca...
Lenovo annuncia nuovi sistemi per la vir...
M6 e M5 Ultra, i primi benchmark conferm...
La nuova falla della cybersecurity &egra...
The Blood of Dawnwalker, il sequel potre...
Colpiti i data center Amazon: irrecupera...
Google Wallet, nuova interfaccia in arri...
iPhone Duo, problemi di produzione per i...
Firefox diventa più veloce con PDF e JPE...
WhatsApp, arriva su iOS la nuova scorcia...
Snap presenta Specs: realtà aumentata, c...
SteamOS verso un cambiamento epocale: ar...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:01.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v