sábado, 10 de mayo de 2014

EVAP 4

Algorítmica y Lenguajes de Programación
Funciones y subrutinas





Funciones y subrutinas. Introducción


  • El diseño descendente permite obtener un programa que resuelva un problema dividiendo este en subproblemas cada vez más sencillos.
  • Cada subproblema tiene asociado un pseudocódigo de alto nivel compuesto por acciones no primitivas.
  • Cuando una de estas acciones no primitivas se repite en varios puntos del algoritmo es interesante darle un nombre y reutilizarla.
  • Estas acciones con nombre se denominan subprogramas, pudiendo ser, a su vez, funciones y subrutinas.


Funciones y subrutinas. Ventajas

Las ventajas de los subprogramas son múltiples:


  • Facilitan la modularidad y estructuración de los algoritmos.
  • Facilitan la lectura e inteligibilidad de los algoritmos.
  • Permiten economizar el esfuerzo del programador al permitir reutilizar el mismo código en varios puntos del mismo algoritmo.
  • Facilitan la depuración y mantenimiento de los programas.


Funciones y subrutinas. Funciones (i)


  • Las funciones son subprogramas con 0 ó más argumentos que siempre devuelven un valor de retorno.
  • Las funciones pertenecen entonces a un tipo determinado.
  • La invocación de una función puede formar parte de:
               Una expresión.
               La parte derecha de una asignación.
  • Una invocación de una función no puede formar:
               Una sentencia aislada.
               La parte izquierda de una asignación.

Funciones y subrutinas. Funciones (ii)
  • Funciones intrínsecas:
  • Las funciones intrínsecas son proporcionadas directamente por el lenguaje de programación.
  • La mayor parte de funciones intrínsecas son funciones matemáticas como la raíz cuadrada, los logaritmos o funciones trigonométricas.
  • Por cada una de las funciones intrínsecas más habituales en FORTRAN existe una función o un operador equivalentes en la notación algorítmica.

Funciones y subrutinas. Funciones (iii)
  • Funciones de usuario (i):

                 En muchas ocasiones el usuario estará interesado en definir sus propias funciones.
                 Las funciones de usuario deben estar definidas dentro del algoritmo principal:

definiciones de constantes                                                
declaraciones de variables
      inicio
          sentencias del algoritmo
 DEFINICIONES DE FUNCIONES
fin


program nombre_programa
    variables y constantes
    sentencias del programa
contains
DEFINICIONES DE FUNCIONES
end


Funciones y subrutinas. Funciones (iv)
  • Funciones de usuario (ii):
  • Para definir una función es necesario:

                   El nombre de la función.
                   El tipo de la función.
                   Los argumentos de la función y el tipo de los mismos.

  • Sintaxis de definición de funciones:


tipo funcion nombre (arg1ÎÎtipo1,..., argNÎÎtipoN)
inicio
sentencia1
sentencia2
...
sentenciaN
fin


tipo function nombre (arg1, ..., argN)
declaración arg1
...
declaración argN
sentencia1
sentencia2
...
sentenciaN
end


Funciones y subrutinas. Funciones (v)


  •            Ejemplos de funciones de usuario:


logical function siempreVerdad ()
siempreVerdad=.true.
end function

integer function maximo (a, b)
integer a,b
if (a>b) then
maximo=a
else
maximo=b
end if
end function

Funciones y subrutinas. Ámbitos (i)
  • Las funciones pueden acceder a una serie de variables:
  •          Argumentos.
  •          Variables definidas dentro de la función.
  • Estas variables se denominan locales por contraposición a las variables declaradas dentro del algoritmo principal denominadas globales.
  • Las variables locales sólo “existen” mientras la función se está ejecutando.
  • Si una variable local se denomina igual que una variable global la función sólo puede acceder a la primera.
  • En FORTRAN las subrutinas pueden modificar los valores de los argumentos recibidos; este fenómeno se denomina efecto lateral y hay que manejarlo con precaución.


Funciones y subrutinas. Subrutinas (i)
  • Subrutinas o procedimientos:
          Las subrutinas son subprogramas con 0 ó más argumentos que nunca devuelven un valor de retorno.
          Las subrutinas, por tanto, no tienen tipo.
          La invocación de una subrutina sólo puede aparecer en una sentencia de llamada a procedimiento                 (llamar/call).
          Una invocación de subrutina no puede formar:
                                         
                                          Una expresión.
                                          La parte derecha de una asignación.
                                          La parte izquierda de una asignación.
   
Funciones y subrutinas. Subrutinas (ii)
  • Ejemplos de subrutinas:


accion intercambio (a,b ÎÎ  entero)
inicio
temporal ÎÎ  entero
temporal ßß a
a ßß b
b ßß temporal
fin


Funciones y subrutinas. Resumen (i)

1. Los subprogramas facilitan la utilización de técnicas de diseño descendente para la construcción de               programas.
2. Los subprogramas:
          · Facilitan la modularidad y estructuración de los algoritmos.
          · Facilitan la lectura e inteligibilidad de los algoritmos.
          · Permiten una economización del esfuerzo del programador al poder escribir
            código reutilizable en muchas partes de un mismo algoritmo.
          · Facilitan la depuración y mantenimiento de los programas.
3. Los subprogramas pueden ser funciones y subrutinas.
4. Las funciones son subrutinas con 0 ó más argumentos y que devuelven un único valor de retorno.
5. Las funciones pueden formar parte de expresiones o aparecer en la parte derecha de una sentencia de           asignación pero nunca pueden constituir una sentencia aislada o aparecer en la parte izquierda de una           asignación.
6. Las funciones son invocadas mediante su nombre seguido de los argumentos entre paréntesis.

Funciones y subrutinas. Resumen (ii)

7. Existen dos tipos de funciones: intrínsecas y definidas por el usuario.
8. Las funciones intrínsecas son funciones de uso muy común: raíz cuadrada, logaritmos, funciones               trigonometricas, etc
9. Las funciones definidas por el usuario deben describirse dentro del algoritmo principal.
10. Los argumentos y variables declaradas dentro del cuerpo de una función (o subrutina) se denominan             variables locales, las variables declaradas dentro del programa principal son variables globales. Los
      subprogramas tienen acceso a las variables globales aunque en el caso de que una variable local se               denomine igual que una variable global tiene preferencia la primera.
11. Las subrutinas son subprogramas que no devuelven ningún resultado; sin embargo, gracias a la utilización       de los efectos laterales es posible su utilización para permitir el “retorno” de varios resultados.

EVAP 3


Bucle

Un bucle o ciclo, en programación, es una sentencia que se realiza repetidas veces a un trozo aislado de código, hasta que la condición asignada a dicho bucle deje de cumplirse.
Generalmente,un bucle es utilizado para hacer una acción repetida sin tener que escribir varias veces el mismo código, lo que ahorra tiempo, deja el código más claro y facilita su modificación en el futuro.
El bucle y los condicionales representan la base de la programación estructurada. Es una evolución del código ensamblador, donde la única posibilidad de iterar un código era establecer una sentencia jump (que en los lenguajes de programación fue sustituida por el "ir a" o GOTO).
Los tres bucles más utilizados en programación son el bucle while, el bucle for y el bucle repetir.

Ejemplo en código C de sentencias repetidas


    int var=0;
 
 
      //código que puede ser sustituido por un bucle
      var = var + 2; //var igual a 2 (puede ser sustituido por var+=2)
      var = var + 2; //var igual a 4
      var = var + 2; //var igual a 6
      var = var + 2; //var igual a 8
      var = var + 2; //var igual a 10
      // fin de código  que puede ser sustituido por un bucle
 
    printf("el resultado es %i", var );

Ejemplo con un bucle:

          int var=0;
 
          //Código para el bucle
          int i;
 
          // este es el Bucle for
          for(i=0;i<10;i+=2)
          { 
             var += 2;          
          }
 
 
          printf("el resultado es %i", var);
Algunos lenguajes de programación tienen sentencias que permiten "escapar" de los bucles sin llegar a la condición de fin, como el romper o el devolver.

Bucles Infinitos

Bucle infinito en programación es un error que consiste en realizar un ciclo que se repite de forma indefinida ya que su condición para finalizar nunca se cumple.

Por definición un bucle debe contener condiciones que establezcan cuándo empieza y cuándo acaba, de manera que, mientras las condiciones se cumplan, ejecute una secuencia de código de manera repetitiva. En el caso de ciclo infinito, como la condición de finalización no se alcanza, el bucle sigue ejecutando el segmento de código indefinidamente.

Ejemplo de ciclo infinito en C (while)


#include <stdio.h>
#include <iostream>
 
int main(void) {
 int x = 0;
 while(x < 10) {
  printf("\x¡No acabaré nunca >:D !\n");
 } 
 return 0;
}
Se observa que la sentencia printf("\x¡No acabaré nunca!\n"); siempre se ejecuta porque la condición del bucle while() siempre es cierta, no existe una condición de salida que obligue al bucle a finalizar. Exactamente, no se alcanza la condición de salida. Si en el ejemplo anterior, dentro del bloque de código del bucle while, se encontrase la instrucción
x++;
El bucle hubiera ejecutado 10 veces y hubiera terminado.

Algoritmo:

 1. Inicio
 2. Suma-0
     N-Bucle infinito, ya que no existe ninguna condición.
     Suma=suma+N
 3. Suma ++

Diagrama de Flujo.





Bucles finitos 


Los bucles finitos se ejecutan un determinado número de veces y pueden tener varios tipos de estructuras, las más utilizadas son: 

  •  Bucle con condición de testeo.
  •  Bucle que se repite un número conocido de veces.

  •  Bucle con condición de testeo. 


Se utiliza una instrucción de testeo para controlar la ejecución del bucle. Para 
este caso la repetición del lazo es finita, pero no se puede precisar el número 
de veces que se repite. 

Ejemplo1: 


 EsperaUno 


                btfss PORTA,4 
                goto EsperaUno 

En el ejemplo1 se lee el pin 4 de PORTA y hasta que no se pone a 1 no sale de este bucle. 

Ejemplo2: 

 No Es Igual 

                               movf PORTA, W 
                               sublw 0x56 
                               btfss STATUS,Z 
                               goto NoEsIgual 
 Es Igual 


En el ejemplo 2 se lee el registro PORTA y hasta que no su valor no es igual al de la constante 0x56 no se sale del bucle. 



  • Bucle que se repite un número conocido de veces 


Las instrucciones decfsz e incfsz se utilizan generalmente en combinación con 
una instrucción de salto goto, para el diseño de bucles de instrucciones que 
deben repetirse una cantidad determinada de veces. Se hace de manera tal 
que un registro se decrementa o incrementa hasta que tome un determinado 
valor. En este caso, sí se conoce el número de veces que se repite el bucle.

Ejemplo: 

 movlw NumeroVeces; este es el numero de veces que se repite el bucle 
 movwf Contador; carga el contador con el numero de veces 
 Lazo ……… 
         ……… 
         ……… 
 decfsz Contador,F; se decrementa el contador hasta que llega a 0 
 goto Lazo; si no llega a cero repite el bucle 

Algoritmo:

1.Inicio
2.Suma=0
   N=0  ____ Bucle finito, porque finaliza cuando se cumpla la condición de que N sea igual a cero.
   Suma=suma+N
3.Resultado: Suma
4.Fin

Diagrama de Flujo.


EVAP 2

 ESTRUCTURAS SELECTIVAS.

Las estructuras selectivas son aquellas que dirigen la ejecución de un programa hacia un grupo de 
sentencias del resultado de la condición.
Las estructuras selectivas o alternativas se dividen en:

1) Simples
2) Doble
3) Múltiple

Algoritmo

Define algoritmo como un conjunto ordenado y finito de operaciones que permite hallar la solución de un problema. Método y notación en las distintas fórmulas del cálculo. El algoritmo constituye un método para resolver un problema mediante una secuencia de pasos a seguir. Dicha secuencia puede ser expresada en forma de diagrama de flujo con el fin de seguirlo de una forma más sencilla.

ESTRUCTURA SELECTIVA SIMPLE

La estructura selectiva simple es aquella que evalua la condición, por verdadera ejecuta una
instrucción y si es falsa no ejecuta ninguna instrucción. En las condiciones se utiliza operadores
lógicos.

Representación Gráfica.

estructura condicional simple

Su expresión en Pseudocódigo.

Si condición s 
 Instrucciones 1
 Instrucciones 2
 Instrucciones N
 Fin si

Problema:

Ingresar cuatro numeros y sumarlos, si la suma es mayor o igual a 2500 imprimir el resultado.

Pseudocodigo.

  1. Inicio.
  2. Leer num1, num2, num3, num4
  3. T=num1+num2+num3+num4
  4. si T>=2500 entonces
  5. Imprimir T
  6. Fin.

  • Diagrama de flujo simple







ESTRUCTURA SELECTIVA DOBLE


Las estructuras selectiva doble ejecuta la condición, si es verdadera realiza una acción y si es falsa realiza otra acción. En las condiciones se utiliza operadores lógicos.

Representación Gráfica.

estructura condicional compuesta

Su expresión en Pseudocódigo

Si condición entonces

 Instrucciones 1
 Instrucciones 2
 Instrucciones N
 sino
 Instrucciones 1
 Instrucciones 2
 Instrucciones N
Fin si

Problema:

Diseñar un diagrama de flujo, en donde se muestre la calificación de un alumno; la calificación aprobatoria debe ser mayor o igual a 11, de lo contrario el alumno reprobara.

Pseudocodigo.

  1. Inicio.
  2. Leer cal
  3. SI cal>=11 ENTONCES
  4. Imprimir aprobado SINO
  5. Imprimir reprobado
  6. Fin.


  • Diagrama de flujo doble



ESTRUCTURA SELECTIVA MÚLTIPLE

Usando la estructura de decisión múltiple se evaluará una expresión que podrá tomar n valores distintos, 1, 2 , 3, ....,n y según que elija uno de estos valores en la condición, se realizará una de las n acciones o lo que es igual, el flujo del algoritmo seguirá sólo un determinado camino entre los n posibles.
Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la acción 1, si toma el valor 2 ejecutará la acción 2, si toma el valor N realizará la acción N.

Representación gráfica. 

Estructura selectiva múltiple.

Su expresión en Pseudocodigo


valor 1: instrucción 1
            instrucción 2
 ........ 
valor 2: instrucción 1
            instrucción 2
 ........ 
valor 3: instrucción 1
            instrucción 2
 . ........ 
 .
valor n: instrucción 1
            instrucción 2
 ........ 
otros : instrucción 1
           instrucción 2
 ........
fin_caso

Problema:

Realizar un algoritmo que lea un número que represente el día de la semana y diga qué día es, teniendo en cuenta lo siguiente: (Lunes=1, Martes=2, ..., Domingo=7).

  • Diagrama de flujo multiple








EVAP 1

Cebiche




Elementos para el cebiche(DECLARACIÓN)



  • Pescado.
  • Choclo.
  • Limones.
  • Camote.
  • Cebolla.
  • Sal.
  • Pimienta negra.
  • Aji no moto
  • Culantro.
  • Ajo molido.
  • Lechuga.


Ingredientes (ASIGNACIÓN)

  • 1 kilo de filetes de pescado fresco 
  • 2 choclos (elote) 
  • 2 a 3 ajíes limo (puede usarse ½ rocoto picado según el gusto) 
  • 5 limones 
  • 2 camotes grandes 
  • 1 cebolla roja grande o 2 medianas 
  • 1 ½ cucharaditas de sal 
  • ½ cucharadita de pimienta negra 
  • 1 cucharadita de Ají No Moto (glutamato monosódico) 
  • 4 ramas de culantro 
  • 1 ½ cucharaditas de ajo molido (o según el gusto) 
  • 6 hojas de lechuga hidropónica, crespa u orgánica 
Preparación (PROCESO)



Primero se lavan bien los filetes de pescado y luego se procede a cortarlo en pequeños pedazos de alrededor de 2 cm en forma de cubo y se depositan en un recipiente de vidrio.






 Picar el ají limo o el rocoto en pedazos pequeños, retirando las          pepitas blancas para que no pique mucho (según el gusto).
                                                       
          






 El corte de la cebolla es muy importante ya que debe ser tipo                  pluma(muy delgada).






 Picar finamente las cuatro ramas de culantro, quitándole los tallos.










Sancochar los choclos y los camotes (en microondas 3 minutos por cada unidad). Luego de sancochados se pelan los camotes y se cortan en pedazos medianos al igual que los choclos.







Se cortan los limones por la mitad (deben ser frescos y no muy maduros) y se les quita las semillas. Procedemos a exprimirlos en un recipiente de vidrio. Un dato importante es evitar exprimir los limones al máximo, para que no salga el sumo amargo de la cáscara. 

Una vez que se tiene el jugo de limón listo, se mezcla con los ajos molidos, el Ají No Moto, la sal y la pimienta durante unos 20 segundos para que se integren todos los ingredientes.




Se agrega el ají limo o rocoto  y el pescado escurrido (sin el hielo) en el recipiente con el jugo de limón, luego la cebolla previamente enjuagada, para que no vaya a tener el sabor dulce del azúcar mientras estuvo remojando, y por último el culantro. Una vez con todos los ingredientes en el recipiente, se mezclan bien usando una cuchara de acero.








Por último servir en un plato con una hoja de lechuga, un trozo de camote, un trozo de choclo y se puede decorar con algo de culantro sobre el pescado. 













Resultado: Cebiche




  • Algoritmo para preparar el cebiche:
    1. Inicio del cebiche.
    2. Delaracion: a, b, c, d, f, g, h, i, j, k, l
    3. Asignacion: 
                    a=Pescado(trozos pequeños de 2 cm)
                    b=Choclo(sancochado y desgranado)
                    c=Limones(zumo)
                    d=Camote(Sancochado y en trozos)
                    e=Cebolla(corte tipo pluma)
                    f=Sal.
                    g=Pimienta negra.
                    h=Aji no moto.
                    i=Culantro(picado, sin tallos)
                    j=Ajo molido.
                    k=Lechuga(hojas)
                    l=Rocoto(pedazos pequeños)
              4. Proceso:
                           
                                 c+j+h+f+g=IDI("Integrado de ingredientes")
                                 IDI+e+i+l+a=MI("Mezcla de ingredientes")
                                 MI+k+b,d=Cebiche

              5.Resultado:  Cebiche.