ARREGLOS
BIDIMENSIONALES
MATRICES
M. en C. Marisol Hernández López Academia Computación
CONCEPTO Y FORMA GENERAL
• En los lenguajes de programación están implementados los arreglos de dos dimensiones o
bidimensionales conocidos como matrices.
• La posición de un elemento dentro de una matriz viene determinada por dos índices, los cuales
representan la fila(i) y la columna(j) donde se encuentra almacenado
• Tanto las filas como las columnas comienzan a numerarse desde 0 hasta el límite N-1 para las
filas y M-1 para las columnas, como se muestra a continuación:
j-> [0] [1] [2] … [M-1]
i-> [0]
MATRIZ[N][M] [1]
[2]
…
[N-1]
M. en C. Marisol Hernández López Academia Computación
REPRESENTACIÓN EN EL DIAGRAMA DE FLUJO
• Una matriz puede utilizar cualquiera de las operaciones definidas por el diagrama de flujo, como son:
entrada, salida, proceso y evaluación de condición.
• La sintaxis para definirla se establece a través del manejo de sus indices en el siguiente orden, primero la fila
representada por el indice [ i ] y despues la columna representada por el indice [ j ].
MAT[i][j]= A*B SI MAT[i][j]
MAT[i][j] MAT1[i][j]= MAT2[i][j]
MAT[i][j] modulo2=0
ENTRADA PROCESO PROCESO
SALIDA
EVALUACION DE CONDICION
M. en C. Marisol Hernández López Academia Computación
DECLARACION DE LOS ARREGLOS BIDIMENSIONALES
• Las matrices también deben ser declaradas antes de utilizarlas, especificando la longitud de sus
filas y columnas. La sintaxis de declaración en lenguaje C se muestra como sigue:
tipo_dato nombre_MATRIZ[longitud_filas][longitud_columnas];
Ejemplos:
int matriz[F][C]; //F y C son longitudes previamente definidas con #define.
float mat[5][5];
double m[20][30];
El acceso a un arreglo bidimensional se puede realizar de dos formas:
1. Individual o directo a un solo elemento, mediante el identificador de la matriz y especificando la
posición exacta de la fila y la columna del dato.
2. Automático o conjunto, utilizando dos estructuras iterativas anidadas de tipo for, debido a que se
deben manejar los indices para la fila(i) y para la columna(j).
M. en C. Marisol Hernández López Academia Computación
ACCESO A LAS MATRICES DE FORMA INDIVIDUAL O DIRECTO A UN SOLO ELEMENTO
Sintaxis en lenguaje C, se utiliza el nombre de la matriz y el índice de la fila y la columna:
nombre_ MATRIZ[fila][columna]
Ejemplos:
printf(“El elemento es: %f”,mat[0][3]); //Imprime el dato que se encuentra en la posición de la fila 0
y la columna 3.
A=matriz[0][1]*B; //Calcula la multiplicación del dato en la posicion fila 0, columna 1 por el valor de
la variable B y se almacena en la variable A.
scanf(“%d”,&m[3][4]); //Almacena un valor en el elemento de la matriz que está en la posición fila 3 y
columna4.
ACCESO A LAS MATRICES DE FORMA AUTOMATICA O EN CONJUNTO
El acceso se realiza mediante el recorrido a través de las filas o las columnas de la matriz, utilizando
la estructura for anidada, el recorrido básico siempre es a través de las filas.
Como se define a continuación:
M. en C. Marisol Hernández López Academia Computación
RECORRIDO POR FILAS:
Subrutina para ingresar datos a una matriz: CREAR_MATRIZ
CREAR_MATRIZ
i=0
i=i+1
j -> [0] [1] [2] [3] [4]
Si Si
i-> [0]
PARA PARA MAT[i][j]
i<N j=0 j<M j=j+1 [1]
[2]
No No
[3]
FIN [4]
OBSERVAR: La estructura for anidada controla los indices
i y j, para que resulte un recorrido por filas el for externo Representación del recorrido
debe contener el indice de las filas que es i y el for interno
contiene el indice de las columnas que es j, recordar que
por filas de la matriz MAT[i][j].
las longitudes para las filas y columnas estan dadas por N Cuando N=5 y M=5
y M, definidas por el usuario.
M. en C. Marisol Hernández López Academia Computación
Subrutina para imprimir los datos de una matriz: IMPRIMIR_MATRIZ
IMPRIMIR_MATRIZ
i=0 j -> [0] [1] [2] [3] [4]
i=i+1 i-> [0]
[1]
PARA
Si PARA Si
MAT[i][j] [2]
i<N j=0 j<M j=j+1
[3]
No No [4]
FIN
M. en C. Marisol Hernández López Academia Computación
SINTAXIS EN LENGUAJE C: PROCESAMIENTO DE LA MATRIZ POR FILAS
-FUNCION: CREAR_MATRIZ(). -FUNCION: IMPRIMIR_MATRIZ().
void CREAR_MATRIZ(int mat[][C],int &n, int &m) void IMPRIMIR_MATRIZ(int mat[][C],int &n, int &m)
{ {
int i,j; int i,j;
for(i=0;i<n;i++) for(i=0;i<n;i++)
{ {
for(j=0;j<m;j++) for(j=0;j<m;j++)
{ {
printf(“Ingresa el dato: ”); printf(“ %d ”,mat[i][j]);
scanf(“%d”,&mat[i][j]); }
} printf(“\n”);
} }
} }
M. en C. Marisol Hernández López Academia Computación
EJECUCIÓN DEL PROGRAMA CON RECORRIDO POR FILAS:
M. en C. Marisol Hernández López Academia Computación
RECORRIDO POR COLUMNAS:
Subrutina para ingresar datos a una matriz: CREAR_MATRIZ
CREAR_MATRIZ
j=0
j -> [0] [1] [2] [3] [4]
j=j+1
i-> [0]
[1]
SI Si
PARA PARA
j<M
i=0 i<N
MAT[i][j]
i=i+1 [2]
[3]
NO No
[4]
FIN
OBSERVAR: Nuevamente se utiliza una estructura Representación del recorrido
for anidada, ahora el for externo controla las por columnas de la Matriz
columnas definidas por j y el for interno controla MAT[i][j].
las filas definidas por i. Cuando N=5 y M=5
M. en C. Marisol Hernández López Academia Computación
SINTAXIS EN LENGUAJE C: PROCESAMIENTO DE LA MATRIZ POR COLUMNAS
-FUNCION: CREAR_MATRIZ(). -FUNCION: IMPRIMIR_MATRIZ().
void CREAR_MATRIZ(int mat[][C],int &n, int &m) void IMPRIMIR_MATRIZ(int mat[][C],int &n, int &m)
{ {
int i,j; int i,j;
for(j=0;j<m;j++) for(i=0;i<n;j++)
{ {
for(i=0;i<n;i++) for(j=0;j<m;i++)
{ {
printf(“Ingresa el dato: ”); printf(“ %d ”,mat[i][j]);
scanf(“%d”,&mat[i][j]); }
} printf(“\n”);
} }
} }
OBSERVAR: La función imprimir es la misma en los dos
procesamientos. Así se utilizará en todos los ejercicios.
M. en C. Marisol Hernández López Academia Computación
EJECUCIÓN DEL PROGRAMA CON RECORRIDO POR COLUMNAS:
M. en C. Marisol Hernández López Academia Computación
PROGRAMA PRINCIPAL:
#include <conio.h> Constantes para definir la longitud
#include <stdio.h> de las filas (F) y las columnas (C).
#define F 20
#define C 20
INICIO void CREAR_MATRIZ(int [][C],int &, int &);
void IMPRIMIR_MATRIZ(int [][C],int &, int &);
N,M void main()
{
int N,M,MATRIZ[F][C];
CREAR_MATRIZ printf(“Cuantas filas: ");
scanf("%d",&N);
printf(“Cuantas columnas: ");
IMPRIMIR_MATRIZ scanf("%d",&M);
CREAR_MATRIZ(MATRIZ,N,M);
IMPRIMIR_MATRIZ(MATRIZ,N,M);
FIN
getch();
}
M. en C. Marisol Hernández López Academia Computación
EJEMPLO 1: Desarrollar el diagrama de flujo y la codificación de un programa que contiene las calificaciones de
las 3 evaluaciones departamentales de N alumnos, el programa calcula el promedio grupal por departamental y
tambien indica cuál es la calificación más alta y la más baja de los tres departamentales.
INICIO
CREAR_MATRIZ
IMPRIMIR_MATRIZ
CALIFICACION_ALTA
CALTA
CALIFICACION_BAJA
CBAJA
PROMEDIO_DEPART
FIN
M. en C. Marisol Hernández López Academia Computación
El almacenamiento se realiza por columna debido a que cada columna representa cada uno de los tres
departamentales y las filas representan a cada uno de los N alumnos evaluados.
El modelo es el siguiente: Por ejemplo, si N=5 alumnos
CREAR_MATRIZ
j=0
j=j+1
SI SI
PARA
i=0 PARA CALIF[i][j] i=i+1
j<M i<N
NO NO
FIN
M. en C. Marisol Hernández López Academia Computación
El proceso de la impresión se realiza por fila pues es la función básica.
El modelo de la matriz queda como sigue:
IMPRIMIR_MATRIZ
i=0
i=i+1
SI SI
PARA PARA CALIF[i][j]
i<N j=0 j<M
j=j+1
NO NO
FIN
M. en C. Marisol Hernández López Academia Computación
Para calcular la calificación más alta se realiza un recorrido por toda la matriz comparando las calificaciones
entre sí, se utiliza la variable CALTA para almacenar la calificación alta que se tenga en ese instante, para evaluar
esta condición CALTA necesita un valor inicial en este caso es 0 debido a que la primera calificación que se
evalue será la mas alta y se tendrá como referencia para la siguiente evaluación, que decidirá si esa es la
calificación más alta o se sutituye por la actual.
CALIFICACION_ALTA
CALTA=0
i=0
i=i+1
SI SI NO
IF
PARA PARA
j=0 j<M
CALIF[i][j]≥
j<N CALTA
NO NO
SI
FIN
CALTA=CALIF[i][j]
j=j+1
M. en C. Marisol Hernández López Academia Computación
El mismo proceso se realiza para encontrar la calificación baja, sólo que esta vez la variable CBAJA se inicializa
con 10 debido a que de esta manera la primera calificación que se evalue cumpla con la condición de ser la
primera calificación baja y pueda tomarse como referencia para las siguientes evaluaciones.
CALIFICACION_BAJA
CBAJA=10
i=0
i=i+1
SI SI NO
IF
PARA PARA
i<N j=0 j<M
CALIF[i][j]≤
CBAJA
NO NO
SI
FIN
CBAJA=CALIF[i][j] CBAJA=CBAJA
j=j+1
M. en C. Marisol Hernández López Academia Computación
Se realiza el proceso para calcular el promedio por cada uno de los departamentales, en este caso, se procesa
por cada una de las columnas de la matriz, considerando que la columna 0 corresponde al primer
departamental, la columna 1 al segundo y la columna 2 al tercero.
PROMEDIO_DEPART
SUM1=0 Observar que por esta razón el procesamiento es
SUM2=0
SUM3=0
como si fuera un vector, utilizando solo una
estructura for y dejando fijo el valor de la
columna en el procesamiento.
i=0
1er. PARA
SI
SUM1=SUM1+CALIF[i][0] i=i+1
Departamental i<N
NO
i=0
2o.
SI
PARA SUM2=SUM2+CALIF[i][1] i=i+1
Departamental i<N
NO
M. en C. Marisol Hernández López Academia Computación
1
i=0
3er. SI
Departamental PARA
i<N
SUM3=SUM3+CALIF[i][2] i=i+1
NO
PROM1=SUM1/N
PROM2=SUM2/N
PROM3=SUM3/N
PROM1,PROM2,
PROM3
FIN
M. en C. Marisol Hernández López Academia Computación
“PROGRAMA PRINCIPAL”
#include <conio.h>
#include <stdio.h>
#define F 50
#define C 3
void CREAR_MATRIZ(float [][C],int &,int &);
void IMPRIMIR_MATRIZ(float [][C],int &,int &);
float CALIFICACION_ALTA(float [][C],int &,int &);
float CALIFICACION_BAJA(float [][C],int &,int &);
void PROMEDIO_DEPART(float [][C],int &);
void main()
{
int N;
float CALIF[F][C],CALTA,CBAJA;
printf("Cuantos alumnos: ");
scanf("%d",&N);
CREAR_MATRIZ(CALIF,N,C);
IMPRIMIR_MATRIZ(CALIF,N,C);
CALTA=CALIFICACION_ALTA(CALIF,N,C);
printf("\nLa calificacion mas alta es: %0.1f",CALTA);
CBAJA=CALIFICACION_BAJA(CALIF,N,C);
printf("\nLa calificacion mas baja es: %0.1f",CBAJA);
PROMEDIO_DEPART(CALIF,N);
getch();
}
M. en C. Marisol Hernández López Academia Computación
void CREAR_MATRIZ(float calif[][C],int &n,int &c) void IMPRIMIR_MATRIZ(float calif[][C],int &n,int &c)
{ {
int i,j; int i,j;
for(j=0;j<c;j++) printf("\n1Dep\t2Dep\t3Dep\n");
{ for(i=0;i<n;i++)
printf("\nDepartamenal %d:\n",j+1); {
for(i=0;i<n;i++) for(j=0;j<c;j++)
{ {
printf("Ingresa la calificacion: "); printf("%0.1f\t",calif[i][j]);
scanf("%f",&calif[i][j]); }
} printf("\n");
} }
} }
M. en C. Marisol Hernández López Academia Computación
float CALIFICACION_ALTA(float calif[][C],int &n,int &c) float CALIFICACION_BAJA(float calif[][C],int &n,int &c)
{ {
int i,j; int i,j;
float calta; float cbaja;
calta=0.0; cbaja=10.0;
for(i=0;i<n;i++) for(i=0;i<n;i++)
{ {
for(j=0;j<c;j++) for(j=0;j<c;j++)
{ {
if(calif[i][j]>=calta) if(calif[i][j]<=cbaja)
{ {
calta=calif[i][j]; cbaja=calif[i][j];
} }
else else
{ {
calta=calta; cbaja=cbaja;
} }
} }
} }
return calta; return cbaja;
} }
M. en C. Marisol Hernández López Academia Computación
void PROMEDIO_DEPART(float calif[][C],int &n)
{
float sum1,sum2,sum3,prom1,prom2,prom3;
int i;
sum1=0;
sum2=0;
sum3=0;
for(i=0;i<n;i++)
{
sum1=sum1+calif[i][0];
}
for(i=0;i<n;i++)
{
sum2=sum2+calif[i][1];
}
for(i=0;i<n;i++)
{
sum3=sum3+calif[i][2];
}
//CONTINUA…
M. en C. Marisol Hernández López Academia Computación
//CONTINUA…
prom1=sum1/n;
prom2=sum2/n;
prom3=sum3/n;
printf("\nEl promedio del primer departamental es: %0.1f",prom1);
printf("\nEl promedio del segundo departamental es: %0.1f",prom2);
printf("\nEl promedio del tercer departamental es: %0.1f",prom3);
}
M. en C. Marisol Hernández López Academia Computación
EJECUCION DEL PROGRAMA:
M. en C. Marisol Hernández López Academia Computación