matrices - Profesor ROBERTO OSORNIO SOTO

Anuncio
 NOMBRE ALUMNO: Apellido paterno Apellido materno Nombre (s) No. BOLETA INSTITUTO POLITÉCNICO NACIONAL SECRETARIA ACADÉMICA DIRECCIÓN DE EDUCACIÓN SUPERIOR ESIME CULHUACAN GRUPO FECHA DIA MES AÑO INGENIERÍA EN COMPUTACIÓN ASIGNATURA ESTRUCTURAS DE DATOS PROFESOR M. en C. BEATRIZ EUGENIA CORONA RAMÍREZ PRÁCTICA No. 3 MATRICES 1. Objetivo El alumno conocerá e implementará el concepto de Matrices, e implementará las operaciones básicas tales como inserción, eliminación y actualización de sus elementos. 2. Material y Equipo Computadora, Compilador C y unidad de almacenamiento 3. Introducción Teórica ARREGLOS BIDIMENSIONALES (MATRICES) Para entender mejor el concepto de arreglos bidimensionales o tablas comenzaremos con un ejemplo. LLUVIAS MENSUALES POR ESTADO MESES / LLUVIAS MORELOS DF QUERÉTARO PUEBLA Enero 50 45 60 58 Febrero 17 3 15 22 Marzo 12 10 8 17 Abril 15 5 20 35 Mayo 22 30 15 22 Junio 50 90 60 100 Julio 85 130 20 88 Agosto 70 75 88 94 Septiembre 65 49 53 105 Octubre 28 37 29 37 Noviembre 35 15 22 4 Diciembre 17 8 14 0 La tabla se interpreta de la siguiente forma: dado un mes, se conoce las lluvias caídas en cada uno de los estados; y dado un estado, se conocen las lluvias 27
caídas en cada uno de los estados; y dado un estado, se conocen las lluvias caídas en forma mensual. Si se quisiera almacenar esta información con los arreglos que se conocen, se tendrían dos alternativas. 1. Definir 12 arreglos de 4 elementos cada uno. Cada arreglo almacenará. Cada arreglo almacenará la información relativa a un mes. Enero Febrero Marzo Diciembre ….. 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 ALMACENAMIENTO DE LA INFORMACIÓN POR MES 2. Definir 4 arreglos de 12 elementos cada uno. Cada arreglo almacenará la información relativa a un estado a lo largo del año. Morelos … 1 2 3 4 … 9 10 11 12 México … 1 2 3 4 … 9 10 11 12 Querétaro … 1 2 3 4 … 9 10 11 12 Puebla … 1 2 3 4 … 9 10 11 12 ALMACENAMIENTO DE LA INFORMACIÓN POR ESTADO Sin embargo ninguna de las dos alternativas es muy práctico. Necesitamos una estructura que permita manejar los datos considerando los meses (renglones de la tabla) y los estados (columnas de la tabla). Una estructura que trate a la información como un todo. La estructura que tiene esta característica se denomina arreglo bidimensional. Un arreglo bidimensional es un conjunto de datos homogéneo, finito y ordenado, donde se hace referencia a cada elemento por medio de dos índices. El primero de los índices se utiliza para indicar el renglón y el segundo para indicar la columna. Un arreglo bidimensional también puede definirse como un arreglo de arreglos. En la siguiente figura se presenta gráficamente un arreglo bidimensional. 28
El arreglo A (MxN) tiene M renglones y N columnas. Un elemento A[ i , j] estará en el renglón i y en la columna j. Internamente en la memoria se reservan M x N posiciones consecutivas para almacenar todos los elementos del arreglo. 1 2 3 . . . N
1 2 . . . M REPRESENTACIÓN DE UN ARREGLO BIDIMENSIONAL Operaciones de arreglos bidimensionales Las operaciones más comunes en arreglos:  Lectura / Escritura  Asignación  Actualización: Inserción Eliminaciones Modificación  Ordenación  Búsqueda 29
LECTURA i=1
No .. Hacer i  1 Repetir con i desde 1 hasta 15 Hacer j  1 Repetir con j desde 1 hasta 5 Leer Matriz[i,j] Hacer j  j+1 {fin del ciclo interno} Hacer i  i+1 {fin del ciclo externo} i <= 15
Si j=1
j <= 5
MATRIZ[ i,j] Pseudo - Código
j = j + 1 i = i+ 1
Diagrama de Flujo
Al variar los índices i y j se lee un elemento de matriz, según la posición indicada por los índices i y j. Para i=1 y j=1 se lee el elemento del renglón 1 y columna 1 Para i=1 y j=2 se lee el elemento del renglón 1 y columna 2 …. Para i=15 y j=5 se lee el elemento del renglón 15 y columna 5 30
ESCRITURA i=1
No .. Hacer i  1 Repetir con i desde 1 hasta 15 Hacer j  1 Repetir con j desde 1 hasta 5 Escribir Matriz[i,j] Hacer j  j+1 {fin del ciclo interno} Hacer i  i+1 {fin del ciclo externo} i <= 15
Si j=1
j <= 5
MATRIZ[i,j] Pseudo - Código
j = j + 1
i = i+ 1 Diagrama de Flujo
31
ASIGNACIÓN A todos los elementos asignar el valor cero. i=1
No .. Hacer i  1 Repetir con i desde 1 hasta 15 Hacer j  1 Repetir con j desde 1 hasta 5 Hacer Matriz[i,j]=0 Hacer j  j+1 {fin del ciclo interno} Hacer i  i+1 {fin del ciclo interno} i <= 15
Si j=1
j <= 5
MATRIZ [i,j] =0 Pseudo - Código
j = j + 1 i = i+ 1
Diagrama de Flujo
Solo a un elemento asignarle un valor, en este caso la asignación es directa, para asignar el valor 12 al elemento del reglón 13 y columna 4 tendríamos: MATRIZ [12,4]=12 32
Las operaciones de asignación, lectura y escritura a todos los elementos de un arreglo bidimensional se pueden hacer por renglones o por columnas. 1 2 3 . . . N
1 2 . . . M M Renglones N columnas Recorrido por renglones 1 2 3 . . . N 1 2 . . . M Recorrido por columnas M Renglones N columnas 33
4. Desarrollo 1. Dada una matriz cuadrada A, construir el diagrama de flujo que permita determinar si dicha matriz es simétrica. Se considera que una matriz es simétrica si A[i,j] = A[j,i] y esto se cumple para todos los elementos i,j de la matriz. Inicio Ingrese la dimensión del arreglo N Si i=1 i<=N j=1 No La dimensión de la matriz no es correcta Si 1<=N<= 50
j<=N No Ingrese el elemento i,j A[ i,j] j = j + 1 A B 34
A j=j+1 No es simétrica B BAND=1 i=1 i<=N y BAND=1 j=1 j<=i‐1 y BAND=1 A[i,j]=A[j,i] BAND=0 i = i + 1 BAND=1 Si es simétrica Fin Diagrama de Flujo
35
#include <stdio.h> #include <conio.h> #define tam 100 void main() { int A[tam][tam],N,j,i; bool BAND=1; printf("Introduce la dimension del arreglo"); scanf("%d",&N); if (N<=50 && N>=1) { for(i=1;i<=N;i++) { for (int j=1;j<=N;j++) { printf("Ingresa el valor %d %d: ",i,j); scanf("%d",&A[i][j]); } } i=1; while(i<=N && BAND==1) { j=1; while((j<=i‐1)&&(BAND==1)) { if(A[i][j]==A[j][i]) j++; else BAND=0; } i++; } if(BAND==1) printf("\nSimetrica"); else printf("\nNo es simetrica"); } else printf("\nLa dimension de la matriz no es correcta"); getch(); } Código en C
36
2. Intercambiar renglones de un arreglo bidimensional. Los elementos del renglón 1 deben intercambiarse con los del renglón N, y así sucesivamente. 1 2 3 4 1 2 3 4
5 8 7 4 1 15 28 49 1 0 2 15 20 14 74 10 8 9 2 2 3 2 10 8 9 3 15 20 14 74 4 0 15 28 49 8 7 4 4 5 Después del intercambio Inicio Ingrese la dimensión del arreglo N Si 1<=N<= 50
No i=1 Error en el dato i<=N Si j=1 j<=N No Si Ingrese el dzto i,j A[ i,j] j = j + 1 A B 37
A B i=1 No i<=(N div 2) Si j=1 No j<=N Si AUX=A[i,j] A[i,j]=A[N‐i+1,j] A[N‐i+1,j]=AUX j=j+1 i = i + 1 Arreglo Resultado i=1 No i<=N Si j=1 No J<=N Si A[i,j] j=j+1 Fin i = i + 1 Diagrama de Flujo
38
#include <stdio.h> #include <conio.h> #define tam 100 void main() { int A[tam][tam],N,j,i,Aux; printf("Introduce el tamaño del arreglo: "); scanf("%d",&N); if (N<=50 && N>=1) { for(i=1;i<=N;i++) { for (int j=1;j<=N;j++) { printf("Ingresa el valor %d %d: ",i,j); scanf("%d",&A[i][j]); } } printf("\nARREGLO ORIGINAL:\n"); for (i=1;i<=N;i++) {for (j=1;j<=N;j++) {printf("%d ",A[i][j]);} printf("\n"); } i=1; while(i<=(N%2)) { j=1; while(j<=N) { Aux=A[i][j]; A[i][j]=A[N‐i+1][j]; A[N‐i+1][j]=Aux; j++; } i++; } printf("\nARREGLO RESULTADO:\n"); for (i=1;i<=N;i++) {for (j=1;j<=N;j++) {printf("%d ",A[i][j]);} printf("\n"); } } else printf("\nERROR en el dato"); getch(); } Código en C
39
3. Sea A ( M x N ) y B (N) arreglos de dos y una dimensión, respectivamente. Construya un diagrama de flujo que asigne valores a B, a partir de A teniendo en cuenta los siguientes criterios. , ,
1, Inicio Ingrese el número de renglones ∗ M,N Si No (M>=1) y (M<=30) y (N>=1) y (N<=20) i=1 i<=M Si No Error en los datos j=1 j<=N No Si Ingrese el dzto i,j A[ i,j] j = j + 1 i = i + 1 B A 40
A i=1 i < = M Si Si i MOD 2 = 0 B[ i ]=0 j = 1 No j < = N Si B[ i ]= B[ i ]+(A[i,j]*A[i‐1,j]) j=j+1 Arreglo Resultado i = 1 i <= M Si B [ i ] i = i +1 B No B[ i ]=0
j = 1 j < = N
No Si B[ i ]= B[ i ]+A[i,j]
i = i + 1 i = i + 1 No Fin Diagrama de Flujo
41
#include <stdio.h> #include <conio.h> #define tam 100 void main() { int A[tam][tam],M,N,j,i ,B[tam]; printf("Introduce el tamaño del arreglo [M x N]: "); scanf("%d,%d",&M,&N); if (M>=1 && M<= 30 && N<=50 && N>=1) { for(i=1;i<=M;i++) { for (int j=1;j<=N;j++) { printf("Ingresa el valor %d %d: ",i,j); scanf("%d",&A[i][j]); } } printf("\nARREGLO ORIGINAL:\n"); for (i=1;i<=N;i++) {for (j=1;j<=N;j++) {printf("%d ",A[i][j]);} printf("\n"); } i=1; while(i<=M) { if(i%2==0) { B[i]=0; j=1; while(j<=N) { B[i]=B[i]+(A[i][j]*A[i‐1][j]); j++; } } else { B[i]=0; j=1; while(j<=N) { B[i]=B[i]+A[i][j]; j++; } } i++; } printf("\nARREGLO RESULTADO:\n"); for (i=1;i<=M;i++) printf("%d ",B[i]); } else printf("\nERROR en los datos "); getch(); } Código en C
42
4. Generar un cuadrado mágico de dimensión N (entero positivo e impar). Es una matriz cuadrada de orden N, contiene los números del uno al N*N, y donde la suma de cualquiera de los renglones, columnas o diagonales principales es siempre la misma. a. El número 1 se coloca en la casilla central del primer renglón b. El siguiente número se coloca en la casilla correspondiente al renglón anterior y columna posterior c. El renglón anterior al primero es el último y la columna posterior a la última es la primera d. Si el número es un sucesor de un múltiplo de N, no se aplica la regla b. Se coloca en la casilla del renglón posterior y en la misma columna. Inicio Ingrese dimensión del cuadrado N Si j= (N+1)DIV 2 i=1 CM [i,j]=1 NUM=2 No Si ((NUM‐1) MOD N)=0 i = i + 1 D Error en el dato NUM<=N*N No 1<=N<=50 y (N MOD 2<>0) No i = i ‐ 1
j = j + 1 i = 0 Si i = N A j > N j = 1 B 43
C D A C CM[ i, j ] = NUM NUM = NUM + 1 B Cuadro Mágico i =1
i < = N
j = 1
j < = N
CM [ i , j ] j = j + 1 i = i + 1
Fin Diagrama de Flujo
44
#include <stdio.h> #include <conio.h> #define tam 100 void main() { int CM[tam][tam],N,NUM,j,i; printf("Ingresa dimension del cuadro : "); scanf("%d",&N); if ((N%2!=0) && N<=50 && N>=1) {j=(N+1)/2; i=1; CM[i][j]=1; NUM=2; while(NUM<=N*N) { if(((NUM‐1)%N)==0) i++; else {i‐‐; j++;} if(i==0) i=N; if(j>N) j=1; CM[i][j]=NUM; NUM++; } printf("\nCUADRO MAGICO\n"); for(i=1;i<=N;i++) {for (j=1;j<=N;j++) {printf("%d ",CM[i][j]);} printf("\n");} } else printf("\nERROR en el dato "); getch(); } Código en C
45
5. Cuestionario [Trabajo complementario] 1.
2.
3.
4.
5.
¿Qué es una tabla y que es una matriz? Explica cuales son las operaciones básicas en el uso de arreglos bidimensionales Ejemplifica donde podemos encontrar en la vida diaria arreglos bidimensionales ¿Qué ventajas aporta este concepto “arreglos bidimensionales” a la programación? Describe un ejemplo de un arreglo bidimensional y de cada una de sus operaciones (implementación) 6. Conclusiones 46
Descargar