lunes, 10 de junio de 2013

7. Subprogramas.


Se llama 
Subalgoritmo a cada una de las partes de un Algoritmo más general que resuelve cada una de las tareas particulares necesarias para que dicho algoritmo general alcance el objetivo para el que fue diseñado, es decir resolver un problema. Este concepto está vinculado al Diseño estructurado de algoritmos, en el cual un problema se divide en partes que posteriormente son resueltas por un módulo. Cada módulo coincidirá pon un subalgoritmo.

     Cuando hablamos de algoritmos complejos estamos hablando de problemas complejos es decir, problemas que se dividen en problemas mas pequeños (subproblemas). La solucion de estos subproblemas se realiza mediante los subalgoritmos.


     Está demostrado que ante un problema complejo, este se resuelve mejor cuando el mismo se divide en pequeños problemas. Este concepto es aplicable con los algoritmos, dividiéndolos en subalgoritmos, que en su conjunto logran resolver el algoritmo.

     La programación modular consiste en dividir un programa en partes bien diferenciadas, llamadas módulos (o subprogramas, o subalgoritmos o subrutinas), que pueden ser analizadas y programadas por separado. Existe un algoritmo o programa principal, que cede el control a los módulos, y una vez éstos se han ejecutado, vuelve a tomar el control, continuando la ejecución del programa por dónde los llamó

     El objetivo del uso de subalgoritmos es modularizar un algoritmo, es decir dividir al problema en subpromlemas, resolver el problema con un algoritmo y a los sobproblemas con subalgoritmos. De esta forma cuando resuelvo un problema me abstraigo de los pequeños detalles que no hacen en sí al problema llamando a acciones (Subalgoritmos) que una vez resuelto el problema principal tendré que solucionar.
La ventaja más importante de modularizar es que los subprogramas se pueden reutilizar en el mismo algoritmo o en otros.


Veamos el ejemplo planteado al principio

     El algoritmo, con el uso de subalgoritmos quedaría escrito de la siguiente forma.

Algoritmo Ejercicio_1
               Leer_Y_Validar
               X<-Numero
Escribir(‘Ingrese la cantidad de número que quiere ingresar’)
Leer(N)
Para i<-1 hasta N
               Lee_y_Validar
Ver_Cooprimos
Si Son_Coopromos entonces
                              Escribir(‘Los número son cooprimos’)
                              Si no
                              Escribir(‘Los número no son cooprimos’)
                              Fin si
               Fin Para
Fin Algoritmo Ejercicio_1


Subalgoritmo Leer_y_Validar
               Repetir
                              Escribir(‘Ingrese un número entre 1 y 10’)
                              Leer(Numero)
               Hasta   (Numero<=10)  ^ (Numero>=1)
Fin Subalgoritmo Leer_y_Validar
  
Subalgoritmo Ver_Cooprimos
               Son_Cooprimos<-V
               Si X<Numero entonces
                              Min<-X
               Si no

                              Min<-Numero

               Fin si
               i<-2
Mientras  i<Min ^ Son_Cooprimos Hacer
               Si  Min mod i = 0  Entonces
                              Son_Cooprimos<-F
               Si no
                              i<-i+1
               fin si

Fin Subalgoritmo Ver_Cooprimos


¿Qué es un procedimiento?

     Teniendo en cuenta lo anterior, se definiría como un módulo. Concretamente, como un módulo que no retorna ningún valor, ejecuta lo que tenga que ejecutar y devuelve el control al programa que lo llamó.
Supongamos que queremos ordenar tres valores numéricos.
En ese caso, el algoritmo sería:
Algoritmo ordenar
Var
a,b,c, aux : entero
Comienzo
Leer a, b, c
si a > b
aux= a
a=b
b= aux
Tres veces se repite el intercambio, con diferentes variables.
     Obsérvese que las líneas de código son similares, por lo que se podría escribir un fragmento de código aparte, y utilizarlo con los PARAMETROS adecuados en cada caso
finsi
si b>c
aux= c
c=b
b= aux
si a > b
aux= a
a=b
b= aux
finsi
finsi
mostrar a,b,c
fin
Amerita, entonces, utilizar un procedimiento «intercambio » que me permita intercambiar dos variables cada vez que lo necesite y sin necesidad de reescribir el código cada vez.

Funciones:

     Es una que toma una o mas valores llamados argumentos y produce un valor llamado resultado
Ejemplo:
F(x) =x/i+x*x
Para evaluar f debemos darle un valor a x.

Declaración de funciones


     Requiere de una serie de pasos que la definen .
Consta de una cabecera , seguido de la palabra (función) y del nombre del argumento de la
función después ira el cuerpo que es una serie de acciones cuya ejecución hará que se asigne un
valor al nombre de la función , esto determina el resultado que ha de devolver al programa.

Ejemplo:

F(x,y)=x/1+x*x
Se define como :
Real función f(x)
Inicio
Devolver (x/(1+x*x))
Fin_funcion




Cada subprograma es en realidad un algoritmo más pequeño que aporta parte de la solución al problema principal. En estos subprogramas podemos definir variables, realizar asignaciones, realizar lectura de datos, imprimir expresiones, variables y literales, usar ciclos, vectores, decisiones, incluso invocar o llamar  a otros subprogramas.
Modelo gráfico de un programa que esta construido con: 
sub-programa.
A Pesar de usar todos los subprogramas que se deseen siempre habrá de existir uno denominado principal, el cual es el encargado de organizar el uso de los elementos y subprogramas disponibles. Un programa siempre inicia en su parte principal y es desde allí de donde se articulan los elementos a ser usados.

Como funciona un programa que esta estructurado por subprogramas?

El programa inicia en su parte principal, es desde allí donde se ejecuta linea a linea, cuando el programa desea utilizar un subprograma, realiza un llamado,al cual se le conoce con el nombre de invocación. 
En este llamado,es vital conocer el nombre del subprograma que se desea invocar y los elementos que se deben enviar para que éste funcione adecuadamente, el programa ejecuta cada instrucción del subprograma que fue llamado, y cuando termina, regresa retornando el resultado y permitiendo que el programa siga la ejecución en la parte donde había sido llamado. 


Los subprogramas tienen dos aspectos claves.

1. Un subprograma se crea una sola vez.
Esto implica hacer el algoritmo que se encuentra en el interior del subprograma de forma que cumpla un fin específico.

2. Un subprograma se usa n veces en un subprograma
Desde cualquier parte del programa se puede llamar a un subprograma creado con el fín de ser usado, solo se necesita enviar los parámetros necesarios para su correcto funcionamiento.

Forma general para definir un subprograma en el lenguaje python.


Para utilizar un subprograma se aplica la misma técnica que trabajamos para las funciones definidas por el sistema.

Para construir un subprograma se necesita:

1. Asignarle un nombre que sea acorde a lo que se espera realice el subprograma
2. Definir el número de parámetros que se necesitarán para su funcionamiento. En este punto la idea es que en un comienzo desde el enunciado se sugiera el número de parámetros que necesitará el subprograma y que más adelante se desarrolle esa habilidad.
3. Crear el algoritmo que se encuentra en el interior del subprograma. Utilizando los parámetros como datos de entrada y aplicando cualquiera de las instrucciones que se venían  aplicando en los algoritmos realizados hasta ahora.
4. Si el programa debe retornar un resultado, este se logra mediante el uso de la instrucción return seguida de lo que se desea retornar. 

Forma general de un programa construido con subprogramas.



1. ¿Para crear un programa con subprogramas siempre hay que importar las bibliotecas?
No. Eso solo depende si se necesitan funciones definidas por el sistema en lo que deseamos construir.

2. ¿Dos subprogramas pueden llamarse igual?
No. Cada subprograma debe tener un único nombre que lo identifique de los demás.

3. ¿Los parámetros pueden llamarse igual?
En un mismo subprograma cada parámetro debe ser diferente de los otros, cada parámetro se separa de los demás por el uso de comas. Pero dos subprogramas si pueden tener el mismo nombre de los parámetros, dado que cada uno es independiente de los demás.

4. ¿Qué instrucciones pueden ir dentro de un subprograma?
Todas las que se han trabajo.
- Definición de variables
- Realización de operaciones lógicas, matemáticas...
- Toma de decisiones if, else, elif ...
- Realización de ciclos, simples y anidados.
- Aplicación de vectores 
- Utilización de funciones definidas por el sistema
- Utilización de subprogramas.

5.¿Puede ejecutarse un subprograma solo?
No. Todo subprograma debe ser llamado desde otra parte del programa y ningún subprograma se ejecutará sin que exista un programa principal que desencadene su utilización.

6. ¿Cuántas veces puedo utilizar un subprograma?
Un subprograma puede ser utilizado las veces que se desee, no hay limites. Pero si se aplica una llamada recursiva, es decir, un programa que se llama a si mismo n veces puede saturar la memoria del computador y bloquear el programa que se esta ejecutando.

7. ¿Que pasa cuando en dos subprogramas se definen variables con el mismo nombre?
Al estar en subprogramas diferentes, no les sucede nada, dado que cada subprograma genera una capsula que la convierte en independiente de los demás e incluso independiente del programa principal.


Ejemplo 1Construir un subprograma que genera una información y es invocado desde el programa principal. 


Ejemplo 2 Construir un subprograma que dados dos catetos, calcule el valor de la hipotenusa a la cual pertenecen. Utilizar dicho subprograma para calcular la hipotenusa de unos catetos leídos por el teclado. 


Ejemplo 3 Crear un sistema que realiza las operaciones básicas entre dos valores decimales aplicando el concepto de subprograma para cada una de las operaciones y del menú principal. 

Algunos gráficos :
Soluciona problemas complejos al dividirlos en subprogramas y luego dividirlos estos en otros mas
simples, hasta que estos sean mas fáciles de resolver. Esta técnica se llama “divide y vencerás” .









Explicación de Subprogramas en estos vídeos :



Mira éste otro vídeo :

6.2 Arreglos bidimensionales

Arreglos bidimensionales
Los arreglos bidimensionales son tablas de valores. Cada elemento de un arreglo bidimensional está simultáneamente en una fila y en una columna.
En matemáticas, a los arreglos bidimensionales se les llama matrices, y son muy utilizados en problemas de Ingeniería.
En un arreglo bidimensional, cada elemento tiene una posición que se identifica mediante dos índices: el de su fila y el de su columna.
Crear arreglos bidimensionales
Los arreglos bidimensionales también son provistos por NumPy, por lo que debemos comenzar importando las funciones de este módulo:
from numpy import *
Al igual que los arreglos de una dimensión, los arreglos bidimensionales también pueden ser creados usando la función array, pero pasando como argumentos una lista con las filas de la matriz:
a = array([[5.1, 7.4, 3.2, 9.9],
           [1.9, 6.8, 4.1, 2.3],
           [2.9, 6.4, 4.3, 1.4]])
Todas las filas deben ser del mismo largo, o si no ocurre un error de valor:
>>> array([[1], [2, 3]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.
Los arreglos tienen un atributo llamado shape, que es una tupla con los tamaños de cada dimensión. En el ejemplo, a es un arreglo de dos dimensiones que tiene tres filas y cuatro columnas:
>>> a.shape
(3, 4) 

Los arreglos también tienen otro atributo llamado size que indica cuántos elementos tiene el arreglo:
>>> a.size
12
Por supuesto, el valor de a.size siempre es el producto de los elementos de a.shape.
Hay que tener cuidado con la función len, ya que no retorna el tamaño del arreglo, sino su cantidad de filas:
>>> len(a)
3
Las funciones zeros y ones también sirven para crear arreglos bidimensionales. En vez de pasarles como argumento un entero, hay que entregarles una tupla con las cantidades de filas y columnas que tendrá la matriz:
>>> zeros((3, 2))
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

>>> ones((2, 5))
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
Lo mismo se cumple para muchas otras funciones que crean arreglos; por ejemplom la función random:
>>> from numpy.random import random
>>> random((5, 2))
array([[ 0.80177393,  0.46951148],
       [ 0.37728842,  0.72704627],
       [ 0.56237317,  0.3491332 ],
       [ 0.35710483,  0.44033758],
       [ 0.04107107,  0.47408363]])

Ejemplo


Operaciones con arreglos bidimensionales
Al igual que los arreglos de una dimensión, las operaciones sobre las matrices se aplican término a término:
>>> a = array([[5, 1, 4],
...            [0, 3, 2]])
>>> b = array([[2, 3, -1],
...            [1, 0, 1]])

>>> a + 2
array([[7, 3, 6],
       [2, 5, 4]])

>>> a ** b
array([[25,  1,  0],
      [ 0,  1,  2]])
Cuando dos matrices aparecen en una operación, ambas deben tener exactamente la misma forma:
>>> a = array([[5, 1, 4],
...            [0, 3, 2]])
>>> b = array([[ 23],
...            [-11],
...            [ 01]])
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Obtener elementos de un arreglo bidimensional
Para obtener un elemento de un arreglo, debe indicarse los índices de su fila i y su columna j mediante la sintaxis a[i, j]:
>>> a = array([[ 3.215.334.676.41],
               [ 9.54,  0.30,  2.14,  6.57],
               [ 5.62,  0.54,  0.71,  2.56],
               [ 8.19,  2.12,  6.28,  8.76],
               [ 8.72,  1.47,  0.77,  8.78]])
>>> a[1, 2]
2.14

>>> a[4, 3]
8.78

>>> a[-1, -1]
8.78

>>> a[0, -1]
6.41
También se puede obtener secciones rectangulares del arreglo usando el operador de rebanado con los índices:
>>> a[2:3, 1:4]
array([[ 0.54,  0.71,  2.56]])

>>> a[1:4, 0:4]
array([[ 9.54,  0.3 ,  2.14,  6.57],
       [ 5.62,  0.54,  0.71,  2.56],
       [ 8.19,  2.12,  6.28,  8.76]])

>>> a[1:3, 2]
array([ 2.14,  0.71])

>>> a[0:4:2, 3:0:-1]
array([[ 6.41,  4.67,  5.33],
       [ 2.56,  0.71,  0.54]])

>>> a[::4, ::3]
array([[ 3.21,  6.41],
       [ 8.72,  8.78]])
Para obtener una fila completa, hay que indicar el índice de la fila, y poner : en el de las columnas (significa «desde el principio hasta el final»). Lo mismo para las columnas:
>>> a[2, :]
array([ 5.62,  0.54,  0.71,  2.56])

>>> a[:, 3]
array([ 6.41,  6.57,  2.56,  8.76,  8.78])
Note que el número de dimensiones es igual a la cantidad de rebanados que hay en los índices:
>>> a[2, 3]      # valor escalar (arreglo de cero dimensiones)
2.56

>>> a[2:3, 3]    # arreglo de una dimensión de 1 elemento
array([ 2.56])

>>> a[2:3, 3:4# arreglo de dos dimensiones de 1 x 1
array([[ 2.56]])
Otras operaciones
La trasposición consiste en cambiar las filas por las columnas y viceversa. Para trasponer un arreglo, se usa el método transpose:
>>> a
array([[ 3.21,  5.33,  4.67,  6.41],
       [ 9.54,  0.3 ,  2.14,  6.57],
       [ 5.62,  0.54,  0.71,  2.56]])

>>> a.transpose()
array([[ 3.21,  9.54,  5.62],
       [ 5.33,  0.3 ,  0.54],
       [ 4.67,  2.14,  0.71],
       [ 6.41,  6.57,  2.56]])
El método reshape entrega un arreglo que tiene los mismos elementos pero otra forma. El parámetro dereshape es una tupla indicando la nueva forma del arreglo:
>>> a = arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

>>> a.reshape((4, 3))
array([[ 0, 1, 2],
       [ 3, 4, 5],
       [ 6, 7, 8],
       [ 9, 10, 11]])

>>> a.reshape((2, 6))
array([[ 0, 1, 2, 3, 4, 5],
       [ 6, 7, 8, 9, 10, 11]])
La función diag aplicada a un arreglo bidimensional entrega la diagonal principal de la matriz (es decir, todos los elementos de la forma a[i, i]):
>>> a
array([[ 3.21,  5.33,  4.67,  6.41],
       [ 9.54,  0.3 ,  2.14,  6.57],
       [ 5.62,  0.54,  0.71,  2.56]])

>>> diag(a)
array([ 3.21,  0.3 ,  0.71])
Además, diag recibe un segundo parámetro opcional para indicar otra diagonal que se desee obtener. Las diagonales sobre la principal son positivas, y las que están bajo son negativas:
>>> diag(a, 2)
array([ 4.67,  6.57])
>>> diag(a, -1)
array([ 9.54,  0.54])
La misma función diag también cumple el rol inverso: al recibir un arreglo de una dimensión, retorna un arreglo bidimensional que tiene los elementos del parámetro en la diagonal:
>>> diag(arange(5))
array([[0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 2, 0, 0],
       [0, 0, 0, 3, 0],
       [0, 0, 0, 0, 4]])
Reducciones por fila y por columna
Algunas operaciones pueden aplicarse tanto al arreglo completo como a todas las filas o a todas las columnas.
Por ejemplo, a.sum() entrega la suma de todos los elementos del arreglo. Además, se le puede pasar un parámetro para hacer que la operación se haga por filas o por columnas:
>>> a = array([[ 4.32.99.10.12. ],
...            [ 8.4.56.46.4.3],
...            [ 7.83.13.47.88.4],
...            [ 1.21.59.6.36.8],
...            [ 7.69.23.30.98.6],
...            [ 5.36.74.65.31.2],
...            [ 4.69.11.53.0.6]])
>>> a.sum()
174.4
>>> a.sum(0)
array([ 38.8,  37. ,  37.3,  29.4,  31.9])
>>> a.sum(1)
array([ 18.4,  29.2,  30.5,  24.8,  29.6,  23.1,  18.8])
El parámetro indica a lo largo de qué dimensión se hará la suma. El 0 significa «sumar a lo largo de las filas». Pero hay que tener cuidado, ¡por que lo que se obtiene son las sumas de las columnas! Del mismo modo, 1 significa «a lo largo de las columnas, y lo que se obtiene es el arreglo con las sumas de cada fila.
Las operaciones a.min() y a.max() funcionan del mismo modo:
>>> a.min()
0.1
>>> a.min(0)
array([ 1.2,  1.5,  1.5,  0.1,  0.6])
>>> a.min(1)
array([ 0.1,  4.3,  3.1,  1.2,  0.9,  1.2,  0.6])
a.argmin() y a.argmax() también:
>>> a.argmin(0)
array([3, 3, 6, 0, 6])
>>> a.argmin(1)
array([3, 4, 1, 0, 3, 4, 4])



ARREGLOS BIDIMENSIONALES

Hay arreglos de una dimensión, como los que se ha visto y usado hasta aquí, hay arreglos de dos dimensiones como los que veremos ahora, y puede haber arreglos de tres o más dimensiones. Esto último depende del lenguaje de programación que se use y la versión de él se tenga.
Los arreglos bidimensionales son de gran utilidad en el manejo de matrices, para obtener información de ellas y efectuar operaciones matriciales como suma, resta, producto e inversión, y aplicaciones donde la solución maneje matrices.
Para definir un arreglo bidimensional se hace de manera análoga a la definición de arreglos de una dimensión. Se elige un nombre, y se da la máxima posición para cada dimensión, recordando que cada dimensión varía de uno hasta ese valor máximo indicado. Cada dimensión tiene su propio rango de variación que es de 1 hasta el valor máximo, y es independiente de la variación de las otras dimensiones del arreglo.
En una instrucción se puede definir uno o varios arreglos, unidimensionales, bidimensionales o de dimensiones mayores.
Ejemplo:



La primera instrucción define 3 arreglos de nombre: N, M y M2. El primero es unidimensional con 15 variables, el segundo es bidimensional con 10*10 variables que son: M(1,1), M(2,1),..., M(10,1), M(1,2), M(2,2),...., M(10,9), M(1,10), M(2,10),..., M(10,10). El tercer arreglo es bidimensional con 6*6=36 variables.
La segunda instrucción define dos arreglos bidimensionales cuyos nombres son: MM y RE. El primero tiene 7*16=132 variables, y el segundo tiene 15*5=75 variables.

El número de variables de un arreglo esta dado por el producto de la máxima posición de la primera dimensión, por la máxima posición de la segunda dimensión. Esto, porque en cada dimensión el subíndice varía desde 1 hasta su máxima posición, independientemente de la variación del subíndice de la otra dimensión.
La instrucción:



Define un arreglo de dimensiones ajustables, de nombre XT con N*M variables. Esta instrucción estará correcta si las variables N, M están creadas e inicializadas con anterioridad a ella. Que sea correcta o no depende también del lenguaje de programación que use y si permite definir dimensiones ajustables. El lenguaje BASIC permite definirlas.

El tamaño de un arreglo es teóricamente cualquiera, pero estará limitado por la memoria principal que quede disponible en el computador que usa.
Por ejemplo, el arreglo M(100,100) tiene 10000 variables, y si cada una ocupa 4 bytes, se concluye que ocupa 40000 bytes que son aproximadamente 40 KB. Esto indica que este arreglo no podrá estar donde quede menos memoria que esa cantidad.
Los elementos de un arreglo bidimensional se pueden aludir con el uso de dos subíndices, uno para cada dimensión. Es decir, el programador para referirse a una variable dentro de un arreglo bidimensional lo hace usando un subíndice para cada dimensión.
Las instrucciones:


Están tomadas al azar y sin conexión lógica entre ellas. Para que la primera instrucción tenga sentido las variables I, J deberán haberse creado e inicializado con valores dentro del rango de variación de la dimensión del arreglo M. El arreglo M debe estar creado y la variable en la posición I, J debe estar inicializada. La variable TR también debe estar creada e inicializada.
Similares alcances se pueden hacer respecto de las otras tres instrucciones.
Ejemplo:



Estas instrucciones suman 36 variables del arreglo T y dejan la suma en S.
Observe que hay dos ciclos, uno contenido dentro del otro. Cuando I toma el valor 1, J toma los valores 1, 2, 3, 4, 5 y 6. Cuando I toma el valor 2, J toma todos esos valores de nuevo, y así sucesivamente.
En este ejemplo se formal los 21 primeros impares y su cuadrado en el arreglo IM, luego se calcula al suma, el producto y el promedio de ellos. Al final se imprimen.


EJEMPLO




En este ejemplo se lee 120 datos correspondientes a DAP y Altura de 120 árboles. Los 120 DAP quedan en la primera dimensión del arreglo DA, las 120 alturas en la segunda, las áreas basales en la tercera y los volúmenes en la cuarta.
El volumen se calcula como: (Área basal * Altura) / 3 , y, Area basal: (PI / 4) * DAP * * 2)



 EJERCICIOS MATRICIALES

Se muestra ahora dos programas cuya solución requiere usar arreglos bidimensionales, y que son especialmente útiles en el manejo de matrices.
Ejemplo 
Lea dos matrices de 4X4 y calcule e imprima la matriz suma y la matriz producto. Leer las dos matrices al mismo tiempo, un elemento de cada una.



Ejemplo 




OBSERVACIÓN
Hay tres ciclos anidados en el cálculo de la matriz producto y hay dos ciclos anidados en la lectura y en el cálculo de la suma.
Lea N, y a continuación una matriz de NXN, luego calcules el producto de ella con su transpuesta. Imprima también la traza de A, de su transpuesta y de la matriz producto. Asuma que N <= 9.

El registro lógico de lectura tiene la forma:


 EJERCICIOS PROPUESTOS
La lista de ejercicios siguientes es para usar arreglos en su solución, sea éste unidimensional o bidimensional.
1. Se tiene un archivo con un grupo de 30 alumnos con el nombre y 15 notas de cada uno. Se pide imprimir cada nombre con sus 15 notas ordenadas de menor a mayor, y a continuación de las 15 notas, el promedio de ese alumno.



2. Leer de a un número hasta que lea el número 9999 y no se considera.
Se pide que imprima cuántas veces apareció el 1, el 2, ..., el 29 entre todos los números que se leyeron. Indique al final cuántos números leyó y cuál fue el promedio de esos números leídos.
La salida tendrá la forma:
El número 1 apareció ... veces
El número 2 apareció ... veces
:
El número 29 apareció ... veces
Se leyó ... números
El promedio de ellos fue: ....
3. Lea 20 nombres y 8 notas para cada uno, e imprima cada nombre con su promedio en el orden que los leyó. Luego se debe imprimir cada nombre y su promedio, pero ordenados de mayor a menor de acuerdo al promedio.
4. Lea 19 números correspondientes a datos tomados en terreno, e imprímalos ordenados de mayor a menor primero, y luego de menor a mayor. Luego imprima la mediana y el promedio de esos 19 números leídos. Luego vuelva a leer otros 19 números correspondientes a otra muestra tomada e imprimir de éstos la misma información. Debe leer hasta que los 19 números sean iguales y se consideran. 
Por ejemplo. 
Si los números leídos son: 15.5, 3.2, 2.5, ...., 18.6, 1.8 se deberá imprimir:

1.8
2.5
3.2
.....
15.5
18.6
18.6
15.5
......
3.2
2.5
1.8
Mediana = ......
Promedio = .....
5. Considere f(X) = X * SQRT(X) + Ln(1+2X2) - 2 * e-3X y el intervalo [0,4]. Calcule la imagen de los puntos en el intervalo dado con aumentos de 0.05, y deje los puntos y las imágenes en arreglos. Observe que son 81 puntos en un arreglo y 81 imágenes en otro arreglo.
Se pide ubicar el punto donde se produce la mayor imagen e imprimirlo junto a su imagen. Indique también si f(X) es o no estrictamente creciente o decreciente en el intervalo dado.


6. En un archivo se tiene información de 50 insumos que se ocupan en una oficina por mes, en formato:Por ejemplo:

Lápiz pasta 160 25.0Se pide emitir dos informes, el primero debe contener la descripción, cantidad y valor de los 30 insumos de mayor valor ordenados descendentemente de acuerdo al valor unitario.El segundo informe debe contener la descripción, cantidad y valor de los 25 insumos de mayor cantidad por mes ordenados descendentemente de acuerdo a la cantidad.
Así, el primer informe tendrá formato:
cinta de máquina 3 1580.0
papel roneo 100 1005.0
normógrafo 2 860.0
El segundo informe tendrá formato:
stencil 360 50.0
transparencias 200 160.0
papel roneo 100 1005.0
:
7. Considerando el archivo de insumo para una oficina del ejercicio 6, se pide emitir un listado de todos los insumos ordenados de mayor a menor de acuerdo al gasto total en dinero al mes de cada uno de ellos. El gasto total por mes de cada insumo esta dado por el producto: valor unitario * cantidad
Así, este listado de salida tendrá formato:
papel roneo 100500.0
transparencias 32000.0
stencil 18000.0
: :
8. Por programa forme y luego imprima la siguiente matriz cuadrada de10X10 agregue a continuación el valor de su traza y el mensaje "es simétrica de 10 X 10"
2
3
4
. . . . . . .
11
3
4
5
. . . . . . .
12
:




11
12
13
. . . . . . .
20
9. Forme por programa las siguientes dos matrices: y calcule e imprima la matriz producto A*B. Luego calcule la matriz producto B*A e imprima A*B y B*A. Finalmente imprima un mensaje que diga si A*B es igual a B*A


10. Lea un número N que es entero positivo entre dos y diez inclusive, luego lea dos matrices A y B de NxN debe imprimir un mensaje que diga "A y B conmutan" o bien, "A y B no conmutan".




11. Se tiene un archivo de cuarenta alumnos con la nota final de quince asignaturas y se pide leer este archivo para sacar un listado con el orden en que deben llamarse en la ceremonia de graduación, si se llamará primero al mayor promedio y luego a los que le siguen en orden. Las dos primeras notas deben tomarse con coeficiente tres, las cuatro siguientes con coeficiente dos, y las nueve restantes con coeficiente uno.
El archivo de lectura tiene forma:




°Para determinar el número total de elementos en un arreglo bidimensional usaremos las siguientes fórmulas:
Rango
de renglones (r1) = ls1 - (li1+1)
Rango de columnas (r2) = ls2 - (li2+1)
No. Total de componentes = r1 * r2

Representación en memoria por columnas
[pic]

x : array [1..5,1..7] of integer

Para calcular la dirección de memoria de un elemento se usan la siguiente formula:
A[i,j] = base (A) + [((j - li2) R1 + (i + li1))*w]

Representación en memoria por renglones
[pic]
x : array [1..5,1..7] of integer
Para calcular la dirección de memoria de un elemento se usan la siguiente formula:
A[i,j] = base (A) + [((i - li1) R2 + (j + li2))*w]
Donde:
i = Indice del renglón a calcular
j = Indice de la columna a calcular
li1 = Límite inferior de renglones
li2 = Límite inferior de columnas
w = Número de bytes tipo componente

Operaciones Con Arreglos

Las operaciones en arreglos pueden clasificarse de la siguiente forma:

• Lectura
• Escritura
• Asignación
• Actualización
• Ordenación
• Búsqueda

Lectura

Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus componentes.

La lectura se realiza de la siguiente manera:
para i desde 1 hasta N haz
x


Declaración.
La declaración de un arreglo consiste en establecer las características del arreglo y sus elementos, por medio de la siguiente sintaxis:

[ , ] <> ;

Donde:

tipo indica el tipo correspondiente a los elementos del arreglo ,

identificador es el nombre del arreglo, y

el par de corchetes y la coma, [ , ], representan las dimensiones del arreglo y encierra dos números enteros, cuyo producto corresponde al número de elementos del arreglo.

Ejemplos:

double [ , ] matriz ;

int [ , ] ubicación ;

Rama [ , ] árbol; // Rama es una clase.

Observe que, en la declaración, el espacio entre los corchetes está vacío. Esto se debe a que, durante dicha operación, no se reserva espacio en la memoria.

La creación de un arreglo bidimensional consiste en reservar espacio en la memoria para todos sus elementos, utilizando la siguiente sintaxis:

<> = new [ dim1, dim2 ] ;

Donde:

new es el operador para gestionar espacio de memoria, en tiempo de ejecución,

dim1 y dim2 son valores enteros que representan las dimensioes del arreglo.

El tamaño del arreglo es el resultado de multiplicar los valores de las dimensiones y representa el número de elementos del arreglo.

codificación 
La codificación es también aquella operación que tiene lugar para enviar datos de un lugar a otro, procesarlos y obtener resultados a partir de ellos. Todas las operaciones informáticas están cifradas en código binario, o bien, combinaciones más o menos complejas de unos y ceros que ocurren constantemente.A su vez, determinadas operaciones con ordenadores requieren un segundo nivel de codificación. Son aquellas que precisan de aspectos de seguridad y confidencialidad y, por ende, implican la creación de mensajes cifrados que sólo pueden ser leídos por cierto tipo de ordenadores o por el usuario que los ha creado, como ocurre con las contraseñas y datos personales en transacciones en línea.Este tipo de codificación tiene un alto valor de confiabilidad y se utiliza en todo tipo de tareas y entornos informáticos, en cuestiones tan simples como crear una cuenta en una red social y tan complejas como realizar operaciones bancarias y financieras por Internet.

Ejemplo:




Arreglos Multidimensionales

Este también es un tipo de dato estructurado, que está compuesto por n dimensiones. Para hacer referencia a cada componente del arreglo es necesario utilizar n índices, uno para cada dimensión
Para determinar el número de elementos en este tipo de arreglos se usan las siguientes fórmulas:
RANGO (Ri) = lsi - (lii + 1)
No. TOTAL DE ELEMENTOS = R1 * R2* R3 * ...* Rn
donde:
i = 1 ... n
n = No. total de dimensiones
Para determinar la dirección de memoria se usa la siguiente formula:
LOC A[i1,i2,i3,...,in] = base(A) + [(i1-li1)*R3*R4*Rn + (i2-li2)*R3*R2*... (in - lin)*Rn]*w

Operaciones Con Arreglos
Las operaciones en arreglos pueden clasificarse de la siguiente forma:
·         Lectura
·         Escritura
·         Asignación
·         Actualización
·         Ordenación
·         Búsqueda
a) LECTURA
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus componentes.
La lectura se realiza de la siguiente manera:
para i desde 1 hasta N haz
x<--arreglo[i]
b) ESCRITURA
Consiste en asignarle un valor a cada elemento del arreglo.
La escritura se realiza de la siguiente manera:
para i desde 1 hasta N haz
arreglo[i]<--x
c) ASIGNACIÓN
No es posible asignar directamente un valor a todo el arreglo, por lo que se realiza de la manera siguiente:
para i desde 1 hasta N haz
arreglo[i]<--algún_valor
d) ACTUALIZACION
Dentro de esta operación se encuentran las operaciones de eliminar, insertar y modificar datos. Para realizar este tipo de operaciones se debe tomar en cuenta si el arreglo está o no ordenado.
Para arreglos ordenados los algoritmos de inserción, borrado y modificación son los siguientes:
1.- Insertar.
Si i< mensaje(arreglo contrario caso En arreglo[i]<--valor i<--i+1 entonces>
2.- Borrar.
Si N>=1 entonces
inicio
i<--1
encontrado<--falso
mientras i<=n y encontrado=falso
inicio
si arreglo[i]=valor_a_borrar entonces
inicio
encontrado<--verdadero
N<--N-1
para k desde i hasta N haz
arreglo[k]<--arreglo[k-1]
fin
en caso contrario
i<--i+1
fin
fin
Si encontrado=falso entonces
mensaje (valor no encontrado)
3.- Modificar.
Si N>=1 entonces
inicio
i<--1
encontrado<--falso
mientras i<=N y encontrado=false haz
inicio
Si arreglo[i]=valor entonces
arreglo[i]<--valor_nuevo
encontrado<--verdadero
En caso contrario
i<--i+1
fin

fin




Tipo_dato nombre_matriz [índice fila] [índice columna] Nombre_matriz [subíndice1] [subíndice2] Para localizar o almacenar un valor en el array se deben especificar dos posiciones (dos subíndices), uno para la fila y otro para la columna. Los elementos se referencian con el formato: T [3,4] elemento de la fila 3 y columna 4 Declaración de los arrays bidimensionales: Al igual que en los arrays de una dimensión (vectores), los arrays bidimensionales (tablas) se crean con declaraciones type y var cuando se codifican en Pascal. Figura: Array de dos dimensiones T con 5 filas y 8 columnas.



Se deben indicar: Nombre del array Tipo del array El rango permitido (es decir, el primero y último valores posibles) por cada subíndice. 
Ejemplos



Manipulación de Tablas: El orden mas natural de procesar los vectores es el orden secuencial: del primero al último elemento. En el caso de las tablas o arrays bidimensionales, existen diferentes ordenes para su recorrido. Los más usuales son: recorrido por filas y recorrido por columnas. Recorrido por filas/columnas: Los elementos de la primera fila/columna se procesan primero, a continuación los de la segunda fila/columna, y así sucesivamente. Sea el array A de 3 filas y 4 columnas. Los recorridos serán:




Los recorridos se realizan mediante bucles anidados, uno por cada dimensión o índice. Ejemplo: Leer los datos de la siguiente tabla: 



Técnicas de programación: Los tipos de componentes de un array pueden ser de cualquier tipo predefinido o definido por el usuario. Los tipos de los subíndices pueden ser de cualquier tipo ordinal, excepto real. En Pascal, el tamaño del array debe ser declarado en el momento que se escribe el programa. Por consiguiente, si el tamaño deseado varía de una ejecución a otra, el array debe ser declarado del mayor tamaño posible. Es buena idea utilizar constantes definidas para uno o los dos límites de un tipo de índice del array. Este sistema permite que el tamaño del array pueda ser modificado cambiando simplemente los valores de las constantes en las declaraciones. A los elementos del array se puede acceder de modo secuencial, con un bucle, o de modo aleatorio directamente por su índice. La asignación de un array a otro requiere que los arrays sean del mismo tipo (A:=B).

Los elementos individuales de un array o el array completo pueden ser pasados como parámetros a procedimientos. Errores típicos de programación: Indices de la declaración del array fuera de rango o de límite ( error en tiempo de ejecución) No inicializar los arrays Los tipos de dos arrays utilizados en una sentencia de asignación de arrays deben ser los mismos No deben existir inconsistencias de tipos. El tipo del subíndice y el tipo del elemento utilizado en todas las referencias de los arrays deben corresponder a los tipos especificados en la declaración del array.



Vídeos

http://www.youtube.com/watch?v=SMIyVS3k848
http://www.youtube.com/watch?v=dh7KEQKsJy0

http://www.youtube.com/watch?v=nAdjap7i_AU