DOMANDA random walk su c

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Ho notato adesso che la richiesta dell'assegnamento non coincide precisamente, infatti il moto deve essere circoscritto alle posizioni immediatamente vicine al '*', rispetto ai punti cardinali diciamo. Qualche idea?
Puoi usare ancora una funzione rand()%4, ed assegnare ad ogni valore uno spostamento (0 in alto, 1 a sinistra, 2 a destra e 3 in basso); per spostarlo in alto fai c[i-1][j], a destra c[j+1] e via cosi. Occhio che devi mettere delle condizioni per quando è ai bordi, sennò ti esce dai valori dell'array e ti dà errore.
 

roger21

Nuovo Utente
21
3
Puoi usare ancora una funzione rand()%4, ed assegnare ad ogni valore uno spostamento (0 in alto, 1 a sinistra, 2 a destra e 3 in basso); per spostarlo in alto fai c[i-1][j], a destra c[j+1] e via cosi. Occhio che devi mettere delle condizioni per quando è ai bordi, sennò ti esce dai valori dell'array e ti dà errore.


Questa parte nel mio programma è implementata in modo simile a come hai suggerito, grazie. L'unica questione è come integrare il char per avere i '+' stampati. Nel mio codice già gli '*' si muovono casualmente come voglio, grazie ad una serie di if-else. L'unico problema è che non riesco a integrare i char per avere traccia dei '+' a schermo. vorrei capire che condizione dare all'if-else per richiamare il char. se vuoi allego la parte di codice relativa con i commenti su quello che mi serve. Gracias!
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Questa parte nel mio programma è implementata in modo simile a come hai suggerito, grazie. L'unica questione è come integrare il char per avere i '+' stampati. Nel mio codice già gli '*' si muovono casualmente come voglio, grazie ad una serie di if-else. L'unico problema è che non riesco a integrare i char per avere traccia dei '+' a schermo. vorrei capire che condizione dare all'if-else per richiamare il char. se vuoi allego la parte di codice relativa con i commenti su quello che mi serve. Gracias!
Il codice farebbe comodo, ricorda di metterlo tra
Codice:
tuo codice[/ CODE] per renderlo più chiaro e visibile
 
  • Mi piace
Reazioni: Mursey

roger21

Nuovo Utente
21
3
Il codice farebbe comodo, ricorda di metterlo tra
Codice:
tuo codice[/ CODE] per renderlo più chiaro e visibile[/QUOTE]
  

[CODE]
 for (j=0; j<M; j++) { //questa è la parte del programma che stampa le varie griglie, è inserito dentro un altro ciclo for con una variabile h che arriva fino al numero di passi che voglio che compia, permettendomi di stampare tante griglie quanti sono i passi
    printf("|");
    for (i=0; i<N; i++)
    {   
        if (i==a && j==b) //le variabili a e b, già inizializzate, variano randomicamente nel modo che serve a me, in questo if-else metto '*' nelle posizioni di i e j corrispondenti ad a e b 
        printf("*");
        else if (i== && j==) //questo è l'if-else che vorrei controllasse i vari '+' ma non capisco come porre le condizioni su i e j in modo tale che ricordino tutte le posizioni vecchie di '*'  
        printf("%c", c[a]);
        else printf(" "); //questa condizione else mi permette di lasciare vuoti tutti i posti che non sono interessati dal randomwalk  
    }
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Codice:
 for (j=0; j<M; j++) { //questa è la parte del programma che stampa le varie griglie, è inserito dentro un altro ciclo for con una variabile h che arriva fino al numero di passi che voglio che compia, permettendomi di stampare tante griglie quanti sono i passi
    printf("|");
    for (i=0; i<N; i++)
    {   
        if (i==a && j==b) //le variabili a e b, già inizializzate, variano randomicamente nel modo che serve a me, in questo if-else metto '*' nelle posizioni di i e j corrispondenti ad a e b 
        printf("*");
        else if (i== && j==) //questo è l'if-else che vorrei controllasse i vari '+' ma non capisco come porre le condizioni su i e j in modo tale che ricordino tutte le posizioni vecchie di '*'  
        printf("%c", c[a]);
        else printf(" "); //questa condizione else mi permette di lasciare vuoti tutti i posti che non sono interessati dal randomwalk  
    }
prova a porre else if (c=='+' && c[j]=='+'), ovvero se nella posizione corrente dell'array è memorizzato il '+'.

- - - Updated - - -

Il fatto è che devi usare un'array per poter memorizzare tutte le posizioni assunte dall'asterisco, perchè usando solo il printf non hai nulla di salvato
 

roger21

Nuovo Utente
21
3
prova a porre else if (c=='+' && c[j]=='+'), ovvero se nella posizione corrente dell'array è memorizzato il '+'.

- - - Updated - - -

Il fatto è che devi usare un'array per poter memorizzare tutte le posizioni assunte dall'asterisco, perchè usando solo il printf non hai nulla di salvato



Esatto, grazie è questo il problema fondamentale, vorrei capire come salvare in un array le vecchie posizioni occupate da a e b, in modo da poterle richiamare con la condizione if-else. Vorrei capire materialmente che cosa scrivere.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Esatto, grazie è questo il problema fondamentale, vorrei capire come salvare in un array le vecchie posizioni occupate da a e b, in modo da poterle richiamare con la condizione if-else. Vorrei capire materialmente che cosa scrivere.

randomizzi le due variabili i e j, poni c[j] = '*', stampi la griglia e riponi c[j] = '+'. Al successivo random rifai la stessa cosa, solo che controlli se nella posizione c[j] è presente il +.
 

roger21

Nuovo Utente
21
3
randomizzi le due variabili i e j, poni c[j] = '*', stampi la griglia e riponi c[j] = '+'. Al successivo random rifai la stessa cosa, solo che controlli se nella posizione c[j] è presente il +.

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 11
#define B 7
int main() {
    int i, j, h=0, a=N/2 , b=N/2, leng=4, lengz=3, k, z;
    char c[N][N];
    srand(time(NULL));
    for ( i = 0; i < N; i++) {   
        for ( j = 0; j < N; j++) {
            c[i][j] = 'o';c[0][j]= '=';c[i][0]='|';c[N][j]='=';c[i][N-1]='|';
        }
        printf("\n");
    }
    for(h=0; h<B-1; h++) {do {
            k = rand() % leng+1;  
         if (k==1) {if(a<N && a>0) {a = a-1;} 
                    else {z = rand() % lengz+1; 
                        if(z==1) a = a+1;
                        else if (z==2) {if(b<N && b>0) b = b-1; else b = b+1;}
                        else if (z==3) {if(b<N-1) b = b+1; else b = b-1;}}}  
    else if (k==2) {if(a<N-1) {a = a+1;} 
                    else {z = rand() % lengz+1;
                        if (z==1) a = a-1;
                        else if (z==2) {if(b<N && b>0) b = b-1; else b = b+1;}
                        else if (z==3) {if(b<N-1) b = b+1; else b = b-1;}}}
    else if (k==3) {if(b<N && b>0) {b = b-1;} 
                    else {z = rand() % lengz+1;
                        if (z==1) b = b+1;
                        else if (z==2) {if(a<N && a>0) a = a-1; else a = a+1;}
                        else if (z==3) {if(a<N-1) a = a+1; else a = a-1;}}}
    else if (k==4) {if(b<N-1) {b = b+1;} 
                    else {z = rand() % lengz+1; 
                        if (z==1) b = b-1;
                        else if (z==2) {if(a<N && a>0) a = a-1; else a = a+1;}
                        else if (z==3) {if(a<N-1) a = a+1; else a = a-1;}}}
        } while (c[a][b] == '*' || c[a][b] == '+');      
        c[a][b] = '*'; 
        for ( i = 0; i < N; i++) {   
            for ( j = 0; j < N; j++) {
                printf(" %c", c[i][j]);
            }
        printf("\n");    
        }
        c[a][b] = '+'; 
    }
    return 0;
}


Ok, l'unica cosa che ancora non mi torna è che vorrei che il simbolo '*' possa anche trovarsi dove già erano presenti i '+' ad esempio nel caso che durante il moto casuale torni indietro e poi nel bordo inferiore della griglia vorrei che ci fossero solo "=". Comunque grazie mille.
 
Ultima modifica:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Codice:
} while (c[a][b] == '*'); //e ti risolve il primo problema (testato e funziona)

- - - Updated - - -

Codice:
for ( i = 0; i < N; i++) {   
        for ( j = 0; j < N; j++) {
            c[i][j] = 'o';c[0][j]= '=';c[i][0]='|';c[N[B]-1[/B]][j]='=';c[i][N-1]='|'; //ti sei dimenticato il -1 nella terza condizione
        }
 
Ultima modifica:
  • Mi piace
Reazioni: roger21

roger21

Nuovo Utente
21
3
Codice:
} while (c[a][b] == '*'); //e ti risolve il primo problema (testato e funziona)

- - - Updated - - -

Codice:
for ( i = 0; i < N; i++) {   
        for ( j = 0; j < N; j++) {
            c[i][j] = 'o';c[0][j]= '=';c[i][0]='|';c[N[B]-1[/B]][j]='=';c[i][N-1]='|'; //ti sei dimenticato il -1 nella terza condizione
        }
dovrebbe essere tutto perfetto,l'unico problema è che il punto non sarà mai al centro a meno che N non sia dispari mentre nell'assegnamento è pari,ma questo non dipende da me,grazie di cuore e buona serata

- - - Updated - - -

Ennesimo problema,la griglia deve essere 20x20,va tutto bene fino a N=19 ma appena N=20 va tutto in malora,cioè stampa solo l'asterisco sempre nella stessa posizione,credo che fosse voluta questa cosa da parte di chi ha lasciato l'assegnamento,non so a cosa sia dovuta,temo al char
 
Ultima modifica:
  • Mi piace
Reazioni: rodhellas

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Ennesimo problema,la griglia deve essere 20x20,va tutto bene fino a N=19 ma appena N=20 va tutto in malora,cioè stampa solo l'asterisco sempre nella stessa posizione,credo che fosse voluta questa cosa da parte di chi ha lasciato l'assegnamento,non so a cosa sia dovuta,temo al char
Posta il codice :sisilui:
 
  • Mi piace
Reazioni: roger21

roger21

Nuovo Utente
21
3
Posta il codice :sisilui:
,eccolo,è lungo perchè c'è anche una seconda parte nella quale vanno indicate le volte in cui si sposta a nord,sud,est o ovest in media su K=100 spostamenti,ancora non è commentato perchè non l'ho finito
Codice:
 #include <stdio.h>#include <stdlib.h>
#include <time.h>
#define N 20 //se N è 19 va tutto bene,appena arriva a 20 non fa più nulla,immagino perchè il char non ha abbastanza slot di memoria per 400 posti
#define K 100
int main() {
    int i, j, h=0, a=N/2, b=N/2, leng=4, lengz=3, k, z, m, p, l, n=0, s=0, e=0, w=0;
    char c[N][N];
    double sum1=0, sum2=0, sum3=0, sum4=0;
    srand(time(NULL));
    for (i=0; i<=N; i++) {   
        for (j=0; j<N; j++) {
            c[i][j]='o'; c[0][j]='='; c[N-1][j]='='; c[i][0]='|'; c[i][N-1]='|'; c[a][b]='*';
        }
    }
     for (i=0; i<N; i++) {   
            for (j=0; j<N; j++) {
                printf("%c", c[i][j]);
            }
            printf("\n");
        }
    for (i=0; i<=N; i++) {   
        for (j=0; j<N; j++) {
            c[i][j]='o'; c[0][j]='='; c[N-1][j]='='; c[i][0]='|'; c[i][N-1]='|';
        }   
    }
    for(h=0; h<K-1; h++) {do {
            k = rand() % leng+1;  
         if (k==1) {if(a<N-1 && a>1) {a = a-1;} 
                    else {z = rand() % lengz+1; 
                        if(z==1) a = a+1;
                        else if (z==2) {if(b<N-1 && b>1) b = b-1; else b = b+1;}
                        else if (z==3) {if(b<N-2) b = b+1; else b = b-1;}}}  
    else if (k==2) {if(a<N-2) {a = a+1;} 
                    else {z = rand() % lengz+1;
                        if (z==1) a = a-1;
                        else if (z==2) {if(b<N-1 && b>1) b = b-1; else b = b+1;}
                        else if (z==3) {if(b<N-2) b = b+1; else b = b-1;}}}
    else if (k==3) {if(b<N-1 && b>1) {b = b-1;} 
                    else {z = rand() % lengz+1;
                        if (z==1) b = b+1;
                        else if (z==2) {if(a<N-1 && a>1) a = a-1; else a = a+1;}
                        else if (z==3) {if(a<N-2) a = a+1; else a = a-1;}}}
    else if (k==4) {if(b<N-2) {b = b+1;} 
                    else {z = rand() % lengz+1; 
                        if (z==1) b = b-1;
                        else if (z==2) {if(a<N-1 && a>1) a = a-1; else a = a+1;}
                        else if (z==3) {if(a<N-2) a = a+1; else a = a-1;}}}
        } while (c[a][b] == '*');      
        c[N/2][N/2] = '+';
        c[a][b] = '*';  
        for ( i = 0; i < N; i++) {   
            for ( j = 0; j < N; j++) {
                printf(" %c", c[i][j]);
            }
        printf("\n");    
        }
        c[a][b] = '+'; 
    }
printf("\n");
for (l=0; l<K; l++){ 
    for (m=0; m<N; m++) {
        k = rand() % leng+1; 
        for (p=0; p<N; p++) { 
            if (k==1) n = n+1;
        else if (k==2) s = s+1;       
        else if (k==3) e = e+1;          
        else if (k==4) w = w+1;        
        } 
    }
    n = n/N; s = s/N; e = e/N; w = w/N; 
    sum1 += n; sum2 += s; sum3 += e; sum4 += w;
    }
    sum1 = sum1/N; sum2 = sum2/N; sum3 = sum3/N; sum4 = sum4/N;
        printf("La probabilità percentuale di spostamento verso Nord è: %.2lf\n", sum1); 
        printf("La probabilità percentuale di spostamento verso Sud è: %.2lf\n", sum2);
        printf("La probabilità percentuale di spostamento verso Est è: %.2lf\n", sum3);
        printf("La probabilità percentuale di spostamento verso West è: %.2lf\n", sum4);
    return 0;
}
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
,eccolo,è lungo perchè c'è anche una seconda parte nella quale vanno indicate le volte in cui si sposta a nord,sud,est o ovest in media su K=100 spostamenti,ancora non è commentato perchè non l'ho finito
Io lo sto eseguendo e non mi da problemi l'asterisco :grat:
 
  • Mi piace
Reazioni: roger21

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Non solo, nel primo e nel terzo for, devi togliere l' = dalla condizione ( i <= N ) e lasciare solo (i < N), sennò ti dà errore (in questo caso è "stack smashing detected", simile al segmentation fault)

- - - Updated - - -

sul pc del mio amico non lo esegue,sul mio sì ma poi si blocca,ho xcode e dopo la compilazione mi da(lldb) senza terminare di eseguire il programma
Toglie l'uguale nei cicli for (ho fatto un post sopra) :utonto:
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!