[c] Puntatori, funzioni, mescolare carte

di il
7 risposte

[c] Puntatori, funzioni, mescolare carte

Sera,
sto lavorando su un esercizio proposto su un testo (Deitel) di cui si è già parlato sul sito e da cui ho già attinto.
L'esercizio riguarda un mazzo di carte ed è strutturato così: c'è un programma base (che basta ricopiare) e l'esercizio consiste nel modificarlo.
Il programma di base è composto dal main e due funzioni: la prima funzione mescola le carte, la seconda le distribuisce.

L'esercizio richiede di distribuire solo 5 carte e di realizzare una serie di funzioni la prima delle quali deve individuare un eventuale coppia.
Ho modificato il programma che adesso distribuisce 5 carte. Ho trovato un sistema per individuare una coppia ma NON ho realizzato una terza funzione, come da richiesta, ma ho solo modificato la seconda funzione.

Come creo una terza funzione partendo da ciò che ho creato?

Questo tutto il programma:
//Programma per mescolare e distribuire delle carte da gioco
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SUITS 4					//il numero di semi
#define FACES 13				//il numero di facce
#define CARDS 5 				// il numero di carte che voglio che distribuisca


void shuffle(int wDeck[][FACES]);							// prototipo per mescolare le carte
void deal(const int wDeck[][FACES], const char *wFace[], const char *wSuits[]);		// prototipo per distribuire le carte (5 in questo caso)
//void couple(const char *hFace[]);										// prototipo per valutare la mano

int main() {
int i;
	int deck[SUITS][FACES] = {0};							// inizializzo il vettore bidimensionale di 52 elementi a 0, ogni elemento verrà poi modificato in shuffle per definire in che ordine vadano distribuite
		
	const char *suit[SUITS] = {"Cuori", "Quadri", "Fiori", "Picche"};						//dichiaro e inizializzo i vettori dei semi
				
	const char *face[FACES] = {"Asso", "Due", "Tre", "Quattro", "Cinque", "Sei",			//vettori di puntatori rispettivamente di 5 e 13 elementi
							   "Sette", "Otto", "Nove", "Dieci", "Jack", "Regina", "Re"};
	

	srand(time(NULL));										// seme casuale
	
	shuffle(deck);											// passo il mazzo inizializzato a 0 alla funzione shuffle
	deal(deck, face, suit);									//passo il mazzo mescolato e i due vettori appena inizializzati alla funzione che distribuisce le carte

	
	return 0;
}



void shuffle(int wDeck[][13]){
	
	int card;						// questo contatore serve a definire l'ordinamento delle carte
	int row;						//inizializzo le righe 
	int column;						//inizializzo le colonne
		
	for(card=1; card<=52; card++){	

		
		do{
			row = rand()%SUITS;					//assegno un valore casuale alle righe
			column = rand()%FACES;				//assegno un valore casuale alle colonne
		} while(wDeck[row][column] != 0);		//mi assicuro che quel particolare elemento del mazzo non sia già stato modificato 
		
		wDeck[row][column] = card;				//associo a quell'elemento il numero di carta che determina quando dovrà essere pescato

	}	
}


void deal(const int wDeck[][13], const char *wFace[], const char *wSuit[]){
	
	int card;							
	int row;
	int column;
	int i, j;
	char *appoggioFace[6] = {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
	
	for(card=1; card<=5; card++){		
			for(row=0; row<=3; row++){									
				for(column=0; column<=12; column++){						
					if (wDeck[row][column]==card){ appoggioFace[card]=wFace[column];  printf("%5s of %-8s%c", wFace[column], wSuit[row], card%2 ==0 ?'\n' : '\t');  /*printf("%5s", appoggioFace[card]); */
					}
				}
			}
		}
		for(i=1; i<=5;i++)
		for(j=i+1; j<=5; j++)
		if(appoggioFace[i]==appoggioFace[j]) printf("\n\nTrovato");
	}

Queste le parti della seconda funzione create (o modificate) da me che invece dovrebbero formare una terza funzione:
char *appoggioFace[6] = {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
if (wDeck[row][column]==card){ appoggioFace[card]=wFace[column];  printf("%5s of %-8s%c", wFace[column], wSuit[row], card%2 ==0 ?'\n' : '\t');
		for(i=1; i<=5;i++)
		for(j=i+1; j<=5; j++)
		if(appoggioFace[i]==appoggioFace[j]) printf("\n\nTrovato");
Grazie

7 Risposte

  • Re: [c] Puntatori, funzioni, mescolare carte

    Dimenticavo di dire che so che esiste un prototipo, un'invocazione e la funzione vera e propria con il suo blocco di istruzioni, ma non capisco come passare le carte estratte dalla seconda funzione alla terza.
  • Re: [c] Puntatori, funzioni, mescolare carte

    Non si capisce molto.

    Perché parli di seconda o terza funzione che crea confusione?

    Dicci i nomi delle funzioni e i nomi dei dati che vuoi passare. Scrivi quello che hai tentato di fare e gli errori ottenuti.
  • Re: [c] Puntatori, funzioni, mescolare carte

    Guarda che hai sbagliato a copiare dal libro. deck è più comodo che sia array monodimensionale (se non lo vuoi fare di struct fallo di int , poi usi / e % ogni volta per capire che carta sia), deck non l'hai inizializzato e lo shuffle non si fa in quel modo: a parte che non funziona, c'è un modo semplice semplice di mescolare senza affidarsi a dei while sull'esito.

    Comincia a copiare giusto altrimenti è inutile
  • Re: [c] Puntatori, funzioni, mescolare carte

    Ho riprovato il tutto.
    Ecco il nuovo codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define SUITS 4					//il numero di semi
    #define FACES 13				//il numero di facce
    #define CARDS 5 				// il numero di carte che voglio che distribuisca
    
    
    
    void shuffle(int wDeck[][FACES]);							// prototipo per mescolare le carte
    char* deal(const int wDeck[][FACES], const char *wFace[], const char *wSuits[]);		// prototipo per distribuire le carte (5 in questo caso)
    void couple(const char* appoggioFace[6], const char *wFace[]);										// prototipo per valutare la mano
    
    int main() {
    int i;
    	int deck[SUITS][FACES] = {0};							// inizializzo il vettore bidimensionale di 52 elementi a 0, ogni elemento verrà poi modificato in shuffle per definire in che ordine vadano distribuite
    		
    	const char *suit[SUITS] = {"Cuori", "Quadri", "Fiori", "Picche"};						//dichiaro e inizializzo i vettori dei semi
    				
    	const char *face[FACES] = {"Asso", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove", "Dieci", "Jack", "Regina", "Re"};
    	
    	char* hand[6]= {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
    
    	srand(time(NULL));										// seme casuale
    	
    				  shuffle(deck);											// passo il mazzo inizializzato a 0 alla funzione shuffle
    	       *hand = deal(deck, face, suit);									//passo il mazzo mescolato e i due vettori appena inizializzati alla funzione che distribuisce le carte
    				  couple(hand, face);
    	
    	return 0;
    }
    
    
    
    void shuffle(int wDeck[][13]){
    	
    	int card;						// questo contatore serve a definire l'ordinamento delle carte
    	int row;						//inizializzo le righe 
    	int column;						//inizializzo le colonne
    		
    	for(card=1; card<=52; card++){	
    
    		
    		do{
    			row = rand()%SUITS;					//assegno un valore casuale alle righe
    			column = rand()%FACES;				//assegno un valore casuale alle colonne
    		} while(wDeck[row][column] != 0);		//mi assicuro che quel particolare elemento del mazzo non sia già stato modificato 
    		
    		wDeck[row][column] = card;				//associo a quell'elemento il numero di carta che determina quando dovrà essere pescato
    
    	}	
    }
    
    
    char* deal(const int wDeck[][13], const char *wFace[], const char *wSuit[]){
    	
    	int card;							
    	int row;
    	int column;
    	int i, j;
    	char *appoggioFace[6] = {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
    	
    	for(card=1; card<=5; card++){		
    			for(row=0; row<=3; row++){									
    				for(column=0; column<=12; column++){						
    					if (wDeck[row][column]==card){ appoggioFace[card]=wFace[column];  printf("%5s of %-8s%c", wFace[column], wSuit[row], card%2 ==0 ?'\n' : '\t');  /*printf("%5s", appoggioFace[card]); */
    					}
    				}
    			}
    		}
    		
    		    return *appoggioFace;
    		    
    	}
    
    void couple(const char* appoggioFace[6], const char *wFace[])
    {
    	
    	int card;							
    	int row;
    	int column;
    	int i, j;
    	
    		for(i=1; i<=5;i++)
    		for(j=i+1; j<=5; j++)
    		if(appoggioFace[i]==appoggioFace[j]) printf("\n\nTrovato");
    		
    			}
    		
    @oregon queste le tre funzioni:
    void shuffle(int wDeck[][FACES]); //NON MODIFICATA E COPIATA DAL LIBRO
    char* deal(const int wDeck[][FACES], const char *wFace[], const char *wSuits[]); // MODIFICATA - INIZIALMENTE ERA VOID
    void couple(const char* appoggioFace[6], const char *wFace[]); // CREATA DA ME. FUNZIONE CHE DOVREBBE VERIFICARE SE C'E' UNA COPPIA

    Vorrei che la seconda funzione passasse un puntatore o un arrai con le carte estratte.

    @Weierstrass a) Credimi ho controllato ma non credo di aver copiato male. Ho solo usato dei #define che nell'originale non c'erano. b) Hai ragione: un po' cervellotico usare tre puntatori per 52 carte, ma l'esercizio è così!!!
  • Re: [c] Puntatori, funzioni, mescolare carte

    @antragorn

    La funzione shuffle non è uno shuffle ma un semplice primo riempimento: alla seconda chiamata già non funziona più. E anche come riempimento ha un tempo di esecuzione totalmente irragionevole per quello che deve fare.

    Se è davvero l'esempio del tuo libro, mi spiace ma il libro è da buttare
  • Re: [c] Puntatori, funzioni, mescolare carte

    Io ti credo; fatto sta che non riesco a trasformare questa funzione (perfettamente funzionante) che dà le carte e individua se c'è una coppia:
    void deal(const int wDeck[][13], const char *wFace[], const char *wSuit[]){
    	
    	int card;							
    	int row;
    	int column;
    	int i, j;
    	char *appoggioFace[6] = {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
    	
    	for(card=1; card<=5; card++){		
    			for(row=0; row<=3; row++){									
    				for(column=0; column<=12; column++){						
    					if (wDeck[row][column]==card){ appoggioFace[card]=wFace[column];  printf("%5s of %-8s%c", wFace[column], wSuit[row], card%2 ==0 ?'\n' : '\t');  /*printf("%5s", appoggioFace[card]); */
    					}
    				}
    			}
    		}
    		for(i=1; i<=5;i++)
    		for(j=i+1; j<=5; j++)
    		if(appoggioFace[i]==appoggioFace[j]) printf("\n\nTrovato");
    	}
    
    In due funzioni distinte in cui una dia solo le carte e l'altra individui l'eventuale coppia.
  • Re: [c] Puntatori, funzioni, mescolare carte

    Questa l'ultima versione del programma:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define SUITS 4					//il numero di semi
    #define FACES 13				//il numero di facce
    #define CARDS 5 				// il numero di carte che voglio che distribuisca
    
    
    
    void shuffle(int wDeck[][FACES]);							// prototipo per mescolare le carte
    void deal(const int wDeck[][FACES], const char *wFace[], const char *wSuits[]);		// prototipo per distribuire le carte (5 in questo caso)
    void couple(char* appoggioFace[]);										// prototipo per valutare la mano
    
    int main() {
    int i;
    	int deck[SUITS][FACES] = {0};							// inizializzo il vettore bidimensionale di 52 elementi a 0, ogni elemento verrà poi modificato in shuffle per definire in che ordine vadano distribuite
    		
    	const char *suit[SUITS] = {"Cuori", "Quadri", "Fiori", "Picche"};						//dichiaro e inizializzo i vettori dei semi
    				
    	const char *face[FACES] = {"Asso", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove", "Dieci", "Jack", "Regina", "Re"};
    	
    	char* hand[6]= {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
    
    	srand(time(NULL));										// seme casuale
    	
    				  shuffle(deck);											// passo il mazzo inizializzato a 0 alla funzione shuffle
    	             deal(deck, face, suit);									//passo il mazzo mescolato e i due vettori appena inizializzati alla funzione che distribuisce le carte
    			
    	
    	return 0;
    }
    
    
    
    void shuffle(int wDeck[][13]){
    	
    	int card;						// questo contatore serve a definire l'ordinamento delle carte
    	int row;						//inizializzo le righe 
    	int column;						//inizializzo le colonne
    		
    	for(card=1; card<=52; card++){	
    
    		
    		do{
    			row = rand()%SUITS;					//assegno un valore casuale alle righe
    			column = rand()%FACES;				//assegno un valore casuale alle colonne
    		} while(wDeck[row][column] != 0);		//mi assicuro che quel particolare elemento del mazzo non sia già stato modificato 
    		
    		wDeck[row][column] = card;				//associo a quell'elemento il numero di carta che determina quando dovrà essere pescato
    
    	}	
    }
    
    
    void deal(const int wDeck[][13], const char *wFace[], const char *wSuit[]){
    	
    	int card;							
    	int row;
    	int column;
    	int i, j;
    	char *appoggioFace[6] = {"Zero", "Asso", "Due", "Tre", "Quattro", "Cinque"};
    	
    	for(card=1; card<=5; card++){		
    			for(row=0; row<=3; row++){									
    				for(column=0; column<=12; column++){						
    					if (wDeck[row][column]==card){ appoggioFace[card]=wFace[column];  printf("%5s of %-8s%c", wFace[column], wSuit[row], card%2 ==0 ?'\n' : '\t');  /*printf("%5s", appoggioFace[card]); */
    					}
    				}
    			}
    		}
    
    	  
    	  
    	  couple(appoggioFace);
    		    
    
    		    
    	}
    
    void couple(char* appoggioFace[])
    {
    	
    	int card;							
    	int row;
    	int column;
    	int i, j;
    	int count1 = 0;
    	
    			for(i=0; i<6;i++)
    		printf("%s", appoggioFace[i]);
    		
    		
    		for(i=1; i<=5;i++)
    		for(j=i+1; j<=5; j++)
    		if(appoggioFace[i]==appoggioFace[j]) printf("\n\nTrovato, %s", appoggioFace[j]);
    		
    			}
    		
    Non esegue esattamente quello che vorrei, ma oltre non saprei come andare.
Devi accedere o registrarti per scrivere nel forum
7 risposte