PDA

Visualizza versione completa : [C] Matrici e percorsi


Hollala
20-03-2016, 17.20.57
Buongiorno a tutti!
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;}

LoryOne
21-03-2016, 10.11.43
Qui

a[N/2][N/2]='*'


hai impostato che a[4][4] sia uguale a '*', quindi che problema hai ad impostare '+' dove riga e colonna possono essere casuali in un range da 0 a 9 per riga ed identico per colonna ?
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à '+' ?

LoryOne
21-03-2016, 12.32.29
...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.

Hollala
22-03-2016, 21.09.38
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...

Hollala
23-03-2016, 10.21.50
Ah, dimenticavo! L'asterisco può ripassare in una posizione precedentemente occupata dal +.

LoryOne
23-03-2016, 11.09.49
Sai cosa mi sembra ?
Una versione molto semplificata di Snake.

Hollala
23-03-2016, 15.56.41
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

LoryOne
05-04-2016, 16.50.04
Cosa c'era di sbagliato ?
Prima cosa presentiamo lo script in modo ordinato, indentando il codice in modo che i blocchi siano ben visibili.


#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;
}


In secondo luogo, ricordiamoci SEMPRE che le variabili vanno inzializzate, una volta dichiarate.
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 '*'