Está en la página 1de 51

FUNDAMENTOS DE PROGRAMACIÓN

2019-1

Capítulo 4

DISEÑO DE ALGORITMOS
Capítulo 5

IMPLEMENTACIÓN DE ALGORITMOS

1
Retomando lo aprendido
Funciones

Una función proporciona una forma conveniente de


encapsular una tarea o un conjunto de
instrucciones.
Además, nos permite modular nuestros programas.

2
Retomando lo aprendido
Funciones - diseño

Nombre de la variable a retornar


Nombre de la función

Parámetros necesarios
para calcular la función

3
Retomando lo aprendido
Función - codificación
Las funciones pueden tener tipo de retorno double,
int, char o void
void es un tipo de retorno vacío, que permite que la
función no devuelva un valor en particular

4
Agenda
1. Fases de resolución de problemas
2. Ejercicios de análisis

5
Fases de resolución de un problema

1. Definición

2. Análisis

3. Diseño

4. Codificación

5. Ejecución y Pruebas
Definición
• Explicación: se explica de modo resumido el
problema

• Datos de entrada: serán los valores necesarios para


llevar a cabo los cálculos

• Fórmulas: cálculos que se realizarán

• Salidas: resultados requeridos

7
Análisis
• Técnica Top Down
• Diagrama de módulos
• Dividir para vencer

8
Diagrama de módulos

Los nombres de los módulos deben ser descriptivos y expresar la acción


que se va a llevar a cabo en ellos.

9
Diseño
• Diagrama de flujo:
Diagrama que utiliza un conjunto de símbolos estándar unidos por
flechas llamadas líneas de flujo, con el fin de mostrar los pasos que
tendrá el algoritmo.

• Lenguaje de especificación de algoritmos (pseudocódigo):


Usa un conjunto de palabras reservadas en lenguaje natural para
representar cada paso del algoritmo.

10
Ejemplo
Implemente en pseudocódigo, diagrama de flujo y en ANSI C un programa
que permita calcular el área de un triángulo, haciendo uso del diagrama
de módulos mostrado.

Evaluar área de un triángulo


validando datos de entrada

Verificar lados Verificar si lados Calcular Calcular área del


mayores que 0 forman un triángulo semiperímetro triángulo

11
Ejemplo - Pseudocódigo
Algoritmo EvaluarAreaDeUnTriangulo
Escribir "Ingrese los tres lados: "
Leer l1, l2, l3
Si VerificarLadosMayoresQueCero(l1, l2, l3) Entonces
Si VerificarSiLadosFormanTriangulo(l1, l2, l3) Entonces
s <- CalcularSemiperimetro(l1, l2, l3)
area <- CalcularAreaTriangulo(s, l1, l2, l3)
Escribir "El area es ", area
SiNo
Escribir "Los lados no forman un triangulo."
FinSi
SiNo
Escribir "Los lados deben ser todos mayores que 0."
FinSi
FinAlgoritmo

12
Ejemplo - Pseudocódigo
Funcion resultado <- VerificarLadosMayoresQueCero ( lado1, lado2, lado3 )
resultado <- lado1>0 Y lado2>0 Y lado3>0
Fin Funcion

Funcion resultado <- VerificarSiLadosFormanTriangulo(lad1, lad2, lad3)


resultado <- lad1 + lad2 > lad3 Y lad1 + lad3 > lad2 Y lad2 + lad3 > lad1

FinFuncion

Funcion resultado <- CalcularSemiperimetro(l1, l2, l3)


resultado <- (l1 + l2 + l3)/2
Fin Funcion

Funcion resultado <- CalcularAreaTriangulo (s, l1, l2, l3)


resultado <- rc(s * (s-l1) * (s-l2) * (s-l3))
Fin Funcion

13
Ejemplo – Diagrama de flujo

14
Ejemplo – Diagrama de flujo

15
Ejemplo – Código en C

16
Ejemplo – Código en C

17
Paso de parámetros por referencia
Existen casos en los que se quiere modificar el valor de los parámetros de la función o
devolver más de un valor.
En estos casos se suele utilizar una función que tiene tipo de retorno void y se
procede a entregar como parámetros la dirección de la variable .
Por ejemplo, la llamada a una función de este tipo sería

LeerLados(&l1, &l2, &l3);

Por otro lado la implementación de la función es un tanto diferente a lo visto hasta la


fecha

void LeerLados(double *a, double *b, double *c){


printf("Ingrese los tres lados: ");
scanf("%lf %lf %lf", a, b, c);
}
Al colocar los parametros double *a, double *b, double *c, le comunicamos al
compilador que lo que recibe son direcciones de variables y es por ello que al utilizar
la función scanf solo colocamos los nombres de las variables sin el & usual.
18
Ejemplo
Implemente en pseudocódigo, diagrama de flujo y en ANSI C un programa que
permita calcular el área de un triángulo, haciendo uso del diagrama de módulos
mostrado

Evaluar área de un triángulo


validando datos de entrada

Validar lados Verificar si lados Calcular Calcular área del


Leer datos
mayores a 0 forman un triángulo semiperimetro triángulo

19
Ejemplo - Pseudocódigo
Algoritmo EvaluarAreaDeUnTriangulo
LeerLados(l1,l2,l3)
Si VerificarLadosMayoresQueCero(l1,l2,l3) Entonces
Si VerificarSiLadosFormanTriangulo(l1,l2,l3) Entonces
s <- CalcularSemiperimetro(l1,l2,l3)
area <- CalcularAreaTriangulo(s,l1,l2,l3)
Escribir 'El area es ',area
SiNo
Escribir 'Los lados no forman un triangulo.'
FinSi
SiNo
Escribir 'Los lados deben ser todos mayores que 0.'
FinSi
FinAlgoritmo

20
Ejemplo - Pseudocódigo
Funcion LeerLados(a Por Referencia,b Por Referencia,c Por Referencia)
Escribir 'Ingrese los tres lados: '
Leer a,b,c
FinFuncion

Funcion resultado <- VerificarLadosMayoresQueCero ( lado1, lado2, lado3 )


resultado <- lado1>0 Y lado2>0 Y lado3>0
Fin Funcion

Funcion resultado <- VerificarSiLadosFormanTriangulo(lad1, lad2, lad3)


resultado <- lad1 + lad2 > lad3 Y lad1 + lad3 > lad2 Y lad2 + lad3 > lad1

FinFuncion

Funcion resultado <- CalcularSemiperimetro(l1, l2, l3)


resultado <- (l1 + l2 + l3)/2
Fin Funcion

Funcion resultado <- CalcularAreaTriangulo (s, l1, l2, l3)


resultado <- rc(s * (s-l1) * (s-l2) * (s-l3))
Fin Funcion

21
Ejemplo – Diagrama de Flujo

22
Ejemplo – Diagrama de Flujo

23
Ejemplo – Código en C

24
Ejemplo – Código en C

25
Ejercicio – Ex. Esp. 2018-2 Preg. 1
Una forma de generar números pseudo-aleatorios es mediante el algoritmo de
cuadrados medios. Este método fue propuesto en los años 40 por los matemáticos
John von Neumann y Nicholas Metropolis.
El método comienza con un valor entero x0 de 2n cifras denominado semilla que al
elevar al cuadrado resulta en un número de hasta 4n cifras. Sea x1 el número
resultante de seleccionar las 2n cifras centrales de x02. El número pseudo-aleatorio se
obtiene poniéndole un punto decimal delante de las 2n cifras de x1. Para generar el
próximo número pseudo-aleatorio se cambia el valor de la semilla por el valor de x1.
Uno de los problemas de este algoritmo es la incapacidad de generar una secuencia
de números pseudo-aleatorios con periodo de vida grande. En ocasiones sólo es capaz
de generar un número. En otras ocasionas sí permite generar una lista grande de
números.
Se le pide que elabore el diseño en pseudocódigo o diagrama de flujo, con al menos 4
módulos incluido el principal, considerando que dado un número semilla, genere una
lista de números pseudo-aleatorios siguiendo el algoritmo de cuadrados medios. La
lista deberá contener a lo más 1000 números aleatorios. El algoritmo deberá parar en
caso no sea posible generar más números pseudo-aleatorios, es decir cuando el x1 sea
cero y reportar cuántos números pseudo-aleatorios se consiguieron. A continuación
sigue un ejemplo de ejecución de este algoritmo usando como semilla el número
5735.

26
Ejercicio – Ex. Esp. 2018-2 Preg. 1
intento x y digitos_medio numero pseudoaleatorio
1 5735 32890225 8902 0.890200
2 8902 79245604 2456 0.245600
3 2456 6031936 319 0.031900
4 319 101761 176 0.017600
5 176 30976 3097 0.309700
6 3097 9591409 5914 0.591400
7 5914 34975396 9753 0.975300
8 9753 95121009 1210 0.121000
9 1210 1464100 4641 0.464100
10 4641 21538881 5388 0.538800
11 5388 29030544 305 0.030500
12 305 93025 9302 0.930200
13 9302 86527204 5272 0.527200
14 5272 27793984 7939 0.793900
15 7939 63027721 277 0.027700
16 277 76729 7672 0.767200
17 7672 58859584 8595 0.859500
18 8595 73874025 8740 0.874000
19 8740 76387600 3876 0.387600
20 3876 15023376 233 0.023300
21 233 54289 5428 0.542800
22 5428 29463184 4631 0.463100
23 4631 21446161 4461 0.446100
24 4461 19900521 9005 0.900500
25 9005 81090025 900 0.090000
26 900 810000 1000 0.100000

Se han conseguido 26 números aleatorios.

27
Números Pseudo-aleatorios

Obtener dígitos del


Contar cifras Formar pseudo-aleatorio
medio

28
Algoritmo NumerosPseudoAleatorios
Definir MAXIMO Como Entero
MAXIMO <- 1000
Escribir "Ingrese un numero entero de 2n cifras como semilla:"
Leer semilla_2n
x0 <- semilla_2n
cont <- 0
n2_cifras <- contar_cifras(x0)
Escribir "intento x y digitos medio numero pseudo-aleatorio"
Repetir
y0 <- x0 * x0
digitos_medio <- obtener_digitos_medio(y0, n2_cifras)
pseudo_aleatorio <- formar_pseudo_aleat(digitos_medio, n2_cifras)
cont <- cont + 1
x1 <- digitos_medio

Si x1 <> 0 Entonces
Escribir cont, " ", x0, " ", y0, " ", digitos_medio, " ", pseudo_aleatorio
FinSi
x0 <- x1
Mientras Que x1 <> 0 Y cont < MAXIMO
Escribir "Se han conseguido ",cont-1, " numeros aleatorios."
FinAlgoritmo

29
Funcion n_cifras <- contar_cifras ( x0 )
n_cifras <- 0
Mientras x0 <> 0 Hacer
x0 <- trunc(x0 /10)
n_cifras <- n_cifras + 1
Fin Mientras
Fin Funcion

Funcion pseudo_aleatorio <- formar_pseudo_aleat ( x1, n2_cifras )


pseudo_aleatorio <- x1 / (10 ^ n2_cifras)
Fin Funcion

30
Funcion digitos_medio <- obtener_digitos_medio ( y0, n2_cifras )
cant_cifras_eliminadas <- 0
contador_cifras_y0 <- contar_cifras(y0)
cant_cifras_a_eliminar <- (contador_cifras_y0 - n2_cifras) / 2

Mientras cant_cifras_eliminadas < cant_cifras_a_eliminar Hacer


y0 <- trunc(y0 /10)
cant_cifras_eliminadas <- cant_cifras_eliminadas + 1
Fin Mientras
contador_cifras <- 0
digitos_medio <- 0
Mientras contador_cifras < n2_cifras Hacer
ult_digito <- y0 mod 10
digitos_medio <- digitos_medio + ult_digito * 10 ^ contador_cifras
y0 <- trunc(y0 /10)
contador_cifras <- contador_cifras + 1
FinMientras
Fin Funcion

31
Ejercicio Examen Final 2018-1

32
33
34
Evalúa suma de números diferentes
bases y convierte a base octal

Convierte un dígito a Convierte un número a


Muestra resultados
base 10 base octal

35
36
37
38
39
Evalúa suma de números diferentes
bases y convierte a base octal

Convierte un dígito a Convierte un número a


Muestra resultados
base 10 base octal

Convierte letra a numero

40
41
42
43
44
45
46
47
48
Ejercicio

Elabore la tabla de seguimiento y


describa utilizando lenguaje
natural aquello que hace el
algoritmo.
Ojo dicha descripción debe poder
ser comprendida por alguien sin
conocimiento alguno de
programación.

49
Ejercicio

Se tiene un reporte venta de una empresa y se quiere identificar la fecha en la que se


realizó la venta con mayor monto y la fecha con correspondiente a la venta con
mayor monto.
Los datos se van ingresando de la siguiente manera:

18/4/2011 1586.1
15/6/2011 1456.12
18/2/2011 15326.1
13/9/2013 1526.1
29/11/2001 1156.17
18/09/2018 11356.1
10/12/2012 1563.12
1/1/2016 153.14

La salida sería:
El mayor monto corresponde a la fecha 18/2/2011 15326.1
El menor monto corresponde a la fecha 1/1/2016 153.14
50
Bibliografía

• Joyanes, L. (2008). Fundamentos de programación (4a. ed.).


Madrid: McGraw-Hill/Interamericana de España.
• Joyanes, L. y Zahonero, I. (2010). Programación en C, C++,
Java y UML (1a. ed.). México, D.F.: McGraw-
Hill/Interamericana Editores.
• Lopez, L. (2005). Programación estructurada en lenguaje C
(1a. ed.). México, D.F.: Alfaomega Grupo Editor.
• Correa, G. (1992). Desarrollo de algoritmos y sus
aplicaciones en Basic, Pascal, Cobol y C (3a. ed.). Santafé de
Bogotá: McGraw-Hill Interamericana.

51

También podría gustarte