Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    30

    [C]Spostamento aal'interno di una matrice utilizzando i puntatori

    Ciao a tutti... per l'ennesima volta mi trovo di fronte a un esercizio dove non riesco ad andare avanti.. il testo è questo:
    /*CREARE UNA MATRICE NxM DI INTERI(CON N E M DEFINITI DALL'UTENTE). IMPOSTATE LA MATRICE CON TUTTI GLI ELEMENTI A 0.
    DEFINIRE UN PUNTATORE AD INTERI CHE PUNTI ALL'ELEMENTO(0,0)DELLA MATRICE.
    SCRIVERE L'ALGORITMO CHE SPOSTI IL PUNTATORE DI I CASELLE IN BASSO E DI J CASELLE A
    DESTRA(DOVE I E J SONO NUMERI CASUALI COMPRESI RISPETTIVAMENTE TRA 0 E N E TRA 0 E M). RIPETERE L'OPERAZIONE
    DI SPOSTAMENTO DEL PUNTATORE UN NUMERO DI VOLTE DEFINITO DALL'UTENTE E INCREMENTARE DI UNO OGNI
    ELEMENTO DELLA MATRICE CHE VIENE PUNTATO DAL PUNTATORE. STAMPARE LE COORDINATE DI TUTTI I MOVIMENTI
    DEL PUNTATORE E LA MATRICE OTTENUTA ALLA FINE DEGLI SPOSTAMENTI DEL PUNTATORE. */


    Io ho fatto in questo modo... ma quando arrivo allo spostamento non so come fare...

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define N 5
    #define M 8

    int main()
    {
    int v[N][M];
    int i, j, Giu, Dx;
    int *punt;

    srand(time(NULL));

    punt=&v[N][M];//punto all'elemento 0,0 della matrice

    //inizializzo tutti gli elementi a 0

    for(i=0;i<N;i++){
    for(j=0;j<M;j++){
    v[i][j]=0;
    printf("%2d", v[i][j]);
    }printf("\n");
    }

    Giu=rand()%N;
    Dx=rand()%M;
    .........
    ..........

    fflush(stdin);
    getchar();
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    l'inizializzazione la devi fare
    v[i][j] = 0;

    se punt è un puntatore al primo elemento della matrice
    punt + i + j * M;
    ad occhio e croce dovrebbe puntare all'elemento i,j.

    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    30
    Ho modificato l'inizializzazione... in effetti ho sbagliato. Però continuo a non capire come si fa lo spostamento.....

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    l'artmetica dei puntatori garantisce che se punt è un puntatore ad int, p+1 punta al successivo intero.
    La prima riga della matrice sarà quindi compresa tra

    punt e punt + (N - 1)

    punt +N sarà il primo elemento della seconda riga

    punt +N + 1 il secondo elemento della seconda riga

    e così via

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    30
    ...grazie mille dovrei aver capito... ora provo a rivedermi anche l'aritmetica dei puntatori.... magari mi aiuta.
    ciauu

  6. #6
    Ciao, l'esercizio interessava pure me.
    Prova a dare un'occhiata alla mia soluzione, potrebbe interessarti.
    Probabilmente avrò commesso qualche errore (spero non troppi), ma sono un pò arrugginito col C

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>

    void clear(intmatint nint m){
       
    int i,j;
       for(
    i=0;i<n;i++) {
          for(
    j=0;j<m;j++) {
             
    mat[j] = 0;
          }
          
    mat+=m;
       }
    }

    void print(intmatint nint m) {
       
    int i,j;
       for(
    i=0;i<n;i++) {
          for(
    j=0;j<m;j++) {
             
    printf("%d | "mat[j]);
          }
          
    mat+=m;
          
    printf("\n");
       }
    }

    int check_param(int nint m) {
       if (
    <= || <= 0
          return 
    0;
       else 
          return 
    1;
    }

    int check_move(int nint mint pos_iint pos_jint move_iint move_j) {
       
    int final_pos_i pos_i+move_ifinal_pos_j pos_j+move_j;
       if (
    final_pos_i >= || final_pos_j >= m) return 0;
       else return 
    1;
    }

    int main() {
       
    int n,m;
       
    char** coord NULL;
       
    int size 0;

       
    printf("N: ");
       
    scanf("%d", &n);
       
    printf("M: ");
       
    scanf("%d", &m);
       
    printf("\n");

       
    int mat[n][m];
       
    intpunt mat[0] ; 
       
    int pos_i 0;
       
    int pos_j 0;

       
    char str_coord[32];
       
    snprintf(str_coord32"(%d,%d) - Iniziale"0,0);
       
    size++;
       
    coord = (char**) realloc(coordsize);
       
    coord[size-1] = (char*) malloc(32);
       
    snprintf(coord[size-1], 32"%s"str_coord);


       
    clear(mat[0],n,m);

       
    char scelta;   
       do {
          
    printf("1. Stampa matrice\n");
          
    printf("2. Posizione attuale puntatore\n");
          
    printf("3. Sposta\n");
          
    printf("4. Stampa posizioni puntatore\n");
          
    printf("q. Esci\n");
          
    scanf("%s", &scelta);
       
          if (
    scelta == '1') {
             
    printf("\n\n");
             print(
    mat[0],n,m);
             
    printf("\n\n");
          }

          if (
    scelta == '2') {
             
    printf("\n\n");
             
    printf("(i,j) = (%d,%d)\n"pos_ipos_j);
             
    printf("\n\n");
          }

          if (
    scelta == '3') {
             
    int move_imove_j;        
             
    printf("\n\n");
             
    printf("Numeri negativi: spostamenti a sinistra (indice i) o in alto (indice j)\n");
             
    printf("Spostamento riga: ");
             
    scanf("%d", &move_i);
             
    printf("Spostamenti colonna: ");
             
    scanf("%d", &move_j);

             
             if (
    check_move(n,m,pos_i,pos_j,move_i,move_j)) {
                
    pos_i += move_i;
                
    pos_j += move_j;
                
    punt mat[pos_i];
                
    punt[pos_j] +=1
                

                
    char str_coord[32];
                
    snprintf(str_coord32"(%d,%d)"pos_i,pos_j);
                
    size++;
                
    coord = (char**) realloc(coordsize);
                
    coord[size-1] = (char*) malloc(32);
                
    snprintf(coord[size-1], 32"%s"str_coord);
             
             }
                            
             else 
    printf("\nLo spostamento va oltre i limiti della matrice");

             
    printf("\n\n");
          }

          if (
    scelta == '4') {
             
    printf("\n\n");
             
    int i;
             for(
    i=0;i<size;i++)
                
    printf("%s\n"coord[i]);
             
    printf("\n\n");
          }
       
       } while (
    scelta != 'q');

       
    int i;
       for (
    0;isize;i++)
          
    free(coord[i]);
       
    free(coord);
       


  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    a mio avviso ti conviene fare da solo, se hai difficoltà in qualche punto postala qui
    ciao

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 © 2024 vBulletin Solutions, Inc. All rights reserved.