viernes, 23 de octubre de 2015

Arreglos Multidimensional

Concepto


Los arrays multidimensionales son una estructura de datos que almacenan los valores en más de una dimensión. Los arrays que hemos visto hasta ahora almacenan valores en una dimensión, por eso para acceder a las posiciones utilizamos tan solo un índice. Los arrays de 2 dimensiones guardan sus valores, por decirlo de alguna manera, en filas y columnas y por ello necesitaremos dos índices para acceder a cada una de sus posiciones. 

Dicho de otro modo, un array multidimensional es como un contenedor que guardara más valores para cada posición, es decir, como si los elementos del array fueran a su vez otros arrays. 

La declaración de los arreglos bidimensionales, caso particular de los arreglos multidimensionales, se hace como en el siguiente ejemplo:

En la primera línea se reserva espacio para 3 × 4 = 12 elementos doble precisión. El primer subíndice varía entre 0 y 2, y el segundo varía entre 0 y 3. Usualmente, de manera análoga a las matrices, se dice que el primer subíndice indica la fila y el segundo subíndice indica la columna.



Ejemplos de arreglos multidimensional 

Ejemplo#1
“Este programa imprimirá las fila y las columna del vector  multidimensional  3x4”





Ejemplo #2 

En el siguiente ejemplo, el programa sirve para leer matrices, escribirlas y calcular el producto. Lo hace mediante la utilización de funciones que tienen como parámetros arreglos bidimensionales:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void lect_ao(double a[][40], int m, int n, char c );
void escra_ao(double a[][40], int m, int n );
int prodAB0(double a[][40], int m, int n, double b[][40],
int p, int q, double c[][40]);
main()
{
double a[50][40], b[20][40], c[60][40];
int m, n, p, q;
printf("\n Producto de dos matrices.\n");
printf(" num. de filas de A : ");
scanf( "%d", &m);
printf(" num. de columnas de A : ");
scanf( "%d", &n);
// Es necesario controlar que m, n no son muy grandes
// Ni negativos
printf(" num. de filas de B : ");
scanf( "%d", &p);
printf(" num. de columnas de B : ");
scanf( "%d", &q);
if( n != p ){
printf(" Producto imposible\n");
exit(1);
// En el lenguaje C para terminar una aplicación desde la función main
}
Lect_ao(a, m, n, 'A');
printf(" A : \n");
escr_ao(a, m, n);
lect_ao(b, n, q, 'B');
printf(" B : \n");
escr_ao(b, n, q);
if( prodAB0(a,m,n, b,p,q, c) )
{
printf(" C : \n");
escrA0(c, m, q);
}
else printf("\ ERROR\n");
return 0;

//------------------------------------------------

void lect_ao(double a[][40], int m, int n, char c )
{
// lectura de los elementos de una matriz.
int i, j;
for( i = 0; i < m; i++){
for( j=0; j < n; j++){
printf(" %c[%d][%d] = ", c, i+1, j+1);
scanf("%lf", &a[i][j] );
}
}
}
//------------------------------------------------
void escr_ao(double a[][40], int m, int n )
{
// escritura de los elementos de una matriz
int i, j;
int nEltosLin = 5; // numero de elementos por linea
for( i = 0; i < m; i++){
for( j = 0; j < n; j++){
printf("%15.8lf", a[i][j]);
if((j+1)%nEltosLin == 0 || j==n-1)printf("\n");
}
}
}
//------------------------------------------------
int prodAB0(double a[][40], int m, int n, double b[][40],int p, int q, double c[][40])
{
// producto de dos matrices, a mxn, b pxq
// devuelve 1 si se puede hacer el producto
// devuelve 0 si no se puede
int i, j, k;
double s;
if(m<0||n<0||p<0||q<0 || n!= p ) return 0;
for( i=0; i < m; i++){
for( j=0; j < q; j++){
s = 0.0;
for( k=0; k<n; k++) s += a[i][k]*b[k][j];
c[i][j] = s;
}
}
return 1;

En el ejemplo, en la función lect_ao, antes de la lectura del elemento a[i][j], el programa escribe los valores i+1 y j+1, entonces para el usuario el primer subíndice empieza en 1 y acaba en m; el segundo empieza en 1 y acaba en n.













No hay comentarios:

Publicar un comentario