4° Esercizio in c++: Giro a cavallo. Dove è il bug?
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao a tutti,
sto creando un programma che simuli il movimento di un cavallo all'interno di una scacchiera, devo cercare di fargli fare più mosse possibili....
Ho creato a qualcosa di “funzionante” ma purtroppo per qualche motivo a me sconosciuto al 5°/6° spostamento il programma si blocca. Non riesco a trovare il bug
Sottolineo il fatto che il programma NON è completo, tutta via ogni consiglio è il ben venuto..
Ciao
lele
La libreria random.h è linkata qui
sto creando un programma che simuli il movimento di un cavallo all'interno di una scacchiera, devo cercare di fargli fare più mosse possibili....
Ho creato a qualcosa di “funzionante” ma purtroppo per qualche motivo a me sconosciuto al 5°/6° spostamento il programma si blocca. Non riesco a trovare il bug
Sottolineo il fatto che il programma NON è completo, tutta via ogni consiglio è il ben venuto..
Ciao
lele
La libreria random.h è linkata qui
- Allegati
-
Giro a cavallo 001.txt- (6.35 KiB) Scaricato 109 volte
Ultima modifica di KubuntuChancellor il mercoledì 19 agosto 2009, 16:28, modificato 1 volta in totale.
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
premetto:
io sono nuovissimo di programmazione, uso il c e non il c++ e in questo momento sono su xp per dimostrare la superiorità di ubuntu (cosa fra l'altro perfettamente riuscita;-))
Comunque guardando il tuo programma mi sembra abbastanza disordinato, probabilmente sono io un fanatico ma l'essere il più ordinato possibile mi sta tornando utile.
io lo avrei fatto così mi sembra un pò più leggibile di prima (non che prima fosse male anzi).
Il decentramento a destra poi a me me lo ha letto come fatto con degli spazzi, niente di male ma è molto più comodo usare il tasto TAB (quello sopra il block-maiuscol/caps-loock)
Un ultima cosa ti conviene postare il sorgente come ho fatto io (devi usare il comando code quello con il #).
Dopo aver rotto abbastanza i cosidetti non ti posso aiutare perchè di c e c++ menochemai non conosco niente, buona fortuna
io sono nuovissimo di programmazione, uso il c e non il c++ e in questo momento sono su xp per dimostrare la superiorità di ubuntu (cosa fra l'altro perfettamente riuscita;-))
Comunque guardando il tuo programma mi sembra abbastanza disordinato, probabilmente sono io un fanatico ma l'essere il più ordinato possibile mi sta tornando utile.
Codice: Seleziona tutto
#include <ctime>
using std::time;
#include <cstdlib>
using std::rand;
using std::srand;
int rnd(int inizio = 1, int fine = 5000) <------------- Qua ci vuole un "punto e virgola"???
{
int val1 = 0;
static bool s1 = true;
if (s1 == true) <------------- Qua ci vuole un "punto e virgola"???
{
srand(time(0));
s1 = false;
}
val1 = (inizio + rand() % fine);
return val1;
}Il decentramento a destra poi a me me lo ha letto come fatto con degli spazzi, niente di male ma è molto più comodo usare il tasto TAB (quello sopra il block-maiuscol/caps-loock)
Un ultima cosa ti conviene postare il sorgente come ho fatto io (devi usare il comando code quello con il #).
Dopo aver rotto abbastanza i cosidetti non ti posso aiutare perchè di c e c++ menochemai non conosco niente, buona fortuna
Bob
- crisixk
- Entusiasta Emergente

- Messaggi: 1402
- Iscrizione: domenica 17 maggio 2009, 1:15
- Località: Pontedera - Pisa
- Contatti:
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Codice: Seleziona tutto
if (s1 == true) <------------- Qua ci vuole un "punto e virgola"???
{
srand(time(0));
s1 = false;
}altrimenti l'istruzione sarebbe completa e le graffe verrebbero sempre eseguite .. ^^
Avvolte cio' che si crea per facilitarci la vita, ci libera dal ragionare ed insieme ci imprigiona in una sorta di limbo nel quale la coscienza è solo un limite, uno spreco di risorse e tempo. Cosa fa' la mia mano ?
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
quindi ho detto una st*****ta!!!
Perfetto grazie della correzione :-[ :-[
Perfetto grazie della correzione :-[ :-[
Bob
- crisixk
- Entusiasta Emergente

- Messaggi: 1402
- Iscrizione: domenica 17 maggio 2009, 1:15
- Località: Pontedera - Pisa
- Contatti:
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
riguardando il codice, mi pare che rnd possa essere una funzione che viene dichiarata e definita (in maniera a me poko chiara) ..
se fosse cosi', non ci vorrebbe nemmeno li, dopo le parentesi tonde, il punto e virgola, altrimenti avremmo una dichiarazione di prototipo di funzione senza la relativa definizione ( il codice che la funzione deve richiamare )
certo non saprei spiegare la logica degli argomenti passati che vengono inizializzati gia' nella funzione ... bohh, sara' il C++ ?
(z)
se fosse cosi', non ci vorrebbe nemmeno li, dopo le parentesi tonde, il punto e virgola, altrimenti avremmo una dichiarazione di prototipo di funzione senza la relativa definizione ( il codice che la funzione deve richiamare )
Codice: Seleziona tutto
int rnd(int inizio = 1, int fine = 5000)
{
[codice funzione]
return val1;
}(z)
Avvolte cio' che si crea per facilitarci la vita, ci libera dal ragionare ed insieme ci imprigiona in una sorta di limbo nel quale la coscienza è solo un limite, uno spreco di risorse e tempo. Cosa fa' la mia mano ?
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Scusami ma proprio non ho capito cosa non vi piace della funzione rnd()....
Se sapere fare di meglio postate il codice, sarà sempre il ben venuto..... (b2b)
Semplicemente sono argomenti passati da default ovvero, se non ci sono argomenti il programma prende 1 e 5000 come valore. Altrimenti quelli che li vengono passati di volta in volta.
Per quanto riguarda il bug del programma avete idea da cosa dipenda?
Ciao
lele
Se sapere fare di meglio postate il codice, sarà sempre il ben venuto..... (b2b)
int rnd(int inizio = 1, int fine = 5000)certo non saprei spiegare la logica degli argomenti passati che vengono inizializzati gia' nella funzione ... bohh, sara' il C++ ?
Semplicemente sono argomenti passati da default ovvero, se non ci sono argomenti il programma prende 1 e 5000 come valore. Altrimenti quelli che li vengono passati di volta in volta.
Per quanto riguarda il bug del programma avete idea da cosa dipenda?
Ciao
lele
- crisixk
- Entusiasta Emergente

- Messaggi: 1402
- Iscrizione: domenica 17 maggio 2009, 1:15
- Località: Pontedera - Pisa
- Contatti:
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
compilando un sorgente con un codice in ' C ' del genere :KubuntuChancellor ha scritto: Scusami ma proprio non ho capito cosa non vi piace della funzione rnd()....
Se sapere fare di meglio postate il codice, sarà sempre il ben venuto..... (b2b)
int rnd(int inizio = 1, int fine = 5000)certo non saprei spiegare la logica degli argomenti passati che vengono inizializzati gia' nella funzione ... bohh, sara' il C++ ?
Semplicemente sono argomenti passati da default ovvero, se non ci sono argomenti il programma prende 1 e 5000 come valore. Altrimenti quelli che li vengono passati di volta in volta.
Per quanto riguarda il bug del programma avete idea da cosa dipenda?
Ciao
lele
Codice: Seleziona tutto
int rnd(int inizio = 1, int fine = 5000)quindi ho detto, sara' il C++ che lo consente? Io non lo so perche' conosco solo il C.C:\Users\Joe\Desktop\prove.c|28|error: syntax error before '=' token|
la funzione rnd non so' cosa faccia quindi ne mi piace ne non mi piace :-\Scusami ma proprio non ho capito cosa non vi piace della funzione rnd()....
ho solo risposto rispetto al punto e virgola
Notte
Avvolte cio' che si crea per facilitarci la vita, ci libera dal ragionare ed insieme ci imprigiona in una sorta di limbo nel quale la coscienza è solo un limite, uno spreco di risorse e tempo. Cosa fa' la mia mano ?
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao
Le variabili inizio e fine sono il range dei numeri....
Una banalissima funzione..... tutt'altro che qualcosa da professionisti...
Ciao
Lele
Serve a generare dei numeri casuali, attraverso le funzioni rand() e srand(),crisixk ha scritto: la funzione rnd non so' cosa faccia quindi ne mi piace ne non mi piace :-\
Le variabili inizio e fine sono il range dei numeri....
Una banalissima funzione..... tutt'altro che qualcosa da professionisti...
Ciao
Lele
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao,
Se ho capito bene se io chiamo rnd(3, 7) mi deve restituisce un numero intero casuale tra 3 a 7, compresi 3 e 7.
Allora è sbagliata la riga:
Quella giusta è:
Se ho capito bene se io chiamo rnd(3, 7) mi deve restituisce un numero intero casuale tra 3 a 7, compresi 3 e 7.
Allora è sbagliata la riga:
Codice: Seleziona tutto
val1 = (inizio + rand() % fine);
Codice: Seleziona tutto
val1 = inizio + ( rand() % (fine - inizio + 1) );
NTM: Network Traffic (Session, Time) Monitor for Linux (Ubuntu, Kubuntu, Xubuntu, Fedora,...)
- - - /| / - /_/ - - -
- - - / |/ - / \ - - -
- - - / |/ - / \ - - -
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao NK,
Quella giusta è:
Ho voluto controllare con scrupolo il libro, secondo lui questa è la cosa più facile e più efficiente da fare:
inizio = 1; fine = 6;
cout << ( inizio + rand() % fine);
questo è il codice utilizzato per simulare un lancio di un dado a sei facce.
Se poi è sbagliato questo io non lo so.
Ciao
Lele
Quella giusta è:
Codice: Seleziona tutto
val1 = inizio + ( rand() % (fine - inizio + 1) );
inizio = 1; fine = 6;
cout << ( inizio + rand() % fine);
questo è il codice utilizzato per simulare un lancio di un dado a sei facce.
Se poi è sbagliato questo io non lo so.
Ciao
Lele
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Attento, stai generalizzando un codice in modo errato.
Cioè quel codice funziona per generare numeri a 1 a 6 ma se provi a cambiare il valore di inizio ad un valore diverso da 1, non è più valido il codice del libro.
La formula che ti ho postato è quella generale.
Per esercizio, se nella mia formula sostituiamo ad inizio e fine rispettivamente i valori 1 e 6 vedrai che uscirà la formula del libro.
val1 = 1 + ( rand() % (6 - 1 + 1) ) = 1 + ( rand() % 6 )
Cioè quel codice funziona per generare numeri a 1 a 6 ma se provi a cambiare il valore di inizio ad un valore diverso da 1, non è più valido il codice del libro.
La formula che ti ho postato è quella generale.
Per esercizio, se nella mia formula sostituiamo ad inizio e fine rispettivamente i valori 1 e 6 vedrai che uscirà la formula del libro.
val1 = 1 + ( rand() % (6 - 1 + 1) ) = 1 + ( rand() % 6 )
NTM: Network Traffic (Session, Time) Monitor for Linux (Ubuntu, Kubuntu, Xubuntu, Fedora,...)
- - - /| / - /_/ - - -
- - - / |/ - / \ - - -
- - - / |/ - / \ - - -
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Allora cominciamo con il dire che :
if (condizione);
{
fai qualcosa
}
esegue sempre e comunque il "fai qualcosa" contenuto nelle parentesi graffe e questo è dovuto al fatto che il ; dopo l'if viene interpretato come una istruzione (istruzione che verrà eseguita solo se è vera la condizione dell'if).
Passiamo alla funzione random, in C++ la funzione random torna un numero pseudorando
compreso tra 0 e 32,767 (mi pare ...
) per riportarlo entro un range che vogliamo ne si fa il modulo (%) (se non sapete cos'è cercate su google...) in modo che il numero ottenuto sia appunto per forza di cose inferiore a "fine" nel tuo esempio...
quindi ti basterà fare:
out << inizio + ( rand() % fine );
ciao
if (condizione);
{
fai qualcosa
}
esegue sempre e comunque il "fai qualcosa" contenuto nelle parentesi graffe e questo è dovuto al fatto che il ; dopo l'if viene interpretato come una istruzione (istruzione che verrà eseguita solo se è vera la condizione dell'if).
Passiamo alla funzione random, in C++ la funzione random torna un numero pseudorando
compreso tra 0 e 32,767 (mi pare ...
quindi ti basterà fare:
out << inizio + ( rand() % fine );
ciao
Ultima modifica di navy78 il venerdì 21 agosto 2009, 17:31, modificato 1 volta in totale.
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Attenzione navy78 stai sbagliando, la funzione ( inizio + rand() % fine ) non soddisfa la specifica della funzione rnd che KubuntuChancellor vuole implementare.
Esempio:
inizio = 50
fine = 60
Mettiamo che rand() restituisce: 1234
Allora la formula (inizio + ( rand() % fine) diventa: 50 + ( 1234 % 60) = 50 + 34 = 84
84 NON è compreso tra 50 e 60 quindi quella funzione è sbagliata nel nostro caso.
Esempio:
inizio = 50
fine = 60
Mettiamo che rand() restituisce: 1234
Allora la formula (inizio + ( rand() % fine) diventa: 50 + ( 1234 % 60) = 50 + 34 = 84
84 NON è compreso tra 50 e 60 quindi quella funzione è sbagliata nel nostro caso.
NTM: Network Traffic (Session, Time) Monitor for Linux (Ubuntu, Kubuntu, Xubuntu, Fedora,...)
- - - /| / - /_/ - - -
- - - / |/ - / \ - - -
- - - / |/ - / \ - - -
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Scusa NK, hai ragione,
la forma corretta è:
out<< inizio + (rand()%(fine-inizio))
ciao
la forma corretta è:
out<< inizio + (rand()%(fine-inizio))
ciao
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Tranquillo, ora il concetto è più chiaro 
Ciao
Ciao
NTM: Network Traffic (Session, Time) Monitor for Linux (Ubuntu, Kubuntu, Xubuntu, Fedora,...)
- - - /| / - /_/ - - -
- - - / |/ - / \ - - -
- - - / |/ - / \ - - -
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao NK e navy78,
Voglio in anzi tutto ringraziarvi per l'interesse per la mia funzione rnd(), che correggerò al più presto.
Tuttavia io ho bisogno di capire per quale motivo al sesto movimento il programma si blocca, senza darmi alcun errore.
Potete darmi una dritta?
Se nessuno dovesse aiutarmi mi verrò costretto a rifarla a zero il che non è positivo
Ciao
Lele
Voglio in anzi tutto ringraziarvi per l'interesse per la mia funzione rnd(), che correggerò al più presto.
Tuttavia io ho bisogno di capire per quale motivo al sesto movimento il programma si blocca, senza darmi alcun errore.
Potete darmi una dritta?
Se nessuno dovesse aiutarmi mi verrò costretto a rifarla a zero il che non è positivo
Ciao
Lele
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ho dato una controllata al volo al codice, rimane a girare sul while in riga 212.
Nel corpo del while vedo che usi la famosa funzione rnd (riga 209) che abbiamo detto in precedenza essere sbagliata, quindi sarà quello il problema...
Qui si poteva intuire che il problema era in un ciclo che non finiva mai, ma in generale specie quando le cose si fanno più complicate, la sola intuizione non basta.
Non so come l'hai fatto il debug, ma se non hai usato dei strumenti specifici ti invito ad impararli ad usarli.
In futuro avrai spesso di questi problemi ed usare uno strumento adatto ti risparmia molto tempo e fatica
Ciao
Nel corpo del while vedo che usi la famosa funzione rnd (riga 209) che abbiamo detto in precedenza essere sbagliata, quindi sarà quello il problema...
Qui si poteva intuire che il problema era in un ciclo che non finiva mai, ma in generale specie quando le cose si fanno più complicate, la sola intuizione non basta.
Non so come l'hai fatto il debug, ma se non hai usato dei strumenti specifici ti invito ad impararli ad usarli.
In futuro avrai spesso di questi problemi ed usare uno strumento adatto ti risparmia molto tempo e fatica
Ciao
NTM: Network Traffic (Session, Time) Monitor for Linux (Ubuntu, Kubuntu, Xubuntu, Fedora,...)
- - - /| / - /_/ - - -
- - - / |/ - / \ - - -
- - - / |/ - / \ - - -
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao
Ho modificato il codice in rnd() come mi hai detto e ancora non funziona, ho provato a inserire manualmente i valori e funziona leggermente meglio anche se segnala altri errori. Quindi rnd() è parte del problemaNK ha scritto: Ho dato una controllata al volo al codice, rimane a girare sul while in riga 212.
Nel corpo del while vedo che usi la famosa funzione rnd (riga 209) che abbiamo detto in precedenza essere sbagliata, quindi sarà quello il problema...
Si ho utilizzato un dbg ovviamente in maniera elementare, quello che proprio non riesco a capire è perché l'errore si manifesta SOLO a sesto o settimo passaggio.Non so come l'hai fatto il debug, ma se non hai usato dei strumenti specifici ti invito ad impararli ad usarli.
In futuro avrai spesso di questi problemi ed usare uno strumento adatto ti risparmia molto tempo e fatica
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ok, allora comincia ad utilizzare il debugger in modo più avanzato, metti un breakpoint condizionato in modo che ti blocchi al sesto passo di quel punto e uno step alla volta controlla quello che fa e i valori delle variabili.
Non demordere!! (yes)
Non demordere!! (yes)
NTM: Network Traffic (Session, Time) Monitor for Linux (Ubuntu, Kubuntu, Xubuntu, Fedora,...)
- - - /| / - /_/ - - -
- - - / |/ - / \ - - -
- - - / |/ - / \ - - -
- KubuntuChancellor
- Entusiasta Emergente

- Messaggi: 1038
- Iscrizione: lunedì 17 novembre 2008, 19:48
- Distribuzione: Linux Mint 17 64bit
Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?
Ciao
bho inizia a essere frustrante......
Ciao
Lele
a parte che non ho capito come fare, ma a parte questo pur utilizzando il debug non riesco a capire che cosa cambia al 6°-7°NK ha scritto: Ok, allora comincia ad utilizzare il debugger in modo più avanzato, metti un breakpoint
bho inizia a essere frustrante......
Ciao
Lele
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti
