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

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

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
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.
Avatar utente
siscia
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 689
Iscrizione: martedì 14 aprile 2009, 21:21

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da siscia »

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.

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;
}
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
Bob
Avatar utente
crisixk
Entusiasta Emergente
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?

Messaggio da crisixk »

Codice: Seleziona tutto

if (s1 == true)   <------------- Qua ci vuole un "punto e virgola"???
		{
		srand(time(0));
		s1 = false;
		}
non conosco il C++ ma lo stesso codice in C non vorrebbe il punto e virgola dopo le parentesi della condizione verificata da if ...

  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 ?
... s'impara un passo alla volta ...
Avatar utente
siscia
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 689
Iscrizione: martedì 14 aprile 2009, 21:21

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da siscia »

quindi ho detto una st*****ta!!!
Perfetto grazie della correzione  :-[ :-[
Bob
Avatar utente
crisixk
Entusiasta Emergente
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?

Messaggio da crisixk »

  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 )

Codice: Seleziona tutto

int rnd(int inizio = 1, int fine = 5000)
  {

      [codice funzione]

        return val1;
                }
  certo non saprei spiegare la logica degli argomenti passati che vengono inizializzati gia' nella funzione ... bohh, sara' il C++ ?

  (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 ?
... s'impara un passo alla volta ...
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

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)
certo non saprei spiegare la logica degli argomenti passati che vengono inizializzati gia' nella funzione ... bohh, sara' il C++ ?
int rnd(int inizio = 1, int fine = 5000)

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
Avatar utente
crisixk
Entusiasta Emergente
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?

Messaggio da crisixk »

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)
certo non saprei spiegare la logica degli argomenti passati che vengono inizializzati gia' nella funzione ... bohh, sara' il C++ ?
int rnd(int inizio = 1, int fine = 5000)

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
compilando un sorgente con un codice in ' C ' del genere :

Codice: Seleziona tutto

int rnd(int inizio = 1, int fine = 5000)
ottengo :
C:\Users\Joe\Desktop\prove.c|28|error: syntax error before '=' token|
quindi ho detto, sara' il C++ che lo consente? Io non lo so perche' conosco solo il C.
Scusami ma proprio non ho capito cosa non vi piace della funzione rnd()....
la funzione rnd non so' cosa faccia quindi ne mi piace ne non mi piace  :-\

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 ?
... s'impara un passo alla volta ...
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

Ciao
crisixk ha scritto: la funzione rnd non so' cosa faccia quindi ne mi piace ne non mi piace  :-\
Serve a generare dei numeri casuali, attraverso le funzioni rand() e srand(),
Le variabili inizio e fine sono il range dei numeri....

Una banalissima funzione..... tutt'altro che qualcosa da professionisti...
Ciao
Lele
Avatar utente
NK
Prode Principiante
Messaggi: 209
Iscrizione: martedì 7 luglio 2009, 18:11

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da NK »

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:

Codice: Seleziona tutto

val1 = (inizio + rand() % fine);
Quella giusta è:

Codice: Seleziona tutto

val1 = inizio + ( rand() % (fine - inizio + 1) );
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

Ciao NK,

Quella giusta è:

Codice: Seleziona tutto

val1 = inizio + ( rand() % (fine - inizio + 1) );
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
Avatar utente
NK
Prode Principiante
Messaggi: 209
Iscrizione: martedì 7 luglio 2009, 18:11

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da NK »

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 )
navy78
Prode Principiante
Messaggi: 64
Iscrizione: domenica 18 marzo 2007, 11:15

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da navy78 »

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 ... :D) 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
Ultima modifica di navy78 il venerdì 21 agosto 2009, 17:31, modificato 1 volta in totale.
Avatar utente
NK
Prode Principiante
Messaggi: 209
Iscrizione: martedì 7 luglio 2009, 18:11

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da NK »

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.
navy78
Prode Principiante
Messaggi: 64
Iscrizione: domenica 18 marzo 2007, 11:15

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da navy78 »

Scusa NK, hai ragione,


la forma corretta è:


out<< inizio + (rand()%(fine-inizio))


ciao
Avatar utente
NK
Prode Principiante
Messaggi: 209
Iscrizione: martedì 7 luglio 2009, 18:11

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da NK »

Tranquillo, ora il concetto è più chiaro  :)

Ciao
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

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
Avatar utente
NK
Prode Principiante
Messaggi: 209
Iscrizione: martedì 7 luglio 2009, 18:11

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da NK »

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
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

Ciao
NK 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...
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 problema
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 ;)
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.
Avatar utente
NK
Prode Principiante
Messaggi: 209
Iscrizione: martedì 7 luglio 2009, 18:11

Re: 4° Esercizio in c++: Giro a cavallo. Dove è il bug?

Messaggio da NK »

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)
Avatar utente
KubuntuChancellor
Entusiasta Emergente
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?

Messaggio da KubuntuChancellor »

Ciao
NK ha scritto: Ok, allora comincia ad utilizzare il debugger in modo più avanzato, metti un breakpoint
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°
bho inizia a essere frustrante......

Ciao
Lele
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti