[c] Funzioni per un giochino di scommessa.

Pubblicità

jolly

Utente Attivo
Messaggi
110
Reazioni
4
Punteggio
38
Buongiorno a tutto il forum,sto scrivendo un programma che genera un numero casuale e bisogna indovinare il numero,con aumento o diminuzione del saldo.

Ho diviso il programma in 3 funzioni,al momento ne ho scritte solo 2,poi aggiungerò la 3,ragazzi scusate se rompo con queste funzioni ma è un argomento dove ho qualche difficoltà,quindi vorrei prendere più confidenza.
Per farvi capire il programma è strutturato cosi:

A) Genera un numero casuale.

B) Inserisci l'importo che vuoi scommettere.
--) vari controlli per la verifica del saldo etcc.

C) Inserisci il numero da indovinare.

Ecco quello che ho fatto fino ad ora:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void importo (int,int);
void numero (int);

void main ()
{
	int x;
	int imp;
	int saldo=100; 	

	printf( "Benvenuto/a cerca di vincere più soldi indovinando il numero magico...\n" );
	
	srand (time (NULL) );
	x=1+(rand() %10);

	importo(imp,saldo);
	numero(imp); /* dubbio se chiamare la funzione qui,oppure chiamarla dalla funzione importo */
}

void importo (int imp,int saldo)
{
	printf( "Inserisci l'importo che vuoi scommettere: " ); 
	scanf( "%d" , &imp );
	
	while (imp > saldo) {
		printf( "Saldo insufficiente,puoi scommettere max %d €...\n" , saldo );
		printf( "Inserisci l'importo che vuoi scommettere: " );
		scanf( "%d" , &imp );
	}
}

/* il problema si verifica in questa funzione precisamente la variabile imp(ovvero l'importo da scommettere) */
void numero (int imp)
{
	printf ("%d",imp ); 

}
Praticamente nella funzione main ho cercato di scrivere il meno possibile,quindi per prima cosa chiama la funzione importo,dopo chiama la funzione numero e qui sorge il problema con la variabile imp,mi spiego meglio se nella funzione importo ad imp assegno un valore di 50,la stessa variabile imp nella funzione numero invece di essere 50,diventa 4300788 come mai?

Ragazzi accetto molto volentieri consigli e critiche.
 
Il problema è che quando passi la variabile imp alla funzione importo non passi un riferimento al suo indirizzo di memoria ma una copia della variabile che smette di esistere alla fine di tale funzione. Probabilmente non sei ancora arrivato a studiare i puntatori, ti faccio vedere come sistemare anticipandoti questo argomento:
Codice:
  importo(&imp,saldo);
Facendo così con la & (E commerciale) non passi una copia ma l'indirizzo in memoria della variabile.
Codice:
void importo (int * imp,int saldo)
{
    int tmp;
    printf( "Inserisci l'importo che vuoi scommettere: " ); 
    scanf( "%d" , &tmp );
    *imp = tmp;
    
    while ((*imp) > saldo) {
        printf( "Saldo insufficiente,puoi scommettere max %d €...\n" , saldo );
        printf( "Inserisci l'importo che vuoi scommettere: " );
        scanf( "%d" , &tmp );
        *imp = tmp;
    }
}

L'asterisco (*) qua:
Codice:
void importo (int * imp,int saldo)
Significa che stai inizializzando un puntatore ad intero (punta all'indirizzo di memoria della variabile passata per riferimento).
L'asterisco qua invece:
Codice:
*imp = tmp;
Significa che assegno alla variabile imp il VALORE della variabile tmp
 
Ultima modifica:
Il problema è che quando passi la variabile imp alla funzione importo non passi un riferimento al suo indirizzo di memoria ma una copia della variabile che smette di esistere alla fine di tale funzione.
Probabilmente non sei ancora arrivato a studiare i puntatori, ti faccio vedere come sistemare anticipandoti questo argomento:
Codice:
importo(&imp,saldo);

Facendo così con la & (E commerciale) non passi una copia ma l'indirizzo in memoria della variabile.

Codice:
Codice:
void importo (int * imp,int saldo) {
int tmp;     printf( "Inserisci l'importo che vuoi scommettere: " );      scanf( "%d" , &tmp );
*imp = tmp;          while (imp > saldo) {         printf( "Saldo insufficiente,puoi scommettere max %d €...\n" , saldo );         printf( "Inserisci l'importo che vuoi scommettere: " );         scanf( "%d" , &tmp );
*imp = tmp;     } }


L'asterisco (*) qua:

Codice:
void importo (int * imp,int saldo)

Significa che stai inizializzando un puntatore ad intero (punta all'indirizzo di memoria della variabile passata per riferimento).

L'asterisco qua invece:

Codice:
Codice:
*imp = tmp;

Significa che assegno alla variabile imp il VALORE della variabile tmp

Mi hai anticipato di qualche minuto! xD Stavo facendo debug dettagliato.. :D
 
Infatti i puntatori non li ho ancora studiati,ma non ci sarebbe un modo per risolvere il problema senza toccare per il momento i puntatori ? :)

Comunuqe il problema si verifica nella funzione numero e non in importo.
 
Infatti i puntatori non li ho ancora studiati,ma non ci sarebbe un modo per risolvere il problema senza toccare per il momento i puntatori ? :)

Comunuqe il problema si verifica nella funzione numero e non in importo.

In numero ti da quel problema perche' gli passi come parametro una copia della variabile imp che non e' stata modificata con il valore dato dell'utente e quindi ti da un numero casuale che e' quello con cui inizializza di default il compilatore.
Infatti nel main la variaible imp non l'hai inizializzata ma solo dichiarata.
Le funzioni che crei bisogno SEMPRE metterle sopra al main altrimenti il programma da errori.

CODICE FUNZIONANTE:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void importo (int * imp,int saldo)
{
    int tmp;
    printf( "Inserisci l'importo che vuoi scommettere: " ); 
    scanf( "%d" , &tmp );
    *imp = tmp;
    
    while ((*imp) > saldo) {
        printf( "Saldo insufficiente,puoi scommettere max %d €...\n" , saldo );
        printf( "Inserisci l'importo che vuoi scommettere: " );
        scanf( "%d" , &imp );
        *imp = tmp;
    }
}

void numero (int imp)
{
    printf ("%d",imp ); 

}

void main ()
{
    int x;
    int imp;
    int saldo=100;     

    printf( "Benvenuto/a cerca di vincere più soldi indovinando il numero magico...\n" );
    
    srand (time (NULL) );
    x=1+(rand() %10);

    importo(&imp,saldo);
    numero(imp); 
    system("PAUSE");
}

 
Ultima modifica:
io ti ringrazio però non posso usare i puntatori,anche perchè non so nemmeno cosa sono,quindi non ha senso usarli se poi non so nemmeno come funzionano,comunque ho provato il tuo codice e mi da un errore alla riga 15.

Quindi bisogna per forza usare i puntatori? Non cè un altro modo?
 
io ti ringrazio però non posso usare i puntatori,anche perchè non so nemmeno cosa sono,quindi non ha senso usarli se poi non so nemmeno come funzionano,comunque ho provato il tuo codice e mi da un errore alla riga 15.

Quindi bisogna per forza usare i puntatori? Non cè un altro modo?

A me compila correttamente...che compilatore usi?
Altro modo per poter risolvere questo problema e' di usare una variabile globale, altro argomento che ancora non hai affrontato.
 
uso gcc

---------- Post added at 11:35 ---------- Previous post was at 11:14 ----------

Comunuqe ho risolto in questo modo :)
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void importo (void);
void numero (int,int);

void main ()
{

	printf( "Benvenuto/a cerca di vincere più soldi indovinando il numero magico...\n" );
	
	importo();
}

void importo (void)
{
	int imp,saldo=100;

	printf( "Inserisci l'importo che vuoi scommettere: " ); 
	scanf( "%d" , &imp );
	
	while (imp > saldo) {
		printf( "Saldo insufficiente,puoi scommettere max %d €...\n" , saldo );
		printf( "Inserisci l'importo che vuoi scommettere: " );
		scanf( "%d" , &imp );
	}

	numero(imp,saldo);
}

void numero (int imp,int saldo)
{
	int num,x;
	
	srand (time (NULL) );
	x=1+(rand() %10);

	printf( "Inserisci il numero da indovinare: " );
	scanf( "%d" , &num );	
	
	if (num == x) {
		saldo+=imp*2;
		printf( "Hai vinto,il tuo nuovo saldo è %d €...\n" , saldo );
	}

	else {
		saldo-=imp;
		printf( "Hai perso,il tuo nuovo saldo è %d €...\n" , saldo );
	}
}


---------- Post added at 12:24 ---------- Previous post was at 11:35 ----------

ora ho aggiunto l'ultima funzione ed ho incontrato un altro problema strano, ecco il codice:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void importo (void);
void numero (int,int);
void continua (void);

void main ()
{

	printf( "Benvenuto/a cerca di vincere più soldi indovinando il numero magico...\n" );
	
	importo();
}

void importo (void)
{
	int imp,saldo=100;

	printf( "Inserisci l'importo che vuoi scommettere: " ); 
	scanf( "%d" , &imp );
	
	while (imp > saldo) {
		printf( "Saldo insufficiente,puoi scommettere max %d €...\n" , saldo );
		printf( "Inserisci l'importo che vuoi scommettere: " );
		scanf( "%d" , &imp );
	}

	numero(imp,saldo);
}

void numero (int imp,int saldo)
{
	int num,x;
	
	srand (time (NULL) );
	x=1+(rand() %10);

	printf( "Inserisci il numero da indovinare: " );
	scanf( "%d" , &num );	
	
	if (num == x) {
		saldo+=imp*2;
		printf( "Hai vinto,il tuo nuovo saldo è %d €...\n" , saldo );
	}

	else {
		saldo-=imp;
		printf( "Hai perso,il tuo nuovo saldo è %d €...\n" , saldo );
	}
	
	continua();
}

void continua (void)
{
	char risp;
	
	printf( "Vuoi continuare il gioco: ");
	scanf( "%c" , &risp );

	if (risp == 's') {
		printf("ok"); /* prova */

	}
}

Il problema sta nell'ultima funzione "Continua",praticamente esce la scritta "Vuoi continuare il gioco: " dopodiche mi fa uscire dal programma.
Mentre se al posto di char dichiaro risp come un intero funziona perfettamente :boh: come mai ?
 
Io utilizzo Visual Studio e molto probabilmente il compilatore gcc si comporta in modo diverso. Comunque a primo istinto per risolvere il problema della funzione continua bisogna svuotare il buffer di entrata fai cosi':
Codice:
void continua (void)
{
    char risp;
    
    fflush(stdin);
    printf( "Vuoi continuare il gioco: ");
    scanf( "%c" , &risp );

    if (risp == 's') {
        printf("ok"); /* prova */

    }
}
 
ho provato ad aggiungere questa riga: fflush(stdin); ma non cambia niente :(

Ho capito qual'e' il problema...inserisci l'istruzione:
Codice:
system("PAUSE");
nell'ultima riga del main()
Altrimenti il programma ovviamente si chiude senza farti vedere la stampa.
Ah un'altra cosa, impara a fare il debug del programma che e' una parte fondamentale della programmazione.
 
ho provato anche ad aggiungere system("PAUSE"); ma quando vado a compilare mi esce il seguente errore sh: PAUSE: not found.

Altrimenti il programma ovviamente si chiude senza farti vedere la stampa.
Non capisco perchè dovrebbe accadere questo,non mi è mai successo.
 
Pubblicità
Pubblicità
Indietro
Top