5. Subprogramas 1. Cálculo de la función Coseno ∑ 1.1 Análisis

Anuncio
Í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
Descargar