Índice Subprogramas 5. Subprogramas Fundamentos de Informática 1. Cálculo de la función Coseno 2. Suma 3. Ecuación de 2º grado Dpto. Lenguajes y Sistemas Informáticos Curso 2012 / 2013 2 Subprogramas 1. Coseno Subprogramas 1.1 Análisis Coseno 1. Cálculo de la función Coseno • Título – Coseno • Nombre – PrgCoseno ∞ ∞ cos( x) = ∑ (−1)i i =0 1. Coseno cos( x) = ∑ (−1)i 2i x (2i )! i =0 x 2i (2i )! y = t0 + t1 + t2 + t3 + ... + t∞ • Descripción – Programa VB que lee un ángulo en radianes y calcule su coseno, utilizando el desarrollo de Taylor con un error inferior a 0,000001. y =1− x2 x4 x6 + − + ... 2! 4! 6! • Observaciones – Descomposición en funciones – Diseño con y sin funciones – Diseño descendente - implementación ascendente ∞ y = ∑ (−1)i i =0 t0 = −10 · t1 = −11· x 2i (2i )! x 2·0 =1 (2·0)! x 2·1 x2 =− (2·1)! 2 x 2·2 x4 = (2·2)! 24 x 2·3 x6 t3 = −13 · =− (2·3)! 720 t2 = −12 · Cada ti reduce el error en |ti| 3 4 Subprogramas 1. Coseno Subprogramas 1.2 Programa Coseno sin subprogramas 1.2 Programa Coseno sin subprogramas x: real i, j, sig: entero y: real f2i, num: real ter, err: real PrgCoseno x ← LeeReal 1. Coseno y←0 i←0 x 2i y = ∑ (−1)i (2i )! i =0 ∞ x: real i, j, sig: entero y: real f2i, num: real ter, err: real f2i ← 1 j←1 fact2i ← (2·i)! j←j+1 x 2i y = ∑ ( − 1) i (2 i )! i=0 ∞ j≤2·i No Sí sig ← -1i num ← x 2·i ter ← sig · num / f2i y ← y + ter f2i ← f2i · j no Escribe y err ← |ter| ter < 0 sí err ← -ter err ← ter Fin i←i+1 No err < 0,000001 Sí 5 Subprogramas 1. Coseno Subprogramas 1.3 Programa Coseno con subprogramas PrgCoseno1 ang ← LeeReal cos ← Coseno (ang) 1. Coseno 1.4 Interfaz de la función Coseno Parámetro de entrada: x Es una variable inicializada en cada llamada ang: real cos: real Llamada a la función Coseno con el valor de ang x: real La función devuelve un valor, asignado al nombre de la función Coseno ← ... Escribe cos Fin 6 Se evalúa ang y se envía ese valor a la función 7 Tipo del valor devuelto por la función Coseno real Variables locales Coseno ← … 8 Subprogramas 1. Coseno Subprogramas 1.5 Llamada a la función Coseno cos ← Coseno (ang) 1.6 Función Coseno La “evaluación” de la función es valor devuelto y asignado f2i ← Factorial (2·i) sig ← -1i num ← x2·i ter ← sig·num / f2i y ← y + ter err ← ValAbs (ter) i←i+1 x 2i y = ∑ (−1)i (2i )! i =0 ∞ Se calcula el valor del coseno No Coseno ← … cos ← … Sí Coseno ← y Fin 9 1. Coseno Function Coseno (ByVal x As Double)_ As Double Dim i As Integer, sig As Integer Dim f2i As Integer, num ... x: real y = 0 i = 0 Do f2i = Factorial (2*i) sig = (-1) ^ i ... Loop Until err < 0.000001 No Coseno = y End Function 10 Subprogramas 1.7 Función Coseno VB 1. Coseno 1.8 Función Factorial ∞ cos( x) = ∑ (−1)i i =0 Coseno y←0 i←0 x 2i (2i )! n: entero Tipo del resultado Factorial Nota: 13! ya no entra en un entero de 32 bits por lo que sería mejor utilizar reales dobles para f y el resultado entero i, f: entero real Parámetro de entrada i, sig: entero f2i, num, y: real ter, err: real f2i ← Factorial (2·i) sig ← -1i num ← x2·i ter ← sig·num / f2i y ← y + ter err ← ValAbs (ter) i←i+1 f←1 Variables locales i←1 i←i+1 err < 0,000001 i≤n Sí Sí Coseno ← y Llamadas a funciones err < 0,000001 Valor devuelto por la función Subprogramas i, sig: entero f2i, num, y: real ter, err: real y←0 i←0 x 2i cos( x) = ∑ (−1)i (2i )! i =0 ∞ real Coseno real Coseno x: real En la llamada se produce una asignación implícita x ← ang x: real 1. Coseno Valor devuelto por la función No Factorial ← f f ← f·i Fin Fin 11 12 Subprogramas 1. Coseno Subprogramas 1.8 Función Factorial VB 1. Coseno 1.9 Función ValAbs n: entero Factorial entero x: real i, f: entero Function Factorial (ByVal n As Integer)_ As Double Dim i As Integer i←i+1 Dim f As Double f = 0 For i = 1 To n Step 1 f = f * i Next i Nota: usamos doubles en vez de Factorial = i enteros End Function f←1 ValAbs real i←1 i≤n No Sí no Factorial ← f f ← f·i sí x<0 Fin ValAbs ← x ValAbs ← -x Fin 13 Subprogramas 1. Coseno Subprogramas 1.10 Función ValAbs1 x: real 14 1.11 Función Pot (no necesaria en VB) ValAbs1 base: real expo: entero real Parámetros de entrada no x<0 1. Coseno sí p←1 i←1 x ← -x i←i+1 real Pot i ≤ expo i: entero p: real Variables locales No Valor devuelto por la función (resultado) Sí ValAbs ← x p ← p·base El cambio no afecta a la variable de llamada ya que se copia el valor Tipo del resultado Pot ← p Fin Fin 15 16 Subprogramas 2. Suma Subprogramas 2. Suma – Modelos de paso de parámetros 2.1 Suma con función: programa y llamada Psu1 Descripción a, b: real s: real Escribir un subprograma que calcule la suma de dos números • Parámetros de entrada Versiones 1. función con dos parámetros de entrada y devuelve el resultado 2. procedimiento con dos parámetros de entrada y uno de salida 3. procedimiento con un parámetro de entrada y otro de entrada/salida • 2. Suma1 Asignación del resultado a ← LeeReal b ← LeeReal s ← Suma1 (a, b) Escribe s Observaciones Llamada a la función – Paso de parámetros por valor y por referencia – Los procedimientos no “devuelven” nada (pueden usar parámetros de salida) x1, x2: real Fin Cabecera de la función Suma1 real 17 Subprogramas 18 2. Suma1 Subprogramas 2.1 Función Suma1: DdF y VB 2. Suma1 2.1 Llamadas a la función Suma1 Llamada con variables x1, x2: real Suma1 x1, x2: real real s ← Suma1 (a, b) ... s = Suma1 (a, b) ... Suma1 ← x1 + x2 Suma1 real Suma1 ← x1 + x2 Fin Fin Llamada con constantes Function Suma1 (ByVal x1 As Double, ByVal x2 As Double)_ As Double Suma1 = x1 + x2 End Function s ← Suma1 (5, 7) ... s = Suma1 (5, 7) ... 19 20 Subprogramas 2. Suma2 Subprogramas 2.2 Procedimiento 1: programa y llamada Psu2 2.2 Procedimiento Suma2: DdF y VB a, b: real s: real a ← LeeReal b ← LeeReal Parámetros de entrada 2. Suma2 x1, x2: real x: real Suma2 x ← x1 + x2 Parámetro de salida Suma2 (a, b, s) Fin Escribe s Fin x1, x2: real Sub Suma2 (ByVal x1 As Double, ByVal x2 As Double, _ ByRef x As Double) x = x1 + x2 Puede omitirse End Sub Cabecera del procedimiento Suma2 Los cambios realizados sobre las variables pasadas por referencia afectan a las variables de la llamada, que pueden llamarse igual o distinto x: real 21 Subprogramas 22 2. Suma2 Subprogramas 2.2 Llamadas al procedimiento Suma2 2.3 Procedimiento 2: programa y llamada Llamada con variables Psu3 x1, x2: real Suma2 (a, b, s) ... Call Suma2 (a, b, s) ... Llamada con constantes (por valor) Suma2 (5, 7, s) Suma2 2. Suma3 x: real x ← x1 + x2 Parámetro de entrada a, b: real a ← LeeReal b ← LeeReal Fin Parámetro de entrada Suma3 (a, b) Ha de ser una variable para recoger el resultado Escribe a Fin ... Call Suma2 (5, 7, s) ... x1, x2: real 23 Suma3 y salida (el parámetro tiene el mismo nombre en la cabecera) x1: real 24 Subprogramas 2. Suma3 Subprogramas 2.3 Procedimiento Suma3: DdF y VB 2. Suma3 2.3 Llamadas al procedimiento Suma3 Llamada con variables x1, x2: real x1: real Suma3 x1, x2: real Suma3 Suma3 (a, b) x1 ← x1 + x2 Podemos leer el valor de las variables pasadas por referencia y los cambios que hagamos afectan a las variables de la llamada Fin x1 ← x1 + x2 ... Call Suma3 (a, b) ... Fin Ha de ser una variable para recoger el resultado Llamada con constantes Sub Suma3 (ByRef x1 As Double, ByVal x2 As Double) x1 = x1 + x2 End Sub Puede omitirse x1: real Suma3 (a, 7) ... Call Suma3 (a, 7) ... Por la cabecera VB no podemos saber si x1 es de salida o de entrada/salida 25 Subprogramas 3. Ecuación 2º grado Subprogramas 3. Ecuación de 2º grado • Descripción 26 3.1 Programa ecuación de 2º grado - DdF ax 2 + bx + c = 0 Pec2 – Calcular las raíces de una ecuación de 2º grado • • • • Tipo 0: No es una ecuación Tipo 1: Ecuación lineal Tipo 2: Soluciones reales Tipo 3: Soluciones complejas • Observaciones 3. Ecuación 2º grado Programa principal x= a, b, c: real s1, s2: real t: entero a ← LeeReal b ← LeeReal c ← LeeReal − b ± b − 4ac 2a 2 Ecuacion2 (a, b, c, t, s1, s2) – Paso de parámetros por referencia No es evidente qué parámetros son de entrada y cuáles de salida EscribeRes (t, s1, s2) Llamadas a los procedimientos 27 Fin 28 Subprogramas 3. Ecuación 2º grado Subprogramas 3.2 Procedimiento Ecuación2 – DdF a, b, c: real no no tipo ← 0 b≠0 a≠0 3.3 Procedimiento EscribeRes – DdF tipo: entero x1, x2: real Ecuacion2 sí sí tp: entero n1, n2: real no rcd ← √(-d) x1 ← -b / (2·a) x2 ← rcd / (2·a) tipo ← 3 EscribeRes d, rcd: real no d ← b2 – 4·a·c x1 ← -c/b tipo ← 1 d≥0 3. Ecuación 2º grado no no sí rcd ← √(d) x1 ← (-b + rcd) / (2·a) x2 ← (-b – rcd) / (2·a) tipo ← 2 tp = 2 Escribe “Complejas” n1, n2 tp = 1 sí tp = 0 sí sí Escribe “No es ecuación” Escribe “Lineal” n1 Escribe “Reales” n1, n2 Fin Fin 29 Subprogramas 3. Ecuación 2º grado 30 Subprogramas 3.4 Programa VB ecuación 2º grado 3. Ecuación 2º grado 3.5 Procedimiento VB Ecuacion2 Sub Ecuacion2 (ByVal a As Double, ByVal b As Double, ByVal c As Double, _ ByRef tipo As Integer, ByRef x1 As Double, ByRef x2 As Double) Dim d As Double, rcd As Double If a <> 0 Then d = b*b – 4*a*c tipo: entero a, b, c: real Ecuacion2 If d >= 0 Then x1, x2: real rcd = Sqr (d) d, rcd: real no sí x1 = (-b + rcd)/(2*a) a≠0 x2 = (-b – rcd)/(2*a) sí no d ← b2 – 4·a·c b≠0 tipo = 2 Else tipo ← 0 x1 ← -c/b no sí d≥1 tipo ← 1 rcd = Sqr (-d) x1 = -b /(2*a) rcd ← √(-d) rcd ← √(d) x1 ← -b / (2·a) x1 ← (-b + rcd) / (2·a) x2 = rcd / (2*a) x2 ← rcd / (2·a) x2 ← (-b – rcd) / (2·a) tipo ← 3 tipo ←2 tipo = 3 Else End If If b <> 0 Then Else x1 = -c/b tipo = 1 Fin End If Else End Sub tipo = 0 End If End If Sub Pec2_Click() Dim s As String a, b, c: real Dim a As Double, b As Double, c As Double Pec2 s1, s2: real t: entero Dim s1 As Double, s2 As Double Dim t As Integer a ← LeeReal b ← LeeReal s = InputBox ("Coeficiente A") c ← LeeReal a = CDbl (s) s = InputBox ("Coeficiente B") Ecuacion2 (a, b, c, t, s1, s2) b = CDbl (s) EscribeRes (t, s1, s2) s = InputBox ("Coeficiente C") c = CDbl (s) Fin Call Ecuacion2 (a, b, c, t, s1, s2) Call EscribeRes (t, s1, s2) End Sub Llamadas a procedimientos 31 32 Subprogramas 3. Ecuación 2º grado Subprogramas 3.6 Procedimiento VB EscribeRes 3. Ecuación 2º grado 3.7 Programa alternativo con función Pec2a Sub EscribeRes (ByVal tp As Integer, _ ByRef n1 As Double, ByRef n2 As Double) If tp = 0 Then MsgBox "No es una ecuación" tp: entero EscribeRes n1, n2: real ElseIf tp = 1 Then no sí tp = 0 MsgBox "Ecuación lineal. X: " & CStr (n1) sí no ElseIf tp = 2 Then Escribe tp = 1 “No es ecuación” MsgBox "Soluciones reales. " & _ no sí Escribe tp = 2 “Lineal” n1 " x1: " & CStr (n1) & _ Escribe Escribe " x2: " & CStr (n2) “Complejas” n1, n2 “Reales” n1, n2 Else Fin MsgBox "Soluciones complejas. " & _ " x1: " & CStr (n1) & "+" & CStr (n2) & "i" & _ " x2: " & CStr (n1) & "-" & CStr (n2) & "i" End If End Sub La función devuelve el tipo de ecuación a, b, c: real s1, s2: real t: entero a ← LeeReal b ← LeeReal c ← LeeReal t ← Ec2_1 (a, b, c, s1, s2) Cambia la cabecera: dos parámetros de salida por un valor devuelto EscribeRes (t, s1, s2) Fin a, b, c: real a, b, c: real Ec2_1 x1, x2: real entero tipo: entero x1, x2: real Ecuacion2 33 Subprogramas 3. Ecuación 2º grado Subprogramas 3.8 Alternativa VB ecuación 2º grado Sub Pec2a_Click() Dim s As String Dim a As Double, b As Double, c As Double Pec2 Dim s1 As Double, s2 As Double Dim t As Integer a ← LeeReal b ← LeeReal s = InputBox ("Coeficiente A") c ← LeeReal a = CDbl (s) s = InputBox ("Coeficiente B") t ← Ec2_1 (a, b, c, s1, s2) b = CDbl (s) EscribeRes (t, s1, s2) s = InputBox ("Coeficiente C") c = CDbl (s) Fin 34 3. Ecuación 2º grado 3.9 Función VB Ec2_1 Function Ec2_1 (ByVal a As Double, ByVal b As Double, ByVal c As Double, _ ByRef x1 As Double, ByRef x2 As Double) As Integer Dim d As Double, rcd As Double If a <> 0 Then d = b*b – 4*a*c If d >= 0 Then rcd = Sqr (d) x1 = (-b + rcd)/(2*a) x2 = (-b – rcd)/(2*a) Ec2_1 = 2 Else rcd = Sqr (-d) x1 = -b /(2*a) x2 = rcd / (2*a) Ec2_1 = 3 Else End If If b <> 0 Then Else x1 = -c/b Ec2_1 = 1 End If Else End Function Ec2_1 = 0 End If End If a, b, c: real s1, s2: real t: entero t = Ec2_1 (a, b, c, s1, s2) Call EscribeRes (t, s1, s2) End Sub 35 36