PDA

Visualizza la versione completa : [C]Spostamento aal'interno di una matrice utilizzando i puntatori


bucciula
04-06-2009, 11:39
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();
}
:dhò: :dhò: :dhò:

sebaldar
04-06-2009, 11:52
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

bucciula
04-06-2009, 11:59
Ho modificato l'inizializzazione... in effetti ho sbagliato. Però continuo a non capire come si fa lo spostamento..... :(

sebaldar
04-06-2009, 12:19
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

bucciula
04-06-2009, 13:20
...grazie mille dovrei aver capito... ora provo a rivedermi anche l'aritmetica dei puntatori.... magari mi aiuta.
:) ciauu

giacomins87
04-06-2009, 13:37
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



#include <stdio.h>
#include <stdlib.h>

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

void print(int* mat, int n, int 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 n, int m) {
if (n <= 0 || m <= 0)
return 0;
else
return 1;
}

int check_move(int n, int m, int pos_i, int pos_j, int move_i, int move_j) {
int final_pos_i = pos_i+move_i, final_pos_j = pos_j+move_j;
if (final_pos_i >= n || 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];
int* punt = mat[0] ;
int pos_i = 0;
int pos_j = 0;

char str_coord[32];
snprintf(str_coord, 32, "(%d,%d) - Iniziale", 0,0);
size++;
coord = (char**) realloc(coord, size);
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_i, pos_j);
printf("\n\n");
}

if (scelta == '3') {
int move_i, move_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_coord, 32, "(%d,%d)", pos_i,pos_j);
size++;
coord = (char**) realloc(coord, size);
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 (i = 0;i< size;i++)
free(coord[i]);
free(coord);

}

sebaldar
04-06-2009, 15:10
a mio avviso ti conviene fare da solo, se hai difficoltà in qualche punto postala qui
ciao

Loading