PDA

View Full Version : Problemi con programma in C++...


pixie
01-05-2007, 10:03
Ciao raga.... volevo chiedervi un aiutino per questo programma.....Il testo dell'esercizio è già scritto...
Se nn vi chiedo troppo vorrei poterlo completare entro il 3 maggio per favore....grazie

/*Modificare il codice seguente per permettere:
1) la generazione del numero pseudocasuale
nell'intervallo 1..100.
2) un numero predefinito di tentativi del giocatore.
3) l'assegnazione di un punteggio inversamente
proporzionale al numero di tentativi effettuati. */

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore
int i; // num tentativi scelti
int nt=0; // condiz iniz di tentativi

randomize();
magic = random(100); // sceglie un numero a caso
cout << magic; // visualizza num scelto dal computer
cout << " \n Inserisci il numero di tentativi: ";
cin >> i; // inserisci i


do {
for (i;nt;i--) break; // decremento
do {
cout << " Scrivi il tuo numero: \n";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " era ora....finalmente!!!\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero e' troppo alto.\n";
else cout << " Il tuo numero e' troppo basso.\n";
}
} while(guess != magic);

} while(i=0);

system("pause");
}

wingman87
01-05-2007, 10:16
1)Guarda qui per generare il numero:
http://www.cplusplus.com/reference/clibrary/cstdlib/rand.html
2)Devi aver preso un codice già fatto e poi l'hai modificato giusto? Hai messo un po' troppi cicli, ne basta uno...
3)Ad esempio? 100/ntentativi?

pixie
01-05-2007, 10:50
ciao....no il programma da cui si doveva partire è il seguente....

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore

randomize();
magic = rand(); // sceglie un numero a caso

do {
cout << "Scrivi il tuo numero: ";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " è il numero magico.\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero è troppo alto.\n";
else cout << " Il tuo numero è troppo basso.\n";
}
} while(guess != magic);

system("pause");
return 0;
}


Da qui praticamente dobbiamo aggiungere:
1) la generazione del numero pseudocasuale
nell'intervallo 1..100.
2) un numero predefinito di tentativi del giocatore.
3) l'assegnazione di un punteggio inversamente
proporzionale al numero di tentativi effettuati.

Fino adesso sn arrivato alla generazione del numero pseudocasuale.....non mi funzionano gli ultimi due punti....

andbin
01-05-2007, 11:08
1) la generazione del numero pseudocasuale
nell'intervallo 1..100.Vedi un mio esempio in <questo> (http://www.hwupgrade.it/forum/showthread.php?t=1330044) thread.

2) un numero predefinito di tentativi del giocatore.Metti una variabile che contiene il numero di tentativi, inizializzata ad un certo valore (es. 10). Alla fine del ciclo decrementi tale contatore. Il while deve far ripetere il ciclo se guess != magic e se tentativi > 0

3) l'assegnazione di un punteggio inversamente
proporzionale al numero di tentativi effettuati.In questo caso puoi usare la stessa variabile spiegata al punto 2. Se si indovina quando sono rimasti 3 tentativi è chiaramente peggio di quando si indovina quando rimangono 9 tentativi. Così è già "inversamente proporzionale".

pixie
01-05-2007, 11:14
Ok grazie mille...semmai vi faccio sapere se qualcosa nn va....ciao ciao

pixie
02-05-2007, 15:12
ciao....potresti dirmi in linguaggio c++ cm si mette il punto 3? (assegnazione di un punteggio inversamente proporzionale al numero di tentativi effettuati)..grazie

andbin
02-05-2007, 15:33
ciao....potresti dirmi in linguaggio c++ cm si mette il punto 3? (assegnazione di un punteggio inversamente proporzionale al numero di tentativi effettuati)..grazieMi sembrava di averlo spiegato, sebbene a parole, ma chiaramente.
Se usi una variabile che tiene il numero di tentativi ancora da effettuare (quindi in decremento man mano), quello è già un valore inversamente proporzionale al numero di tentativi effettuati.

int magic, guess;
int tentativi = 10;

do {
cout << "Scrivi il tuo numero: ";

......
} while (guess != magic && --tentativi > 0);

cout << "Il tuo punteggio e`: " << tentativi;

pixie
02-05-2007, 20:30
/* 1) la generazione del numero pseudocasuale
nell'intervallo 1..100.
2) un numero predefinito di tentativi del giocatore.
3) l'assegnazione di un punteggio inversamente
proporzionale al numero di tentativi effettuati. */

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore
int i; // num tentativi scelti
int nt=0; // condiz iniz di tentativi

randomize();
magic = random(100); // sceglie un numero a caso
cout << magic; // visualizza num scelto dal computer
cout << " \n Inserisci il numero di tentativi: ";
cin >> i; // inserisci i


do {
for (i;nt;i--) break; // decremento
do {
cout << " Scrivi il tuo numero: \n";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " era ora....finalmente!!!\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero e' troppo alto.\n";
else cout << " Il tuo numero e' troppo basso.\n";
}
} while(guess != magic);

} while(guess != magic && --i > 0); // punteggio

system("pause");

return 0;
}

Questo è il codice che ho creato....per favore potreste dirmi se funziona? è urgente devo consegnarlo doma....grazie

andbin
02-05-2007, 20:50
Questo è il codice che ho creato....per favore potreste dirmi se funziona? è urgente devo consegnarlo doma....grazieUhm, ecco cosa posso dirti:

a) Perché hai usato randomize()/random()??? Sono funzioni non standard e quindi poco portabili. Usa srand() e rand() che sono standard ANSI C.

b) Questo come te lo sei inventato?
for (i;nt;i--) break;
Un ciclo for in cui la espressione di inizializzazione è solo una variabile (quindi non fa nulla), in cui nt causa subito l'uscita dal ciclo (visto che nt è inizializzato a 0).

c) Non capisco la necessità di un doppio do-while annidato .... basta 1 solo ciclo do-while.

d) E la visualizzazione del punteggio dove la fai, visto che parlavi di gestire un punteggio??

e) Ultimo ma non meno importante: scrivi e indenta correttamente il codice!

pixie
02-05-2007, 20:57
ok sarò ignorante fin che vuoi nel campo della programmazione ma la cosa mi appassiona....dunque dv c'è
cin >> i qui dovrei inserire il num di tentativi poi nel ciclo for si continua a decrementare questo num fino a 0 quindi ho fatto for (i;nt;i--) dv i-- è il decremento....scusa posso capire? se nn ti disturbo troppo hai msn? grazie

pixie
02-05-2007, 21:18
Questo è il codice che ho scritto e nn credo sia ancora giusto....ma mi devi ancora risp al quesito precendente...
/* 1) la generazione del numero pseudocasuale
nell'intervallo 1..100.
2) un numero predefinito di tentativi del giocatore.
3) l'assegnazione di un punteggio inversamente
proporzionale al numero di tentativi effettuati. */

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore
int i; // num tentativi scelti
int nt=0; // condiz iniz di tentativi

srand();
magic = rand(100); // sceglie un numero a caso
cout << magic; // visualizza num scelto dal computer
cout << " \n Inserisci il numero di tentativi: ";
cin >> i; // inserisci i


for (i;nt;i--) break; // decremento
do {
cout << " Scrivi il tuo numero: \n";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " era ora....finalmente!!!\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero e' troppo alto.\n";
else cout << " Il tuo numero e' troppo basso.\n";
}

} while(guess != magic && --i > 0); // punteggio
cout << "Il tuo punteggio e`: ";

system("pause");

return 0;
}

pixie
02-05-2007, 22:04
PER FAVORE ATTENDO UNA RISPOSTA.....se nn consegno sto lavoro doma mi gioco il voto di sistemi e mia ma mi ammazza.....per favore vi prego ditemi se va bn

andbin
03-05-2007, 09:42
srand();
magic = rand(100);Nessuna delle due va bene. Ti ho anche indicato all'inizio un thread in cui avevo fatto un esempio completo!

srand() serve per impostare il "seed" del generatore di numeri casuali. Pertanto deve ricevere come argomento un numero che indica il seed. Per questo numero tipicamente si usa il valore ritornato da time(), giusto per dare un valore sempre diverso (ad ogni secondo).
Quindi oltre ad includere <cstdlib> devi anche includere <ctime>

La srand() va messa così:

srand ((unsigned int) time (NULL));

La funzione rand() invece NON ha parametri. Ritorna un valore casuale tra 0 e RAND_MAX. Pertanto se vuoi avere il numero casuale tra un range diverso/particolare, devi fare tu dei calcoli.
Nel caso si voglia avere un range da 1 a 100 compresi, si può fare:

magic = ((int) (rand() / (RAND_MAX+1.0) * 100)) + 1;

for (i;nt;i--) break; // decrementoQuesto non serve a nulla. Il decremento di 'i' l'hai già fatto come predecremento nel while, ed è sufficiente!

Tra l'altro, come ho già detto prima, questo for è inutile. 'nt' l'hai messo a 0 e lo usi solo nel for, pertanto con nt=0, il for termina immediatamente!

cout << "Il tuo punteggio e`: ";Qui ti basta solo più mandare in output il valore di 'i'.

niko_lol
03-05-2007, 17:23
for(int i=10; i < dim; i--)
{
Scrivi il codice che ti serve!
}

andbin
03-05-2007, 17:26
for(int i=10; i < dim; i--)Sicuro sicuro?? :D

Comunque il for non è l'ottimale in questo caso. La continuazione del ciclo è basata su 2 condizioni e comunque la richiesta del "guess" va fatta almeno una volta, pertanto vedo meglio il do-while.

niko_lol
03-05-2007, 17:35
Si ok....io lì ho visto che ci sta un for.... e gli ho scritto come si fa un for! poi sta a lui vedere come fare....più programma e + capisce ecc etc! :)

wingman87
03-05-2007, 22:29
Sicuro sicuro?? :D

Comunque il for non è l'ottimale in questo caso. La continuazione del ciclo è basata su 2 condizioni e comunque la richiesta del "guess" va fatta almeno una volta, pertanto vedo meglio il do-while.
E se fosse:
for(int i=10; i<dim && guess!=magic; i--)
non sarebbe comunque ottimale? E' solo per curiosità...

andbin
04-05-2007, 09:33
E se fosse:
for(int i=10; i<dim && guess!=magic; i--)
non sarebbe comunque ottimale? E' solo per curiosità...Se ci pensi un attimo 'guess' lo prendi in input dentro il ciclo, quindi che senso ha il test la prima volta??? E poi scusa, 'dim' che valore dovrebbe avere?? Inoltre con i-- vai sempre in decremento e non c'è un test per bloccare ad un certo punto il decremento di 'i'!!! Cioè ... hai capito la questione?

Se proprio si volesse usare un for si dovrebbe fare così e usare un break per uscire dal ciclo:
int tentativi, guess, magic;
...
cin >> tentativi; /* input numero tentativi */
...
for ( ; tentativi > 0; tentativi--)
{
....
cin >> guess; /* input guess */

if (guess == magic)
{
....
break; /* esce dal ciclo */
}
....
}