Professional Documents
Culture Documents
1 1 2 3 11 16
Introduccin En la mayora de ocasiones, los problemas que tenemos que resolver manejan muchos datos del mismo tipo, por ejemplo los nombres de los estudiantes de una asignatura, los salarios de los empleados de una empresa, las notas del primer examen de IAI115, etc. Con las estructuras repetitivas hemos logrado leer y procesar varios datos de un mismo tipo (edades, pesos, notas, etc.), almacenndolos en una sola variable, un dato a la vez, de tal forma que al finalizar las iteraciones requeridas, en memoria slo se mantiene el ltimo de los datos en la variable. En algunos casos no basta con esto, sino que se hace necesario almacenar en memoria todos los datos para futuros procesamientos, en estas circunstancias es que las estructuras de datos son muy tiles para disear y programar una solucin. Nikklaus Wirth, precursor de Programacin Estructurada, sostuvo que Un programa se obtiene tras el diseo correcto del algoritmo y la eleccin adecuada de la estructura de datos, pensamiento que tiene validez aun hoy en da.
se realiza de forma secuencial. La ventaja es sin embargo, muy importante, la posibilidad de aumentar o disminuir en tiempo de ejecucin el nmero de elementos que componen la estructura. En esta oportunidad nos dedicaremos a trabajar con estructuras de datos estticas, y entre todas las que existen, lo haremos con los arreglos.
2.. Arregllos o Arrays 2 Arreg os o Arrays Un arreglo es una secuencia de espacios en memoria principal (RAM) a las que: se puede acceder directamente contiene datos del mismo tipo (entero, real, etc.), y pueden ser seleccionados individualmente mediante el uso de subndices. Dicho de otra forma, un arreglo es una estructura de datos de tamao constante, que puede almacenar un conjunto de datos del mismo tipo (homognea), y se caracteriza por: Tener un nico identificador o nombre de variable que representa todos los elementos, y estos se diferencian unos de otros por medio de uno o varios subndices. Permitir el acceso a sus elementos individualmente o a todos ellos, las veces que sean necesarias. Los arreglos se clasifican segn la organizacin que se le den a los datos dentro de la memoria; para ordenarlos se utilizan los subndices y, de acuerdo al nmero de subndices utilizados en el arreglo, hablamos de la dimensin del mismo: 2.1 Unidimensionales, con una sola dimensin o subndice (Vectores)
-2
10
1 1 2 3 4
15 1 9 3
8 2 -40 9
-11 7 5 -6
0 1 2 -5
1 0 6 0
C
1 2 3
0 0 3 0 15 0 -7 3 15 -7 15 -7 5 15 2 -7 2 5 4 2 5 3 2 5 3
2 1 2 1
De igual forma que cualquier variable, un vector debe tener un identificador o nombre.
Aqu hemos llamado A a nuestro vector ejemplo. Los elementos, que estn en el vector A, ocupan una determinada posicin dentro de l:
0 1 2 3 4 5 6 7 8 9
significa que A[2] es igual a -5 significa que A[9] es igual a 99 significa que A[0 ] es igual a 12
Vemos, entonces que un elemento se referencia por el nombre del vector y la posicin que ocupa dentro de l. El nmero que se coloca entre signos de agrupacin (en este caso corchetes) se llama subndice y designa la posicin del elemento en el vector. Los subndices son nmeros enteros positivos, o expresiones matemticas que generen un resultado entero y positivo. La numeracin de los subndices depende mucho del lenguaje de programacin que se utilice, la mayora de lenguajes utilizan el nmero uno (1) para el primer subndice por ejemplo Algol, BASIC, FORTRAN y otros; otros lenguajes como Pascal, pueden utilizar cualquier nmero como primer subndice. Otros lenguajes como Java, C (el que nosotros aplicamos), inician siempre con el subndice cero (0):
T [0]
T[1]
T[2]
T[3]
T [4]
T [5]
T [29]
25.5
29
32
27.4
30
29
31.1
Cada casilla o posicin del vector se comporta como una variable simple o escalar, por lo tanto las acciones que podemos realizar con cada una son las mismas: Almacenar un solo dato. Cambiar su valor, por medio de asignacin, o proceso matemtico, o lectura. Se puede imprimir el dato contenido en ella. Los vectores se pueden representar como una fila o como una columna. Por ejemplo, el vector K de 6 elementos se muestra en la siguiente figura:
K 4
0
0 1
12
1
3
2
6
3
7
4
14
5
2 3 4
Subndice Elementos
K 4 12 3 6 7 14
En resumen, un vector es una secuencia finita de datos (existe un ltimo elemento), de tamao fijo (no se puede variar el nmero mximo de elementos que forman el vector) y homogneos (todos los datos son del mismo tipo). La dimensin de un vector est dada por la cantidad de elementos que contiene y debe ser definida al inicio del flujograma.
En donde: Identificador n
El trabajo o acciones que se pueden realizar con los elementos de un vector pueden realizarse con una, varias o con todas las posiciones del vector:
K[ i ]
3.2.c Asignacin
Un elemento Varios elementos Todos los elementos
0 1
K[5]=7
K[0]=4 K[3]=3
i = 0, 5, 1
V
v [ i ] = i+1
3 4 5
K [6 ] = 14
1 2 3 4 5 6
14
3.2.d Procesos Matemticos: Con los elementos de un vector podemos realizar los clculos que se requieren. Por ejemplo, tomemos el vector K, con los datos: K 4
0
12
1
3
2
6
3
7
4
14
5
Asigna al elemento K [ 3 ] el resultado de: 2 * 4 + 3 K [ 3 ] = 2*K[ 0 ]+K[ 2 ] Asigna al elemento K [ 6 ] el resultado de: 7 + 14 K [ 6 ] = K[ 4 ] + K[ 5 ]
12
1
3
2
11
3
7
4
21
5
3.2.e Procesos Lgicos: Con vectores podemos realizar tambin las comparaciones que sean necesarias:
No
K[ 3 ] >= K[ 4 ]
Si
K[ 3 ] >= v[ 1 ]
Si
K[ 3 ] >= 7.5
Si
K[ 3 ] >= my
Si
3.2.f Impresin de datos Al igual que la lectura de datos, la impresin de un vector se hace utilizando un contador para manejar los subndices, y una de las estructuras de repeticin vistas anteriormente, tal como se muestra en la figura. Con este trozo de flujograma se imprimen, uno a uno, los 6 valores que tiene guardados el arreglo K. i = 0, 5, 1
K[ i ]
3.3. Ejemplo de Problemas que utilizan Vectores 3.3.1 Disee un flujograma que calcule la edad promedio de 10 estudiantes, que muestre la edad
mayor del grupo y el correlativo del estudiante con la mayor edad. I. Planteamiento del Problema Entrada de datos
Salida de datos
Edades de 10 estudiantes
Edad promedio Edad mayor No. del estudiante con mayor edad
II. Anlisis del Problema a) Variables de Salida: Nombre Tipo e_prom Real mayor Entero num Entero
Descripcin Edad promedio de los 10 alumnos Edad mayor del grupo de estudiantes Nmero del estudiante con mayor edad
Descripcin Vector que almacena cada una de las edades de los 10 estudiantes
c) Restricciones: edad[i] >0, donde i = 0, 1, 2, 3, , 9 d) Proceso: sum = 0; mayor = -1 sum =sum + edad[ i ] edad[ i ] > mayor ? SI: mayor = edad[ i ] num = i e_prom = sum/estu e) Variables de proceso Nombre tipo i Entera sum Entera Repetir desde i = 0 hasta i <= 9, con cambios de 1
Inicio
Si
sum = 0;
i = 0, 9, 1
mayor = -1
num = i
3 2
edad[ i ]
Edad promedio: , e_prom, Edad mayor: , mayor, N del estudiante con la edad mayor: , num
3.3.2 Disee un programa que lea las notas de 25 estudiantes, las imprima, y adems que calcule la
nota promedio de todos, y cuantos estudiantes obtuvieron una nota mayor que el promedio. I. Planteamiento del Problema Entrada de Datos - Nota de cada estudiante - Nmero de estudiantes (25) Proceso Salida de Datos - Nota de cada estudiante y el correlativo del mismo - Media - Nmero de notas mayores que la media
II. Anlisis del Problema a) Variables de salida: Nombre Tipo Descripcin media Real El promedio de las notas m Entera Nmero de estudiantes con notas mayores que la media, contador i Entera Contador, cuenta el nmero de estudiantes y sus y notas respectivas (correlativo) Recordar que tambin se imprimen la nota de todos los alumnos, notas[i] y su correlativo b) Variables de Entrada: Nombre Tipo Descripcin notas[ ] Real Arreglo que contiene las notas c) Restricciones: (notas [ i ]>=0) && (notas [ i ]<=10) d) Proceso: suma = 0 Repetir desde i = 0 hasta 24 media = suma/num m=0 Repetir desde i = 0 hasta 24 notas [ i ] > media? Si: m = m + 1 suma = suma + notas[i]
e) Variables de proceso: Nombre Tipo Descripcin suma Real Sumatoria de todas las notas
Inicio
1
media = suma/25
suma = 0
m=0
i = 0, 24, 1
i = 0, 24, 1
notas[ i ]
Si
m=m+1
Si
notas[ i ]
i+1, notas[ i ]
Fin
Por qu se necesita un arreglo en la solucin anterior? Nos piden que encontremos el nmero de estudiantes que obtuvieron una nota mayor que el promedio, esto slo puede ser evaluado despus de haber calculado el promedio de notas. Para hacer esto, es necesario que tengamos acceso de nuevo a los valores que fueron ledos para las notas y, eso solo se puede lograr manteniendo dichos datos en un vector.
10
Los elementos de una estructura pueden estar clasificados ordenados de forma: Ascendente, si los elementos que forman la estructura de datos estn organizados de menor a mayor. Descendente, cuando los elementos se encuentran clasificados de mayor a menor. En ambos casos los valores repetidos, si existen, quedan en posiciones contiguas. En esta unidad de la asignatura, se estudiarn dos de los algoritmos de ordenamiento que existen: bubble sort y el de insercin.
11
i = 0, 4, 1
a[i] a[i]
Mientras ( c != 0)
c=0 i = 0, 4-1, 1
A
a[ i ]
Fin NO SI
a[i]> a [ i +1]
El algoritmo anterior ordena de mayor a menor, si se quiere un ordenamiento descendente solo hay que cambiar el signo de la condicin, as:
12
...
No
a [ i ] < a [ i+1 ]
...
En la siguiente versin se aplic modularidad, al mismo algoritmo de ordenamiento, disendose dos mdulos, el principal y otro llamado orden. TOP-DOWN
principal
orden
Mdulo Principal: Lee e imprime el vector original, es decir desordenado. Mdulo Orden: Recibe el vector original, lo ordena y lo imprime.
13
INICIO
orden ( v [ ], n1 ) c=1
Mientras ( c != 0)
c=0 a[i]
i = 0, n1 - 2, 1
NO
v[i]> v [ i +1]
SI
i = 0, n-1, 1
a[i]
v[i]
RETORNAR
14
4.2. Mtodo de Insercin. El mtodo de ordenacin por insercin es similar al proceso tpico de ordenar tarjetas de nombres por orden alfabtico, tambin las cartas de una baraja; la cual consiste en insertar un nombre en su posicin correcta dentro de una lista que ya est ordenada. El algoritmo contempla los siguientes pasos: 1. El primer elemento a[0] se considera ordenado, es decir, la lista inicial consta de un elemento. 2. Se inserta a[1] en la posicin correcta delante o detrs de a[0], dependiendo de que sea menor o mayor. 3. Por cada lazo o iteracin i (desde i =1 hasta n-1) es explora la sublista a[i-1]...a[0] buscando la posicin correcta de insercin; a la vez se mueve hacia abajo (a la derecha en la sublista) una posicin todos los elementos mayores que el elemento a insertar a[i], para dejar vaca esa posicin. 4. Insertar el elemento en la posicin correcta. La porcin del diagrama de flujo correspondiente al mtodo de insercin es:
j=i
aux=a[i]
a[ j ] = a[ j-1]
j=j-1
a[ j ] = aux
15
En este ejemplo tenemos una matriz de dimensin M * N, en donde M es el nmero de filas y N el nmero de columnas. Aqu M=5 y N=6. El nmero total de elementos de la matriz ser entonces 5*6 = 30. De la misma forma que los vectores, una matriz debe tener un nombre. Llamaremos MAT a nuestra matriz ejemplo y determinaremos la posicin de algunos de sus elementos. MAT ser de tipo alfanumrico.
La matriz MAT est definida con 5 filas y 6 columnas. Una vez que la matriz contenga datos para referirnos a un elemento debemos conocer en que fila y que columna reside ese elemento; como vimos en los vectores la numeracin de los subndices depende del lenguaje de programacin, por lo que nosotros iniciamos con subndice cero (0), tanto en las filas como en las columnas, por ejemplo:
16
0 0
A L O
MAT
1 2 3
Para asignarle esos valores a la matriz se puede referenciar cada casilla o posicin escribiendo el nmero de fila y columna entre corchetes por separada y unos despus del otro, iniciando con la fila requerida, de est manera: MAT [nmero de fila][nmero de columna] = dato Por ejemplo: MAT [0][0] = MAT [1][1] = MAT [2][4]= MAT [3][1] = A L O
En donde, - identificador: es el nombre que se le ha asignado a la matriz - M: es el nmero de filas que tendr la matriz. - N: es el nmero de columnas que tendr la matriz.
17
INICIO
Reservar
MAT[ 3 ][ 4 ]
f = 0, 2, 1 c = 0, 3, 1
MAT [ f ] [ c ]
Datos a utilizar: 2, 6, 3, 8, 4, 9, 7, 2, 3, 5, 1, 6
FIN
En este ejemplo, la matriz se lee fila por fila, controladas por la variable f (que toma valores desde 1 hasta 3) y en cada una se inician las columnas controladas por la variable c (que toma valores desde 1 hasta 4). La lectura y cambios de subndice se muestran a continuacin: fila 0 0 0 0 1 1 1 1 2 2 2 2 columna 0 1 2 3 0 1 2 3 0 1 2 3 Lee MAT [ 0 ] [ 0 ] MAT [ 0 ] [ 1 ] MAT [ 0 ] [ 2 ] MAT [ 0 ] [ 3 ] MAT [ 1 ] [ 0 ] MAT [ 1 ] [ 1 ] MAT [ 1 ] [ 2 ] MAT [ 1 ] [ 3 ] MAT [ 2 ] [ 0 ] MAT [ 2 ] [ 1 ] MAT [ 2 ] [ 2 ] MAT [ 2 ] [ 3 ] Datos 2 6 3 8 4 9 7 2 3 5 1 6 MAT
0 0 1 2 3
2 4 3
6 9 5
3 7 1
8 2 6
El recorrido de una matriz, que se lee fila por fila desde la primera columna hasta la ltima, se hace de arriba hacia abajo (filas) y de izquierda a derecha. Tambin se puede hacer el recorrido de la matriz por columnas. En este caso el ciclo ms externo tiene que manejar el subndice de las columnas y el ciclo ms interno el de las filas, como se muestra a continuacin.
18
INICIO
Reservar
MAT [ 3 ][ 4 ]
c = 0, 4, 1
f = 0, 3, 1
MAT [ f ] [ c ]
Datos a utilizar: 2, 6, 3, 8, 4, 9, 7, 2, 3, 5, 1, 6
FIN
En este caso, la matriz se lee columna por columna, controladas por la variable c (que toma valores desde 0 hasta 3) y en cada una se inician las filas controladas por la variable f (que toma valores desde 0 hasta 2). La lectura y cambios de subndice se muestran a continuacin:
columna 0 0 0 1 1 1 2 2 2 3 3 3
fila 0 1 2 0 1 2 0 1 2 0 1 2
Lee MAT [ 0 ] [ 0 ] MAT [ 1 ] [ 0 ] MAT [ 2 ] [ 0 ] MAT [ 0 ] [ 0 ] MAT [ 1 ] [ 1 ] MAT [ 2 ] [ 1 ] MAT [ 0 ] [ 1 ] MAT [ 1 ] [ 1 ] MAT [ 2 ] [ 2 ] MAT [ 0 ] [ 2 ] MAT [ 1 ] [ 2 ] MAT [ 2 ] [ 2 ]
Datos 2 6 3 8 4 9 7 2 3 5 1 6
MAT
0 0 1 2 3
MAT
0 0 1 2 1 2 3
2 6 3
8 4 9
7 2 3
5 1 6
Note que los valores quedan almacenados en diferentes posiciones dentro de la matriz, a pesar que son los mismos datos en ambas lecturas
19
...
1
A
0 1
5 8 -2.
1 -1 15
...
5.2.d Proceso (Matemticos y lgicos) Matemticos Lgicos
NO
A[ 2 ] [ 0 ] >= A[1][1]
SI
0 0
A:
1 2
5 8 13
1 -1 -1
20
...
f = 0, 2, 1 c = 0, 3, 1 MAT [ f ] [ c ]
...
En este ejemplo, la matriz se imprime fila por fila, controladas por la variable f (que toma valores desde 0 hasta 2) y en cada una se inician las columnas controladas por la variable c (que toma valores desde 0 hasta 3).
5.3.
5.3.1. Disee un flujograma que permita calcular la suma de los elementos positivos y la suma de
los elementos negativos de una tabla o matriz T, cuyas dimensiones no excedan de 100. I. Planteamiento del Problema Entrada de Datos - Nmero de filas de la matriz - Nmero de columnas de la matriz - Valor de cada elemento de la matriz Proceso Salida de Datos - Suma de los elementos positivos de la matriz - Suma de los elementos negativos de la matriz
II. Anlisis del Problema a) Variables de salida: Nombre Tipo Descripcin SNP Entera Suma de los elementos positivos SNN Entera Suma de los elementos negativos b) Variables de entrada: Nombre Tipo T[][] Entera M Entera N Entera
c) Restricciones:
El nmero de filas y columnas no pueden ser ms de 100: (M>0 && M <= 100) && (N>0 && N <= 100)
21
d) Proceso:
SNP = 0 SNN = 0
f = 0, M-1, 1 c = 1, N-1, 1
M, N
Mientras (M<1 && M>100 ) || (N<1 && N>100)
Si
SNP=SNP+T[f][c]
SNN=SNN+T[f][c]
M, N
Suma de positivos:, SNP
f = 0, M-1, 1 c = 0, N-1, 1
T[ f ][ c ]
Fin
22
5.3.2. Disee un flujograma que permita leer 25 datos enteros, e imprimirlos en forma de
tabla o matriz (fila por fila). I. Planteamiento del Problema Entrada de Datos - Valor de cada elemento de la Matriz (25 elementos, en una matriz 5X5) II. Anlisis del Problema a) Variables de salida: No se usan, se imprimen los mismos datos de entrada b) Variables de entrada: Nombre Tipo tabla [ ] [ ] Entera Proceso Salida de Datos - Impresin de la matriz en formato de tabla, fila por fila
Descripcin 25 Nmeros guardados como una matriz de 5 filas y 5 columnas La cantidad de filas (5) y de columnas (5) se consideran constantes y, se trabajaran como simblocas c) Restricciones: No se usan
f) Constantes con nombre: Nombre Tipo Descripcin filas Entera El nmero de filas de la matriz col Entera El nmero de columnas de la matriz. d) Proceso: filas = 5 ; col = 5 ;
Valor 5 5
e) Variables de proceso: Nombre Tipo Descripcin i Entera Contador de filas j Entera Contador de columnas
23
III. Diseo de la solucin. Flujograma. Inicio filas = 5 col = 5 Reservar memoria para tabla [filas] [columnas]
LECTURA DE LA MATRIZ FILA POR FILA
i = 1, filas, 1 j = 1, col, 1
Tabla[i][j]
j==col
i = 1, filas, 1
\n \n
j = 1, col, 1
tabla [ i ][ j ]
Fin
1
Material editado por Ing. Carolina Ayala e Ing. Milagro Castillo P. ciclo II 2011
24