Arrays multidimensionales en C

Hasta ahora los arrays que hemos utilizado eran de una dimensión, vamos a ver ahora un array bidimensional (tabla de doble entrada).

– Prog090

/* Prog090.cpp */

#include <stdio.h>
#include <stdlib.h>
void main()
{
int matriz[20][5];
int i,j;
int aux; char
nada[1];
printf(«Vamos a generar un listado de notas nn»); for(i=0;i<20;i++)
{
printf(«n Fila %3d: «,i); for(j=1;j<5;j++)
{
matriz[i][j]=rand() % 10;
printf(«%d»,matriz[i][j]);
printf(» «);
}
}
printf(«nn Continuo (s/n) ? «); scanf(«%s»,&nada); if (nada[0]==’n’) return;
printf(«nn Vamos a calcular la media nn»); for(i=0;i<20;i++)
{
printf(«n La media de la fila %2d es: «,i); aux=0;
for(j=1;j<5;j++) aux=aux+matriz[i][j]; matriz[i][0]=aux/4;
printf(«%5d»,matriz[i][0]);
}
}

Estudio del PROG090:

– El programa utiliza un array bidimensional (matriz[20][5]) de 20 filas y 5 columnas, que simula las notas de 20 alumnos en 4 asignaturas. En la columna 0 del array, el programa coloca la media de las notas.
– Observa la línea: matriz[i][0]=aux/4;

La división entre números enteros (aux y 4), se trunca automáticamente para que sea otro entero (matriz[i][0])

– Prog091

/* Prog091.cpp */

#include <stdio.h>
void main()
{
int m1[2][2];
int m2[2][2];
int prod[2][2];
int i,j;
int aux;
/* Introducción de las matrices
*/ printf(«n Primera matriz n»); for(i=0;i<2;i++)
{
printf(«n Escribe los elementos de la fila %d:n»,i+1); for(j=0;j<2;j++) scanf(«%d»,&m1[i][j]);
}
printf(«n Segunda matriz n»); for(i=0;i<2;i++)
{

printf(«n Escribe los elementos de la fila %d:n»,i+1); for(j=0;j<2;j++) scanf(«%d»,&m2[i][j]);
}
/* Escritura de las dos matrices */ printf(«nn Tenemos: nn»); for(i=0;i<2;i++)
{
printf(» | «); for(j=0;j<2;j++)
{
printf(«%3d»,m1[i][j]);
}
printf(» |                | «);
for(j=0;j<2;j++)
{
printf(«%3d»,m2[i][j]);
}
printf(» | n»);
}
/* Cálculo del producto */
prod[0][0]=m1[0][0]*m2[0][0]+m1[0][1]*m2[1][0]; prod[1][0]=m1[1][0]*m2[0][0]+m1[1][1]*m2[1][0]; prod[0][1]=m1[0][0]*m2[0][1]+m1[0][1]*m2[1][1]; prod[1][1]=m1[1][0]*m2[0][1]+m1[1][1]*m2[1][1];
/* Escritura del resultado */
printf(«nn El producto de las dos matrices es: n»); for(i=0;i<2;i++)
{
printf(» | «); for(j=0;j<2;j++)
{
printf(«%5d»,prod[i][j]);
}
printf(» | n»);
}
}

– Prog092

/* Prog092.cpp */

/* Programa que lee un sistema de 3 ecuaciones con 3 incógnitas y escribe la matriz ampliada */
#include <stdio.h>
void main()
{
float a[3][4];
int j;
/* Introducción de datos */
printf(«n Primera ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[0][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[0][j]);
}
printf(«n»);
printf(«n Segunda ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[1][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[1][j]);
}
printf(«n»);
printf(«n Tercera ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[2][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[2][j]);
}
printf(«n»);
/* Escritura de la matriz ampliada */
printf(«nn»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);
}
– Prog093

/* Prog093.cpp */

/* Programa que lee un sistema de 3 ecuaciones con 3 incógnitas y resuelve el sistema por el método de GAUSS
Supongo la existencia de coeficientes distintos de cero en las incógnitas
Supongo también que el sistema es Compatible Determinado. */

#include <stdio.h>
void main()
{
float a[3][4];
int j,i,k;
float b;
float x[3],aux[3][4];

/* Introducción de datos */
printf(«n Primera ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[0][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[0][j]);
}
printf(«n»);
printf(«n Segunda ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[1][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[1][j]);
}
printf(«n»);
printf(«n Tercera ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[2][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[2][j]);
}
printf(«n»);

/* Escritura de la matriz ampliada */
printf(«nn»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++) printf(«t%7.2f»,a[2][j]); printf(«n»);

/* Método de GAUSS: hemos de conseguir una matriz triangular superior. */
for (i=0;i<=2;i++)
{
b=a[i][i];
// Observa que estoy suponiendo a[i][i] distinto de 0 for (j=i;j<=3;j++) a[i][j]=a[i][j]/b;
for (j=i+1;j<=2;j++)
{
b=a[j][i];
for (k=i+1;k<=3;k++) a[j][k]=a[j][k]-a[i][k]*b;
}
}

for (k=0;k<=2;k++)
{
i=2-k; b=0;
for (j=i+1;j<=2;j++) b=b+a[i][j]*x[j]; x[i]=a[i][3]-b;
}
a[1][0]=0;
a[2][0]=0;
a[2][1]=0;

/* Escribe la matriz resultante, Observa que es triangular superior. */ printf(«nn»);
printf(» |»);
for (j=0;j<=3;j++) printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);
printf(«nnX1= %f        X2= %f          X3= %f «,x[0],x[1],x[2]);
}

Prueba el prog093 para los sistemas:

3x +2y –5z = -8
-2x –4y +z = -7
5x –4y +2z = 3
Si todo funciona correctamente nos sale: x= 1 ; y=2 ; z=3

0x –5y +3z =-25
3x +0y –5z = 22
2x –7y +0z = -16
En este caso no funcionará porque a[0][0]= 0

1x +2y +3z = 4
2x +5y +3z = 6
2x +4y +5z = 3
Solución: x=-37 ; y=13 ; z=5

– Prog094

/* Prog094.cpp */

/* Programa que lee un sistema de 3 ecuaciones con 3 incógnitas y resuelve el sistema por el método de GAUSS */

#include <stdio.h>
void main()
{
float a[3][4];
int j,i,k;
float b,aux;
float x[3];
/* Introducción de datos */
printf(«n Primera ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[0][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[0][j]);
}
printf(«n»);
printf(«n Segunda ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[1][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[1][j]);
}
printf(«n»);
printf(«n Tercera ecuaciónn «); for (j=0;j<=3;j++)
{
if (j==3)
{
printf(«tTérmino independiente: t»); scanf(«%f»,&a[2][3]);
break;
};
printf(«tCoeficiente de x%d: t»,j+1); scanf(«%f»,&a[2][j]);
}
printf(«n»);
/* Escritura de la matriz ampliada
*/ printf(«nn»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);

/* Método de GAUSS: hemos de conseguir una matriz triangular superior. */
for (i=0;i<=2;i++)
{
if (a[i][i]==0)
{
j=i+1;
while (a[j][i]==0)
j=j+1; if (j==3)
{
printf(«n ES UN SISTEMA INCOMPATIBLE»);
return;
}
for (k=0;k<=3;k++)
{
aux=a[i][k];
a[i][k]=a[j][k];
a[j][k]=aux;
}
};

b=a[i][i];
for (j=i;j<=3;j++) a[i][j]=a[i][j]/b;
for (j=i+1;j<=2;j++)
{
b=a[j][i];
for (k=i+1;k<=3;k++) a[j][k]=a[j][k]-a[i][k]*b;
}
}
for (k=0;k<=2;k++)
{
i=2-
k; b=0;
for (j=i+1;j<=2;j++) b=b+a[i][j]*x[j]; x[i]=a[i][3]-b;
}
a[1][0]=0;
a[2][0]=0;
a[2][1]=0;
/* Escribe la matriz resultante, Observa que es triangular superior. */ printf(«nn»);
printf(» |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=3;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);
printf(«nnX1= %f        X2= %f          X3= %f «,x[0],x[1],x[2]);
}

Prueba el prog094 para los sistemas:

3x +2y –5z = -8
-2x –4y +z = -7
5x –4y +2z = 3
Si todo funciona correctamente nos sale: x= 1 ; y=2 ; z=3

0x –5y +3z =-25
3x +0y –5z = 22
2x –7y +0z = -16 Solución:
x=-1 ; y=2 ; z= -5

1x +2y +3z = 4
2x +5y +3z = 6
2x +4y +5z = 3
Solución: x=-37 ; y=13 ; z=5

x + y + z = 3
2x –5y –z = 5
3x –4y +0z = 8
Es compatible indeterminado, una de x=2 ; y=-0,5 ; z= 1,5

x +y +z = 2
x –y +z = -3
2x +0y +2z = 1
Es un sistema incompatible.

– Prog095

/* Prog095.cpp */

/* Programa que transforma una matriz en otra equivalente, pero triangular superior, por el método de GAUSS */

#include <stdio.h>
void main()
{
float a[3][3];
int j,i,k;
float b,aux;
/* Introducción de datos */
printf(«n Primera fila de la matrizn «); for (j=0;j<=2;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[0][j]);
}
printf(«n»);
printf(«n Segunda fila de la matrizn «); for (j=0;j<=2;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[1][j]);
}
printf(«n»);
printf(«n Tercera fila de la matrizn «); for (j=0;j<=2;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[2][j]);
}
printf(«n»);
/* Escritura de la matriz
*/ printf(«nn»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);

/* Método de GAUSS: hemos de conseguir una matriz triangular superior. */

for (i=0;i<=2;i++)
{
if (a[i][i]==0)
{
j=i+1;
while (a[j][i]==0)
j=j+1; if (j==2)
{
printf(«nNo sé hacerlo porque hay muchos ceros»); return;
}
for (k=0;k<=2;k++)
{
aux=a[i][k];
a[i][k]=a[j][k];
a[j][k]=aux;
}
};
b=a[i][i];
for (j=i+1;j<=2;j++)
{
b=a[j][i]/a[i][i];
for (k=i+1;k<=2;k++) a[j][k]=a[j][k]-a[i][k]*b;
}
}

a[1][0]=0;
a[2][0]=0;
a[2][1]=0;
/* Escribe la matriz triangular superior
*/ printf(«nn»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);
}

Matemáticamente no es del todo correcto, ya que en el caso a[i][i]=0, permutamos las filas de la matriz Pruébalo para la matriz de las incógnitas de los sistemas del programa anterior.

– Prog096

/* Prog096.cpp */

/* Programa que calcula el determinante por el método de GAUSS */
#include <stdio.h>
void main()
{
float a[3][3];
int j,i,k;
float b,aux,deter; deter=1;
/* Introducción de datos */
printf(«n Primera fila de la matrizn «); for (j=0;j<=2;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[0][j]);
}
printf(«n»);
printf(«n Segunda fila de la matrizn «); for (j=0;j<=2;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[1][j]);
}
printf(«n»);
printf(«n Tercera fila de la matrizn «); for (j=0;j<=2;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[2][j]);
}
printf(«n»);
/* Escritura del determinante
*/ printf(«nn»);
printf(»  |»);
for (j=0;j<=2;j++) printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++) printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);
/* Método de GAUSS: hemos de conseguir un determinante triangular superior. */
for (i=0;i<=2;i++)
{
if (a[i][i]==0)
{
j=i+1;
deter=-1;
while (a[j][i]==0)
j=j+1; if (j==2)
{
printf(«nNo sé hacerlo porque hay muchos ceros»); return;
}
for (k=0;k<=2;k++)
{
aux=a[i][k];
a[i][k]=a[j][k];
a[j][k]=aux;
}
};
b=a[i][i];
for (j=i+1;j<=2;j++)
{
b=a[j][i]/a[i][i];
for (k=i+1;k<=2;k++) a[j][k]=a[j][k]-a[i][k]*b;
}
}

a[1][0]=0;
a[2][0]=0;
a[2][1]=0;
/* Escribe la matriz triangular superior
*/ printf(«nn»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[0][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[1][j]); printf(«n»);
printf(»  |»);
for (j=0;j<=2;j++)
printf(«t%7.2f»,a[2][j]); printf(«n»);
deter=deter*a[0][0]*a[1][1]*a[2][2];
printf(«nEl determinante es %f»,deter);
}

Prueba els programa para los determinantes:

3 2 -5
-2 -4 1
5 -4 2

Solución: -134

0 -5 3
3 0 -5
2 -7 0

Solución: -13

1 2 3
2 5 3
2 4 5

Solución: -1

1 1 1
2 -5 -1
3 -4 0

Solución: 0

1 1 1
1 -1 1
2 0 2

Solución: 0

– Prog097

/* Prog097.cpp */

/* Programa que calcula un determinante de orden ‘n’ (n<=10) */

#include <stdio.h>
void main()
{
float a[10][10];
int j,i,k,n,s;
float b,aux,deter;
deter=1;
printf(«nCálculo de un determinante de orden ? «); scanf(«%d»,&n);
s=1;
/* Introducción de datos
*/ while (s<=n)
{
printf(«n Fila %d del determinanten «,s); for (j=0;j<=n-1;j++)
{
printf(«tColumna %d: t»,j+1); scanf(«%f»,&a[s-1][j]);
}
printf(«n»);
s++;
};
/* Escritura del determinante
*/ printf(«nn»);
for (s=0;s<=n-1;s++)
{
printf(»  |»);
for (j=0;j<=n-1;j++) printf(«t%7.2f»,a[s][j]); printf(«n»);
}

/* Método de GAUSS: hemos de conseguir un determinante triangular superior. */

for (i=0;i<=n-1;i++)
{
if (a[i][i]==0)
{
j=i+1;
deter=-1;
while (a[j][i]==0)
j=j+1; if (j==n-1)
{
printf(«nNo sé hacerlo porque hay muchos ceros»); return;
}
for (k=0;k<=n-1;k++)
{
aux=a[i][k];
a[i][k]=a[j][k];
a[j][k]=aux;
}
};

b=a[i][i];
for (j=i+1;j<=n-1;j++)
{
b=a[j][i]/a[i][i];
for (k=i+1;k<=n-1;k++) a[j][k]=a[j][k]-a[i][k]*b;
}
}

for (i=1;i<=n-1;i++)
{
for (k=0;k<=n-1;k++)
{
j=i-1-k;
a[i][j]=0; };
}

/* Escribe la matriz triangular superior
*/ printf(«nn»);
for (s=0;s<=n-1;s++)
{
printf(»  |»);
for (j=0;j<=n-1;j++)
printf(«t%7.2f»,a[s][j]); printf(«n»);
}
for (i=0;i<=n-1;i++) deter=deter*a[i][i];
printf(«nEl determinante es %f»,deter);
}

Pruébalo para los determinantes:

5 2 -3 5
-1 1 2 6
1 0 -1 7
3 1 0 8

Solución: -112

-3 0 1 3
2 -1 2 -2
1 2 3 4
-1 5 -4 5

Solución: -31

0 -1 0 -1 0
1 2 0 -1 1
2 1 -3 -2 2
-1 1 3 2 3
5 1 4 -3 4

Solución: 183

Fuente: Programación en C/C++ (Manual FV) de Fermí Vilà