Programma in C

di il
1 risposte

Programma in C

Ho realizzato questo programma pero' adesso dovrei riuscire a spostare la mia X nell array 2D a destra o sinistra in base della scelta dell utente.
Ma non saprei come fare .
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void visualizza_scacchiera(char *,int ,int,int);
int main() {

//inizializziamo la nostra scacchiera
char a[][5]=         {{' ',' ','  ','  ','  '},
                      {'  ','  ','  ','  ','  '},
                      {'  ','  ','  ','  ','  '},
                      {'  ','  ','  ','  ',' '},
                      {'  ','  ','  ','  ','  '},
                      {' ','  ',' X',' ','  '}} ;
visualizza_scacchiera(&a[0][0],5,   6, 5); 
                                     
                      }
 
                      
                                                                
void visualizza_scacchiera(char *pa,int n_col,int n,int m ) 
{
int i,j,sposta;
// stampiamo scacchiera
printf("------------PERCORSO----------- \n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%5c",*(pa+n_col*i+j));
printf("\n");
}
// termina stampa scacchiera
system("pause");
}

1 Risposte

  • Re: Programma in C

    Ciao,

    non sò se possa esserti realmente d'aiuto ma ti consiglio di dare un sguardo a questo link:

    È vero che tratta di ordinamento degli array ma magari ti fà venire qualche idea su come manipolare gli array e come spostare i valori a seconda del verificarsi di una data condizione.

    Altrimenti potresti utilizzare un medoto più spartano ( e meno efficace in quando devi creare la copia di un valore, occupando più memoria e quindi allungando il tempo dell'esecuzione).
    Ovvero potresti, supponendo di avere l'array a[3][3] e dovendo modificare il 2d "a[2]":
    -verificatasi la condizione "sposta a sinistra":
    copio il valore di a[2][1] in una char b; (volendo potresti copiare a[2][2] ma in questo modo sia per sx che dx i valori sono uguali)
    sovrascrivo a[2][1] con il valore di a[2][2]
    azzero a[2][2] (= ' ')
    sovrascrivo a[2][0] con il valore di b (copia di ex a[2][1])
    -verificatasi la condizione "sposta a destra": idem ma all'inverso.

    Ho preparato un piccolo programmino per mostrarti quando detto (scritto e testato su linux comunque dovrebbe essere ansi-c).
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    int main(int argc, char *argv[])
    {
        if(argc < 2)
        {
            printf("Usage %s -sx|-dx\n", argv[0]);
            exit(EXIT_SUCCESS);
        }
        char a[3][3] = {{ 'a', 'b', 'c'},
                         { 'd', 'e', 'f'},
                         { 'g', 'h', 'i'}};
        printf("ora a[2][0] vale -> %c\n", a[2][0]);
        printf("ora a[2][1] vale -> %c\n", a[2][1]);
        printf("ora a[2][2] vale -> %c\n", a[2][2]);
        if (strcmp("-sx", argv[1]) == 0)
        {
            printf("-- sposto verso sinistra di una posizione --\n");
            char b = a[2][1]; // creo una copia del valore
            a[2][1] = a[2][2];
            a[2][2] = ' ';
            a[2][0] = b; // contiene "h"
        }
        else if (strcmp("-dx", argv[1]) == 0)
        {
            printf("-- sposto verso destra di una posizione --\n");
            char b = a[2][1]; // creo una copia del valore
            a[2][1] = a[2][0];
            a[2][2] = b;
            a[2][0] = ' ';
        }
        printf("ora a[2][0] vale -> %c\n", a[2][0]);
        printf("ora a[2][1] vale -> %c\n", a[2][1]);
        printf("ora a[2][2] vale -> %c\n", a[2][2]);
        return 0;
    }


    Bene, ricorda che la copia di un valore andrebbe evitata ma attualmente il metodo più facile che mi è venuto in mente è questo, gli algoritmi del link sopra evitano la copia ma hanno il "difetto" che su grande mola di dati tendono ad inchiodarsi (ovviamente).

    nel tuo caso quindi farei un semplice:
    per sx
    a[6][2] = a[6][3];
    a[6][3] = ' ';
    e per spostare a dx cambiando i valori della colonna.

    Non mi dilungo oltre, se servono chiarimenti risponderò quanto prima, ricordando che comunque non è il metodo più efficace o elegante del mondo, ma tant'è che funziona e in piccoli programmini che non richiedono una particolare ottimizzazione può andare...

    Ciao ciao!

    PS. visto solo ora la data del post LOL, magari non leggerai nemmeno questa mia risposta, oramai comuqnue è postato. Magari tra un po' di tempo lo userò come promemoria.
Devi accedere o registrarti per scrivere nel forum
1 risposte