Sie sind auf Seite 1von 131

GUIA DE FUNDAMENTOS DE PROGRAMACION FUNCIONAL EN SCHEME

MARISOL GOMEZ RAMIREZ marisol.gomez@correounivalle.edu.co INGENIERA DE SISTEMAS UNIVERSIDAD DEL VALLE CALI-COLOMBIA 2012

INTRODUCCIN

La presente gua servir de ayuda a los estudiantes que quieran aprender programacin funcional en Scheme. La gua viene con variados ejemplos y ejercicios resueltos de cada tema y al final de cada captulo se presenta una seccin de ejercicios propuestos.

En el primer captulo se presentan algunos los conceptos matemticos necesarios para el aprendizaje de la programacin en Scheme, en el captulo dos se explica la notacin prefija que es el tipo de notacin utilizada en este lenguaje, en el captulo 3 se ensea la construccin de funciones bsicas, en el captulo 4 se estudian las funciones que utilizan condicionales, en el captulo 5 se revisan las funciones que utilizan otras funciones para la solucin de problemas como son las funciones auxiliares, en el captulo 6 se presenta el uso de funciones recursivas, en el captulo 7 se presentan el tipo de datos compuesto llamado estructura, en el captulo 8 se presenta la utilizacin de funciones con estructuras, en el captulo 9 se estudian las listas simples, en el captulo 10 las listas de estructuras, en el captulo 11 el uso de memoria y secuenciacin, en el captulo 12 los vectores, en el captulo 13 la ocultacin de informacin a travs de local y en el captulo 14 los rboles binarios.

Se espera seguir mejorando en un futuro este material. Por ahora espero que sirva como una base para aprender algunos conceptos de la programacin en Scheme.

CONTENIDO TEMA 1. CONCEPTOS MATEMATICOS BASICOS TALLER CONCEPTOS BASICOS 2. NOTACION PREFIJA TALLER NOTACION PREFIJA 3. FUNCIONES SIMPLES EN SCHEME TALLER FUNCIONES SIMPLES EN SCHEME 4. CONDICIONALES TALLER CONDICIONALES 5. FUNCIONES AUXILIARES TALLER FUNCIONES AUXILIARES 6. RECURSIVIDAD TALLER RECURSIVIDAD 7. ESTRUCTURAS TALLER ESTRUCTURAS 8. FUNCIONES CON ESTRUCTURAS TALLER FUNCIONES CON ESTRUCTURAS 9. LISTAS SIMPLES TALLER LISTAS SIMPLES 10. LISTAS DE ESTRUCTURAS TALLER LISTAS DE ESTRUCTURAS 11. MEMORIA Y SECUENCIACION TALLER MEMORIA Y SECUENCIACION 12. VECTORES TALLER VECTORES 13. LOCAL TALLER LOCAL 14. ARBOLES BINARIOS PAG. 4 11 13 19 21 34 35 48 51 60 63 74 75 80 81 90 92 99 100 104 105 116 117 126 127 129 130

1. CONCEPTOS MATEMATICOS BASICOS Son los elementos necesarios que debemos aprender para desarrollar programas.

Identificadores: Tipos de Datos Operadores y operandos Expresiones

IDENTIFICADORES: Representa los datos de un programa. Los identificadores son valores asociados a un nombre. Se clasifican en: Constantes: Datos Numricos o alfanumricos que no cambian durante la ejecucin de un programa o funcin ejemplo pi=3.14, E=2.718228 Variables: Permite almacenar temporalmente un dato durante la ejecucin de un proceso. Por ejemplo x=2, luego se realiza x=x+3, x inicialmente vale 2 y luego su valor se incrementa en 3, tomando x el nuevo valor de 5. Como vemos el valor de x puede variar, de all el nombre de variable.

Los valores que se le asignan a una variable solo pueden tomar valores de ese tipo. Los identificadores o sea los nombres que se le dan a las variables o constantes, elegidas para el algoritmo o programa deben ser significativos y tener relacin con el objeto que representan por ejemplo: nombrePerson: puede ser el nombre de una variable para representar nombres de personas. Precios: para representar precios de diferentes artculos Notas: para representar las notas de un curso.

Ejemplo LongitudCircunferencia= 2*Pi * radio


4

Pi: es una constante, un valor fijo (3.14) LongitudCircunferencia y radio son variables y sus valores pueden cambiar

TIPOS DE DATOS Naturaleza del conjunto de valores que puede tomar una variable o constante. Los tipos de datos se clasifican en: Simples a) Numricos (number): Permite representar valores escalares en forma numrica Ejemplo 4, 2, 5, 3.14

b) Lgicos (boolean): Solo pueden tener dos valores cierto o falso. Representa el resultado de una comparacin entre otros datos o expresiones. Ejemplo la comparacin (5>3) es Verdadera y la expresin (1>2) es falsa

c) Alfanumricos : (string): Secuencia de caracteres alfanumricos, que permite representar valores identificables de forma descriptiva, esto incluye nombres de personas, direcciones etc, Se representan encerrados entre comillas dobles. Ejemplos calle 3 norte Juan Carlos Lpez

d) Simbolo (symbol) Secuencia de caracteres alfanumricos que no pueden llevar espacios en blanco, van antecedido de una comilla simple. Ejemplos rojo calle_3 Sandra Juan_Carlos_Lopez

Compuestos: a) b) c) d) Estructuras Listas Arreglos rboles

OPERADORES Y OPERANDOS Elementos que relacionan de forma diferente dos valores de una o ms variables y/o constantes. Aritmticos: Permiten la realizacin de operaciones matemticas. EXPRESION 7/2 12 mod 7 4+2x5 = = = RESULTADO 3.5 5 14

En las expresiones anteriores /, mod, + y x corresponden a cada uno de los operadores y 7 2 12 4 5 corresponden a los operandos. Nota: el mod en Scheme se representa como remainder y el div o cociente de la divisin se representa como quotient.

EXPRESIONES: Son combinaciones de constantes, variables (operandos), operadores, parntesis y nombres de funciones. Ejemplos A+ (b +3)/c X= v+ l Segn el tipo de datos que manipulan estas pueden ser:

a) Aritmticas
6

b) Relacinales e) Lgicas PRIORIDAD DE LOS OPERADORES ARITMETICOS

Todas las expresiones encerradas entre parntesis se evalan primero. Las expresiones con parntesis anidados se evalan de adentro hacia afuera, y los parntesis ms interno se evalan primero.

Dentro de una misma expresin los operadores se evalan en el siguiente orden: 1 : (exponenciacin) 2. mod (modulo o residuo de la divisin entre dos nmeros enteros), div (cociente de la divisin entre dos nmeros enteros) x (multiplicacin), / (divisin) 3. + (suma) - (resta)

Los operadores en una misma expresin con igual nivel de prioridad se evalan de izquierda a derecha. Ejemplos

1) 4+2*5 4+10 14

2) 23*2/5 46/5 9.2

2) 3+5*(10- (2+4)) 3+5*(10- 6) 3+5*4 3+20 23

3) 2.1*(1.5+3.0*4.1) 2.1*(1.5+12.3) 2.1*13.8= 28.98

4) 3.5+5.09 - 3.5= 3.5+5.09-3.5= 8.59-3.5= 5.09

el mod es el residuo de la divisin entre dos nmeros enteros ejemplo 7 mod 2 es igual a 1.

Cociente o div

1 3 Residuo o mod

En caso de que los nmeros no sean enteros no se les puede aplicar el mod por ejemplo 6.7 mod 2 sera un error!

Operadores Relacinales: Establecen una relacin entre dos valores. Compara estos valores entre si y esta comparacin produce un resultado de certeza o falsedad (verdadero o falso), tiene menor prioridad que los aritmticos. Mayor que Menor que > <

Mayor o igual que >= Menor o igual que <= Diferente Igual <> = (not (=))

Ejemplos Si a=10 b=20 c=30 2) c>a es Verdadero 4) a - b< c 10 - 20 < 30 -10 < 30 Verdadero

1) a<b es Verdadero 3) a + b > c 10+20>30 30 >30 Falso

5) a * b <> c 10*20<>30 200<>30 Verdadero

Operadores Lgicos: Se utilizan para establecer relaciones entre valores lgicos. And Or Not Y O Negacin

TABLA LOGICA DEL OPERADOR AND Operando 1 V V F F Operador Operando 2 AND V F V F Resultado V F F F
9

TABLA LOGICA DEL OPERADOR OR Operando 1 V V F F Operador Operando 2 OR V F V F Resultado V V V F

TABLA LOGICA DEL OPERADOR NOT Operador Not Operando 1 V F Resultado F V


V: Verdadero F: Falso

Ejemplos 1) Si a=10, b=20 y c=30 (a<b) and (b< c) (10<20) and (20 < 30) V and V V

2) Si a=10

b=12 c =13 d =10

((a > b) or (a < c)) and ((a = c) or (a >= b)) ((10>12) or (10<13)) and ((10=13) or (10>=12)) ( F or V V ) and ( and F
10

F F

or

F )

3) Not (a=c) and (c>b) Not (10=13) and (13 >12) F and V V TALLER 1: CONCEPTOS MATEMATICOS BASICOS

1. Responda Cual es la diferencia entra variable y constante.

2. Para las siguientes variables segn el valor que contienen diga a que tipo pertenecen:

a) b) c) d) e) f) g)

x=12.4 s=Hola mundo cadena=hola placa=3456 color=rojo afirmacion=true f=false

3. Diga que Variables y de qu tipo utilizara para representar la siguiente informacin:

a) b) c) d) e) f)

Direccin de una casa Nmero telefnico Nombre del pas Numero de cedula Nombre de animal Color de una fruta

11

4. Si a=15 b=35 c=40, Resuelva las siguientes expresiones y diga que valor toman a) (a>b) or (a>c) b) not( (a+b)>c) c) ((a > b) or (a < c)) and ((a = c) or (a >= b))

12

2. NOTACION PREFIJA Antes de empezar a programar en Scheme debemos a aprender la notacin prefija ya que en este lenguaje todas las expresiones matemticas se escriben en esta notacin. En las expresiones prefijo todas las expresiones aritmticas estn en parntesis. En la notacin prefija primero se especifica el operador y luego los operandos, separados por espacios. INFIJO POSTFIJO PREFIJO 3 + 8 ----------> Los operadores van en medio de los operandos 3 8 + ----------> Los operadores van al final de los operandos + 3 8 ----------> Los operadores van al inicio de los operandos

Paso de Notacin Infija a Prefija Ejemplo Pasar a notacin prefija las siguientes expresiones:

a) 2+8*5+6 2+(8*5)+6 (+ 2 (* 8 5)) + 6 (+ (+ 2 (* 8 5) ) 6)

1. Si no est en parntesis la expresin infija y hay operadores con diferente prioridad (y es fcil de presentarse ambigedad), primero se debe agrupar en parntesis la expresin, antes de pasarla a prefijo.

2 .Luego se recorro la expresin de izquierda a derecha, cuando se encuentra un operador se abre parntesis, se escribe el operador seguido del operando izquierdo, seguido del operando derecho y finalmente se cierra el parntesis. Repito el proceso hasta que toda la expresin este en prefijo

13

Otra forma de resolver la expresin anterior 2+8*5+6 2+(8*5)+6 (+ 2 (* 8 5) 6)

b) 3+ (2 - 5) (+ 3 (2 - 5)) (+ 3 (- 2 5))

Se siguen los mismos pasos pero si hay un mismo operador que opere sobre varios operandos en un mismo nivel de prioridad, entonces al pasar a prefijo se pueden agrupar en un solo parntesis.

c) (1 8 ) / (10 - 100) (- 1 8) / (- 10 100 ) (/ (- 1 8) (- 10 100))

d) 1+2 - 3+4 (+ 1 2) 3 + 4 (- (+ 1 2) 3) +4 (+ (- (+ 1 2) 3) 4)14

e)

(* 5 x x x) + (* 4 x x) + (* 2 x) 4 (+ (* 5x x x) (* 4 x x ) (* 2 x)) 4 (- (+ (* 5 x x x) (* 4 x x) (* 2 x)) 4)

14

Resolver Expresiones en Prefijo Ejemplos: 1. Resolvamos las siguientes expresiones en prefijo


Recorremos la expresin de izquierda a derecha y vamos resolviendo primero los parntesis ms internos. Cuando se resuelve lo que hay dentro del parntesis, se quita el parntesis y se escribe solo el resultado de la expresin

a) (- (* 5 7) (+ (* 7 8) 8)) (- 35 (+ 56 8)) (- 35 64)= -29 b) (* 5 73 (+ 1 6)) (* 365 7)= 2555

c) (* (* 2 4) (+ 8 -9) 7) (* 8 1 7)= - 56

d) (* 6 8 (+ 100 20)) (* 6 8 80)=3840

e) (- (* 18 3) 5) (- 54 -5) = -59

f) (/ (+ (* 52 4) 6) 2) (/ (+ 208 6) 2) (/ 214 2) 107

g) (* (- (/ 98 3) 5) 4) (* (- 32.6 5) 4)
15

(* 27.6 4)=110.4

h) (sqrt (+ (* 32 4) 16)) (sqrt (+ 128 16)) (sqrt 144)=12


remainder, obtiene el residuo de la divisin entre dos nmeros enteros.

i) (remainder (* 6 4) (/ 12 5)) (remainder 24 2.4) !error

j) (>5 (* 10 4)) (> 5 40) falso

k) (< (+ 8 2) 20) (< 10 20) verdadero

l) (not (= 2 3)) (not falso) verdadero

16

2.

Cul es el resultado de las siguientes expresiones cuando x=4 x=2 x=7/2

a) (> x 3) (> 4 3)= verdadero (> 2 3) =verdadero (> 7/2 3)=verdadero

b) (and (> 4 x) (> x 3)) (and (> 4 4) (> 4 3)) (and verdadero falso) verdadero 2

(and (> 4 2) (> 2 3)) (and verdadero falso) falso

(and (> 4 7/2) (> 7/2 3)) (and verdadero verdadero)= verdadero

Ms ejercicios de paso de infijo a prefijo a) 9+5*6+2 9 + (5 * 6) + 2 (+ 9(5 * 6)) + 2 (+ 9(* 5 6)) + 2


17

(+ (+ 9(* 5 6))2)

b)

3 + (2 - 5) (+ 3(2 - 5)) (+ 3(- 2 5))

c)

( 10 * 2) + (15 - 5) (* 10 2) + (- 15 5) (+(* 10 2)(- 15 5))

Evaluar una expresin escrita en prefijo a) (+(* 10 2)(- 15 5 (+ 20 10) 30

b) (*(+(- 4 2)(* 5 2)7)(+ 5 4)) (*(+ 2 10 7)9) (* 19 9 ) 171

c) (/ 10(+(*(/(+ 5 5)2)(+ 2 2)) 10)) (/ 10(+(*(/ 10 2)4)10)) (/ 10(+(* 5 4)10)) (/ 10(+ 20 10)) (/ 10 30) = 0.3

18

d)

(/(+(* 52 4)6)2) (/(+ 208 6)2) (/ 214 2) = 107

e)

(-(+(*(*(/ 40 2)3)2 20)100)40) (-(+(*(* 20 3)2 20)100)40) (-(+(* 60 2 20)100)40) (-(+ 2400 100)40) (- 2500 40) = 2460

TALLER 2: NOTACIN PREFIJA

1. Qu valor devolvern las siguientes operaciones: a) ( * (+ (- 5 2) (* 4 2) 7) (+ 5 5) 2) b) (-(+ 7 3) (+ 4 6) (+ 10 10) 20) c) (* ( 10 5) (+ 35 15))

e) (/ (+ (*(/ (+ 5 5) 2) (+ 2 2)) 10) 10) f) (-(+(*(*(/ 40 2) 3) 2 20) 100) 40) 2. Representar las siguientes expresiones en notacin prefija y resolver en Scheme:

a) [ (25 + 5) * 2] - 60 b) 50 * [(-50 + -15) * (-80 + 20)]


19

c) 2 * [(-5 + -15) + (-80 + 90)] d) 5 * [(-10 20) (-80 + 90)] e) [(2 * 5) + [(4 2) + 8]] f) 3+ (2 5 ) g) (1 - 18) / (11 2000) h) i)

3 Que respuestas devuelven las siguientes expresiones b) (+ (* 2 (- 82 67.5)) 100) c) (/ (+(* 52 4) 6)2) d) (* (- (/ 98 3)5) 4) e) (sqrt (+ (* 32 4) 16)) f) (remainder (* 6 4 ) (/ 12 5))

4 Determine si es verdadero (true ) o falso (false) a) (>8 -5) b) (>= (+ 100 (+ 5 8 ) (* 10 1)) 2) c) (< 4850 (+ 15 8 (+ (+ 90 9) (- 200 8)) (* 9 20))) d) (> 5 ( * 10 4)) e) (< (+ 8 2) 20) f) (and (> 4 3) (<=10 100)) g) (or (> 4 3) (=10 100)) h) (not (= 2 3))

5 Para a) x=9 a) (> x 3)

b) x = 3

c) x = 15/ 2

Cul es el resultado de: b) (and (> 4 x) (> x 3) ) c) (= ( * x x ) x)


20

3. FUNCIONES SIMPLES EN SCHEME Desde mucho tiempo atrs, las maquinas han minimizado el esfuerzo humano, en procesos tediosos repetitivos. Los programas surgen como respuesta inmediata a la idea de construir una mquina y hacer que esta lleve a cabo un conjunto de instrucciones.

Para que la maquina entienda los algoritmos y los procese se necesitan que estn escritos en un lenguaje propio de la maquina o sea un lenguaje de programacin.

Existen muchos lenguaje de programacin, as como existen diferentes idiomas en el mundo como el ingles, espaol francs etc, con los cuales las personas se comunican, as tambin las maquinas tiene muchos idiomas para comunicarse java, C++, Visual Basic, Scheme y cada uno de ellos tiene sus propias caractersticas. En el curso aprenderemos acerca del lenguaje de programacin Scheme que es un lenguaje de programacin Funcional.

Cuando se codifica un algoritmo en Scheme las expresiones se escriben en Notacin Prefija. El programa debe llevar cierta documentacin o comentarios que se le hacen al programa para que sea ms fcil de entender, tanto para nosotros como para otros programadores.

CARACTERSTICAS DE LA PROGRAMACIN FUNCIONAL Un lenguaje funcional es aquel cuyos programas estn basados en funciones, que son llamadas desde otras funciones, en estos lenguajes no existen formas explicitas de influir en el control del programa y la nica forma de iterar es a travs de la recursividad.

Estos lenguajes son especialmente tiles para representar problemas de modelacin y simulacin en las distintas reas de la ingeniera. Tambin es muy usado en el rea de la inteligencia artificial
21

Scheme nace a partir de list, sin embargo permite otras caractersticas como la asignacin y por eso se le conoce como un lenguaje funcional impuro. El valor de una expresin depende solo de los valores de sus subexpresiones, si las tiene. Tiene una sintaxis sencilla, y muy poderosa. Se basa en la evaluacin de expresiones en lugar de la ejecucin de instrucciones. Permite la reutilizacin de cdigo. Datos fuertemente tipados: No acepta usar una variable en una funcin si sus datos no coinciden

ESCRIBIR FUNCIONES EN SCHEME Cuando hacemos un programa o funcin en Scheme debemos tener en cuenta realizar ciertos pasos que hacen parte de la documentacin:

Propsito: donde se describir que hace la funcin. Anlisis de datos donde se especifican los datos entrada y salida y se le da un nombre a funcin. Luego se hacen las instrucciones propias del programa o sea el cuerpo de la funcin, es decir el algoritmo pero escrito en lenguaje Scheme. Finalmente se realiza la prueba es decir la ejecucin de la funcin, donde se dan valores a los datos o variables de entrada para obtener los resultados de salida. Este paso es tan importante como el cuerpo de la funcin, porque es en la prueba donde se ejecuta la funcin. Si no se realiza este paso es como si no existiera la funcin.

Importante: Los comentarios deben ir antecedidos de un punto y coma ; que estos no sean ledos por la mquina. (Solo los debemos ver nosotros).

para

22

Ejemplo Hagamos una funcin para sumar dos nmeros

; Propsito: la funcin permitir sumar dos nmeros ; Anlisis Nombre de programa: suma Datos de entrada x de tipo numrico y de tipo numrico
En Scheme no necesitamos darle nombre a los datos de salida Tipo de los datos de entrada

Tipo de datos de salida: numrico

Una vez tenemos claro estos paso hacemos el cuerpo del programa Bueno para escribir una funcin en Scheme tengamos en cuenta las siguientes cosas: En Scheme todo va en parntesis, cada parntesis que abre debe cerrarse, para iniciar una funcin utilizamos la palabra define para indicar que inicia el programa. Luego se abre un parntesis en el cual se encierra el nombre que le damos a la funcin, para darle el nombre pensemos en cul es el dato de salida, esos nos da una idea de cmo podemos llamar a la funcin. Seguido al nombre del programa vienen todas las variables o datos de entrada. Y luego viene la frmula que resuelve el problema que debe estar escrita en prefijo.

23

Forma general de una funcin en Scheme (define (nombreFuncion datosEntrada) (formulaPrefijo))

Entonces la funcin anterior en Scheme queda as:

; Cuerpo del programa (define (suma x y) (+ x y))

Observe que esta instruccin no va antecedida por ; (punto y coma), ya que se necesita que sea leda por el computador.

Bueno ya tenemos ella funcin pero para que la maquina lo ejecute es necesario hacerle una llamada es decir indicarle a la mquina que corra la funcin con los datos de entrada que queramos, a esto lo llamamos Prueba o ejecucin del programa.

Para hacer la prueba escribimos en parntesis el nombre de la funcin con los valores dados a los datos de entrada

; Pruebas

(suma 7 8)
Observe que esta instruccin no va antecedida por ; (punto y coma), ya que se necesita que sea leda por el computador

(suma 20 30)

Importante Si no se hace la prueba el computador no va a realizar el programa porque es aqu donde le decimos a la mquina que ejecute el programa.

24

Ejemplo Hacer un programa para hallar el rea de un triangulo ; Propsito: calcular el rea de un tringulo ; Anlisis ; Nombre funcin: AreaTriangulo ; Datos entrada: area: number y base: number ; Tipo de dato de salida: number

; Cuerpo del programa

Nombre de la funcin

(define (area base altura) (* base altura))


Datos de entrada

; Prueba (area 3 4)
Tenga en cuenta que la instruccin que hace la prueba no va en comentario (antecedido por ;)

25

EL ENTORNO DE DR SCHEME

1) Hacemos clic en Inicio->Todos los programas->PLT Scheme->Dr Scheme

De aqu revisamos la sintaxis

De aqu ejecutamos el programa

Se abre esta ventana:

Aqu escribimos los programas o funciones

Aqu se muestran los resultados

26

La Ventana de definiciones: corresponde a la parte superior de la ventana, all se escriben las funciones, teniendo en cuenta todos los pasos anteriores.

Ventana de interacciones: Corresponde a la parte inferior, y aqu van a aparecer los resultados de la ejecucin de las funciones o evaluacin de las expresiones.

En la ventana de definiciones digitamos el cdigo de las funciones, por ejemplo el de la funcin suma.

; Propsito: Realizar la suma de dos nmeros ; Anlisis ; Nombre de la funcin: suma ;Datos de entradas: x:y:number ;Tipo de dato de salida number

; Cuerpo del programa (define (suma x y) (+ x y))

; Prueba (suma 45 67)

3) Guardemos el programa

Archivo->Salvar definiciones como 4) Ejecutemos el programa


27

Cuando se ejecuta un programa o se revisa su sintaxis pueden aparecer diferentes errores

Algunos Errores Tpicos

a) reference to undefined identifier: referencia a un identificador indefinido

Posibles causas Cuando un operador est unido al operando Se ha escrito mal alguna variable

b) read: expected a ')'; indentation suggests a missing ')' Posibles causas Falta algn parntesis por cerrar

b) cond: expected a clause with a question and answer, but found a clause with only one part Posibles causas Esta mal escrita la condicin. Falta el operador else en la clausula.

28

PEDIR DATOS AL USUARIO EN SCHEME Para mostrar un mensaje utilizamos display Y para leer un valor del teclado usamos read

Ejemplo Hallar el rea de un cuadrado

; Propsito: calcular rea del cuadrado ; Anlisis ; Datos de entrada: l: number ; T.D.S: number

; Funcin (define (area l) (* l l))

(display "ingrese el valor del lado ")

; Prueba (area (read)) ; aca se llama la funcin y se le manda como parmetro el valor ledo

29

EJERCICIOS RESUELTOS Ejercicio 1 La presin, el volumen y la temperatura de una masa de aire se relacionan por la frmula: Masa=(presion*volumen)/ (0.37 * (temperatura+460)). Realizar una funcin que permita hallar la masa conociendo la formula anterior. ; Propsito: hallar la masa ; Anlisis ; Nombre funcin: masa ; Datos entrada : presin: numrico, volumen: numrico, temperatura: numrico ; Tipo dato salida: numrico

; Cuerpo de la funcin (define(masa presion volumen temperatura) (/(* presion volumen)(* 0.37(+ temperatura 460))))

; Prueba (masa 2 4 6)

Ejercicio 2 Todos los lunes, mircoles y viernes, una persona corre la misma ruta y cronometra los tiempos obtenidos. Realizar una funcin para determinar el tiempo promedio que la persona tarda en recorrer la ruta en estos tres das.

; Propsito: determinar el tiempo promedio de recorrido ; Anlisis ; Nombre funcin: tiempoderecorrido


30

; Datos de entrada : t1:numerico t2:numerico t3:numerico ; Tipo dato salida: numrico

; Cuerpo de la funcin (define (tiempoderecorrido t1 t2 t3) (/(+ t1 t2 t3 )3))

;Llamado funcin (tiempoderecorrido 20 30 40 )

Ejercicio 3 Dado 5 nmeros a, b, c, d, e. Disee una funcin que permita calcular el promedio de ellos. ; Propsito : disear un programa que permita calcular el promedio de ellos ; Anlisis ; Nombre funcin: promedio ; Datos de entrada : n1:numerico n2:numerico n3:numerico n4:numerico n5:numerico ; Tipo dato salida: numrico

; Cuerpo de la funcin (define(promedio n1 n2 n3 n4 n5) (/ (+ n1 n2 n3 n4 n5)5))

; llamado de la funcin (promedio 1 2 3 4 5)


31

Ejercicio 4 Hacer una funcin que calcule el rea de un cuadrado

; Propsito: calcular el rea de un cuadrado ; Anlisis ; Nombre funcin: areacuadrado ; Datos de entrada: l: numrico ; Tipo de salida: numrico

; Cuerpo de la funcin (define (areacuadrado l) (* l l))

; Llamado funcin (areacuadrado 20)

Ejercicio 5 Una empresa paga $8000 por hora a todos sus empleados, Desarrolle la funcin que determine el ingreso del empleado.

; Propsito: determinar ingreso del empleado por hora ; Anlisis ; Nombre funcin: ingreso ; Datos de entrada: horas: numrico ; Tipo de salida : numrico
32

; Cuerpo de la funcin (define (ingreso horas ) (* 8000 horas))

; Llamado funcin (ingreso 8)

Ejercicio 6 Realizar una funcin que permita calcular el rea de un crculo del cual se conoce su dimetro (el dimetro es igual a dos veces el radio).

; Propsito: calcular el rea de un crculo ; Anlisis: ; Nombre de la funcin: AreaCirculo ; Datos de entrada: Diametro: number ; Tipo datos de salida: number

; Cuerpo de la funcin (define (AreaCirculo Diametro) ( * 3.14( expt ( / Diametro 2) 2)))

; Prueba (AreaCirculo 3)

33

TALLER 3: FUNCIONES SIMPLES EN SCHEME

1. Hacer una funcin que calcule el nuevo salario de un obrero si se sabe que obtuvo un incremento del 25% sobre su salario anterior.

2. El dueo de una tienda compra un artculo a un precio determinado. Hacer una funcin para obtener el precio en lo que se debe vender para obtener una ganancia del 30%

3. Hacer un programa para calcular la distancia entre dos puntos dados por la formula

4. Realizar funciones para calcular el rea y el volumen de una esfera. El rea est dada por y el volumen por

5. Realice funciones para convertir un dato de metros a pie y pulgadas (1 metro=39.37 pulgadas) (1 pie=12 pulgadas.)

34

3. CONDICIONALES Definicin de variable Antes de entrar en el tema de condicionales aprendamos a definir una variable en Scheme. Una variable se define cuando se quiere dar un valor a la variable y de ah en adelante cuando se haga referencia a la variable esta contiene el valor definido en ella.

La definicin de una variable tiene la siguiente sintaxis: (define nombreVariable valorVariable)

Ejemplo (define p 3.14)

Valor asignado a la variable

Nombre dado a la variable

Cada vez que mencionemos la variable automticamente reemplazara su valor.

en

Scheme

el

programa

Algunos operadores de comparacin Operador string? Funcin Ejemplo

Para revisar si una variable (string? Marisol) o valor es de tipo cadena Retornara true ya que Marisol si (string) es de tipo string.

string=?

compara si dada dos valores de tipo string

(string Cali Bogota)


35

(llamado tambin alfanumerico o cadenas) Devuelve false ya que son son iguales, en caso de cadenas diferentes serlo devuelve true en caso contrario retorna false symbol? Determina si una variable es de tipo symbol determina si dos smbolos son iguales en caso afirmativo devuelve true, en caso contrario devuelve false Revisa si una variable o valor es de tipo booleano (tambin conocido como tipo lgico) Revisa si dos datos de tipo symbol son iguales (symbol? Juguete) Retorna true (symbol=? Barbie Barbie) Como los dos smbolos son iguales devuelve true

symbol=?

boolean?

(boolean? (> 5 7)) Como (> 5 7) retorna false y false es de tipo booleano entonces toda la expresin retorna true. (boolean=? true false) devuelve false

boolean=?

CONDICIONALES EN SCHEME Permiten resolver problemas donde existen diferentes alternativas o caminos a tomar en su desarrollo.

Dentro de Scheme existen varios forma de expresar las condiciones.

Sentencia if Veamos su sintaxis:

36

(if (condicion) (accion1)

(accion2))

Se evala una condicin y si se cumple que es verdadera se realiza la accion1, en caso contrario, es decir cuando la condicin evaluada es falsa entonces se debe realizar la accion2.

Ejemplo Determinar si un nmero es par o no Como se sabe un nmero es par cuando es divisible por 2 es decir el residuo de la divisin del nmero por 2 es 0, para lo cual utilizamos el operador remainder.

; Propsito: determinar si un nmero es par o no

; Anlisis ; Nombre funcin: ParImpar ; Datos de entrada: n: number ; Tipo dato de salida: number
Cuando a condicin se cumpla o sea que sea verdadero que el residuo de n con 2 es igual a 0, se mostrara por pantalla el mensaje Es Par (accion1) y cuando no se cumpla esta condicin es decir sea falsa entonces se mostrara por pantalla el mensaje Es impar (accion 2).

; Cuerpo del programa

(define (ParImpar n) (if ( = remainder n 2) 0) Es par Es impar))

; Prueba (ParImpar 10) devuelve Es par (ParIMpar 7) ;devuelve Es impar


37

EJERCICIOS RESUELTOS Ejercicio 1 Realizar una funcin que permita calcular el total que una persona debe pagar en una llantera. El precio de cada llanta es de $300.000, si se compran menos de 5 llantas; y de $ 200.000 si se compran 5 o ms.

; Propsito: Calcular el total a pagar en una llantera dependiendo del nmero de llantas que compre. ; Anlisis ; Datos de entrada: llanta: numrico ; Datos de salida: numrico

; Definicin de la funcin (define(valorpagar llanta) (if (<= llanta 5)(* llanta 300000) (* llanta 200000)))

; Prueba (valorpagar 6) (valorpagar 3) (valorpagar 5)

Ejercicio 2 Hacer una funcin que calcule el valor absoluto de un nmero.

; Anlisis ; Propsito: Calcular el valor absoluto de un nmero.


38

; Datos de entrada: numero: numrico ; Datos de salida: numrico ; Definicin de la funcin

(define(absoluto numero) (if(<= numero 0)(* numero -1) (* numero 1)))

;prueba (absoluto -5) (absoluto -8) (absoluto 6)

Ejercicio 3 Hacer una funcin que determine cunto gana un empleado, si el empleado trabaja ms de 160 horas se le pagara a $3000 por hora, si trabaja 160 horas o menos se le pagara la hora a $2500

; Anlisis ; Propsito: Determinar cunto gana un empleado ; Nombre funcin: salario ; Datos de entrada: HorasT: numrico ; Tipo dato salida: numrico

39

; Funcin: (define(salario HorasT) (if(> 160 HorasT)(* 3000 HorasT) (* 2500 HorasT)))

;Prueba: (salario 190) (salario 140) (salario 160)

Ejercicio 4 Haga una funcin que lea dos nmeros los multipliqu y muestre su resultado, solo si el segundo nmero es negativo

; Anlisis ; Propsito: multiplicar dos nmeros solo si el segundo es negativo ; Nombre: multiplicacin ; Datos de entrada: a: numrico b: numrico ; Datos de salida: numrico

; Funcin (define (multiplicacion a b) (if (< b 0) (* a b) "El segundo nmero no es negativo"))

; Prueba (multiplicacion 4 -6)


40

(multiplicacion 4 7) (multiplicacion 3 -1)

Ejercicio 5 Hacer una funcin que compruebe si dos nmeros son iguales

; Propsito: comprar si dos nmeros son iguales ; Analisis ; Nombre de la funcin: igual ; Datos de entrada: a: numrico b: numrico ; Datos de salida: string

; Funcin (define (igual a b) (if (= a b) "son iguales" "son diferentes"))

; Prueba (igual 2 4) (igual 4 4) (igual 0 0)

41

Sentencia Cond Se utiliza cuando existen muchas condiciones o alternativas dentro de la funcin.

Sintaxis del cond

(cond (condicion1 accion1) (condicion2 accion3) . . . (condicionN accionN)

(else accionN))

En un cond se evalan varias condiciones y cuando se encuentra alguna que sea verdadera se realiza la accin que la acompaa. Cuando se realiza una accin la funcin termina, es decir las otras condiciones no se evalan.

Al final de las condiciones debe ir la clusula else que significa que si no se cumpli ninguna de las condiciones anteriores entonces se debe realizar la accionN

42

Ejemplo Determinar si un n dado es solucin de la ecuacin 2

4n62

; Propsito: Determinar si un n dado es solucin de la ecuacin 4n262 ; Anlisis ; Nombre de la funcin: soluciones ; Datos de salida: n:number ; Tipo datos de salida: numbe

; Cuerpo del programa (define (soluciones n) (cond [(= 462 (+(* 4(expt n 2)) (* 6 n) 2)) Si es solucin] [else No es solucin]))

; Prueba o llamado de la funcin (soluciones 3)

Ejemplo En una Universidad existen tres programas acadmicos que son: Licenciatura Matemticas, Tecnologa en Electrnica, y Tecnologa de Sistemas, los cuales tienen un costo de $1.000.000 para Tecnologa Electrnica, $1.200.000 para Matemticas y $1.300.000 para Tecnologa en Sistemas, adems de esto los estudiantes tienen un descuento del 10% si pertenecen a estrato 2 y del 20% si pertenecen a estrato 1: Hacer un programa que dado el estrato al cual pertenece el estudiante y la carrera que quiere estudiar determine el costo de su matrcula.
43

; Propsito: Determinar el costo de una matricula ; Anlisis ; Nombre funcin: costo ; Datos de entrada: estrato :number y carrera: number ; Tipo dato de salida: number
Definir variables es opcional, pero se ha hecho para aprender su utilidad.

; Definicin de variables (define TE Tecnologa en electrnica) (define TS Tecnologa de Sistemas) (define M Matematicas)
Se saca el porcentaje y se descuenta al valor original de la matrcula.

(define costo carrera estrato) (cond [(and (string=? carrera TE) (= estrato 1)) (- 1000000 (* 1000000 0.2))] [ (and (string=? carrera TE) (= estrato 2)) (- 1000000 (* 1000000 0.1))] [(and (string=? carrera TS) (= estrato 1)) (- 1300000 (* 1300000 0.2))] [(and (string=? carrera TS) (= estrato 2)) (- 1300000 (* 1300000 0.1))] [ (and (string=? carrera M) (= estrato 1)) (- 1200000 (* 1200000 0.2))] [(and (string=? carrera M) (= estrato 2)) (- 1200000 (* 1200000 0.1))]))

; Llamado de la funcin (costo TE 2) ; debe devolver 900.000 (costo M 1); debe devolver 960.000 (costo Matematicas 1) ;debe devolver 960.000

El llamado de la funcin se puede hacer con las variables ya definidas o con el nombre de la carrera.

44

EJERCICIOS RESUELTOS Ejercicio 2 Hacer una funcin que lea tres nmeros distintos, valide que no sean iguales y determine cul es el mayor.

; Propsito: Leer tres nmeros distintos, validar que no sean iguales y determinar cul es el mayor. ; Anlisis ; Nombre de la funcin: iguales ; Datos de entrada:X, Y, Z son de tipo numrico ; Tipos de datos de salida: string

;Cuerpo de la funcion: ( define ( iguales x y z ) ( cond (( and ( = x y ) ( = x z ) ( = z y ) ) "son iguales" ) (( and ( > y x ) ( > y z )) "y es mayor" ) (( and ( > x y ) ( > x z )) "x es mayor" ) (( and ( > z x ) ( > z y )) "z es mayor" ) ( else "no pueden ser iguales" )))

;Llamado de la funcion ( iguales 1 1 4 )

45

Ejercicio 2 Desarrolle una funcin llamada soluciones que reciba los coeficientes a, b, c de una ecuacin cuadrtica de la forma y determine cuantas soluciones tiene la ecuacin, suponiendo que a no es 0 Recuerde que una ecuacin cuadrtica tiene: Dos soluciones si b2 4ac Una solucin si b2 4ac No tiene solucin si b2 4ac

Por ejemplo si a=1, b=0 y c= 1 la ecuacin tiene 2 soluciones. Si a=2, b=4, c=2 la ecuacin tiene 1 solucin.

; Propsito: hacer una funcin para determinar cuntas soluciones tiene la ecuacin cuadrtica ; a diferente de 0 ; Nombre de la funcin: soluciones ; Dato entrada: a, b, c tipo numrico ; Tipo dato salida: number

; Cuerpo de la funcin: ( define ( soluciones a b c ) ( cond [( > ( expt b 2 ) ( * 4 a c )) " tiene dos soluciones" ] [( = ( expt b 2 ) ( * 4 a c )) "tiene una solucin" ] [ else "no tiene solucin" ]))

;Llamado funcin ( soluciones 1 0 -1 )


46

Ejercicio 3 Hacer una funcin que sume dos nmeros solo si el segundo nmero es mayor al primero.

; Propsito: ejecutar una suma solo si el segundo nmero es mayor al primero ; Anlisis ; Nombre de la funcin: suma ; Datos de entrada:num1 y num2 son de tipo number ; Datos de salida: number o string

; Funcin ( define ( suma num1 num2 ) ( cond [( < num1 num2 ) ( + num1 num2 )] ( else "el segundo nmero no es mayor" )))

; Prueba ( suma 7 8 )

Ejercicio 4 En un supermercado se hace una promocin, mediante la cual el cliente obtiene un descuento dependiendo de un nmero; que se escoge al azar, si el nmero escogido es menor que 74 el descuento es el 15% sobre total de la compra, si es mayor o igual a 74 el descuento es el 20%. Haga una funcin que obtenga cunto dinero se le descuenta.

; Propsito: crear una funcin que indique el descuento de un comprador.


47

; Anlisis ; Nombre de la funcin : descuento ; Datos de entrada : azar y precio son de tipo number ; Tipo de dato salida: numrico

; Cuerpo funcin ( define ( descuento azar precio ) ( cond [( < azar 74 ) ( / ( * precio 15 ) 100 )] [( >= azar 74 ) ( / ( * precio 20 ) 100 )]))

; Prueba ( descuento 75 100000 )

TALLER 4: CONDICIONALES

1. Responda que valores devuelven las siguientes expresiones: (string=? Hola Mundo hola Mundo) (remainder (/ 10 2) 5) (number? 3 .4) (boolean? (> 6 7)) (symbol=? mi_mundo Mi_mundo)

2. Determina si las siguientes funciones poseen errores y corrgelas a) (define (funcionM p q )(+ 8 (+(* p q) r))) b) (define h (+ 8 7))
48

c) (define (multiplicacin m k) (cond [(= 1 k) m] [(> m 1) (+ m multiplicacion m (k- 1))])) 3. En un hospital existen tres reas; ginecologa, pediatra, traumatologa. presupuesto anual del hospital se reparte conforme a la siguiente tabla rea Ginecologa Traumatologa Pediatra Porcentaje del presupuesto 35% 25% 30% El

Hacer una funcin que reciba el nombre de un rea del hospital y el monto presupuestal y determine la cantidad de dinero que le corresponde a esta rea. 4. En una fbrica de computadoras se plantea ofrecer a los clientes un descuento que depender del nmero de computadoras que compre. Si las computadoras son menos de 5 se le dar un 10% de descuento sobre el total de la compra, si el nmero de computadoras es mayor o igual a 5 pero menos de 10 se le otorgara un descuento del 20%; y si son 10 o ms se les da un 40% de descuento. El precio de cada computadora es de $1.100.000. Realice una funcin que calcule cunto se paga finalmente por la compra de las computadoras.

5. Haga una funcin que lea dos nmeros los multiplique y muestre su resultado, solo si el segundo nmero es negativo.

6. Una Aerolnea desea saber cunto debe cobrar a sus pasajeros por la compra de un tiquete, dependiendo de las siguientes condiciones: Los destinos de la Aerolnea son Bogot y San Andrs Un tiquete se puede comprar faltando 2, 1 o el mismo da del viaje (0)

49

Un tiquete comprado a Bogot faltando 2 das tiene un costo de $ 150000, faltando 1 da su costo se eleva en un 5% y el mismo da en un 8% ms que faltando 1 da, es decir un 8% ms sobre el valor del tiquete faltando 1 da. A San Andrs el costo del tiquete es de $ 395.000 si es comprado faltando 1 da, si es faltando 2 das su costo se reduce en un 7% y si es el mismo da el valor es mayor en un 5% sobre su valor.

50

5. FUNCIONES AUXILIARES El uso de funciones auxiliares hace que el diseo de programas sea ms manejable y agradable, permitiendo descomponer un problema en pequeos subproblemas. Se pueden definir mltiples funciones auxiliares, el orden de definicin no afecta su llamado. Desde una funcin se puede llamar a otra funcin.

Ejemplo Si diseamos una funcin que calcule el rea de un crculo seria de la siguiente forma.

; Propsito: funcin para calcular el rea de un circulo ; Anlisis de datos ; Nombre de la funcin: AreaCirculo ; Datos de entrada: radio: number ; Tipo del dato de salida: number

; Cuerpo de la funcin (define (AreaCirculo radio)) (* 3.14 radio radio))

Ahora si luego queremos hacer una funcin para calcular el volumen de una esfera, pero sabemos que el volumen de una esfera se puede calcular multiplicando el rea del crculo por el radio, entonces como ya tenemos diseada la funcin que calcula el rea del crculo podemos utilizarla para calcular el volumen de la esfera.
51

Entonces diseemos la funcin para calcular el volumen de la esfera, y que utilice la funcin anterior.

; Funcin Principal ; Propsito: calcular el volumen de una esfera ; Anlisis de datos ; Nombre de la funcin: VolumenEsfera ; Datos de entrada: r : number ; Tipo de dato de salida: number

; Cuerpo de la funcin (define (VolumenEsfera r)

Aqu llamamos a la funcin auxiliar

(* ( / 4 3) (AreaCirculo r)))

; Llamado de la funcin o prueba (VolumenEsfera 5)

Ejemplo Usando la funcin auxiliar del rea de la circunferencia calcular el rea de un anillo que tiene un radio externo y un radio interno

; Funcin auxiliar ; Propsito: calcular el rea de una circunferencia ; Anlisis de datos ; Nombre de la funcin: area_circunferencia
52

; Datos de entrada: radio: number ; Tipo de datos de salida: number

; Cuerpo de la funcin (define (area_circunferencia radio) (* 3.14 radio radio)) ;************************************************ ; Funcin principal ; Propsito calcular el rea de un anillo ; Anlisis de datos ; Nombre de la funcin areaAnillo ; Datos de entrada: rexterior :number, rinterior:number ; T.D.S:number

; Cuerpo del programa (define (areaAnillo rexterior rinterior) (- (area_circunferencia rexterior) (area_circunferencia rinterior)))

; Prueba (areaAnillo 5 4)

EJERCICIOS RESUELTOS Ejercicio 1 Un alumno desea saber cul ser su nota final en una materia, dado el nombre de la materia. Estas materias se evalan como se muestra a continuacin:
53

La calificacin de matemticas se obtiene de la siguiente manera: Examen 90%. Promedio de las tares 10%. La calificacin de fsica se obtiene de la siguiente manera: Examen 80%. Promedio de tares 20. La calificacin de qumica se obtiene de la siguiente manera: Examen 85%. Promedio de tareas 15%. En todas las materias se pidi un total de tres tareas. ; Propsito: calcular la nota final de matemticas ; Anlisis ; Nombre de la funcin: nota_mat ; Datos de entrada: E T1 T2 T3: number ;Tipos de datos de salida: number

;Funcin (define (nota_mat E T1 T2 T3) (+ (* 0.9 E) (* (/ (+ T1 T2 T3)3)0.1)))

;Prueba (nota_mat 5 2 3 5) ;****************************** ; Propsito: calcular la nota final de fsica ; Anlisis ; Nombre de la funcin: fsica ; Datos de entrada: E T1 T2 T3 number ; Tipos de datos de salida: number
54

; Funcin: (define(fisica ex t1 t2 t3) (+(* ex 0.8)(*(/(+ t1 t2 t3)3) 0.2)))

; Prueba: (fisica 3 5 2 5) ;****************************************** ; Propsito: Calcular la nota final de qumica ; Anlisis: ; Nombre de la funcin: quimica ; Datos de entrada: E T1 T2 T3 number ; Tipos de datos de salida: number

; Funcin (define(quimica ex t1 t2 t3) (+(* ex .85)(*(/(+ t1 t2 t3)3)0.15)))

; Prueba (quimica 4 1 3 3) ;********************************************** ; Propsito: dado el nombre de la materia y las notas, calcula la nota para esta materia. ; Anlisis: ; Nombre de la funcin: calculonota ; Datos de entrada: materia: string
55

; e, t1, t2, t3: number ; Tipos de datos de salida: number ; Cuerpo de la funcin: (define (calculonota materia e t1 t2 t3) (cond ((string=? materia "matematicas") (nota_mat e t1 t2 t3)) ((string=? materia "fisica") (fisica e t1 t2 t3)) ((string=? materia "quimica") (quimica e t1 t2 t3))))

; Prueba (calculonota "quimica" 5 5 5 5)

Ejercicio 2 Calcular el promedio general de las tres materias.

; Propsito: calcular el promedio general de las tres materias ; Anlisis: ; Datos de entrada: em t1m t2m t3m ef t1f t2f t3f eq t1q t2q t3q: numricos ; Datos de salida: numrico

; Funcin (define (promediogeneral em t1m t2m t3m ef t1f t2f t3f eq t1q t2q t3q) (/ (+ (nota_mat em t1m t2m t3m) (fisica ef t1f t2f t3f) (quimica eq t1q t2q t3q)) 3))

; Prueba
56

(promediogeneral 3 5 2 3 4 4 2 5 3 5 1 2)

FUNCIONES PASADAS COMO ARGUMENTOS

El llamado de una funcin tambin se puede recibir como dato de entrada de una funcin. Resolvamos el ejercicio 2 de esta forma. Ejercicio 3 ; Anlisis ; Datos de entrada: notaM notaf notaQ: numericos ; Datos de salida: numricos (define (promedio notaM notaF NotaQ) (/(+ notaM notaF NotaQ)3))

; Prueba" (promedio (nota_mat 3 5 2 3) (fisica 4 4 2 5) (quimica 3 5 1 2))

;******************* Otra forma de resolver el ejercicio es definiendo en variables el llamado de las funciones que calculan la nota en cada materia, y luego utilizar estas variable en el llamado de la funcin promedio.

(define m (nota_mat 3 5 2 3)) (define f (fisica 4 4 2 5)) (define q (quimica 3 5 1 2))

57

(promedio m f q)

Ejercicio 4 La caja de compensacin da un subsidio de vivienda a los empleados afiliados a ella. Teniendo en cuenta que si gana $500.000 o menos se le da un subsidio de $600.0000. Si gana ms de $500.000 y menos o igual a $1500.000 se le da un subsidio de $300.0000. Si gana ms de $1.500.000 se le da un subsidio de $1.000.000. Su salario esta dado dependiendo del nmero de horas que trabaja al mes Si trabaja 160 horas o menos se le paga a $3000 la hora Si trabaja ms de 160 horas se le paga a $2500 la hora Realizar un programa que permita calcular el valor del subsidio del trabajador, conociendo el nmero de horas trabajadas en el mes. Utilice funciones auxiliares (para calcular el salario)

; Propsito: calcular salario de un empleado ; Anlisis: dato entrada: h: number ; TDS: number

; Funcin (define(salario h)(cond ((<= h 160) (* h 3000)) ((> h 160) (* h 2500))))

58

; Prueba (salario 160) ;************************************************* ; Funcin principal ; Propsito: calcular el subsidio que da la caja de compensacin a un empleado ; Anlisis ; Dato entrada: horas: number ; TDS:number

;Funcin (define (subsidio horas)

(cond [(<= (salario horas) 500000)6000000] [(and(> (salario horas)500000) (<(salario horas)1500000))3000000] [(> (salario horas)1500000)1000000] (else "dato invalido")))

; Prueba (subsidio 170) (subsidio 600) ;*************************************************************** Resolviendo el mismo problema pero recibiendo el salario como dato de entrada, es decir se usa una funcin como dato de entrada

59

; Propsito: calcular subsidio de la caja, dado al empleado ; Anlisis ; Dato entrada: salario: number

; Funcin (define (subsidio2 salario) (cond [(<= salario 500000)6000000] [(and(> salario 500000) (< salario 1500000)) 3000000] [(> salario 1500000)1000000] (else "dato invalido")))

; Prueba (subsidio2 (salario 170))

Nota: El valor que se manda como dato de entrada a la funcin subsidio2 es el llamado de la funcin salario, El valor que retorne el llamado a salario, ser el que ingrese a la funcin salario2.

TALLER 5: FUNCIONES AUXILIARES 1. Reduccin:

a) explicar cmo es el proceso de reduccin y aplicar las funciones con los siguientes valores : x=3, x=8, s= 3 y=5 respectivamente (define (f x) (+ (g x) 9)) (define (g y) (sqrt (* y (* (+ 2 12) (/ (* (+ 3 5) (/ 30 10)) 2)))))
60

(define (misterio s y) (expt (misterio1 s) (misterio2 y))) (define (misterio1 x1) (*(+ x1 5) (expt (sqrt 9) 5))) (define (misterio2 x2) (+(/ x2 5) (* (/ 8 9) (+2 4)))) Utilizando funciones auxiliares desarrolle las siguientes funciones:

2. Desarrolla un programa que calcula el rea del cilindro. El programa recibe el radio del disco de la base del cilindro y su altura.

3 Hacer una funcin que diga a que signo zodiacal pertenece una persona, dado el mes y da de nacimiento. Tenga en cuenta: Aries: est comprendido entre el 21 de marzo al 19 de abril Tauro: est comprendido entre 20 de abril al 20 de mayo Gminis: est comprendido entre 21 de mayo al 21 de junio Cncer: est comprendido entre 22 de junio al 22 de julio Leo : est comprendido entre el 23 de julio al 22 de agosto Virgo: est comprendido entre el 23 de agosto al 22 de septiembre Libra: est comprendido entre 23 de septiembre al 22 de octubre Escorpin: est comprendido entre 23 de octubre al 21 de noviembre Sagitario: est comprendido entre 22 de noviembre al 21 de diciembre Capricornio: est comprendido entre 22 de diciembre al 20 de enero Acuario: est comprendido entre 21 de enero al 19 de febrero Piscis: est comprendido entre 20 de febrero al 20 de marzo

4. Hacer otra funcin que diga a que elemento pertenece un signo zodiacal, dado el da y mes de nacimiento. (utilizar la funcin anterior)
61

Tenga en cuenta: Los signos zodiacales Aries, Leo y Sagitario pertenecen al Elemento Fuego Los signos zodiacales Tauro, Virgo y Capricornio pertenecen al Elemento Tierra Los signos zodiacales Gminis, Libra y Acuario pertenecen al Elemento Aire:

62

6. RECURSIVIDAD La Recursin o Recursividad consiste en realizar una definicin de un concepto en trminos del propio concepto que se est definiendo.

Ejemplos Los nmeros naturales se pueden definir de la siguiente forma: 0 es un Nmero natural y el sucesor de un nmero natural es tambin un nmero natural. El factorial de un nmero natural n, es 1 si dicho nmero es 0, o n multiplicado por el factorial del nmero n-1, en caso contrario. La n-sima potencia de un nmero x, es 1 si n es igual a 0, o el producto de x por la potencia (n-1)-sima de x, cuando n es mayor que 0. En todos estos ejemplos se utiliza el concepto definido en la propia definicin. La Recursividad Es la forma en la cual se especifica un proceso basado en su propia definicin. Escritura de programas recursivos La recursin permite expresar un problema en trminos de s mismo. La especificacin de una funcin recursiva no es simple y podemos identificar dos partes en su formulacin, la primera es identificar los casos bsicos y la segunda definir el paso recursivo, los caso bsicos corresponden a los casos limite. La ejecucin de una funcin recursiva debe converger siempre a los casos bsicos especificados por la funcin.

Ejemplo Realizar una funcin que sume los n primeros nmeros. Sumar los n primeros nmeros es igual a la suma de los n-1 trminos ms n y as sucesivamente hasta llegar a 1.

; Propsito: sumar los n primeros nmeros


63

; Anlisis de datos ; Nombre de la funcin: suma ; Datos de entrada: n: number ; Tipo del dato de salida :number

; Cuerpo del programa (define (suma n) (cond [(> n 1) (+ n (suma (- n 1)))] [else 1]))

; Prueba (suma 5)

En una funcin recursiva en vez de llamar una funcin auxiliar diferente se llama a ella misma y este proceso se repita hasta que se cumpla una condicin de parada

Ejemplo Realizar una funcin recursiva que permita hallar la suma de la serie de los nmeros impares, desde 1 hasta n.

; Propsito: sumar los nmeros impares ; Anlisis de datos ; Nombre de la funcin :impares ; Datos de entrada: n: number
64

; Tipo del dato de salida: number

; Cuerpo de la funcin (define (impares n) (cond [(or (= n 1) (= n 0))1] ((= (remainder n 2) 0) (impares (- n 1 ))) (else (+ n (impares (- n 2)))) ))

;Prueba (impares 5); devuelve 9 (impares 10) ;devuelve 25

Internamente el programa har algo as, aunque nosotros solo vemos el resultado final. (Prueba paso a paso) (impares 5)
(impares 5) ( + 5 (impares 3))=(+ 5 4)=9 ( + 3 (impares 1))=(+ 3 1)=4 1 n 5 3 1

(impares 9)
(impares n) ( impares 9) ( + 9 (impares 7))=(+ 9 16)=25 (+ 7 (impares 5))= (+ 7 9)=16 (+ 5 (impares 3))=(+ 5 4)=9 (+ 3 (impares 1))=(+ 3 1)=4 1 n 10 9 7 5 3 1

65

Ejemplo Calcular el factorial de un nmero Sabemos que el factorial de un nmero son las multiplicaciones del nmero con todos los nmeros que hay por debajo del hasta llegar a 2. 5!=5*4*3*2 o sea que 5! = 5* !4 Y si nos damos cuenta 4!= 4* 3 * 2 Y 3!=3* 2 * 1 2!=2* 1 Entonces definamos la funcin factorial
= 3! = 2! = 4!

; Propsito: calcular el factorial de un numero ; Anlisis de datos ; Nombre de la funcin: factorial ; Datos de entrada: m:number ; Tipo de dato de salida: number

; Cuerpo de la funcin (define (factorial m) (cond ((> m 1) (* m (factorial (- m 1)))] [else 1]))

66

; Prueba (factorial 5) ;Retorna 120

La ejecucin del programa paso a paso es as:


(Factorial m) ( * 5 (factorial 4))=120 (* 4 (factorial 3))=24 (* 3 (factorial 2))=6 (* 2 (factorial 1))=2 1 m 5 4 3 2 1

EJERCICIOS RESUELTOS Ejercicio 1 Realizar una funcin que muestre los nmeros menores que n

; Propsito: Mostrar los nmeros menores que n ; Anlisis ; Nombre funcin: Menores ; Dato entrada: n: numrico ; Tipo dato de salida: numrico

; Cuerpo de la funcin (define(Menores n) (cond ((< n 1)"Dato Invalido") ((= n 2)1) (else(begin(display(- n 1))(Menores(- n 1))))))
67

; Prueba o llamado de la funcin (Menores 10)

Ejercicio 2 Realizar una funcin que calcule la suma de los n primeros nmeros pares

; Propsito: Hallar la suma de los n primeros nmeros pares. ; Dato de entrada: n: numrico. ; Tipo de dato de salida: Numrico

; Funcin: define (par n) (cond ((=(remainder n 2) 1) (par (- n 1))) ((or (= n 2) (= n 0)) n) (else (+ n (par (- n 2))))))

; Prueba (par 7) (par 10) ;

Ejercicio 3 Mostrar los mltiplo de 7 hasta un nmero dado.

68

; Propsito: Calcular los mltiplos desde 7 hasta un numero dado ; Anlisis: Datos de entrada: num, n: numrico ; Tipo de datos de salida: numrico

;Funcin: (define (multiplos num n) (cond [(> (* 7 num) 2000) "termin. "] [else (begin (display (* 7 num)) (display " ")(multiplos (+ num 1) n))]))

;******************** ; Propsito: llamar a la funcin mltiplos ; Anlisis: dato de entrada n:numerico ; Tipo de dato de salida: numrico

; Funcin (define (multiplosdeSiete n) (multiplos 1 n))

; Prueba (multiplosdeSiete 2000)

Ejercicio 4 Dado un nmero en decimal, obtener el equivalente binario.

69

; Propsito: Ver el equivalente en binario de un nmero n. ; Anlisis: Datos de Entrada: numrico ; Tipo de Dato de Salida: numrico

;Funcin

(define (binario x) (cond

[(= (quotient x 2) 0)(display (remainder x 2))] [else (begin (binario (quotient x 2))(display (remainder x 2)))]))

Calcula el cociente entre dos nmeros enteros

; Prueba (binario 20)

Ejercicio 5. Mostrar la serie matemtica de Fibbonaci

; Propsito: Mostrar la serie Fibbonaci. ; Anlisis: Datos de Entrada: numrico ; Tipo de Dato de Salida: numrico (define (fib N) (cond [(< N 2) 1] [else (+ (fib (- N 1))(fib (- N 2 )))]))

70

; Funcin principal (define (serie-fib N) (cond [(< N 0) " "] [else ( begin (serie-fib (- N 1))(display (fib N))(display " "))]))

; Prueba (serie-fib 5)

Ejercicio 6 Mostrar los nmeros pares de 2 hasta n, donde n debe ser par

; Propsito: mostrar los nmeros pares de 2 hasta n, n debe ser par ; Anlisis ; Nombre funcin: pares ; Dato entrada n:number ; Tipo de dato de salida: numrico ;Funcin (define (pares n) (if (=(remainder n 2)0) (cond ((= n 2) 2) (else (begin (display n) (display " ") (pares (- n 2))))) "el nmero debe ser par"))

71

; Prueba "los nmeros pares son : " (pares 10) (pares 11)

Ejercicio 7 Realizar una funcin que dado un trmino calcule el resultado de la sumas de los trminos de la serie de Fibonacci hasta ese nmero.

; Propsito: calcular el resultado de la suma de la serie de Fibonacci ; Anlisis ; Nombre funcin: Fibonacci ; Dato entrada:n: number ; Tipo dato de salida: number

;Cuerpo de la funcin (define(Fibonacci n) (cond ((= n 0)0) ((= n 1)1) (else(+(Fibonacci(- n 1))(Fibonacci(- n 2))))))

; Prueba o llamado de la funcin (Fibonacci 1) (Fibonacci 2)


72

(Fibonacci 3)

Ejercicio 8 Realizar una funcin que calcule la potencia de un nmero, dado la base y el exponente.

; Propsito: calcular la potencia de un nmero ; Anlisis: ; Nombre funcin: potencia ; Dato entrada: base exponente, number ; Tipo dato de salida: number

; Cuerpo de la funcin: (define (potencia base exponente) (cond ((= exponente 1)base) (else(* base(potencia base(- exponente 1))))))

;Prueba o llamado de la funcin (potencia 2 5)

73

TALLER 6: RECURSIVIDAD 1. Lea un nmero y determine si es primo o no; un nmero es primo si no es divisible por otro nmero diferente del mismo o la unidad. Por ejemplo el 7 aparte de el mismo y 1 no hay otro nmero que lo divida, por lo tanto es primo. 2. Realizar una funcin que muestre los nmeros cuadrados desde n hasta 1. 3. Realizar una funcin que calcule el cociente de la divisin entre dos nmeros por medio del mtodo se restas sucesivas. (investigar)

74

7. ESTRUCTURAS

Las estructuras son tipos de datos compuestos es decir cuando pensamos en un dato de tipo estructura pensamos en un dato que a su vez tiene otra informacin como por ejemplo. Estudiante con los campos o informacin nombre, cedula, cdigo, curso, edad. Empleado con los campos de informacin Salario, nombre, edad, sexo. Animales con los campos de informacin Especie, Numero de patas. Fruta con los campos color, sabor Pelcula con los campos Gnero, ao, director. CD Con los campos nombre, nmero de canciones precio Amigos con los campos Nombre, telfono, edad, fecha de cumpleaos

Definicin de una estructura Como la estructura es un nuevo tipo de datos que entonces tenemos que especificar cmo va a estar conformado, cules y de qu tipo van a ser sus campos. Es el programador el que determina como va a estar formada cierta estructura, es decir que campos va a contener la estructura y de qu tipo van a hacer sus campos.

La definicin de una estructura se hace de la siguiente forma:


Nombres que van a tener los campos de la estructura

Nombre que se va a dar a el nuevo tipo de datos estructura

(define-struct nombreEstructura (nombrecampo1 nombrecampo2 nombrecampo3 nombrecampoN))

75

Creacin de la Estructura particular Para dar valores a la variable del nuevo tipo de datos hay una sentencia que permite hacer esto

Es la sentencia make y se usa as:


Valores de los campos de la estructura particular.

(make-nombreEstructura valorcampo 1 valorcampo2 valorcampo3 valorcampoN)

Selectores

Son las operaciones que nos van a permitir acceder a los elementos de una estructura

(NombreEstructura-nombreCampo (EstructuraParticular))

Ejemplo Manejemos una estructura CD donde nos interesa el nombre, nmero de canciones, autor y precio. Como vemos la estructura va a estar formado por los campos nombre, autor que son de tipo string y los campos nmero de canciones y precio que son de tipo numrico. Definamos la estructura (define-struct CD (nombreCD autor Ncanciones precio))

La anterior es la definicin del nuevo tipo de datos como tal.

76

Ahora pensemos en algunos ejemplos de estructuras CD es decir algunas estructuras en particular.

(make-CD Donde Jugaran los Nios Mana 10 50000)

Ejemplo Una estructura Fruta

; Definicin de la estructura Fruta (define-struct Fruta (nombre color sabor))

; Definicin de algunas frutas particulares (make-fruta Manzana roja acida) (make-fruta Limon verde acido) (make-fruta Mango amarillo dulce)

Para definir la estructuras particulares es conveniente guardar estos valores en variables, para que cuando hagamos referencia a cierta fruta o estructura particular no tengamos que escribir toda la definicin sino solamente el nombre de la variable donde fue almacenada. Como se muestra a continuacin:

(define M (make-fruta Manzana roja acida))


Nombre de la variable que va a almacenar esta fruta particular

77

(define L (make-fruta Limon verde acido)) (define mango (make-fruta mango amarillo dulce))

Nota: importante: tenga en cuenta la diferencia entre mango y mango, el primero es el nombre de la variable, y el segundo, que aparece entre doble comillas es el valor que se le ha dado al campo nombre de la estructura particular mango.

Aplicacin de los selectores (Fruta-nombre M); retorna manzana (Fruta-color M); retorna roja (Fruta-sabor M); retorna acido

Ejercicio: aplique los selectores a las frutas L y mango

Operador ? Podemos comparar si una variable es de determinado tipo de estructura, colocando el signo ? a la estructura base seguido de la variable, como se observa a continuacin:

(Fruta? M) ; pregunta si M es de tipo Fruta en este caso devuelve true

(CD? L) ; Pregunta si L es de tipo CD, como es falso la expresin devuelve false

EJERCICIOS RESUELTOS Ejercicio 1 Definir una estructura helado con los campos: sabor, cantidad y precio.
78

(define-struct helados (sabor cantidad precio))

Creacin de estructuras particulares (make-nombreestructura valorcampo1 valorcampo2...)

Ejercicio 2 Crear tres estructuras particulares de helados

(define Hela1 (make-helados 'lulo "4 litros" 650)) (define Hela2 (make-helados 'fresa "3.5 litros" 650)) (define Hela3 (make-helados "frutos del bosque" "4.5 litros" 600 ))

Ejercicio 3 Definir una estructura de marcas de partes de una skateboard con los campos: ruedas, rodamientos, trucks y madero. Y definir 4 estructuras particulares

; Definicin de estructuras. (define-struct skateboard (ruedas rodamientos trucks madero))

;Creacin de estructuras particulares (define board1 (make-skateboard 'spitfire 'ruch 'venture 'blind)) (define board2 (make-skateboard 'crudas 'monkey 'phanton 'gril)) (define board3 (make-skateboard 'element 'fkd 'thunder 'fundation)) (define board4 (make-skateboard 'bones 'lucky 'industrial 'almost))
79

Ejercicio 4 Aplique cada uno de selectores para obtener un campo distinto de cada estructura particular de los ejercicios 2 y 3.

(helados-sabor Hela1) (helados-cantidad Hela2) (helados-precio Hela3)

(skateboard-madero board1) (skateboard-rodamientos board2) (skateboard-trucks board3) (skateboard-ruedas board4)

TALLER 7: ESTRUCTURAS

1. Defina las siguientes estructuras: a) Empleado con los campos nombre salario cargo b) Estudiante con los campos nombre cdigo curso c) Pases con los campos capital extensin poblacin d) Animal con los campos nombre especie nmero de patas

2. Defina tres estructuras particulares de cada uno 4. Aplique cada uno de los selectores a las estructuras particulares del punto 2.

80

8. FUNCIONES CON ESTRUCTURAS Cuando se realizan funciones que manejan estructuras de debe hacer un nuevo paso que es el anlisis y definicin de datos, donde ira la definicin de la estructura. Si no se define la estructura, cuando la utilicemos nos mostrar un error ya que ser un tipo de datos desconocido para el programa. Tambin se debe documentar cada campo de que tipo va ser.

Tambin si se quiere se pueden crear algunas estructuras particulares, para utilizarlas en la prueba, pero la prueba se puede realizar con cualquier valor.

Veamos algunos ejemplos con estructuras: Ejemplo Hacer una funcin para calcular el promedio de un estudiante, donde un estudiante tiene los campos nombre, nota 1, nota 2 y nota 3.

; Anlisis y definicin de datos (define-struct Estudiante (nombre nota1 nota2 nota3)) ; Nombre es de tipo string, nota1, nota2 y nota3 son de tipo number

; Definicin de las estructuras particulares (define estudiante1 (make-Estudiante Juan Lopez 5 4 3)) (define estudiante2 (make-Estudiante Carlos gomez 5 3 2)) (define estudiante3 (make-Estudiante Luis salazar 2.4 3))

; Propsito calcular el promedio de un estudiante

; Nombre de la funcin: promedio


81

; Dato de entrada: E: Estudiante ; Tipo datos de salida: number

Este es el nombre con el que se defini la estructura. La funcin recibe un dato de tipo Estudiante

; Cuerpo de la funcin define (promedio E) (/ (+ (Estudiante-nota1 E) (Estudiante-nota2 E) (Estudiantes-nota3 E)) 3))

; Prueba (promedio estudiante1) (promedio estudiante2)

Ejemplo Desarrollar una funcin que calcule el rea de una estructura crculo o rectngulo.

; Propsito: calcular el rea de una estructura crculo o rectngulo. ; Anlisis y definicin de datos (define-struct circulo (radio)) ; Circulo es una estructura donde su campo radio es de tipo number

(define-struct rectangulo (ancho largo)) ; rectngulo es una estructura donde sus campos ancho y largo son de tipo number

;Definicin de estructuras particulares (define circulito (make-circulo 2))


82

(define rectangulo1 (make-rectangulo 4 5))

; Propsito: Calcular el rea de una figura geomtrica ; Anlisis ; Nombre de la funcin: rea ; Datos de entrada: figurita: rectanguolo o circulo ; Tipo de datos de salida: number

; Cuerpo de la funcin (define (area figurita) (cond [(rectangulo? figurita) (* (rectangulo-ancho figurita)(rectangulo-largo figurita))] [(circulo? figurita) (* (circulo-radio figurita)3.14)]))

;Prueba (area rectangulo1) ;retorna 20 (area circulito) ;retorna 6.28

Ejemplo Hacer una funcin que reciba una estructura libro y retorne el mismo libro pero con el precio incrementado en 15% si la editorial es oveja Negra, en un 10% si la editorial es Planeta de lo contrario no incremente el precio del libro.

; Definicin de datos (define-struct Libro (nombre autor editorial precio))

83

;Libro es una estructura donde los campos nombre, autor , editorial son de tipo string y precio es de tipo number.

; Definicin de estructuras particulares (define libro1 (make-libro 100 aos de soledad Gabriel Garcia Marquez Oveja Negra 70000))

(define libro2 (make -libro Mientras llueve Fernando Soto Aparicio Planeta 60000))

; Propsito: incrementar el precio de un libro ; Nombre de la funcin: Incrementar ; Dato de entrada L: Libro ; Tipo de datos de salida: Libro
Observe que el dato de entrada y salida es el mismo tipo o sea un libro.

; Cuerpo del programa (define (Incrementa L) (cond [(string=? Oveja Negra (Libro-editorial L)) (make-libro (libro-nombre L) (Libroautor L) (Libro-editorial L) (+ (Libro-precio L) (* (Libro-precio L) 0.15)))] [(string=? Planeta (libro-editorial L)) (make- libro (Libro-nombre L) (Libro-autor L) (Libro-editorial L) (+ (Libro-precio L) (* (Libro-precio L) 0.10)))]] [else L]))
Como se modific un valor de un campo de la estructura entonces la estructura se debe volver a construir.

La prueba paso a paso se vera as:

84

(make-libro 100 aos de soledad Gabriel Garca Mrquez Oveja Negra (+ 70000 (* 70000 0.15)))

;Quedando finalmente (make-libro 100 aos de soledad Gabriel Garca Mrquez Oveja Negra 80500)

Ejemplo Desarrolle Un programa que a partir de dos artculos diferentes determine el nombre del almacn que ms ventas al ao ha tenido. Cada artculo tiene la siguiente informacin: nombre del artculo, nombre del almacn donde se vende el artculo, costo de produccin unitario, valor venta unitario, nmero de ventas al ao.

; Definicin de datos (define-struct Articulo (nombreArticulo VVUnitario NVA Nalmacen CostoProduccion)) ;Articulo es una estructura donde nombreArticulo Nalmacen son string y CostoProduccion y NVA son de tipo numrico

; Definicin de estructuras particulares (define articulo1 (make-Articulo Lavadora 60000 100 Exito 50000)) (define articulo2 (make-Articulo TV 550000 200 Carrefour 400000))

Las estructuras particulares se definen para probar o ejecutar la funcin, pero es opcional el definirlas.

85

; Propsito determinar el nombre del almacn con el artculo que ms ventas al ao ha tenido ; Nombre de la funcin: Ventas ; Datos entrada: A1: Articulo, A2:Articulo ; Tipo de dato de salida: Articulo

; Cuerpo del programa (define (Ventas A1 A2) (cond [(> (Articulo-NVA A1) (Articulo-NVA A2)) (Articulo-Nalmacen A1)] [(= (Articulo-NVA A1) (Articulo-NVA A2)) Tienen igual nmero de ventas] [else (Articulo-Nalmacen A2)])

; Prueba (Ventas articulo1 articulo2) ; Devuelve Carrefour

EJERCICIOS RESUELTOS Ejercicio 1 Se tiene una estructura que contiene el marcador de un partido de futbol, realizar una funcin determine quin gano el partido o si hubo empate

; Propsito: realizar una funcin que de los resultados de un partido ; Definicin de la estructura (define-struct partido (nombre1 goles1 nombre2 goles2)); nombre1 y nombre2 son string; goles1 y goles2 son number.

86

; Definicin de estructuras particulares (define partidof1 (make-partido 'porto 2 'chelsea 3)) (define partidof2 (make-partido 'milan 2 'manchester 1)) (define partidof3 (make-partido 'manchester 1 'chelsea 1))

; Anlisis: ; Nombre de la funcin: resultado ; Datos de entrada: e1: estructura partido ; Tipo de Datos de salida: symbol

; Cuerpo de la funcin (define (resultado e1 ) (cond [(> (partido-goles1 e1) (partido-goles2 e1)) (partido-nombre1 e1)] [(< (partido-goles1 e1) (partido-goles2 e1)) (partido-nombre2 e1)] [else 'empate]))

; Prueba: (resultado partidof1 ) (resultado partidof2 ) (resultado partidof3 )

87

Ejercicio 2 En una clnica donde se ofrecen varios servicios se requiere un programa para saber si el paciente tiene saldo pendiente o no con ellos. Se debe manejar una estructura con los campos: nombre, tipo de servicio , valor consulta y saldo

; Propsito: realizar una funcin que determine si un cliente debe o no. ; Anlisis: ; Nombre de la funcin: deuda ; D.E: deudor (estructura) ; Tipo de Datos de salida: string

; Definicin de la estructura (define-struct cliente ( nombre T_S V_C saldo))

; Definicin de estructuras particulares: (define clien1 (make-cliente "Max Bernal" 'ficioterapia 40000 35000)) (define clien2 (make-cliente "Juana Perez" 'optometria 56000 0)) (define clien3 (make-cliente "tomas suarez" 'optometria 56000 -5000))

; Funcin (define (deuda deudor) (cond [(> (cliente-saldo deudor)0) (begin (display(cliente-nombre deudor))(display " ") "Tiene saldo pendiente")] [(= (cliente-saldo deudor)0)(begin (display(cliente-nombre deudor))(display " ") "NO Tiene saldo pendiente")]
88

[else "tiene saldo a favor" ]))

; Prueba (deuda clien1) (deuda clien2) (deuda clien3)

Ejercicio 3 Se necesita un programa que calcule la nota final del curso de fundamentos de programacin. Se tiene una estructura para almacenar cada nota, y se sabe que talleres y quices tienen un valor del 30%, el primer parcial un valor del 30% y el parcial final 40%.

; Propsito: Calcular la nota final del curso de fundamentos de programacin ; Anlisis: ; Nombre de la funcin: nota_final ; D.E: nota_final: estructura notas ; Tipo de Datos de salida: number

; Definicin de la estructura (define-struct notas( T_Q Parcial1 Parcial2 ))

; Definicin de la estructura particular (define mis_notas (make-notas 4.5 5 2))

89

; Funcin (define (nota_final estru) (+(*(notas-T_Q estru)0.3)(*(notas-Parcial1 estru)0.3)(*(notas-Parcial2 estru)0.4)))

; Prueba (nota_final mis_notas)

TALLER 8: FUNCIONES CON ESTRUCTURAS 1 A partir de dos fechas, cada fecha tiene como informacin: el da, mes y ao, hacer: a) Un programa que determine si la primera fecha es anterior a la segunda. b) Un programa que determine cuantos aos hay entre las dos fechas

2. A partir de dos estructuras estudiante con campos nombre, curso, nota1, nota2, nota3. Crear un programa que devuelva el nombre del estudiante con promedio mayor. (Utilice funciones auxiliares)

3. Desarrolle a partir de dos estructuras punto (cada uno con sus coordenadas x y) a) Un programa que determine si los puntos son diferentes. b) Un programa que determine si estn ubicados horizontalmente. c) Un programa que determine si estn ubicados verticalmente d) Un programa que retorne la distancia entre los dos puntos. e) Un programa que retorne el punto ms cercano al origen.

5. Desarrolle una funcin llamada TiempoSegundos, (con los campos horas minutos segundos) la cual recibe una estructura tiempo y genera el nmero total
90

de segundos. Por ejemplo: si la funcin recibe como dato de entrada la estructura (make-tiempo 10 10 2) el programa devuelve 36602. 6. Defina una estructura de datos que represente un numero fraccionario (que tiene numerador y denominador) y realice una funcin que mltiple dos nmeros fraccionarios. 7. A partir de una estructura para los datos de estudiante, estos datos son nombre, nota1, nota2, nota3 donde notas son parciales para el estudiante y tienen el mismo valor, desarroll una funcin, que retorne la informacin de si el estudiante aprob o no la materia. 7. Desarrolle a partir de dos artculos diferentes, donde cada artculo tiene la siguiente informacin: nombre del artculo, nombre del almacn, costo de produccin unitario, valor venta unitario, nmero de ventas al ao: a) Un programa que determine si todos los artculos se venden en el mismo almacn. b) Un programa que retorne el artculo que ms ganancia ha dejado en el ao. c) Un programa que retorne el nombre del almacn que menos ventas en total ha tenido d) Un programa que retorne el valor de venta unitario del artculo que menos se ha vendido en el ao e) Un programa que retorne el promedio total de las ganancias dejadas en el ao por los tres .artculos Aclaracin: En un mismo almacn se puede vender ms de un artculo.

91

9. LISTAS SIMPLES Una lista es una secuencia o coleccin de elementos de igual o diferente tipo, o sea es otro tipo de datos compuesto.

Ejemplos lista de artculos: jabon, desinfectante, papa Lista de Universidades: Univalle, Santiago Javerina Lista de amigos: Juan Pedro Pablo Lista de ciudades: Cali Bogota Medellin Lista de centros comerciales: Exito Carrefour chipichape Lista de gastos: 5000 20000 50000 68000 Lista de utilesEscolares: lapiz Borrador Cuaderno

Toda lista con al menos un elemento est conformada por el primer elemento y el resto de la lista.

El resto de la lista son todos los elementos de la lista sin el primer elemento Para obtener el primer elemento de la lista utilizamos el operador first Y para obtener el resto de la lista usamos el operador rest Una lista vaca se representa con la palabra empty

Para escribir una lista en Scheme se usa la palabra list seguida por los elementos de la lista por ejemplo definamos la Lista de centros comerciales Exito Carrefour Chipichape

(list Carrefour Exito Chipichape)

92

Tambin podemos guardar esta lista en una variable (define CentrosComerciales (list Carrefour Exito Chipichape))
Variable en la que se guarda la lista

Operadores de listas Operador first Funcin Obtiene el primer elemento de una lista Obtiene el resto de una lista Permite concatenar dos listas Obtiene la lista al reves Agrega un elemento a una lista ejemplo (first (list Juan Pedro Pablo)) ;retorna Juan (rest (list Juan Pedro Pablo)) ;retorna (list Pedro Pablo) (append (list 5 7 8) (list 10 11)) ; devuelve (list 5 7 8 10 11)

rest

append

reverse

(reverse (list 5 7 8); devuelve (list 8 7 5) (cons 2 (list 5 7 8) ) ;devuelve (list 2 5 7 8) observe que el elemento que se agrega siempre queda de primero.

cons

Ejemplo1 (first (list 1 3 5 6 7)) es igual a 1 (rest (list 1 3 5 6 7)) es igual a (list 3 5 6 7)

Ejemplo 2 Definicin de una lista de lista de ciudades (define ciudades (list "Cali" "Bogota" "Medellin" "Manizales"))

93

(first ciudades) es igual a Cali (first (first ciudades)) es incorrecto (first ciudades) es un elemento "Cali" y sobre un elemento no se puede aplicar el operador first ni el operador rest. (rest ciudades) es igual a (list "Bogota" "Medellin" "Manizales") (first (rest (rest ciudades))) es igual a Medellim (rest (rest(rest ciudades))) es igual a empty (rest(rest (rest(rest ciudades)))) es incorrecto cuando la lista es empty ya no se pueden aplicar mas operaciones

Ejemplo 3 (define amigos(list "juan" "pedro" "laura" "raul")) (first (rest(rest amigos))) es igual a Laura (rest(rest(rest(rest amigos)))) es igual a empty (rest(first amigos)) error no se puede aplicar rest a un elemento (append amigos ciudades) es igual a (list "Cali" "Bogota" "Medellin" "Manizales" "juan" "pedro" "laura" "raul") (reverse (list 10 23 34)) es igual a (list 34 23 10) (cons 56(list 10 23 34)) es igual a (list 56 10 23 34) (reverse(append (list 12 13 14) (list 2 3) (list 3 7))) es igual a (list 7 3 3 2 14 13 12) (cons 4(cons 5(list 2 3 6))) es igual (list 4 5 2 3 6)

Problemas que manejan Listas

Este tipo de funciones son recursivas y por lo general tienen como condicin de parada que la lista sea vaca.
94

En cuanto a la documentacin tambin se debe hacer un anlisis y definicin de datos para la lista.

EJERCICIOS RESUELTOS Ejercicio 1 Realizar una funcin que calcule el nmero de elementos de una lista

; Anlisis y definicin de datos ListaUtiles es una lista de tiles escolares donde tiles escolares es de tipo symbol

; Definicin de una lista particular (define listaUtiles (list sacapuntas Borrador Maletin ))

; Propsito: funcin que determine el nmero de elementos de una lista ; Nombre de la funcin: longitud , Dato entrada:lista de tipo listaUtiles ; Tipo dato de salida: number

; Cuerpo de la funcin (define (longitud lista)) (cond [(empty? lista) 0] [else (+1 (longitud (rest lista)))]))

95

Ejercicio 2 Hacer una funcin para sumar los elementos de una lista

; Anlisis y definicin datos ;listanumeros es una lista de nmeros ; Propsito: Sumar los elementos de una lista ; Nombre de la funcin :sumaElementos ; Dato de entrada:L: ListaNumeros ; Tipo de dato de salida: number

; Cuerpo de la funcin (define (sumaElementos L) (cond [(empty? L) 0] [else (+ (first L) (sumaElementos (rest L)))]))

; Prueba (sumaElementos (list 10 12 5 )) ; devuelve 27

Ejercicio 3 Hacer una funcin que incremente en 100 los elementos de una lista de nmeros.

; Anlisis y definicin de datos ; Propsito: incrementar en 100 cada elemento de una lista de nmeros. ; ListaNumeros es una lista de nmeros
96

; Nombre de la funcin: incremento ; Dato entrada:P:ListaNumeros ; Tipo dato salida: ListaNumeros

; Cuerpo del programa (define (incremento P ) (cond [(empty? P) emprty] [else (cons (+ 100 (first P)) (incremento (rest P)))] ))

; Prueba (incremento (list 10 30 50)) ;Devuelve (list 110 130 150)

Ejercicio 4 ; Proposito: funcin que busca un elemento de tipo symbol en una lista de smbolos ; Analisis:D.E:L:Lista de simbolos, e:symbol ;T.D.S:boolean

; Funcin (define (buscar L e) (cond ((empty? L) false) ((symbol=? (first L) e) true) (else (buscar (rest L) e))))

97

; Prueba (buscar (list 'Juan 'Pedro 'Luis) 'Miguel) (buscar (list 'Juan 'Pedro 'Luis) 'Luis) (buscar empty 'Luis)

Ejercicio 5 Hacer una funcin que invierta una lista, sin usar el operador reverse

; Propsito: invertir una lista ; Anlisis: ; Dato de entrada: T: lista de nmeros ; T. D.S: lista de nmeros

; Definicin de una lista particular (define lista1 (cons 2 (cons 5 (cons 7 empty))))

; Funcin (define (invertir T) (cond [(empty? T) empty] [else (append (invertir (rest T)) (cons (first T)empty) )]))

; Prueba (invertir lista1)

98

TALLER 9: LISTAS SIMPLES

1. Desarrollar una funcin que tome una lista de nombres de animales de un zoolgico y un nombre de animal y determine s este animal se encuentra en el zoolgico. 2. Realizar una funcin que multiplique los elementos de una lista. 3. Implementar una funcin que determine el reverso de una la lista. 4. Desarrollar una funcin que toma una lista de nmeros y calcula el promedio (use como funcione auxiliare las funciones para sumar los elementos de la lista y la funcin para contar los elementos de la lista, que se desarrollaron antes en el captulo.)

5. Crear una funcin que determine si dos listas son iguales. 6. Desarrollar una funcin llamada buscar que determine si un numero est en una lista de nmeros.

7 Desarrollar una funcin que tome un smbolo y una lista de smbolos y determine cuantas veces aparece el smbolo en la lista.

8 Realizar una funcin que toma un elemento y una lista de nmeros y retorna la lista sin el elemento.

9 Realizar una funcin que toma una lista de nmeros y dos nmeros (nuevo y viejo) y genera otra lista donde las apariciones del viejo son reemplazadas por las del nuevo.

10. Realizar una funcin que encuentre todos los divisores de un nmero y los retorne en una lista.
99

10. LISTAS DE ESTRUCTURAS Una de las aplicaciones de lista ms comunes es la de permitir el almacenamiento de datos para luego consultarlos. Dicha informacin podra representar por ejemplo informacin de una empresa sobre su personal, sueldo, periodo de vacaciones.

Entonces las lista van a estar formadas por estructuras, pero primero se debe definir la estructura para luego si definir la lista que va a estar formada por esas estructuras.

Ejemplo Hacer una funcin que busque un empleado dentro de una empresa y retorne true (verdadero) si el empleado se encuentra en la empresa y false en caso contrario.

; Definicin de la estructura (define-.struct empleado (nombre cedula salario)) ; empledo es una estructura donde nombre es de tipo string, cedula y salario de tipo number.

; Estructuras particulares (define empleado1 (make-Empleado Juan Perez 578910 800 000)) (define empleado2 (make-Empleado Maria Gomez 754328 900 000)) (define empleado3 (make-Empleado Carlos Salazar 54321 700 000))

;definicin de una lista Particular (define empresa1 (list empleado1 empleado2 empleado3 ))
100

; Propsito: Buscar un empleado en una empresa, por medio del nombre.

; Nombre de la funcin: buscar ; Datos de entrada: n de tipo string y E de tipo Empleado

Compara s i n y el nombre del primer elemento de la lista son iguales. Como el primer elemento de la lista es una estructura se debe

; Cuerpo del programa (define (buscar n E) (cond [(empty E) false)] [(string=? N (Empleado-nombre (first E))) true ] [else (buscar n (rest E))]))

; Prueba (buscar Carlos Salazar empresa1) ;devuelve true

Ejemplo Crear una funcin llamada ElevarPrecios que tome una lista de artculos (el articulo tiene los campos nombre del artculo, precio y cdigo del producto) y produzca la lista con todos los precios de los artculos incrementados en un 5%.

; Propsito: incrementar los precios de una lista

; Definicin de datos
101

(define-struct articulo (nombre precio cdigo))

; Definicin de datos particulares (define L1 (list (make-articulo "medias" 3500 34) (make-articulo "zapatos" 65000 23))) Cuando algn campo de la estructura de la lista
cambia se debe volver a construir la lista insertando de nuevo cada elemento, y cada elemento a su vez se crea con el operador make.

; Anlisis

; Datos de entrada: L: lista de artculos ; T.D.S: lista de artculos

; Cuerpo de la funcin (define (incrementar L) (cond [(empty? L) empty] [else (cons (make-articulo (articulo-nombre (first L)) (* (articulo-precio (first L)) 1.05) (articulo-codigo (first L))) (incrementar (rest L)))]))

; Prueba (incrementar L1)

EJERCICIOS RESUELTOS Ejercicio 1 Se tiene una lista de estudiantes, donde cada estudiante tiene los campos nombre, cdigo y direccin. Realizar una funcin que dado el cdigo de un estudiante diga si est matriculado.

102

; Propsito: Funcin que dado el cdigo de un estudiante determina si est matriculado ; Definicin de la estructura (define-struct estudiante(nombre codigo direccion)); nombre y direccion son string y codigo number

; Definicin lista particular (define univalle(list(make-estudiante "Yeferson" 201203 "calle 13") (make-estudiante "Yorleidi" 201205 "calle 4") (make-estudiante "Gustavo" 201206 "k 93")))

; Anlisis ; Nombre funcin: buscar ; D.E: cod: number L:lista de estudiantes ;T.D: string

; Funcin (define (buscar L cod) (cond [(empty? L)"no se encuentra matriculado"] [(= cod (estudiante-codigo(first L)))"si se encuentra matriculado"] [else (buscar (rest L) cod)]))

; Prueba (buscar univalle 201205)


103

TALLER 10: LISTAS DE ESTRUCTURAS 1. Desarrollar una lista de artculos donde la estructura artculo tenga los campos nombre del artculo, cdigo y precio. Y realizar las siguientes funciones: a) Una funcin que determine el nombre del artculo a partir del precio y el almacn (la lista de artculos). b) Una funcin que determine el precio del artculo a partir del nombre y el almacn (la lista de artculos).

2. Dada una lista de estudiantes de la universidad con los campos nombre, cdigo y curso, realizar una funcin que dado un cdigo determine si el estudiante se encuentra matriculado en la universidad. 3. Dada un directorio telefnico de amigos donde cada amigo tiene nombre, direccin y telfono, crear una funcin que dado el nombre devuelva el nmero telefnico del amigo. 4. Implementar un diccionario, donde dada una palabra la funcin devuelva el significado de la palabra. 5 Un curso tiene como informacin: el nombre de la asignatura, grupo, crditos, saln, profesor, hora de inicio, hora finalizacin. Adems, debe considerar que una escuela, por ejemplo, la escuela de ingeniera de sistemas es la encargada de ofrecer determinados cursos dentro de la universidad. a) Desarrolle un programa que a partir de una escuela, determine cul es el total de crditos que ofrece. b). Desarrollar un programa que a partir de una escuela, y del nombre de una asignatura, determine cuantos cursos diferentes ofrece la escuela de esa asignatura. c) Desarrollar un programa que a partir de una escuela y del nombre de un profesor, retorne la informacin de los cursos que el ensea.

104

11. MEMORIA Y SECUENCIACION

En Scheme se puede establecer varias instrucciones dentro de una misma funcin (secuenciacin) utilizando la sentencia begin de la siguiente forma:

(begin (expresin1) (expresion2) (expresion3) (expresin) (expresin N + 1))

Todas las expresiones se evalan desde la primera hasta la N luego se evala la expresin N + 1 y su valor es devuelto por toda la expresin begin N

La memoria en Scheme se usa en programas que requieren tener en cuenta ejecuciones pasadas. Para manejo de memoria se utiliza la instruccin set! que permite modificar una variable definida antes, si la variable no se ha definido antes no se puede modificar.

Recordemos que una variable se define as: (define nombreVariable expresion)

Para modificar el valor de variable lo hacemos as: (set! nombreVariable expresin)

105

Ejemplo 1 (define x 10) ; x se define con valor 10 (set! x (+ x 12)) ;x toma el valor de 22 (set! x (* x 2)) ; x queda valiendo 44 X ; se imprime 44

Nota: para ver el valor de la variable es necesario imprimirla, pues el set! la modifica pero no la muestra

Diferencia entre insertar elementos en una lista sin y con memoria"

(define l1 (list 2 3 4 ))

Sin memoria (cons 5 l1) (cons 6 l1) Si se imprime l1 aparece con su valor original que es (list 2 3 4)

Ahora veamos con memoria (set! l1 (cons 5 l1)) Al insertar 5 queda (list 5 2 3 4)

Ejemplo 2 Trabajando con funciones

106

En una funcin sin memoria (define (agregarlista L e) (cons e L)) Al llamar la funcin primera vez, la funcin retorna la lista" (list 6 5 2 3 4) (agregarlista l1 6)

Pero si se imprime la variable ya no recuerda lo que se le inserto. l1 ; muestra (list 5 2 3 4)

Si vuelve y se llama a la funcin, para inseratar 7 (agregarlista l1 7)

Pero si se imprime la lista fuera de la funcin vemos que sigue estando como se defini l1 (list 5 2 3 4)

Ahora con memoria (define (agregarlistaconmemoria L e) (set! l1 (cons e L)))

(agregarlistaconmemoria l1 6) l1

Y si ahora se inserta el 7 (agregarlistaconmemoria l1 7)


107

Al imprimirse la lista conserva memoria es decir aparecen todos los elementos insertados l1

Lo mismo funciona con funciones de listas de estructuras

(define-struct amigo (nombre telefono)) (define directorio empty) (set! directorio ( cons (make-amigo "pedro" 3164018769) directorio)) "el directorio queda" directorio

(set! directorio (cons (make-amigo "pilar" 3012576845) directorio)) "el directorio con dos elementos queda" directorio

Ahora hagamos una funcin que se encargue de agregar los nombre y telfonos de nuestro amigos al directorio del celular

(define (agregarDirectorio nom tel) (set! directorio (cons (make-amigo nom tel) directorio)))

"llamemos la funcin" (agregarDirectorio "juanca" 301234566) directorio


108

Uso de la memoria para pedir datos al usuario Con la instruccin (set! nombreVariable (read) ) le asignamos un valor a la variable que es digitado por el usuario. Ejemplo 2 Calcular el rea de un tringulo, y la base y la altura son ledos del teclado.

; Definicin de variable para manejo de memoria (define base 0) (define altura 0)

; Propsito: calcular el rea de un triangulo ; Anlisis ; Datos de entrada; B: number, A:number ; TDS: number

; Funcin (define (AreaTriangulo B A) (/(* B A)2)) ;******************************************************** ; Propsito: leer los datos y llamar a la funcin AreaTraingulo ; Anlisis: ; Datos entrada: void ( define (lectura) (begin( display "Digite valor para la base...>") (set! base (read) ) ( display "Digite valor para la altura..>")
109

(set! altura (read) ) ( if ( and ( not(= base 0 )) ( not(= altura 0 ) )) (begin(display "el resultado es ") (AreaTriangulo base altura)) (display "Error en la entrada de datos ") )))

; Prueba (lectura)

EJERCICIOS RESUELTOS Ejercicio 1 Desarrollar funciones para manejar la informacin de los estudiantes de la universidad, las funciones deben permitir: a) Agregar estudiantes b) Consultar por el cdigo todos los datos de un estudiante (No usa memoria) c) Borrar estudiantes, dado el cdigo.

a) ; Propsito: agregar estudiantes ; Anlisis ; Nombre funcin: agregar ; Dato entrada: est: string, cod:number, cur: number ; T.D.S: lista de estudiantes

; Definicin de la estructura
110

(define-struct estudiantes(nombre codigo curso))

; Definicin de la variable que maneja memoria (define universidad empty)

; Funcin (define(agregar est cod cur) (begin(set! universidad(cons(make-estudiantes est cod cur)universidad))universidad))

; Prueba (agregar "Alexis" 1261736 2702) (agregar "Jesenia" 1261748 2702)

b) ; Propsito: buscar por el cdigo y devolver el nombre y el curso ; Anlisis ; Nombre funcin: consultar ; Dato entrada: l: lista y codi: number ; T.D.S: string

; Cuerpo de la funcin (define (consultar l codi) (cond [(empty? l)"no esta inscrito"]
111

[(= codi (estudiantes-codigo(first l))) (begin(display(estudiantes-nombre (first l)))(display " ")(display(estudiantes-curso (first l))))) [else (consultar (rest l) codi)]))

; Prueba (consultar universidad 1261736) (consultar universidad 126174)

c) ; Propsito: borrar un estudiante de la lista ; Anlisis ; Nombre funcin: eliminar ; Dato de entrada: nomb: string y L:lista ; T.D.S: lista (define (eliminar nomb L) (cond [(empty? L) "no existe"] [(string=? nomb (estudiantes-nombre (first L))) (begin (set! universidad (rest L))universidad)] [else(begin(set! universidad (cons(first L)(eliminar nomb (rest L))))universidad)]))

; Prueba (eliminar "Alexis" universidad)

112

Ejercicio 2 Hacer una funcin para determinar el nmero menor de una lista de nmeros

; Propsito funcin para determinar el menor de una lista de nmeros ; Anlisis: nombre funcin: Menorlista ; Dato entrada:L: lista numeros, M: number

; Definicin de la variable para manejo de memoria (define M 0)

; Definicin de una lista particular, para ser usada en la prueba (define l1 (list 5 10 2 4 2))

;Cuerpo de la funcin (define (Menorlista L m) (cond [(empty? L ) m] [(< m (first L)) (Menorlista (rest L) m)] [(> m (first L)) (Menorlista (rest L) (first L))] [(= m (first L)) (Menorlista (rest L) m)])) ;*********************************************

; Propsito: obtener el menor de la lista usando a la funcin anterior ; Anlisis: nombre funcin: primero ; Dato entrada: L: lista nmeros, M: number
113

; Funcin (define (primero L ) (begin (set! M (first L)) (Menorlista (rest L) M )))

; Prueba (primero l1)

Ejercicio 3 Se requiere una funcin que permita afiliar un paciente a la EPS.

; Propsito: funcin que afilia un paciente a la EPS ; Definicin de estructura (define-struct paciente(nombre numerohistoriaclinica cedula)); nombre es string, numerohistoriaclinica y cedula son number.

; Definicin de una lista particular (define comfenalco(list(make-paciente "damaris londoo" 20123080 1152456895) (make-paciente "yolanda rios" 20123512 1145625525) (make-paciente"luci montes" 20128536 1148759645)))

; Anlisis: ; Nombre de la funcin: afiliarpaciente ; Datos de entrada: nombre strind, numerohistoriaclinica y cedula: number ; T.D.S: lista pacientes afiliados
114

; Cuerpo de la funcin (define (afiliarpaciente nom numhis ced) (begin (set! comfenalco (cons (make-paciente nom numhis ced)comfenalco))comfenalco))

; Prueba (afiliarpaciente "juanita perez" 20123085 1123569857)

Ejercicio 4 Realizar una funcin que permita consultar por el nmero de historia clnica todos los datos de un paciente de lista de historias clnicas.

; Propsito: Consultar por el nmero de historia clnica todos los datos de un paciente de lista de historias clnicas

; Definicin de datos ; Definicin de estructura ; Anlisis ; Nombre de la funcin: consultarpaciente ; Datos de entrada: numerohistoriaclinica L:lista de paciente ; T:D:S: estructura paciente

; Cuerpo de la funcin (define(consultarpaciente L numhis) (cond


115

[(empty? L)"no se encuentra en la clnica"] [(= numhis (paciente-numerohistoriaclinica (first L))) (first L)] [else(consultarpaciente(rest L)numhis)]))

; Prueba (consultarpaciente comfenalco 20128536)

TALLER 11: MEMORIA 1. Crear un programa para el manejo de los empleados de una empresa. El programa debe permitir: a) Agregar empleados b) Consultar por la cedula todos los datos de un empleado c) Borrar empleados de la empresa d) El empleado tiene los campos nombre, cedula, salario.

2. Crear un programa para el manejo de una agenda electrnica. Cada persona dentro de la agenda tiene los campos nombre, correo, telfono y direccin El programa debe permitir: a) Agregar registros a la agenda. b) Consultar por nombre el telfono de una persona b) Consultar por nombre el correo de una persona c) Borrar registros de la agenda, por medio del nombre

116

12. VECTORES

Definicin de los vectores (define v(make-vector 3)) (define w(make-vector 5)) (define x(make-vector 3)) (define g(make-vector 3))

Nombre dado al vector

Tamao del vector, o cantidad de elementos que puede contener.

Dar valores a cada posicin del vector (vector-set! v 0 5); v es el nombre del vector; 0 la posicin del vector; y 5 el valor a guardar (vector-set! v 1 6) (vector-set! v 2 7) (vector-set! g 0 4) (vector-set! g 1 10) (vector-set! g 2 11)

Mirar el contenido de determinado posicin (vector-ref v 1); v es el nombre del vector ; 1 la posicin del vector (vector-ref g 1)

Obtener el tamao del vector (vector-length v)

117

EJERCICIOS RESUELTOS Ejercicio 1 Haga una funcin que determine si dos vectores presentan el mismo tamao ; Propsito: Determinar si dos vectores tienen el mismo tamao y retorne verdadero o falso ; Anlisis ; Nombre de la funcin: tamaoVectores ; Datos de entrada:v1 v2:vectores ; Tipo datos de salida:boolean ; Cuerpo de la funcin (define (tamaoVectores v1 v2) (if(=(vector-length v1) (vector-length v2)) true false)) ; Prueba (tamaoVectores v g) (tamaoVectores x w)

Ejercicio 2 Haga una funcin que determine si dos vectores presentan los mismos valores en todas sus posiciones ; Propsito: Determinar si dos vectores son iguales o diferentes ; Anlisis ; Nombre de la funcin: comparar ; Datos de entrada:v1 v2:vectores i:number ; Tipo datos de salida: boolean

118

; Cuerpo de la funcin (define (comparar v1 v2 i) (cond ((= -1 i) "son iguales") ((= (vector-ref v1 i) (vector-ref v2 i)) (comparar v1 v2 (- i 1))) (else "son diferentes"))) ;*********************************************** ; Funcin principal ; Propsito: validar que los vectores tengan el mismo tamao antes de compararlos ; Anlisis ; Nombre de la funcin: compararVectores ; Datos de entrada: v1,v2:vectores ; Tipo datos de salida: string

; Cuerpo de la funcin (define (compararVectores v1 v2 ) (if (tamaoVectores v1 v2)(comparar v1 v2 (-(vector-length v1)1))"no son iguales"))

; Prueba (compararVectores (vector 8 15 20) (vector 6 9 88)) (compararVectores (vector 1 2 3) (vector 1 2 3)) (compararVectores v g)

119

Ejercicio 2 Haga una funcin que reciba dos vectores y los sume y devuelva como resultados un vector.

; Propsito: Sumar dos vectores ; Anlisis ; Nombre de la funcion: sumarvector ; Datos de entrada: a b:vectores i:number ; Tipo datos de salida: vector

; Cuerpo de la funcin (define(sumarvector a b i) (if (tamaoVectores a b) (cond [(= i(vector-length a))a] [else(begin(vector-set! a i(+(vector-ref a i)(vector-ref b i)))(sumarvector a b(+ i 1)))]) "los vectores no se pueden sumar porque no tienen igual tamao")) ;***************************************************** ; Funcin principal ; Propsito: llamar a la funcin que suma los dos vectores empezando desde la posicin 0 ; Anlisis ; Nombre de la funcin: suma ; Datos de entrada: v1 v2:vector ; Tipo datos de Salida:vector
120

; Cuerpo de la funcin (define(suma v1 v2) (sumarvector v1 v2 0))

;Prueba (suma v g)

Ejercicio 3 Haga una funcin que reciba un vector de 20 posiciones donde se almacenan los sueldos de n empleados y diga cuantos empleados ganan ms del salario mnimo actual que es $566700.

;Definicin del vector (define empleados(make-vector 20))

;Guardar valores en algunas posiciones del vector (vector-set! empleados 0 800000) (vector-set! empleados 1 900000) (vector-set! empleados 2 700000) (vector-set! empleados 3 720000) (vector-set! empleados 4 710000) (vector-set! empleados 5 800000) (vector-set! empleados 6 800000)

121

; Definicin de la variable donde se van a guardar los datos de los empleados que ganen ms del mnimo, inicindola en 0. (define m 0) ; Propsito: Calcular cuntos empleados ganan ms del salario mnimo ; Anlisis ; Nombre de la funcin: minimomayor ;Datos de entrada: v:vector, i:number ; Tipo datos de salida: number

; Cuerpo de la funcin (define(minimomayor v i) (cond [(=(vector-length v)i)m] [ (>(vector-ref v i)566700) (begin(set! m(+ m 1))(minimomayor v(+ i 1)))] [else(minimomayor v(+ i 1))])) ;********************************************************* ; Funcin principal ; Propsito: llamar a la funcin anterior, iniciando la posicin desde donde se empieza a recorrer el vector en 0. ; Anlisis ; Nombre de la funcin: mayor ; Datos de entrada: v1:vector ; Tipo datos de Salida: number

; Cuerpo de la funcin
122

(define(mayor v) (minimomayor v 0))

; Prueba (mayor empleados)

Ejercicio 4 Realice una funcin que reciba como dato de entrada el vector de los sueldos de los empleados y retorne y muestre un vector con los sueldos menos el 10% de cada sueldo.

; Propsito: Retornar los sueldos con el 10% de descuento de cada sueldo ; Anlisis ; Nombre de la funcin: descuento ; Datos de entrada: v:vector i:number ; Tipo datos de salida: vector ; Cuerpo de la funcin (define(descuento v i) (cond ((=(vector-length v)i)empleados) (else(begin(vector-set! empleados i)0.10)))(descuento v(+ i 1)))))) i(-(vector-ref v i)(*(vector-ref v

;***************************************************** ; Funcin principal ; Propsito: llamar a la funcin anterior, iniciando la posicin desde se empieza a recorrer el vector en 0;
123

Anlisis ; Nombre de la funcin: des ; Datos de entrada: v: vector ; Tipo datos de Salida: vector

; Cuerpo de la funcin (define (des v) (descuento empleados 0))

; Prueba (des empleados)

Ejercicio 5 Haga una funcin que reciba dos vectores, los reste y devuelva como resultado un vector.

; Propsito: Restar dos vectores ; Anlisis ; Nombre de la funcin: restarvector ; Datos de entrada: c d:vectores i:number ; Tipo datos de salida: vector

; Cuerpo de la funcin (define(restarvector c d i) (if (tamaoVectores c d)


124

(cond [(= i(vector-length c))g] [else(begin(vector-set! g i(-(vector-ref c i)(vector-ref d i)))(restarvector c d(+ i 1)))]) "los vectores no se pueden restar porque no tienen igual tamao")) ;************************************************** ; Funcin principal ; Propsito: llamar a la funcin anterior, iniciando la posicin desde donde se empieza a recorrer el vector en 0. ; Anlisis ; Nombre de la funcin: resta ; Datos de entrada: v1 v2: vector ; Tipo datos de Salida: vector

; Cuerpo de la funcin (define(resta v1 v2) (restarvector v1 v2 0))

;Prueba (resta w g) (resta v g)

125

TALLER 12: VECTORES

1. Escribir un mtodo que calcule el producto escalar de dos vectores. Si v y w son los vectores y n su tamao, el producto escalar se calcula como la sumatoria de V(i)*W(i) 2. Se utiliza un vector para almacenar las calificaciones de 10 estudiantes, realice funciones que permitan calcular: A) La nota mayor del curso B) El promedio del curso C) La nota menor del curso 3. Realizar una funcin que reciba un vector de las ventas de una semana y calcule las utilidades de toda las semana, se sabe que a cada venta se le gana un 10%.

126

13. LOCAL Permite encapsular u ocultar informacin a las dems funciones.

Sintaxis <exp>= (local (<def-1> <def_n> <exp>)

(local ((define x 4) (define (suma x y) (+ x y)))) (suma 3 x)

Ejemplo El siguiente ejercicio se hace de forma global (define x 5) (define (suma x y) (+ x y)) (suma 3 x) ;Retorna 8

Este mismo ejercicio de forma local (local ((define x 5) (define (suma x y) (+ x y))) (suma 3 x)) ;Retorna 8

(suma 5 x) ;Este llamado esta fuera del local por lo tanto no se reconoce y el programa genera un error.

Ejemplo

127

Colocar en el cuerpo de local, una expresin que sea un llamado a la funcin principal que recibe como argumentos los de la funcin que contiene el local.

Una funcin que calcula el rea de un anillo usando el local.

; Propsito: Calcular rea de un anillo ; Anlisis ; Nombre funcin: rea_anillo_local ; Datos de entrada: rext: number, rint:number ; T.D.S:number

(define (area_anillo_local rext rint) (local ( (define pi 3.14 (define (area_circulo r) (* pi 3.14)) (define (are_anillo re ri) (- (area_circulo re) (area_circulo r1))) ) (area_anillo rext rint) ) ) ; Prueba (area_anillo_local 2 1) produce 9.42 (area_anillo_local 9.1) produce 25.12

128

TALLER 13 LOCAL

1. Responda que valor toma x en la siguiente expresin

(define x (local m ((define (operaciones x y) (+ (* x y) 6 ))) (operaciones 10 12))

a) Que valor devuelve la siguiente expresin (local (define x 5) (define (suma x y) (/ (* (+ x 5) 10) 2))) (suma 4 x)

3. Que valores devuelven las siguientes expresiones

a) (local ((define x 3) (define y 4) (define (suma x y z) (+ x y z)) (suma x y 10))

b) (local (( define pi 3.14) (define (volumen r) (* (/ 4 3) pi r r))) (volumen 5))

c) (volumen 6)

d) realizar una funcin para hallar el promedio de una lista usando local

129

14. ARBOLES BINARIOS Definicin de un rbol binario (define-struct nodo (info izq der))

Definicin de un rboles particulares (define arbolito(make-nodo 5 (make-nodo 6 empty empty) (make-nodo 7 empty empty))) (define arbol2 (make-nodo 30(make-nodo 3 (make-nodo 12 empty empty) empty) (make-nodo 4 empty empty)))

Ejercicio 1 Buscar un elemento en un rbol binario

; Propsito: buscar un elemento en un rbol binario ; Anlisis ; Dato entrada: A:arbol binario, e:number ; TDS:boolean

; Funcin (define (buscar A e) (cond ( (empty? A) false) ((= (nodo-info A) e) true)

(else (or (buscar (nodo-izq A) e) (buscar (nodo-der A) e)))))


130

; Prueba (buscar arbolito 7) (buscar arbolito 10)

;*********************************************************** Ejercicio 2 Sumar los valores del campo informacin del rbol ; Propsito: suma el valor del campo informacin de un rbol ; Anlisis: Dato entrada: A: rbol ;TDS: number

; Funcin (define (suma A) (cond ((empty? A) 0) (else (+ (nodo-info A) (suma (nodo-izq A)) (suma(nodo-der A))))))

;Prueba (suma arbolito)

131

Das könnte Ihnen auch gefallen