PDA

Visualizza la versione completa : [c++] creare una matrice..


giocciu
17-01-2008, 16:26
ciao a tutti!!
sono nuovo del forum... vi vorrei chiedere una cortesia...
vorrei creare funzione che dia una matrice n*n da due vettori di dimensione variabile n...

come faccio a creare i vettori di dimensione variabile??
se è possibile anche una piccola spiegazione...
thanks!! :master:

MItaly
17-01-2008, 16:45
Ecco un esempio (molto) commentato che ho scritto qualche anno fa.


/*
Programma di esempio per l'allocazione dinamica di array by Matteo Italia, creato tra il 10 e l'11 Dicembre 2005
Nota: per divertirsi si possono inserire dei numeri piuttosto grossi; nel migliore dei casi il programma dirà
che non c'è abbastanza memoria, nel peggiore inizierà ad allocarla, e guardando nel task manager il grafico
"utilizzo memoria" ci si renderà conto della brusca impennata...
*/
/*Per printf, scanf, ...*/
#include "stdio.h"
/*Per getchar*/
#include "conio.h"
/*Per malloc, free, rand, srand*/
#include "stdlib.h"
/*Per time*/
#include "time.h"
/*Costanti di codici di errori standard da winerr.h*/
#define ERROR_SUCCESS 0L
#define ERROR_OUTOFMEMORY 14L

/*Punto d'ingresso*/
int main()
{
/*Puntatore ad interi (dopo punterà all'area per l'array)*/
int *array;
/*Varie variabili*/
unsigned int ind1=0, ind2=0, count1, count2;
/* ^| ^| ^| ^+ contatore per le colonne
| | + contatore per le righe
| + numero di colonne
+ numero di righe
Nota: inizializzo ind1 e ind2 perché le variabili locali non vengono inizializzate
automaticamente; se l'utente in seguito non inserisse nulla o inserisse solo il primo valore,
una o entrambe le variabili resterebbe(ro) immutata(e), ossia con un valore indeterminato. */
printf("Inserire le dimensioni della matrice [righe,colonne]: ");
/*Richiesta delle dimensioni dell'array*/
scanf("%u,%u",&ind1,&ind2);
printf("Servono %u bytes. ",ind1*ind2*sizeof(int));
printf("Allocazione della memoria...\n");
/*Alloca la memoria*/
array=(int *) malloc(ind1*ind2*sizeof(int));
if (array==NULL)
{
/*Se malloc ha restituito un puntatore NULL significa che non c'è abbastanza memoria*/
printf("Memoria insufficiente.\n");
printf("Premere un tasto per uscire...");
getch();
/*Restituisce il codice di errore corrispondente*/
return ERROR_OUTOFMEMORY;
}
/*Ok, la memoria è stata allocata correttamente*/
printf("Memoria allocata.\n");
printf("Inizializzazione generatore numeri casuali...\n");
/*Inizializza il generatore di numeri casuali*/
srand((unsigned int ) time(NULL));
/* ^^^^^^^^^^ restituisce l'ora corrente
^^^^^^^^^^^^^^^^^^^^^^^^^^ ora corrente come intero senza segno usato come seme per srand*/
/*Ciclo per riempire l'array*/
printf("Riempimento array...\n");
for (count2=0;count2<ind2; count2++)
{
for (count1=0; count1<ind1; count1++)
{
*((int *) array+(count1*ind2)+count2)=rand();
/*
Esempio: questa tabella
0 1 2 3 4
+--+--+--+--+--+
0| | | | | |
+--+--+--+--+--+
1| | | | | |
+--+--+--+--+--+
2| | | | | |
+--+--+--+--+--+
3| | |[]| | |
+--+--+--+--+--+
4| | | | | |
+--+--+--+--+--+
5| | | | | |
+--+--+--+--+--+
come si può immaginare, in memoria è così:
Coordinate XY 00 01 02 03 04 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 40 41 42 43 44 50 51 52 53 54
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | | | | | | | | | | | | | | | | |[]| | | | | | | | | | | | |
Posizione +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
(array + ...) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Per raggiungere la posizione del quadratino [] (2,3):
1. Si ricava lo shift di posizioni rispetto a (0,0), ossia da array
a. Si moltiplica la riga della posizione desiderata (3) per il numero di colonne (5) -> 3*5=15
b. Si aggiunge la colonna della posizione desiderata (2) -> 15+2=17 (vedi sopra)
2. Si somma lo shift alla locazione di memoria di (0,0), ossia ad array,avendo cura di usare
(tipo *) (qui tipo è int) perché il C applichi correttamente l'aritmetica dei puntatori.
*/

}
}
printf("Array riempito\n");
for (count2=0;count2<ind2; ++count2)
{
for (count1=0 ; count1<ind1; ++count1)
{
/*Stesso ragionamento*/
printf("%d",*((int *) array+(count1*ind2)+count2));
printf("\t");
}
printf("\n");
}
printf("Deallocazione array...\n");
/*Dealloca la memoria*/
free(array);
printf("Premere un tasto per uscire...");
getch();
/*Tutto è andato a finire bene; codice d'uscita standard.*/
return ERROR_SUCCESS;
}

Loading