Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Ruotare a DX e SX un' ARRAY MATRICE

    Ciao a tutti, sono 2 giorni che mi sto scervellando su come ruotare a destra e/o a sinistra una matrice (quadrata) in C.

    Di sicuro sarà una cavolata ma ora non mi viene proprio in mente.

    L'array l'ho creato e inizializzato in questo modo:

    char** matrice(int d, **p){
    int i, j;
    p=(char **) malloc(d * sizeof(char *));
    for(i=0;i<d; i++)
    p[i]=(char *)malloc( d * sizeof(char));

    for(i=0;i<d;i++){
    for(j=0;j<d;j++)
    p[i][j]='o';
    }
    return p;
    }


    Successivamente scritta una funzione che la stampasse.

    Ora mi serve un'altra funzione che, nel main, inserendo il comando r(destra) o l(sinistra), mi ruoti la matrice o a destra o a sinistra (di 90°).
    Spero di essere stato chiaro e spero che sappiate rispondere a questa mia domanda, grazie.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Ho corretto il titolo aggiungendo il linguaggio, ma devi indicarlo tu.

    Leggi il Regolamento per ulteriori indicazioni da seguire.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Prova così
    codice:
    printf("La matrice ruotata di 90 gradi a sinistra\n\n");
    for (i=0; i<n; i++) 
    {	for (j=0; j<n; j++)
    	printf("%c ", matrice[n-1-j][n-1-i] );
    printf ("\n");
    }
    printf("\n\nLa matrice ruotata di 90 gradi a destra\n\n");
    for (i=0; i<n; i++)
    {	for (j=0; j<n; j++)
    	printf("%c ", matrice[j][i]);
    printf ("\n");
    }

  4. #4
    Ok grazie Bersan, provo subito, poi ti farò sapere se va bene. Grazie ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Dopo pranzo si ragiona meglio!
    codice:
    /*
    Esempio di una matrice 3 per 3:
    			90° destra
    1  2  3			7  4  1
    4  5  6			8  5  2
     7  8  9			9  6  3
    		riga_nuova = colonna_vecchia
    		colonna_nuova = 3 - riga_vecchia - 1
    
    
    			90° sinistra
    1  2  3			3  6  9
    4  5  6			2  5  8
    7  8  9			1  4  7
    		riga_nuova = 3 - colonna_vecchia - 1
    		colonna_nuova = riga_vecchia
    	quindi per una matrice n per n
    */
    printf("\n\nLa matrice ruotata 90° a destra\n\n");
    for (i = 0; i<n; i++)
      {	for (j = 0; j<n; j++)
    	printf("%d ", mat[n-j-1][i]);
      printf("\n");
      }
    
    printf("\n\nLa matrice ruotata 90° a sinistra\n\n");
    for (i = 0; i<n; i++)
      {	for (j = 0; j<n; j++)
    	printf("%d ", mat[j][n-i-1]);
      printf("\n");
      }

  6. #6
    Ho provato come dicevi te bersan. Ci siamo quasi però.

    Nel senso che il comando ruota sinistra o ruota destra non deve stampare niente, è sempre il comando 'p' (da ricordare che al comando p è assegnata una funzione)che mi stampa la matrice.
    Quindi le 2 funzioni ruota(sinis o dest) mi devono salvare solo in **matrice quella nuova modificata, e poi col comando p stamparla.

    Qui di seguito scrivo una delle 2 funzioni che ho fatto: (ovviamente va tenuta in considerazione la funzione con malloc del mio primo messaggio)

    void ruota(int n, char **p){
    int i, j;
    for(i=0;i<n;i++){
    for(j=0; j<n ;j++)
    p[i][j]=p[j][n-1-i];
    }
    }

    Purtroppo però sembra non andar bene in quanto la matrice che mi stampa non me la ruota.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Lo sbaglio che fai nella funzione ruota è che modifichi i valori della matrice prima di averli sostituiti.
    Secondo me, nella funzione ruota, devi usare una matrice ausiliare n per n.
    Alloca la memoria per la matrice ausiliare.
    Nel ciclo invece di p[i][j]=p[j][n-1-i]; scrivi ausiliare[i][j]=p[j][n-1-i];
    Poi copia la ausiliare nella matrice p passata come parametro modificandola.
    Libera la memoria occupata dalla matrice ausiliare

  8. #8
    ok, hai ragione, quindi io ho fatto una nuova malloc per una copia della mia matrice n per n che verrà chiamata tutte le volte che ne creo una nuova. Quindi dovrei avere 2 matrici allocate giusto?? Quella che utilizzo e una ausiliaria.

    char** copia(int d, char **a){
    int i, j;
    a=(char **) malloc( d * sizeof(char *));
    for (i=0; i<d; i++)
    a[i]=(char *) malloc( d * sizeof(char));

    for (i=0; i<d; i++){
    for (j=0;j<d;j++)
    a[i][j]='o';
    }
    return a;
    }


    Poi nella mia funzione ruota ho fatto così:

    void ruotadx(int d, char **a, char **p){
    int i, j;
    for (i=0; i<d; i++){
    for (j=0;j<d;j++)
    a[i][j]=p[j][d-1-i];
    }
    }


    Fin qui dovrebbe essere giusto.
    Infine però come faccio a rimettere la a nella p??

    Grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Dovresti fare qualcosa del genere:
    codice:
    #include<stdio.h>
    void ruota(char **mat, int n, int verso)
    {
    int **tmp; // matrice ausiliaria
    int i, j;
    tmp = malloc(n*sizeof(char*));
    for (i = 0; i < n; i++)
    tmp[i] = malloc(n*sizeof(char));
    
    for (i=0; i<n; i++)
     for (j=0; j<n; j++)
    	{
    	if (verso == 1)  tmp[i][j] = mat[n-j-1][i];
    	if (verso == -1)  tmp[i][j] = mat[j][n-i-1];
    	}
    
    for (i=0; i<n; i++)
     for (j=0; j<n; j++)
       mat[i][j] = tmp[i][j]; // copio tmp nella mat
    
    for (i = 0; i < n; i++) // dealloco la matrice ausiliare
    	free(tmp[i]);
    free(tmp);
    }
    void stampa(char **mat, int n)
    {
    int i, j;
    for (i=0; i<n; i++)
       { for (j=0; j<n; j++)
          printf("%c ", mat[i][j]);
       printf("\n");
      }
    }
    main()
    {
    int i, j, n;
    char **mat;
    printf("Dimensione della matrice: ");
    scanf("%d",&n);
    mat = malloc(n*sizeof(char*));
    for (i = 0; i < n; i++)
    mat[i] = malloc(n*sizeof(char));
    char c = 'a';
    for (i=0; i<n; i++) {
     for (j=0; j<n; j++){
    	mat[i][j] = c;  // riempio la matrice con le lettere dalla 'a' alla a + n*n
    	c++; // naturalmente tu la riempi come ti pare
    	}
    }
    
    printf("La matrice: \n");
    stampa(mat, n);
    int verso;
    printf("\n Per ruotare la matrice a destra digitare 1 a sinistra -1. \t");
    scanf("%d", &verso);
    while (verso != 1 && verso!= -1)
    	{
    	printf("Devi digitare soltanto 1 o -1. \t");
    	scanf("%d", &verso);
    	}
    printf("Ruoto la matrice di 90 gradi a ");
    if (verso == 1) printf("destra\n");
    else	printf("sinistra\n");
    ruota(mat, n, verso);
    stampa(mat, n);
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.