|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
20-03-2016, 18.20.57 | #1 |
Newbie
Registrato: 20-03-2016
Messaggi: 4
|
[C] Matrici e percorsi
Invoco il vostro aiuto perché non riesco proprio a cavare un ragno dal buco nella realizzazione di un programma in C. Mi si richiede di stampare passo passo il moto casuale di una particella che parte dal centro di una tabella NxN (e ci rimane per tutti i suoi spostamenti). In pratica devo stampare tante tabelle quanti sono gli spostamenti denotando la posizione della particella con * e tutte le posizioni precedenti con +. Non dovrei avere problemi con la generazione di valori casuali, uso le funzioni srand(time(NULL)) e rand()%4, che associo alle 4 possibilità di uno switch di modificare il valore delle posizioni di una matrice matrix[N][N]. Le mie difficoltà consistono sostanzialmente nel capire come assegnare caratteri char alla matrice nelle varie posizioni (spazi della tabella compresi), come far "memorizzare" le posizioni precedenti al programma, in modo che stampi i + al loro posto e come stampare la tabella ottenuta. La grafica dovrebbe risultare all'incirca così (primo passo, con gli spazi al posto dei puntini): ======== |...............| |...............| |......*.......| |...............| |...............| ======== Ringrazio chiunque mi dia qualche idea e qualche dritta a livello della sintassi, questo è quello che ho tentato di scrivere fin'ora: #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 9 #define K 3 int main(void){ char a[N][N]; int i, j, RIG=N, COL=N, nord=0, est=0, sud=0, ovest=0, numero, g, d, *p; srand(time(NULL)); while (g<K){ numero=(rand()%4); switch (numero) { case 0: nord++; break; case 1: est++; break; case 2: sud++; break; case 3: ovest++; break;} for(i = 0; i < RIG; i++) for(j = 0; j < COL; j++) {a[i][j]=' '; a[i][0]='|'; a[i][N-2]='|'; a[i][N-1]='\n'; a[N/2][N/2]='*';} for(d=1; d<N; d++) printf("="); printf("\n"); for(i = 0; i < RIG; i++){ for(j = 0; j < COL; j++) printf("%c", a[i][j]);} for(d=1; d<N; d++) printf("="); printf("\n"); g++;} return 0;} |
21-03-2016, 11.11.43 | #2 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [C] Matrici e percorsi
Qui
Codice:
a[N/2][N/2]='*' Quante iterazioni si devono compiere per riempre la matrice con tutti '+' ? E poi cosa deve succedere se ad esempio a riga 3 e colonna 3 c'è già '+' ?
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
21-03-2016, 13.32.29 | #3 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [C] Matrici e percorsi
...a mio avviso puoi fare tutto con soli 2 cicli for (uno per riga ed uno per colonna) nel momento stesso in cui stampi a video.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
22-03-2016, 22.09.38 | #4 |
Newbie
Registrato: 20-03-2016
Messaggi: 4
|
Rif: [C] Matrici e percorsi
Ti ringrazio per la risposta, Lory! Però il mio problema sta nel riempire con i + solo le posizioni occupate precedentemente dall'asterisco, non tutte :/
Ho provato nuovamente, e ora ho K tabelle NxN e l'asterisco che pare muoversi in maniera corretta: include<stdio.h> #include<stdlib.h> #include<time.h> #define N 8 #define K 5 int main(void){ char a[N][N]; int i, j, numero, g, d, posx=(N-1)/2, posy=(N-1)/2; srand(time(NULL)); while (g<K){ for(i = 0; i < N; i++) for(j = 0; j < N; j++) {a[i][j]=' '; a[i][0]='|'; a[i][N-2]='|'; a[i][N-1]='\n'; a[posx][posy]='*';} for(d=1; d<N; d++) printf("="); printf("\n"); for(i = 0; i < N; i++){ for(j = 0; j < N; j++) printf("%c", a[i][j]);} for(d=1; d<N; d++) printf("="); printf("\n"); numero=(rand()%4); switch (numero) { case 0: posx++; break; case 1: posx--; break; case 2: posy++; break; case 3: posy--; break;} if(posx<=0) posx++; if(posx>=(N-1)) posx--; if (posy<=0) posy++; if (posy>=(N-2)) posy--; g++;} return 0;} Ma non capisco come far memorizzare le posizioni precedenti. Ho tentato scrivendo if (g>0) a[posx][posy]='+'; b[i][j]+=a[i][j]; e stampando b, ma deve aver sommato i caratteri char, stampando cose improbabili... |
23-03-2016, 11.21.50 | #5 |
Newbie
Registrato: 20-03-2016
Messaggi: 4
|
Rif: [C] Matrici e percorsi
Ah, dimenticavo! L'asterisco può ripassare in una posizione precedentemente occupata dal +.
|
23-03-2016, 12.09.49 | #6 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [C] Matrici e percorsi
Sai cosa mi sembra ?
Una versione molto semplificata di Snake.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
23-03-2016, 16.56.41 | #7 |
Newbie
Registrato: 20-03-2016
Messaggi: 4
|
Rif: [C] Matrici e percorsi
Dici? Cavolo, ora che ho risolto (ho implementato, ora fa tutto quello che deve fare) mi hai dato un'idea per trasformarlo e renderlo più divertente! :P
|
05-04-2016, 17.50.04 | #8 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [C] Matrici e percorsi
Cosa c'era di sbagliato ?
Prima cosa presentiamo lo script in modo ordinato, indentando il codice in modo che i blocchi siano ben visibili. Codice:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 8 #define K 5 int main(void){ char a[N][N]; int i, j, numero, g=0, d=0, posx=(N-1)/2, posy=(N-1)/2; srand(time(NULL)); while (g<K){ for(i = 0; i < N; i++) for(j = 0; j < N; j++){ if(d==0) a[i][j]=' '; a[i][0]='|'; a[i][N-2]='|'; a[i][N-1]='\n'; a[posx][posy]='*'; } for(d=1; d<N; d++) printf("="); printf("\n"); for(i = 0; i < N; i++){ for(j = 0; j < N; j++) printf("%c", a[i][j]); } for(d=1; d<N; d++) printf("="); printf("\n"); numero=(rand()%4); switch (numero) { case 0: posx++; break; case 1: posx--; break; case 2: posy++; break; case 3: posy--; break;} if(posx<=0) posx++; if(posx>=(N-1)) posx--; if (posy<=0) posy++; if (posy>=(N-2)) posy--; g++; } return 0; } Guardate il primo while: g potrebbe avere qualunque valore e la condizione specificata potrebbe essere verificata come no. Passimo poi alla porzione di codice aggiunta: if(d==0) a[i][j]=' '; Solo la prima volta l'elemento a[i][j] deve contenere quel valore ' ', altrimenti le posizioni successive identificate da posx e posy non saranno riempite da '*'
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
Visualizzare files in percorsi diversi nella stessa finestra | gutguy | Windows 7/Vista/XP/ 2003 | 7 | 15-09-2008 19.30.06 |
Moltiplicazione di matrici | aduri | Programmazione | 2 | 13-10-2006 13.56.41 |
siti dove vedere percorsi stradali | afterhours | Segnalazioni Web | 9 | 26-08-2004 16.20.50 |
[VB.Net] Matrici di matrici | wicasa | Programmazione | 0 | 25-08-2004 21.24.13 |
Calcolo tra matrici | GiulioCesare | Programmazione | 1 | 02-10-2003 00.47.04 |