29/05/12 9:42
eclix
Comunque sono andato in panico dicendomi che la matrice non serve . Sicuro? XD
Non è che poi vado fuori traccia??
aaa
29/05/12 21:34
subazu
1 Passaggio parametri
mi viene il dubbio che sia permesso solo dal c++, per ora lascia stare, mi documenterò meglio.
2 Ciclo While
Il ciclo while serve per spostare le pedine, e perciò va dentro la tua fantomatica funzione, solo che devi chiarire l'idea che hai di questa funzione....
La funzione deve muovere le pedine no? secondo te deve anche crearle? deve inizializzarle? oppure lo deve fare qualcun altro fuori dalla funzione? (come facevi tu)
Prova a pensare alla tua funzione come ad una scatola, devi buttare qualcosa in questa scatola perché faccia il suo lavoro? ha senso inizializzare valori fuori dalla funzione se questi sono inizializzati sempre allo stesso modo e sono sempre uguali?
Io per adesso sto risolvendo unicamente il problema di una giocata, poi basterà rinominare "main" in "fantomatica_funzione" e richiamarla in un altro main che riscriverai, no?
3 Show chess
La funzione va cambiata, e diventa un pelino più complicata.
Diciamo che per risolvere questo problema in generale ci sono più strade, una è quella della matrice, che occupa un botto di spazio (grandezza della scacchiera alla seconda) ed è inoltre una grande scocciatura perché hai 2 strutture dati indipendenti che hanno gli stessi dati (la matrice e le 2 strutture) e vanno fra di loro sincronizzate ad ogni modifica.
L'altra è quella più analitica e furba, perché occupa unicamente l' spazio delle pedine e per la stampa a video trova i minimi delle coordinate, per sapere quale pedina va stampata prima, si posiziona nel punto e la stampa, così per tutte.
Se fai caso la tua matrice contiene sempre un sacco di spazi "vuoti", che sono irrilevanti e 2 lettere diverse, di cui tieni traccia le coordinate.
Quindi invece di stampare l'intera matrice non ti converrebbe stampare a video solo i 2 caratteri sapendone le coordinate???
4 Rand
Esatto, questo per una questione di competenza (dico io), a me non deve interessare come fa il suo lavoro la movimento_casuale finché non devo scriverla, questo perché se un giorno decidessi che non voglio più muovere la pedina in quel modo ma con un algoritmo basato sulla genetica quantistica (non credo neanche se esista) mi basterebbe riscrivere SOLO quel metodo.
A dirla tutta sarebbe ancora più opportuno chiamarlo "movimento" ma si può anche lasciare perdere.
5 fuori traccia
Diciamo che se il tuo prof è uno sciocco pretenderà la matrice, sennò ti dirà che sei riuscito a analizzare in modo corretto il problema e a trovare una soluzione più complessa ed efficace di quanto pretendesse da voi.
La vera traccia in informatica è il problema, non i consigli di risoluzione.
Se comunque hai questo dubbio sviluppa entrambi gli algoritmi (in quello con la matrice però devi usare solo quella, senza le 2 strutture).
Io di certo non risolverei mai un problema del genere con una matrice.
aaa
10/06/12 12:47
subazu
1 Matrice non matrice
La matrice non è necessaria per risolvere il problema, ma per farne a meno si deve analizzare il problema in modo molto più approfondito, e ciò ti richiederebbe più tempo.
Nella consegna c'è un array 2D appunto perché evidentemente il professore ha pensato che fosse troppo difficile per voi farne a meno.
Io dico che è il caso che tu la matrice la usi, e consegni l'esercizio con la matrice, ma che sarebbe bene che tu provassi a farne a meno.
Non so se tu hai una base di strutture dati, ma con la matrice usi 2 strutture dati indipendenti che svolgono lo stesso mestiere, uno spreco inutile...
2 la matrice a mio avviso la devi dichiarare dentro la funzione e al massimo passargli un intero che rappresenti la grandezza della matrice.
Questo perché se tu dovessi ricavare dei dati per esempio per confrontare il numero di passi medi che fanno le pedine per 100 casi (fino a qui come nel tuo esercizio) ma in diverse dimensioni di scacchiere, come opereresti?
Passando diverse dimensioni di matrici (=array 2D) alla tua funzione questa funziona correttamente?
Se no allora perché gli e la passi ?
La funzione "movimento_casuale" può prendere come parametro matrici differenti e fare il suo lavoro in modo corretto?
Tieni sempre a mente che se hai la possibilità di sbagliare prima o poi sbaglierai qualcosa :-)
Quindi invece di essere così generosi da passare matrici non inizializzate e di dimensioni arbitrarie decidi di passare un intero che rappresenta il lato della scacchiera e di gestire tutto all'interno:
dichiarazione
inizializzazione
movimento
Io non vedo il codice della "movimento_casuale" e della "initialize_chess" ma da qualche parte prenderanno gli indici per muoversene fuori o per fare i cicli sulla matrice e credo che se tu gli passassi indici diversi suderebbe un disastro.
Pensa anche alla inizializzazione delle pedine... inizializzi la loro posizione con delle costanti, se cambi dimensione alla matrice le coordinate dovrebbero cambiare di conseguenza in automatico e invece...
3 Ciò che non si capisce
I due punti sono semplici, rileggili, cmq nel
P3 la soluzione è quella di passare alla funzione un booleano che determina se stampare la matrice a video ogni volta o no, e hai un esempio con dei commenti.
P4 rileggi e rifletti su cosa dovrebbe fare la funzione, c'è l'esempio a mio dire più lineare e invece dopo come hai affrontato tu il problema, in alcuni punti un pò sparso, confronta bene gli esempi e collegali al tuo codice e tutto ti sarà più chiaro.
aaa
11/06/12 17:51
eclix
Questo è il codice della movimento_casuale:
void movimento_casuale(char walk[][30], Pedina *pawn)
{
int passo;
passo=rand()%4;
switch(passo)
{
case SU: if((*pawn).x==0)
{walk[(*pawn).x][(*pawn).y]='.'; walk[++(*pawn).x][(*pawn).y]=(*pawn).simb;}
else
{walk[(*pawn).x][(*pawn).y]='.'; walk[--(*pawn).x][(*pawn).y]=(*pawn).simb;} break;//pedina verso nord
case GIU: if((*pawn).x==N-1)
{walk[(*pawn).x][(*pawn).y]='.'; walk[--(*pawn).x][(*pawn).y]=(*pawn).simb;}
else
{walk[(*pawn).x][(*pawn).y]='.'; walk[++(*pawn).x][(*pawn).y]=(*pawn).simb;} break;//pedina verso sud
case SINISTRA: if((*pawn).y==0)
{walk[(*pawn).x][(*pawn).y]='.'; walk[(*pawn).x][++(*pawn).y]=(*pawn).simb;}
else
{walk[(*pawn).x][(*pawn).y]='.'; walk[(*pawn).x][--(*pawn).y]=(*pawn).simb;} break;//pedina verso ovest
case DESTRA: if((*pawn).y==N-1)
{walk[(*pawn).x][(*pawn).y]='.'; walk[(*pawn).x][--(*pawn).y]=(*pawn).simb;}
else
{walk[(*pawn).x][(*pawn).y]='.'; walk[(*pawn).x][++(*pawn).y]=(*pawn).simb;} break;//pedina verso est
}
}
e questo invece di initialize_chess:
void initialize_chess(char v[][N],Pedina p1, Pedina p2)
{c
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
v[i][j]='.';
v[p1.x][p1.y]=p1.simb; //postazione iniziale della pedina1
v[p2.x][p2.y]=p2.simb; //postazione iniziale della pedina2
}
non mi sono state date nozioni sul tipo booleano, forse per questo non sono riuscito a capire?
o non richiede poi tutta questa scienza?
cmq mi manca poco per la consegna dell'esercizio... se lo lascio così dici che non va bene? non è che mi sto facendo troppi problemi? XD
Ultima modifica effettuata da eclix 11/06/12 17:58
aaa