Professional Documents
Culture Documents
Fuentes: Segovia, Juan. Introduccin al lenguaje SL / Juan Segovia Joyanes Luis, Fundamentos de Programacin/Luis Joyanes Aguilar
Arreglos Un arreglo o array es un conjunto finito y ordenado de elementos homogneos. La propiedad ordenado significa que el elemento primero, segundo,tercero...n-simo de un arreglo puede ser identificado. Los elementos de un array son homogneos, es decir, del mismo tipo de datos. Un arreglo puede estar compuesto de todos sus elementos tipo cadena, lgico o numrico. Los arreglos son genricamente conocidos como matrices, que cuando tienen una sola dimensin son conocidos como matriz unidemensional o vector . Tamben existen los arreglos de ms de una dimensin en cuyo se los denomina como matriz multidimensional o simplemente matriz . La ms usada es la matriz bidimensional o de dos dimensiones . En este curso tomaremos las siguientes convenciones: Usaremos matrices de hasta dos dimensiones. Denominaremos vector a la matriz unidemensional. Distinguiremos como matriz al arreglo bidimensional. Vectores Un ejemplo de vector: notas[1] 100 notas[2] 90 notas[.....] .. notas[i] 50 notas[n] 70
..
En el ejemplo, notas es el nombre del vector y cada elemento est identificado por el nombre del vector y un nmero entero entre corchetes indicando el subndice, ndice o posicin de cada elemento. Un vector representa a un conjunto de variables simples, que ocupan espacios contiguos de memoria, denominadas con el mismo nombre y diferenciadas por el subndice. Como debe ser homogneo debe guardar datos del mismo tipo para cada elemento. En este caso cada elemento debe ser numrico, pues guarda notas que son datos numricos. Se dice, entonces, que el vector notas es numrico. Asi notas[1]=100 implica que el valor 100 est guardado en la posicin 1 del vector notas o dicho de otra forma la variable simple notas[1] contiene el valor 100. Un vector tiene una dimensin que puede ser fija o variable. En nuestro ejemplo el vector tiene dimensin n o sea variable. La dimensin fija se da cuando, por ejemplo, se necesita almacenar los nombres de meses en como un vector con valores constantes en el programa: mes[1] mes[2] mes[3] mes[4] mes[5] mes[6] mes[7] mes[8] mes[9] mes[10] mes[11] mes[12]
enero febrero marzo abril mayo junio julio agosto setiembre octubre noviembre diciembre
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
En este ejemplo el vector se llama mes, tiene dimensin fija 12 y es de tipo cadena. El hecho de un vector sea de dimensin fija o variable da lugar a dos tipos: los estticos con dimensin fija y los dinmicos con dimensin variable tambin conocidos como vectores abiertos. Declaracin de vectores en SL La declaracin de vectores en SL es muy sencilla: se declara como una variables ms, indicando al compilador los datos adicionales que necesita: La cantidad de elementos que tendr, y De qu tipo sern los elementos, es decir, si sern numricos, de cadena o lgicos. Dimensin de un vector Esttico de o dimensin fija Por ejemplo, para declarar un vector numrico de 5 elementos escribiremos:
var a:vector[5] numerico // Definicin del vector esttico o de dimensin fija
Dinmico de o dimensin variable Se realiza en dos etapas. La primera donde se declara el vector sin saber el tamao real a ser usado:
var a:vector[*] numerico // Definicin del vector dinmico o de dimensin variable
Tambin debe ser definida una variable que contendr el tamao real del vector:
var d:numerico // Dimensin del vector
Una vez listas esas definiciones que se realizan en el area declarativa del programa se procede a definir el tamao real a ser usado, ya en la parte de procedimientos del programa, mediante las siguientes lineas:
imprimir("Ingrese la dimensin del vector:") leer(d) // Lee la dimensin exacta del vector dim(a,d) // Dimensiona el vector con el tamao necesario
Lectura de un vector Lectura de un vector esttico o de dimensin fija Se puede hacer de dos formas. Sin usar ciclos y usando la propiedad la funcin leer() de cargar desde teclado un vector con una sola sentencia:
imprimir("Ingrese los 5 valores para el vector, separados con coma:\n") leer(a) // Lee los valores para el vector
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos Esto se ejecutara segn se muestra ms abajo:
Ingrese los 5 valores para el vector, separados con coma: 3,2,4,7,1
La ventaja de esta forma es para el programador, quin escribe menos lneas de cdigo.La desventaja es para el usuario final quien tiene menos claro como ingresar los datos. Pero siempre existe una solucin que este caso es ingresar el valor para cada elemento del vector por medio de un ciclo y con un mensaje ms amigable para el usuario final:
desde i=1 hasta 5 // Ciclo para variar el valor del subndice en la lectura de cada elemento { imprimir("Ingrese a[",i,"]:") leer(a[i]) // Lee valor para cada elemento del vector }
La ventaja en este caso es decididamente para el usuario final, que tiene mensajes mas claros y concretos y mayor facilidad de ingreso de datos. El programador debe escribir ms lneas de cdigo pero tambin tiene la ventaja de un cdigo mas legible que le sirve para l mismo y para otros programadores cuando se tenga que revisar el programa para algn mantenimiento. Lectura de un vector dinmico o de dimensin variable El proceso es casi idntico a la lectura de vectores estticos. La diferencia rdica a que se debe ingresar la dimensin del vector qu indica cuantos elementos se debe leer. De nuevo tenemos la lectura sin usar ciclos:
imprimir("Ingrese la dimensin del vector:") leer(d) // Lee la dimensin exacta del vector dim(a,d) // Dimensiona el vector con el tamao necesario imprimir("Ingrese los ",d," valores para el vector, separados con coma:\n") leer(a) // Lee los valores para el vector
Un ejemplo de ejecucin:
Ingrese la dimensin del vector:3 Ingrese los 3 valores para el vector, separados con coma: 4,88,12
Por supuesto tambin se puede usar ciclos para leer los elementos de un vector, como se ve en la siguiente porcin de cdigo:
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
desde i=1 hasta d // Ciclo para variar el valor del subndice en la lectura de cada elemento { imprimir("Ingrese a[",i,"]:") leer(a[i]) // Lee valor para cada elemento del vector }
Inicializacin de un vector Los elementos de un vector pueden ser inicializados completamente con una sola sentencia. Dependiendo de que el vector sea esttico o dinmico las opciones varan ligeramente. A continuacin unos ejemplos: Inicializacin de un vector esttico con valores constantes cargados en el programa En este ejemplo se inicializa un vector con los nombres de los meses del ao. Primero, en la parte declarativa se dimensiona con un valor fijo, en este caso 12:
var nombre_mes:vector[12] cadena // Contendr nombres de meses
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
leer_nro_mes() // Lee el primer nmero de mes mientras (nro_mes_ok(mes)) // Mientras es vlido lo ingresado { imprimir("El nmero ",mes," corresponde a ",nombre_mes[mes],"\n") // Muestra el nombre de mes leer_nro_mes() // Lee los siguientes nmeros de meses } fin // Area de subrutina subrutina leer_nro_mes() // Procedimiento de lectura de nmero de mes inicio imprimir("Ingrese nmero de mes (Entre 1 y 12). No vlido para fin:") leer(mes) fin subrutina nro_mes_ok(m:numerico) retorna logico // Funcin de validacin de nmero de mes inicio retorna(m>=1 and m<=12) // Valida y retorna SI o NO fin
Inicializacin parcial de un vector esttico para ciertos elementos y con autocompletado para los dems En el ejemplo se inicializa un vector cadena de tamao 5 con z en el primer elemento y se autocompleta con asteriscos en los dems. En la parte declarativa se define el vector:
var a:vector[5] cadena // Vector a ser inicializado
Notese que tambin se imprime el tamao del vector mediante la funcin alen().El programa completo se ve as:
programa c03_08s /* Objetivo Fecha Autor */ var a:vector[5] cadena // Vector a ser inicializado inicio cls() imprimir("Valores cargados en el vector antes de su inicializacin:\n") imprimir(a,"\n") // Imprime el vector antes de ser cargado a={"z","*",...} // Inicializa el vector imprimir("El vector:\n",a,"\n","Tiene dimensin ",alen(a),"\n") // Imprime el vector y su tamao fin :Inicializar vector de tamao 5 con "z" en primer elemento y astericos en los dems Mostrar tamao del vector :02/05/2012 :Jos Rojas Dvalos
Inicializacin de un vector dinmico con valores constantes y uso implicito de dim() En la parte declarativa se define un vector dinmico o abierto, sin conocer an el tamao real:
var a:vector[*] numerico // Vector dinmico a ser cargado
La inicializacin en la parte procedimental a la vez de cargar los valores realiza un dim() implicito:
5/ 23 02/05/12 15:51:10 /var/www/apps/conversion/tmp/scratch_6/137426806.odt
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
a={2,4,6,8,10} // Al mismo tiempo que inicializa hace el papel dim()
Asignacin entre vectores Un vector puede ser asignado a otro con una sola sentencia de asignacin, es decir, no se requiere asignar elemento a elemento. Nuestro ejemplo, en la parte declarativa, dimensiona dos vectores dinmicos o abiertos y define la variable que va a contener la dimensin de ambos:
var a:vector[*] numerico // Vector dinmico a ser cargado por teclado b:vector[*] numerico // Vector dinmico al que se le asignara los valores de a[] d:numerico // Dimensin de ambos vectores
Posteriormente dimensiona ambos vectores y lee los valores para el vector origen:
imprimir("Dimensin de a[]:") leer(d) // Lee dimensin de a[] y b[] dim(a,d) // Dimensiona a[] dim(b,d) // Dimensiona b[] imprimir("Ingrese los valores para a[] separados por coma:\n") leer(a) // Lee valores para a[]
Para finalmente asignar el vector origen al destino y mostrar los valores de ambos vectores:
b=a // Asigna los valores de a[] a b[] imprimir("El vector a[]:\n",a,"\n","Tiene dimensin ",alen(a),"\n") // Imprime a[] y su tamao imprimir("El vector b[]:\n",b,"\n","Tiene dimensin ",alen(b),"\n") // Imprime b[] y su tamao
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
Dimensin de a[]:3 Ingrese los valores para a[] separados por coma: 3,4,5 El vector a[]: 3,4,5 Tiene dimensin 3 El vector b[]: 3,4,5 Tiene dimensin 3
Proceso de un vector Normalmente para procesar un vector hay que recorrerlo elemento a elemento como en el siguiente ejemplo con un vector esttico o de dimensin fija:
// Proceso del vector desde i=1 hasta 5 // Ciclo para variar el valor del subndice en el acceso a cada elemento { si (i % 2 == 0) // Si la posicin es par { a[i]="*" // Se asigna asterisco al elemento sino // en caso contrario, si la posicin es impar a[i]="%" // Se asigna simbolo de porcentaje al elemento } }
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
// Lectura desde i=1 hasta 5 // Ciclo para variar el valor del subndice en la lectura de cada elemento { imprimir("Ingrese a[",i,"]:") leer(a[i]) // Lee valor para cada elemento del vector } // Impresin antes del cambio imprimir("Los valores cargados en el vector original son:\n") imprimir(a,"\n") // Proceso del vector desde i=1 hasta 5 // Ciclo para variar el valor del subndice en el acceso a cada elemento { si (i % 2 == 0) // Si la posicin es par { a[i]="*" // Se asigna asterisco al elemento sino // en caso contrario, si la posicin es impar a[i]="%" // Se asigna simbolo de porcentaje al elemento } } // Impresin despus del cambio imprimir("Los valores cargados en el vector modificado son:\n") imprimir(a,"\n") fin
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
sino // en caso contrario, si el elemento tiene valor impar a[i]=a[i]+1 // Se suma 1 al valor del elemento } } // Impresin despus del cambio imprimir("Los valores cargados en el vector modificado son:\n") imprimir(a,"\n") fin
Impresin de un vector Existen tres casos posibles, de los cules se dan ejemplos: Impresin sin ciclo para vector
imprimir("Los valores cargados en el vector original son:\n") imprimir(a,"\n")
Matrices Un ejemplo de matriz, es la que contiene las notas de dos parciales de cada alumno identificado por su n de cdula, en diferentes materias identificadas por su cdigo. La matriz que identificaremos con amn, y donde no se considera la primera fila(horizontal) ni la primera columna(vertical), que se insertan solo a modo de ilustracin, se muestra a continuacin con datos de ejemplo: amn[] Columnas -> 1 Filas nrocedula 1 2 3 4 5 654438 709446 202283 4655429 4655430 2 codmateria 1 1 1 1 1 3 parcial1 100 80 90 70 80 4 parcial2 50 90 30 80 95
En el ejemplo, amn es el nombre de la matriz y cada elemento est identificado por el nombre de la
9/ 23 02/05/12 15:51:10 /var/www/apps/conversion/tmp/scratch_6/137426806.odt
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos matriz y dos nmeros enteros entre corchetes separados por coma indicando los subndices, ndices o la posicin de cada elemento en forma de coordenada. Es decir un elemento de una matriz est identificado por una posicin fila y otra posicin columna, en ese orden . A los efectos de una mejor comprensin separemos de la matriz mostrada anteriormente como ejemplo la parte que realmente contiene datos, que es la resaltada: amn[] 654438 1 709446 1 202283 1 4655429 1 4655430 1
100 80 90 70 80
50 90 30 80 95 Filas(1 al 5)
Columnas(1 al 4) A partir de ahora podemos decir que cada una de las cinco filas contienen los datos de un alumno y sus notas parciales en una materia. Cada una de las cuatro columnas corresponden a un dato: la 1 al n de cdula la 2 al cdigo de materia la 3 a la nota del parcial 1 la 4 a la nota del parcial 2. Esto implica que el alumno con n de cdula 654438 tiene tiene almacenado el dato mencionado en amn[1,1] que se lee en la matriz amn en la fila 1 columna 1 . O en amn[4,3] est almacenada la nota del primer parcial en la materia con codigo 1 del alumno con cedula n 4655429. Para una mejor comprensin mostramos la matriz con sus posiciones posibles: amn[] [1,1] [1,2] [1,3] [1,4] [2,1] [2,2] [2,3] [2,4] [3,1] [3,2] [3,3] [3,4] [4,1] [4,2] [4,3] [4,4] [5,1] [5,2] [5,3] [5,4] Resumiendo: Una matriz es un arreglo bidimensional que guarda datos en c/u de sus elementos Una matriz es una disposicin tabular en filas y columnas Los elementos se identifican por con el nombre de la matriz, entre corchetes la posicin fila y la posicin columna como en amn[3,4] La matriz del ejemplo tiene 5 filas y 4 columnas
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos Se puede decir que la matriz es de dimensin o de orden 5x4. Un matriz representa a un conjunto de variables simples, que ocupan espacios contiguos de memoria, denominadas con el mismo nombre y diferenciadas por los subndices. Como debe ser homogneo debe guardar datos del mismo tipo para cada elemento. En este caso cada elemento debe ser numrico, pues guarda n de cdula, cdigo de materia, nota parcial 1 y nota parcial 2 que son datos numricos. Se dice, entonces, que la matriz amn es numrica. As amn[1,1]=654438 implica que el valor 654438 est guardado en la fila 1 columna 1 de la matriiz amn o dicho de otra forma la variable simple amn[1,1] contiene el valor 654438. Un matriz tiene doss dimensines que puede ser fijas o variables. En nuestro ejemplo la matriz tiene dimensin 5x4 o sea fija. Las dimensiones variables se dan cuando, por ejemplo, se necesita almacenar cantidades de datos desconocidas, como en el caso de las localidades y sus barrios. Una fila estara dedicada a una localidad y en la primera columna ira el nombre de la localidad y en las siguientes el nombre de cada uno de sus barrios. Una posible matriz con datos se muestra a continuacin: Asuncin Villarrica .. .. Santo Domingo Ybaroty .. .. Vista Alegre Costa-i Santa Luca .. .. .. .. .. .. .. .. .. .. ..
Como la cantidad de localidades y barrios recien se conocern a la hora de cargar los datos, en este caso hay que prever que las dimensiones esten dadas por dos variables enteras a ser ingresadas por teclado. Supongamos que la dimensin fila estar dada por la variable filas y la dimensin columna sera guardada en la variable columnas. En este ejemplo la matriz se llama lb, tiene dimensin variable filasxcolumnas y es de tipo cadena. El hecho de una matriz sea de dimensin fija o variable da lugar a dos tipos: las estticas con dimensiones fijas y las dinmicas con dimensin variable tambin conocidos como matrices abiertas. Declaracin de matrices en SL La declaracin de matrices en SL es muy sencilla: se declara como una variables ms, indicando al compilador los datos adicionales que necesita: La cantidad de filas y columnas que tendr De qu tipo sern los elementos, es decir, si sern numricos, de cadena o lgicos.
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos Dimensin de una matriz Esttica de o dimensin fija Por ejemplo, para declarar una matriz numrica de 5 filas y 4 columnas escribiremos:
var amn:matriz[5,4] numerico // Dimensin de matriz esttica
Dinmica de o dimensin variable Se realiza en dos etapas. La primera donde se dimensiona la matriz sin saber las dimensiones reales a ser usadas:
var lb:matriz[*,*] cadena // Dimensin de matriz dinmica
Tambin debe ser definidas dos variables que contendrn las dimensiones reales de la matriz:
var filas:numerico // Cantidad mxima de filas de la matriz columnas:numerico // Cantidad mxima de columnas de la matriz
Una vez listas esas definiciones que se realiza en el area declarativa del programa se procede a definir las dimesiones reales a ser usadas, ya en la parte de procedimientos del programa, mediante las siguientes lineas:
imprimir("Ingrese valor de la dimensin fila:") leer(filas) // Lee cantidad de filas imprimir("Ingrese valor de la dimensin columna:") leer(columnas) // Lee cantidad de columnas dim(lb,filas,columnas) // Dimensiona matriz con tamaos ingresados
Lectura de una matriz Lectura de una matriz esttica de o dimensin fija Se puede hacer de dos formas. Sin usar ciclos y usando la propiedad la funcin leer() de cargar desde teclado una matriz con una sola sentencia:
imprimir("Ingrese los 20 valores para la matriz separados por coma:\n") leer(amn)
Las forma mas amigable sera ingresando datos para la matriz por medio de ciclos:
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
{ desde c=1 hasta 4 // Para recorrer columnas { imprimir("ngrese valor para amn[",f,",",c,"]:") leer(amn[f,c]) // Leer valor para cada elemento } }
Lectura de una matriz dinmica o de dimensin variable El proceso es casi idntico a la lectura de matrices estticas. La diferencia rdica a que se debe ingresar las dimensines de la matriz qu me indica cuantos elementos debo leer. De nuevo tenemos la lectura sin usar ciclos:
imprimir("Ingrese valor de la dimensin fila:") leer(filas) // Lee cantidad de filas imprimir("Ingrese valor de la dimensin columna:") leer(columnas) // Lee cantidad de columnas dim(lb,filas,columnas) // Dimensiona matriz con tamaos ingresados // Lee datos imprimir("Ingrese datos para la matriz separados por coma:\n") leer(lb)
Un ejemplo de ejecucin:
Ingrese el valor de la dimensin fila:2 Ingrese el valor de la dimensin columa:3 Ingrese datos para la matriz separados por coma: Asunci, Sajonia, Tacumbu, San Lorenzo, Lucerito,Reducto
Por supuesto tambin se puede usar ciclos para leer los elementos de una matriz, como se ve en la siguiente porcin de cdigo:
desde cf=1 hasta f // Recorre filas { desde cc=1 hasta c // Recorre columnas { imprimir("Ingrese cadena en fila ",cf," columna ",cc,":") leer(m[cf,cc]) // Lee valor para elemento } }
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
imprimir("Ingrese valor de la dimensin fila:") leer(f) // Lee cantidad de filas imprimir("Ingrese valor de la dimensin columna:") leer(c) // Lee cantidad de columnas dim(m,f,c) // Dimensiona matriz con tamaos ingresados
Inicializacin de una matriz Los elementos de una matriz pueden ser inicializados completamente con una sola sentencia. Dependiendo de que una matriz sea esttica o dinmica las opciones varan ligeramente. A continuacin unos ejemplos: Inicializacin de una matriz esttica con valores constantes cargados en el programa En este ejemplo se inicializa una matriz de 3 x 4 con los nombres de los meses del ao, distribuidos por cuatrimestre, con el primer cuatrimestre en la primera fila y as sucesivamente. Primero, en la parte declarativa se dimensiona la matriz con valores fijos:
var nombre_mes:matriz[3,4] cadena // Contendr nombres de meses por cuatrimestre
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
" corresponde a ",nombre_mes[cuatrimestre],"\n") // Muestra nombre meses del cuatrimestre leer_nro_cuatrimestre() // Lee los siguientes nmeros de cuatrimestre } fin // Area de subrutina subrutina leer_nro_cuatrimestre() // Procedimiento de lectura de nmero de cuatrimestre inicio imprimir("Ingrese nmero de cuatrimestre (Entre 1 y 3). No vlido para fin:") leer(cuatrimestre) fin subrutina nro_cuatrimestre_ok(c:numerico) retorna logico // Funcin de validacin de nmero de cuatrimestre inicio retorna(c>=1 and c<=3) // Valida y retorna SI o NO fin
Inicializacin parcial de una matriz esttica para ciertos elementos y con autocompletado para los dems En el ejemplo se inicializa un matriz cadena de tamao 5x2 con x en la primera fila y se autocompleta con % en las dems. En la parte declarativa se define la matriz:
var a:matriz[5,2] cadena // Matriz a ser inicializada
Notese que tambin se imprime el tamao de la matriz mediante la funcin alen().El programa completo se ve as:
programa c03_16s /* Objetivo Fecha Autor */ var a:matriz[5,2] cadena // Matriz a ser inicializada f,c:numerico // Contador de filas,contador de columnas inicio cls() imprimir("Valores cargados en la matriz antes de su inicializacin:\n") imprimir(a,"\n") // Imprime la matriz antes de ser cargada a={ :Inicializar matriz de tamao 5 con "x" en primera fila y "%" en las dems Mostrar tamao de la matriz :02/05/2012 :Jos Rojas Dvalos
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
{"x","x"}, // Inicializa la matriz {"%","%"}, ... } imprimir("La matriz:\n") desde f=1 hasta 5 // Recorre filas { desde c=1 hasta 2// Recorre columnas { imprimir(a[f,c]," ") // Imprime valor de elemento y espacio } imprimir("\n") // Salta a siguiente fila } imprimir("Tiene dimensin ",alen(a)*alen(a[1]),"\n") // Imprime tamao de la matriz fin
Inicializacin de una matriz abierta con valores constantes y uso implicito de dim() En la parte declarativa de define una matriz abierta, sin conocer an el tamao real:
var a:matriz[*,*] numerico // Matriz dinmica a ser cargada
La inicializacin en la parte procedimental a la vez de cargar los valores realiza un dim() implicito:
a={ {2,4,6,8,10}, // Al mismo tiempo que inicializa hace el papel dim() {12,14,16,18,20} }
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
Una matriz puede ser asignada a otra con una sola sentencia de asignacin, es decir, no se requiere asignar elemento a elemento. Nuestro ejemplo, en la parte declarativa, dimensiona dos matrices abiertas y define las variables que van a contener las dimensiones de ambos:
var a:matriz[*,*] numerico // Matriz dinmica a ser cargada por teclado b:matriz[*,*] numerico // Matriz dinmica a la que se le asignara los valores de a[] d,e:numerico // Dimensiones de ambas matrices
Posteriormente dimensiona ambas matrices y lee los valores para la matriz origen:
imprimir("Dimensin fila de a[]:") leer(d) // Lee dimensin fila de a[] y b[] imprimir("Dimensin columna de a[]:") leer(e) // Lee dimensin columna de a[] y b[] dim(a,d,e) // Dimensiona a[] dim(b,d,e) // Dimensiona b[] imprimir("Ingrese los valores para a[] separados por coma:\n") leer(a) // Lee valores para a[]
Para finalmente asignar la matriz origen a la destino y mostrar los valores de ambas matrices:
b=a // Asigna los valores de a[] a b[] imprimir("La matriz a[]:\n",a,"\n","Tiene dimensin ",alen(a)*alen(a[1]),"\n") // Imprime a[] y su tamao imprimir("La matriz b[]:\n",b,"\n","Tiene dimensin ",alen(b)*alen(b[1]),"\n") // Imprime b[] y su tamao
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
imprimir("La matriz b[]:\n",b,"\n","Tiene dimensin ",alen(b)*alen(b[1]),"\n") // Imprime b[] y su tamao fin
Proceso de una matriz Normalmente para procesar una matriz hay que recorrerlo elemento a elemento como en el siguiente ejemplo con una matriz de dimensin fija:
// Genera matriz desde i=1 hasta 4 // Recorre filas { desde j=1 hasta 3 // Recorre columnas { si (i%2==0) // Si la fila es par { a[i,j]="*" // Carga asterico sino // Si la fila es impar a[i,j]="0" // Cargaa cero } } }
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
}
Impresin de una matriz Existen tres casos posibles, de los cules se dan ejemplos: Impresin sin ciclo para matriz
imprimir("Los datos cargados son:\n") imprimir(amn,"\n") // Imprime matriz completa
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
} imprimir("\n") // Salto de fila }
Matriz cuadrada Se conoce como matriz cuadrada a aquella que tiene la dimensin fila igual a la dimensin columna. As si se dice que una matriz es de orden 4 se entiende que tiene 4 filas y 4 columnas. Si se expresa la dimensin de una matriz como n x n (ene por ene) tambin se entiende que es cuadrada. En el primer caso es con dimensiones fijas, en el segundo con dimensines variables. Como las dimensines son iguales se puede expresar como matriz de dimensin u orden 4 en el primer caso, o como matriz de dimensin u orden n, en el segundo. Suponiendo la siguiente matriz:
10 1 12 6 7 0 88 92 8 5 44 2
43 55 64 33
Elementos situados en la diagonal principal Tomemos los valores de los elementos que estn en rojo: {10,0,43,33}. Suponiendo que nuestra matriz se denomina m seran los elementos m[1,1],m[2,2],m[3,3] y m[4,4]. Qu tienen de comn estos elementos? Sus coordenadas o subindices son iguales desde el punto de vista posicin fila y posicin columna. En este caso se dice que estos elementos estn en la diagonal principal de la matriz. Elementos situados por encima la diagonal principal Si ahora tomamos los valores de los elementos que estan en verde: {7,8,44,2,55}. Vemos que se guardan en los elementos m[1,2],m[1,3],m[1,4],m[2,4] y m[3,4]. Qu tienen de comn estos elementos? Sus coordenadas filas son menores que sus coordenadas columnas. Se dice que estos elementos estn por encima de la diagonal principal. Elementos situados por debajo de la diagonal principal Finalmente, si tenemos en cuenta los valores de los elementos que estan en azul: {1,12,6,92,64}. Vemos que se guardan en los elementos m[2,1],m[3,1],m[4,1],m[4,2] y m[4,3]. Qu tienen de comn estos elementos? Sus coordenadas filas son mayores que sus coordenadas columnas. Se dice
20/ 23 02/05/12 15:51:10 /var/www/apps/conversion/tmp/scratch_6/137426806.odt
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos que estos elementos estn por debajo de la diagonal principal. A continuacin un ejemplo de seleccin de elementos de una matriz cuadrada segn su relacin con la diagonal principal. El programa cuenta los elementos en, muestra los que estn por encima y halla la suma de los que estn por debajo, siempre en relacin con la diagonal principal:
programa c03_20s /* Objetivo:Leer una matriz de orden d, contar elementos en, mostrar elementos por encima y hallar la suma de elementos por debajo de la diagonal principal Fecha :02/05/2012 Autor :Jos Rojas Dvalos */ var m:matriz[*,*] numerico // Matriz a ser leida d:numerico // Dimensin de la matriz cuadrada i,j:numerico // Contador para filas, contador para columnas cend=0 // Contador para elementos en la diagonal principal sded=0 // Sumador de elementos por debajo de la diagonal principal inicio cls() imprimir("Ingrese la dimensin de la matriz cuadrada:") leer(d) // Lee dimensin dim(m,d,d) // Dimensiona // Lee valores para la matriz desde i=1 hasta d // Recorre filas { desde j=1 hasta d // Recorre columnas { imprimir("Ingrese valor para a[",i,",",j,"]:") leer(m[i,j]) // Lee valor para cada elemento de la matriz } } // Procesa matriz imprimir("Los valores de los elementos que estan por encima de la diagonal principal son:\n") desde i=1 hasta d // Recorre filas { desde j=1 hasta d // Recorre columnas { si (i==j) // Si el elemento est en la diagonal principal { cend=cend+1 sino si (i<j) // Si el elemento est por encima de la diagonal principal { imprimir(m[i,j]," ") // Se muestra separado con un espacio sino // Si el elemento est por debajo de la diagonal principal sded=sded+m[i,j] } } } } imprimir("\n") // Salto de lnea imprimir("Cantidad de elementos en la diagonal principal = ",cend,"\n") imprimir("Suma de valores de elementos por debajo de la diagonal principal = ",sded,"\n") fin
Recorrer elementos en la diagonal principal con un ciclo Valindonos de la propiedad de una matriz cuadrada, especficamente de la que dice que los elementos en la diagonal principal tienen la posicin fila igual a la posicin columna, podemos recorrer con un solo ciclo la mencionada diagonal. En el ejemplo el programa se asigna el valor 1 a los elementos en la diagonal principal:
programa c03_21s /* Objetivo :Generar matriz numrica cuadrada de orden 5, con valor 1 en elementos de diagonal principal, 0 en los otros Fecha :02/05/2012 Autor :Jos Rojas Dvalos */
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
var a:matriz[5,5] numerico // Matriz nmerica a ser generada que se llena de ceros al ser dimensionada i:numerico // Contador para filas j:numerico // Contador para columnas inicio cls() // Genera matriz desde i=1 hasta 5 // Recorre diagonal principal { a[i,i]=1 // Carga 1 en la diagonal principal } // Muestra matriz imprimir("La matriz generada es:\n") desde i=1 hasta 5 // Recorre filas { desde j=1 hasta 5 // Recorre columnas { imprimir(a[i,j]," ") // Imprime elemento y un espacio } imprimir("\n") // Salto de fila } fin
La diagonal secundaria Miremos nuestra matriz ejemplo de nuevo, con los valores marcados en rojo:
10 1 12 6 7 0 88 92 8 5 44 2
43 55 64 33
Los valores de los elementos marcados son: {44,5,88,6} que se guardan en m[1,4],m[2,3],m[3,2]ym[4,1]. Qu tienen de comn estos elementos? Si nos fijamos con atencin en las coordenadas y en el orden en que fueron citados notaremos que las coordenadas de las filas van de menor a mayor y las coordenadas de las columnas van de mayor a menor. Por lo tanto con un solo ciclo de 1 a 4 puedo generar el valor de las filas y tengo que buscar por medio de algn truco de clculo generar en paralelo el valor para los columnas. Descubra el truco usado en el programa que se lista a continuacin, para recorrer la diagonal secundaria con un solo ciclo y llenarla de "*", dejando los dems elementos con valor "+":
programa c03_22s /* Objetivo :Generar matriz cadena cuadrada de orden d, con valor "*" en elementos de diagonal secundaria, "+" en los otros Fecha :02/05/2012 Autor :Jos Rojas Dvalos */ var a:matriz[*,*] cadena // Matriz cadena a ser generada d:numerico // Dimensin de la matriz cuadrada i:numerico // Contador para filas j:numerico // Contador para columnas inicio cls() imprimir("Ingrese dimensin de la matriz cuadrada:") leer(d) // Lee dimensin de la matriz dim(a,d,d) // Dimensionamiento de la matriz // Genera matriz
Facultad Politcnica - UNA Algortmica I Seccin ND Licenciatura en Ciencias Informticas Unidad 3: Estructuras de datos
desde i=1 hasta d // Recorre filas { desde j=1 hasta d // Recorre columnas { a[i,j]="+" // Carga "+" en todos los elementos } } // Recorre diagonal secundaria desde i=1 hasta d // Recorre filas { j=(d+1)-i // Genera columnas a[i,j]="*" // Carga "*" en la diagonal secundaria } // Muestra matriz imprimir("La matriz generada es:\n") desde i=1 hasta d // Recorre filas { desde j=1 hasta d // Recorre columnas { imprimir(a[i,j]," ") // Imprime elemento y un espacio } imprimir("\n") // Salto de fila } fin