Sunteți pe pagina 1din 137

recur

GUIA DE FUNDAMENTOS DE PROGRAMACION FUNCIONAL EN SCHEME

MARISOL GOMEZ RAMIREZ


marisol.gomez@correounivalle.edu.co
INGENIERA DE SISTEMAS UNIVERSIDAD DEL VALLE
CALI-COLOMBIA
2014

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 estudia 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 programacinFuncional
en Scheme.

CONTENIDO
TEMA
1. CONCEPTOS MATEMATICOS BASICOS

PAG.
4

TALLER CONCEPTOS BASICOS


2. NOTACION PREFIJA
3.

11
13

TALLER NOTACION PREFIJA

19

FUNCIONES SIMPLES EN SCHEME

21

TALLER FUNCIONES SIMPLES EN SCHEME

34

4. CONDICIONALES

35

TALLER CONDICIONALES
5. FUNCIONES AUXILIARES

48
51

TALLER FUNCIONES AUXILIARES


6. RECURSIVIDAD

60
63

TALLER RECURSIVIDAD
7. ESTRUCTURAS

74
75

TALLER ESTRUCTURAS
8. FUNCIONES CON ESTRUCTURAS

80
81

TALLER FUNCIONES CON ESTRUCTURAS


9. LISTAS SIMPLES

90
92

TALLER LISTAS SIMPLES


10. LISTAS DE ESTRUCTURAS

99
100

TALLER LISTAS DE ESTRUCTURAS


11. MEMORIA Y SECUENCIACION

104
105

TALLER MEMORIA Y SECUENCIACION


12. VECTORES

116
117

TALLER VECTORES
13. LOCAL

126
127

TALLER LOCAL
14. ARBOLES BINARIOS

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 del mismo
tipo de la variable.
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.
Precio: para representar precios de diferentes artculos
Notas: para representar las notas de un curso.

Ejemplo
LongitudCircunferencia= 2*Pi * radio
5

Pi: es una constante, un valor fijo (3.14)


LongitudCircunferencia
cambiar

radio son variables y sus valores pueden

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 (letras,


nmeros y otros smbolos), que permite representar valores identificables de forma
descriptiva, esto incluye nombres de personas, direcciones etc, Se representan
encerrados entre comillas dobles y pueden contener espacios.
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) Estructuras
b) Listas
c) Arreglos
d) rboles
Que se estudiaran en captulos posteriores.
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

RESULTADO

7/2

3.5

12 mod 7

4+2x5

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
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)
Como se observa hay operadores con igual nivel de prioridad.

Los operadores en una misma expresin con igual nivel de prioridad se


evalan de izquierda a derecha.

Ejemplos
1) 4+2*5 2) 23*2/5
2.1*(1.5+3.0*4.1)
4+10

46/5

14

9.2

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

3)
2.1*(1.5+12.3)

3+5*4

2.1*13.8

3+20

28.98

23
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

>
9

Menor que

<

Mayor o igual que >=


Menor o igual que <=
Diferente

<>

Igual

(not (=))

10

Ejemplos
Si a=10

b=20 c=30

1) a<b es Verdadero
3) a + b>c

2) c>a es Verdadero
4) a - b<c

10+20>30

10 - 20 < 30

30 >30

-10 < 30

Falso

Verdadero

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

Operadores Lgicos: Se utilizan para establecer relaciones entre valores lgicos.


And

Or

Not

Negacin

TABLA LOGICA DEL OPERADOR AND


Operando 1

Operador Operando 2

Resultado

AND

TABLA LOGICA DEL OPERADOR OR


11

Operando 1

Operador Operando 2

Resultado

OR

TABLA LOGICA DEL OPERADOR NOT


Operador

Operando 1

Resultado

Not

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))
(

or

V
V

) and (
and

or

F )

F
3) Not (a=c) and (c>b)
12

Not (10=13) and (13 >12)


F

and

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
Nmero de cedula
Nombre de animal
Color de una fruta

13

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))

14

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 este
tipo de 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 3 + 8 ----------> Los operadores van en medio de los operandos
POSTFIJO 3 8 + ----------> Los operadores van al final de los operandos
PREFIJO + 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)

2 .Luego se recorre la expresin de izquierda a derecha, cuando se encuentra un operador se abre parntesis

15

Otra forma de resolver la expresin anterior


2+8*5+6
2+(8*5)+6
(+ 2 (* 8 5) 6)
Se siguen los mismos pasos pero si hay un mismo operador que opere sobre varios operandos (en este caso

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

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)16

e)

5 x + 4 x + 2 x4

(* 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)

16

Resolver Expresiones en Prefijo


Ejemplos:
1.

Resolvamos las siguientes expresiones en prefijo

a) (- (* 5 7) (+ (* 7 8) 8))
(- 35 (+ de
56izquierda
8))
Recorremos la expresin
a derecha y vamos resolviendo primero los parntesis ms internos.
(- 35 64)= -29

b) (* 5 73 (+ 1 6))
(* 365
Cuando se resuelve
lo que7)=
hay 2555
dentro del parntesis, se quita el parntesis y se escribe solo el resultado de la

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)
17

(* 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

18

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 falso verdadero)
verdadero

(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
19

(+ (+ 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)

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

(*(+ 2 10 7)9)
(* 19 9 )
171

b) (/ 10(+(*(/(+ 5 5)2)(+ 2 2)) 10))


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

20

c) (/(+(* 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. Resolver 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))

d) (/ (+ (*(/ (+ 5 5) 2) (+ 2 2)) 10) 10)


e) (-(+(*(*(/ 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)]
c) 2 * [(-5 + -15) + (-80 + 90)]
21

d)
e)
f)
g)

5 * [(-10 20) (-80 + 90)]


[(2 * 5) + [(4 2) + 8]]
3+ (2 5 )
(1 - 18) / (11 2000)
x
log x +5x3
h)
4

i)

a3 b 3
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

b) x = 3

c) x = 15/ 2

Cul es el resultado de:


a) (> x 3)
b) (and (> 4 x) (>x 3) )
c) (= ( * x x )x)
22

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 cdigo para que el programa 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
23

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 el nombre
que llevara l a funcin.
Luego se escriben 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

24

Ejemplo
Hagamos una funcin para sumar dos nmeros

; Propsito: la funcin permitir sumar dos nmeros


; Anlisis
Nombre de programa: suma
Datos de entrada

Tipo de los datos de entrada

x de tipo numrico

y de tipo numrico

Tipo de datos de salida:


numrico
En Scheme
no necesitamos darle nombre a los datos de salida

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.

25

Forma general de una funcin en Scheme


(define (nombreFuncion datosEntrada) (formulaPrefijo))

Entonces la funcin anterior en Scheme queda as:

;Cuerpo de la funcin

Observe que esta


instruccin
antecedida
(define
(sumanox vay)(+
x y)) por ; (punto y coma), ya que se necesita que sea leda por e

Bueno ya tenemos la 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 e

(suma 20 30)

Importante Si no se hace la prueba el computador no va a ejecutar el programa.

26

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))
Nombre de los datos de entrada

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

27

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

28

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.
29

2) Guardemos el programa: Archivo->Salvar Definiciones como

30

4) Ejecutemos el programa

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


31

a) 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.

32

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 (tipo de datos de salid): number

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

(display "ingrese el valor del lado ")

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

33

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 de entrada : presin: numrico, volumen: numrico,
temperatura: numrico
; Tipo de dato salida: numrico

; Cuerpo de la funcin
(define(masa presin volumen temperatura)
(/(* presin 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
34

; Datos de entrada : t1:numerico t2:numrico t3:numerico


; Tipo dato salida: numrico

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

;Llamado de la 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
cinco nmeros
; Anlisis
; Nombre funcin: promedio
; Datos de entrada : n1:numrico n2:numrico 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
35

(promedio 1 2 3 4 5)

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
36

;Datos de entrada: horas: numrico


;Tipo de salida : numrico
;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)
37

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

( y y ) +(x x )
2

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


est dada por

4 r2

y el volumen por

4 3
r
3

38

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 hace 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

Funcin

Ejemplo

string?

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)


39

(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?

symbol=?

boolean?

boolean=?

Determina si una variable


es de tipo symbol

(symbol? Juguete)

determina si dos smbolos


son iguales en caso
afirmativo devuelve true,
en caso contrario devuelve
false

(symbol=? Barbie Barbie)

Revisa si una variable o


valor es de tipo booleano
(tambin conocido como
tipo lgico)

(boolean? (> 5 7))

Revisa si dos datos de tipo


boolean son iguales

(boolean=? true false)

Retorna true

Como el valor de los dos smbolos


son iguales devuelve true

Como (> 5 7) retorna false y


false es de tipo booleano
entonces toda la expresin
retorna true.

devuelve false

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

Dentro de Scheme existen varias forma de expresar las condiciones.

Sentencia if
Veamos su sintaxis:

40

(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

Cuando la condicin se cumple , es decir es verdadero que el residuo de n con 2 es igual a 0, se muestra por

;Tipo dato de salida:number

;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
41

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 llantas.

; Propsito: Calcular el total a pagar en una llantera dependiendo del


nmero de llantas que se compren.
; Anlisis
;Datos de entrada:cantidadLlantas: numrico
;Datos de salida: numrico

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

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

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

; Anlisis
42

; Propsito: Calcular el valor absoluto de un nmero.


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

(define(absolutoNumero)
(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 por hora

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

43

; 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)
44

(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)

45

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

46

Ejemplo
Determinar si un n dado es solucin de la ecuacin

4 n2+ 6 n+2=462

; Propsito: Determinar si un n dado es solucin de la ecuacin


4 n2+ 6 n+2=462
;Anlisis
; Nombre de la funcin: soluciones
; Datos de salida: n:number
; Tipo datos de salida: number

;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 en 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.
47

; Propsito: Determinar el costo de una matricula


; Anlisis
; Nombre funcin: costo
; Datos de entrada: estrato :number

y carrera: string

; 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)
Se saca el porcentaje y se descuenta al valor original de la matrcula.

(define M Matematicas)

(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))]
[else Datos no validos]))
48

; Llamado de la funcin
(costo
TEfuncin
2) ; debe
devolver
900.000
El llamado
de la
se puede
hacer con
las variables ya definidas o con el nombre de la carrera.
(costo M 1); debe devolver 960.000
(costo Matematicas 1) ;debe devolver 960.000
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" )))
49

;Llamado de la funcin
( iguales 1 1 4 )

50

Ejercicio 2
Desarrolle una funcin llamada soluciones que reciba los coeficientes a, b, c de
una ecuacin cuadrtica de la forma

a x 2+ bx+ c=0

y determine cuantas

soluciones tiene la ecuacin, suponiendo que a no es 0 Recuerde que una


ecuacin cuadrtica tiene:
Dos soluciones si
Una solucin si

b 2 4ac

b 2 4ac

No tiene solucin si

b 2 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 x 2+ bx+ c=0 ; donde a es diferente de 0

;Nombre de la funcin: soluciones


;Dato entrada: a, b, c : de 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" ]))
51

;Llamado funcin
( soluciones 1 0 -1 )
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
52

escogido es menor que 74 el descuento es el 15% sobre total de la compra, si el


nmero 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.


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

; Cuerpo funcin
( define ( descuento numAzar precio )
( cond
[( < numAzar 74 ) ( / ( * precio 15 ) 100 )]
[( >= numAzar 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)
53

2. Determina si las siguientes funciones poseen errores y corrgelas


a) (define (funcionM p q )(+ 8 (+(* p q) r)))
b) (define h (+ 8 7))
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

Porcentaje del presupuesto

Ginecologa

35%

Traumatologa

25%

Pediatra

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.

54

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)
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.

55

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 una circunferencia


; Anlisis de datos
; Nombre de la funcin: areaCircunferencia
; Datos de entrada: radio: number
; Tipo del dato de salida: number

; Cuerpo de la funcin
(define (areaCircunferencia 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.
56

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

Aqu llamamos a la funcin auxiliar


; Cuerpo de la funcin

(define (VolumenEsfera r)
(* ( / 4 3) (areaCircunferencia 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: areaCircunferencia
; Datos de entrada: radio: number
57

;Tipo de datos de salida: number

;Cuerpo de la funcin
(define (areaCircunferencia 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)
(- (areaCircunferencia rexterior) (areaCircunferencia 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:
La calificacin de matemticas se obtiene de la siguiente manera: Examen 90%.
Promedio de las tares 10%.
58

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: notaMatematicas
; Datos de entrada: E T1 T2 T3: number
;Tipos de datos de salida: number

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

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

; Funcin:
59

(define(notaFisica ex t1 t2 t3)
(+(* ex 0.8)(*(/(+ t1 t2 t3)3) 0.2)))

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

; Funcin
(define(notaQuimica ex t1 t2 t3)
(+(* ex 0.85)(*(/(+ t1 t2 t3)3)0.15)))

; Prueba
(notaQuimica 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
;e, t1, t2, t3: number
60

; 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))

61

; Prueba
(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 (notaMatematicas 3 5 2 3) (notaFisica 4 4 2 5) (notaQuimica
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 (notaMatematicas 3 5 2 3))


(define f (notaFisica 4 4 2 5))
62

(define q (notaQuimica 3 5 1 2))

(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
$6.000.000
Si gana ms de $500.000 y menos o igual a $1500.000 se le da un subsidio de
$3.000.000
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 el salario de un empleado


; Anlisis: dato entrada: h: number
; TDS: number

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

; 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))30000000]
[(> (salario horas)1500000)1000000]
(else "dato invalido")))

; Prueba
(subsidio 170)
(subsidio 600)
;***************************************************************
64

Resolviendo el mismo problema pero recibiendo el salario como dato de


entrada, es decir se usa una funcin como dato de entrada

; Propsito: calcular subsidio de la caja, dado al empleado


; Anlisis
;nombre de la funcin: subsidio2
; 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 subsidio2.

TALLER 5: FUNCIONES AUXILIARES


1.

Reduccin:
65

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 (funcion1 x) (+ (funciong x) 9))
(define (funciong y) (sqrt (* y (* (+ 2 12) (/ (* (+ 3 5) (/ 30 10)) 2)))))

(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. Realice funciones para convertir un dato de metros a pies y de metros a


pulgadas (1 metro=39.37 pulgadas)
(1 pie=12 pulgadas.)
4. 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
66

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

5. Hacer otra funcin que diga a que elemento pertenece un signo zodiacal, dado
el da y mes de nacimiento. (utilizar la funcin anterior)
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:

67

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


68

; 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
; Tipo del dato de salida: number
69

; 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

(impares 9)
(impares n)

( impares 9)

10

( + 9 (impares 7))=(+ 9 16)=25

(+ 7 (impares 5))= (+ 7 9)=16

(+ 5 (impares 3))=(+ 5 4)=9

(+ 3 (impares 1))=(+ 3 1)=4

Ejemplo
70

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

= 4!

o sea que
5! = 5* !4
Y si nos damos cuenta
4!= 4* 3 * 2
Y 3!=3* 2 * 1

= 3!
= 2!

2!=2* 1
Entonces definamos la funcin factorial

; 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]))

; Prueba
71

(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

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))))))

72

; 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.

; Propsito: Calcular los mltiplos desde 7 hasta un numero dado


73

; Anlisis: Datos de entrada: num, n: numrico


; Tipo de datos de salida: numrico

;Funcin:
(define (multiplos num n)
(cond
[(> (* 7 num) n) "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.

; Propsito: Ver el equivalente en binario de un nmero n.


74

; Anlisis: Datos de Entrada: numrico


; Tipo de Dato de Salida: numrico

;Funcin

(define (binario x)
(cond

Calcula el cociente entre dos nmeros enteros

[(= (quotient x 2) 0)(display (remainder x 2))]


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

;Prueba
(binario 20)

Ejercicio5.
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 )))]))

; Funcin principal
75

(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"))

; Prueba
76

"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)
(Fibonacci 3)
77

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)

78

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 nmero 7, aparte de el mismo y el nmero 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)

79

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,
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, entonces tenemos el programador
debe especificar cmo va a estar conformado, cules y de qu tipo van a ser 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))

80

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.

81

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

(define L (make-fruta Limon verde acido))


82

(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.

83

(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))

84

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.

85

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 mostrara 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


86

Dato
de entrada:
Estudiante
Este ;es
el nombre
con el E:
que
se defini la estructura. La funcin recibe un dato de tipo Estudiante
; Tipo datos de salida: number

; 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))
87

(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))

88

;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

Observe que el dato de entrada y salida es el mismo tipo o sea un libro.

; Tipo de datos de salida: 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:

89

(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 definirlas.

90

;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

91

(define-struct partido (nombre1 goles1 nombre2 goles2)); nombre1 y


nombre2 son string; goles1 y goles2 son number.

;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 )

92

Ejercicio 2
En una clnica donde se ofrecenvarios 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
-5000))

"tomas suarez"

'optometria

56000

; 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")]
93

[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))

94

; 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.

95

4.Desarrolle una funcin llamada TiempoSegundos, (con los campos horas minutos
segundos) la cual recibe una estructura tiempo y genera el nmero total de
segundos. Por ejemplo: si la funcin recibe como dato de entrada la estructura
(make-tiempo 10 10 2) el programa devuelve 36602.

5 Defina una estructura de datos que represente un numero fraccionario (que tiene
numerador y denominador)

y realice una funcin que mltiple dos nmeros

fraccionarios.
6

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.

96

9. LISTAS SIMPLES
Una lista es una secuencia o coleccin de elementos de igual o diferente tipo. 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)

97

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

Funcin

ejemplo

First

Obtiene el primer
elemento de una
lista

(first (list Juan Pedro Pablo))


;retorna Juan

Rest

Obtiene el resto de
una lista

(rest (list Juan Pedro Pablo))


;retorna (list Pedro Pablo)

Append

Permite
concatenar dos
listas

(append (list 5 7 8) (list 10 11)) ;


devuelve (list 5 7 8 10 11)

Reverse

Obtiene la lista al
reves

(reverse (list 5 7 8); devuelve

Agrega un
elemento a una
lista

(cons 2 (list 5 7 8) ) ;devuelve


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

Cons

(list 8 7 5)

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"))

(first ciudades) es igual a Cali


98

(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)

Funciones que manejan Listas

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

99

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)))]))

Ejercicio 2
100

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
;Nombre de la funcin:incremento
101

; 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))))

102

; 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)

103

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.

4 Realizar una funcin que multiplique los elementos de una lista.


3. 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.)

4.Crear una funcin que determine si dos listas son iguales.

5. Desarrollar una funcin llamada buscar que determine si un numero est en una
lista de nmeros.

6. 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.

104

9 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 ))

105

; 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.


; Cuerpo
del
Como el primer
elemento
deprograma
la lista es una estructura se debe indicar con cul de los campos que hay all se v

(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
(define-struct articulo (nombre precio cdigo))
106

;Definicin de datos particulares


(define L1 (list (make-articulo "medias" 3500 34) (make-articulo
"zapatos" 65000 23)))

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

; Cuerpo de la funcin
(define (incrementar L)

Cuando algn campo de la estructura de la lista cambia, se debe volver a construir la lista insertando de nuevo

(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.

; Propsito: Funcin que dado el cdigo de un estudiante determina si


est matriculado
; Definicin de la estructura
107

(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)

TALLER 10: LISTAS DE ESTRUCTURAS

108

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.

109

10 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)

110

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

111

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)
112

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"
113

(agregarDirectorio "juanca" 301234566)


directorio

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)
114

(begin( display "Digite valor para la base...>") (set! base (read) )


( display "Digite valor para la altura..>")
(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
115

; Definicin de la estructura
(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)
116

(cond
[(empty? l)"no esta inscrito"]
[(= 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
117

(eliminar "Alexis" universidad)

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)]))
;*********************************************

118

; Propsito: obtener el menor de la lista usando a la funcin anterior


; Anlisis: nombre funcin: primero
; Dato entrada: L: lista nmeros, M: number

; 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:
119

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

; 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

120

; Cuerpo de la funcin
(define(consultarpaciente L numhis)
(cond
[(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
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
121

122

12. VECTORES

Definicin de los vectores

Nombre dado al vector

(define v(make-vector 3))


(define w(make-vector 5))

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

(define x(make-vector 3))


(define g(make-vector 3))

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)

123

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

124

;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)

125

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
126

;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 empleadosy 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)

127

; 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
128

(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 empleadosy 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(-(vector-ref v i)(*(vector-ref v
i)0.10)))(descuento v(+ i 1))))))
;*****************************************************
; Funcin principal
;Propsito:llamar a la funcin anterior, iniciando la posicin desde se
empieza a recorrer el vector en 0;
129

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)
130

(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)

131

TALLER 12: VECTORES

1. Escribir un mtodo que calcule el producto escalar de dos vectores. Si v y wson


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%.

132

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

133

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

134

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

135

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)))))


136

; 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)

137

S-ar putea să vă placă și