Program (Autoguardado)
Program (Autoguardado)
Program (Autoguardado)
Mover(Norte)
Todo programa tiene exactamente un program: una sección del código que
declara los comandos (acciones) que queremos que la máquina realice
sobre el tablero inicial. Al ejecutar un programa obtendremos un
tablero final.
program {
}
program {
Mover(Norte)
}
program {
Mover(Norte)
Mover(Norte)
}
program {
Mover(Norte)
Mover(Este)
rojas (Rojo);
azules (Azul);
negras (Negro);
y verdes (Verde).
Por ejemplo, este es un tablero con una bolita roja y una negra:
0 1
1
1 1
0 0
1
0 1
program {
Poner(Rojo)
}
program {
Poner(Rojo)
Poner(Rojo)
Poner(Azul)
procedure PonerNegroYRojo() {
Poner(Negro)
Poner(Rojo)
program {
PonerNegroYrojo()
Prestale atención a la sintaxis del ejemplo para ver bien cómo definimos
un procedimiento y cómo lo invocamos en un program.
procedure Poner3Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
program {
Poner3Rojas()
}
Poner(Negro)
Poner(Rojo)
program {
PonerNegroYrojo()
Prestale atención a la sintaxis del ejemplo para ver bien cómo definimos
un procedimiento y cómo lo invocamos en un program.
procedure Poner3Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
program {
Poner3Rojas()
}
0 1 2 3 4
1 1 1 1 1 1 1 1
1 1
1 1 1 1 1 1 1 1
0 0
0 1 2 3 4
1
procedure DibujarLineaColorida(){
2
Poner(Azul)
3
Poner(Negro)
4
Poner(Rojo)
5
Poner(Verde)
6
}
7
program {
8
DibujarLineaColorida()
9
Mover(Este)
A esta altura ya sabemos que para programar siempre tenemos que tener
en cuenta la sintaxis y que para definir nuevos procedimientos también
tenemos reglas:
procedure Mover4AlNorte() {
Mover(Norte)
Mover(Norte)
Mover(Norte)
Mover(Norte)
}
program {
Mover4AlNorte()
}
procedure RojoAlBorde() {
IrAlBorde(Norte)
IrAlBorde(Oeste)
Poner(Rojo)
program {
RojoAlBorde()
}
Ejercicio 14: Colores, colores, colores
Vamos a darle un poco más de color a todo esto haciendo líneas
multicolores como esta:
0 1 2 3 4
1 1 1 1 1 1 1 1
1 1
1 1 1 1 1 1 1 1
0 0
0 1 2 3 4
1
procedure DibujarLineaColorida(){
2
Poner(Azul)
3
Poner(Negro)
4
Poner(Rojo)
5
Poner(Verde)
6
}
7
program {
8
DibujarLineaColorida()
9
Mover(Este)
10
DibujarLineaColorida()
11
Mover(Este)
12
DibujarLineaColorida()
13
Mover(Este)
14
DibujarLineaColorida()
15
IrAlBorde(Oeste)
16
}
Enviar
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:
Hay que dividir en subtareas. Tené en cuenta qué partes de tu
código se repiten y trasladalas a un nuevo procedimiento.
procedure Poner4Bolitas(){
Poner(Azul)
Poner(Negro)
Poner(Rojo)
Poner(Verde)
procedure DibujarLineaColorida(){
Poner4Bolitas()
Mover(Este)
Poner4Bolitas()
Mover(Este)
Poner4Bolitas()
Mover(Este)
Poner4Bolitas()
IrAlBorde(Oeste)
program {
DibujarLineaColorida()
procedure DibujarCuadradoColorido(){
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
IrAlBorde(Sur)
program {
DibujarCuadradoColorido()
REPETICION SIMPLE
Ejercicio 2: La computadora repite por
nosotros
Como te adelantamos en el ejercicio anterior, en Gobstones existe una
forma de decir "quiero que estos comandos se repitan esta cantidad de
veces".
procedure MoverOeste10() {
repeat(10) {
Mover(Oeste)
}
}
Pero no tenés por qué creernos: ¡escribí este código en el editor y fijate si funciona!
procedure MoverOeste5() {
repeat(5) {
Mover(Oeste)
program {
Mover(Sur)
repeat(4) {
Poner(Rojo)
}
Mover(Norte)
}
1 1 1 1
0 0 0 0
0 1 2 0 1 2
procedure Poner3AlNoreste() {
Mover(Norte)
Mover(Este)
repeat(3) {
Poner(Negro)
procedure Poner3AlNoreste() {
Mover(Norte)
repeat(3) {
Mover(Este)
Poner(Negro)
}
}
procedure PonerAzulLejos() {
repeat(4){
Mover(Este)
Poner(Azul)
procedure DibujarLineaNegra6() {
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
}
¿Notás qué es lo que se repite y cuántas veces? Bueno, eso es lo que
tenés que poner en el repeat.
repeat(6){
Poner(Negro)
Mover(Este)
procedure Diagonal4Azul() {
repeat(4){
Poner(Azul)
Mover(Norte)
Mover(Este)
¿Qué quiere decir esto? Que en vez de poner 1 bolita en cada celda,
ahora hay que poner 21. Mirá la imagen:
0 1 2 3 4
4 4
21
3 3
21
2 2
21
1 1
21
0 0
0 1 2 3 4
Definí un procedimiento DiagonalPesada4Azul que resuelva el problema.
procedure Bolas21() {
repeat(21){
Poner(Azul)
procedure DiagonalPesada4Azul() {
repeat(4){
Bolas21()
Mover(Norte)
Mover(Este)
procedure LineaNegra4Este() {
repeat(3) {
Poner(Negro)
Mover(Este)
Poner(Negro)
procedure MoverOeste(){
repeat(3){
Mover(Oeste)
procedure CuadradoNegro(){
repeat(3){
LineaNegra4Este()
Mover(Norte)
MoverOeste()
procedure CuadradoNegro4(){
CuadradoNegro()
LineaNegra4Este()
Solución
Biblioteca
1
procedure DibujarLineaNegra3(){
2
procedure DibujarCuadradoNegroDeLado3(){
repeat(2){
DibujarLineaNegra3()
Mover(Norte)
DibujarLineaNegra3()
program{
DibujarCuadradoNegroDeLado3()
Ya sabemos como dibujar una línea negra con 3 bolitas . Usemos esa
lógica para dibujar una línea verde.
procedure DibujarLineaVerde3(){
repeat(2){
Poner(Verde)
Mover(Este)
Poner(Verde)
VolverAtras()
program{
DibujarLineaVerde3()
repeat(2){
Poner(Rojo)
Mover(Este)
Poner(Rojo)
VolverAtras()
procedure DibujarLineaAzul3(){
repeat(2){
Poner(Azul)
Mover(Este)
Poner(Azul)
VolverAtras()
procedure Poner3(color) {
repeat(3) {
Poner(color)
program {
Poner3(Negro)
En la guía anterior, vimos que se podía usar repeat para hacer algo muchas veces.
Hicimos un ejemplo que se llamaba Diagonal4Azul, que era más o menos así:
procedure Diagonal4Azul(){
repeat(4){
Poner(Azul)
Mover(Este)
Mover(Norte)
}
}
4 4
1
3 3
1
2 2
1
1 1
1
0 0
0 1 2 3 4
Poner3(Rojo)
procedure Poner3(color) {
Poner(color)
Poner(color)
Poner(color)
}
¿Y qué es un parámetro? Son esos nombres que van entre paréntesis para
ser reemplazados por valores concretos cuando invocamos al
procedimiento. Por ejemplo, si lo invocamos así..
program {
Poner3(Negro)
}
Poner(Negro)
Poner(Negro)
Poner(Negro)
Y si lo invocamos así...
program {
Poner3(Rojo)
}
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Fijate como cada vez que aparece color se reemplaza por el valor que
le pasamos a Poner . Veamos si se entiende:
Definí el procedimiento DibujarLinea3 que reciba un color y dibuje una línea de ese
color. Despreocupate por los programs para invocarlo con cada uno de los colores,
van por nuestra parte.
procedure DibujarLinea3(color){
repeat(2){
Poner(color)
Mover(Este)
Poner(color)
VolverAtras()
procedure DibujarCuadradoDeLado3(color){
repeat(2){
DibujarLinea3(color)
Mover(Norte)
DibujarLinea3(color)
¿Y cómo se hace esto? Muy fácil, al igual que como hacemos al escribir,
vamos a separar cada parámetro usando comas de esta manera:
program {
DibujarLinea3(Verde,Este)
Mover (Este)
DibujarLinea3(Rojo,Norte)
Mover (Norte)
DibujarLinea3(Negro,Oeste)
Mover (Oeste)
DibujarLinea3(Azul,Sur)
Mover (Sur)
}
Ejercicio 12: La tercera es la vencida
Para terminar esta lección vamos a definir un procedimiento
llamado Triada ¡que recibe tres parámetros!
Triada recibe tres colores por parámetro y pone tres bolitas, una al lado de
la otra hacia el Este, en el mismo orden en que se reciben. El cabezal
empieza en el origen y debe terminar sobre la última bolita de la tríada.
0 1 2
1
0 0
1 1
0 1 2
procedure Triada(color1,color2,color3){
Poner(color1)
Mover(Este)
Poner(color2)
Mover(Este)
Poner(color3)
procedure Diagonal4AzulVolviendo(){
Diagonal4Azul()
repeat(4){
Mover(Sur)
Mover(Oeste)
}
1. Fundamentos
6. Práctica Repetición simple
2. Una diagonal más ancha
0 1 2 3 4
6 6
1
5 5
1 1
4 4
1 1 1
3 3
1 1 1
2 2
1 1
1 1
1
0 0
0 1 2 3 4
procedure BandaDiagonal4(){
repeat(3){
Diagonal4AzulVolviendo()
Mover (Norte)
}
}
0 1
1 1
0 0
6
0 1
PonerN(x+y, Rojo)
1. Fundamentos
7. Expresiones
3. ¿Qué se hace antes?
¿Qué podríamos representar con bolitas? Por ejemplo una fecha. Una
fecha que debemos recordar es el 24 de marzo de 1976, hoy
constituido Día de la Memoria por la Verdad y la Justicia en Argentina.
procedure DiaDeLaMemoria(){
PonerN(24,Azul)
Mover (Este)
PonerN(3,Verde)
Mover (Este)
PonerN(1976,Negro)
procedure Fecha(dia,mes,anio){
PonerN(dia,Azul)
Mover(Este)
PonerN(mes,Verde)
Mover(Este)
PonerN(anio,Negro)
Inicial Final
0 1 2 3
0 1 2 3
2 2
2 2
1 1
1 1
0 0
0 0
0 1 2 3
procedure MoverN(cantidad,direccion){
repeat(cantidad){
Mover (direccion)
1. Fundamentos
6. Práctica Repetición simple
7. Los números del reloj
Ejercicio 7: Los
L números del reloj
¡Ya sabés Kung Fu!
Ahora, tenés que mostrarnos que podés dibujar un reloj. Lo que haremos por ahora es
solamente poner los números que aparecen en un típico reloj de agujas:
El 12 arriba,
El 3 a la derecha,
El 9 a la izquierda, y
el 6 abajo.
Definí un procedimiento DibujarReloj(radio) que ponga los números del reloj como se indica
arriba: alrededor del casillero actual. El tamaño del reloj se indica con el radio que recibís
como parámetro: mientras más grande es el radio, más alejados están los números del
centro.
Dado el siguiente program:
program {
DibujarReloj(2)
}
0 1 2 3 4
4 4
12
3 3
2 2
9 3
1 1
0 0
6
0 1 2 3 4
procedure DibujarReloj(radio){
MoverN(radio,Norte)
PonerN(12,Rojo)
MoverN(radio,Sur)
MoverN(radio,Sur)
PonerN(6,Rojo)
procedure Ele(direccion){
Linea(direccion,Azul,3)
Linea(siguiente(direccion),Azul,3)
Definí un procedimiento GuardaDe5(), que haga una "guarda" de 5 azulejos (como las que
decoran las paredes). Cada azulejo está conformado por 1 bolita verde, 5 negras y 9 rojas.
0 1 2 3 4 5
1 1
5 5 5 5 5
0 0
9 1 9 1 9 1 9 1 9 1
0 1 2 3 4 5
procedure Ponerla(){
PonerN(1,Verde)
PonerN(5,Negro)
PonerN(9,Rojo)
procedure GuardaDe5() {
repeat (4){
Ponerla()
Mover (Este)
Ponerla()
Mover(siguiente(direccion))
1. Fundamentos
7. Expresiones
11. Copiando bolitas
Una tarea que seguro tenemos que hacer es poner muchas bolitas, y para
eso ya sabemos que existe el procedimiento PonerN que construimos
varios ejercicios atrás. El color de las bolitas que tenemos que poner
también lo sabemos: Rojo, pero... ¿cómo sabemos cuántas poner?
Lo que nos está faltando es una forma de contar cuántas bolitas verdes
hay,, y para eso necesitamosnecesitamos otra función que nos da
Gobstones: nroBolitas(color). Lo que hace es simple: nos retorna la cantidad
de bolitas de un color determinado en la posición actual.
procedure CopiarVerdesEnRojas(){
nRojas(){
Mover(Norte)
PonerAzulejo()
procedure GuardaEnL(){
Base()
Volver()
Alto()
Volver2()
el número 5;
la cantidad de dedos de una mano;
la suma entre 3 y 2;
el número de continentes que existen en el planeta, según la ONU.
Todas las frases anteriores hablan del valor cinco, aunque no lo digan de
forma explícita.
Con esta idea e invocando PonerN, creá un programa que ponga cinco bolitas
negras, PERO sin escribir el número 5.
program{
PonerN(1+4,Negro)
}
0 1
1 1
0 0
6
0 1
PonerN(x+y, Rojo)
1. Fundamentos
7. Expresiones
3. ¿Qué se hace antes?
procedure MoverComoSalmon(direccion) {
Mover(opuesto(direccion))
}
procedure MoverComoSalmon(direccion) {
Mover(opuesto(direccion))
Queremos definir un procedimiento que nos sirva para poner una bolita al lado de
donde se encuentre el cabezal, dejándolo en la posición original. Por ejemplo, al
invocar PonerAl(Norte, Verde) debería poner una bolita verde una posición hacia el
Norte, sin mover el cabezal (bueno, ya sabemos que en realidad sí se mueve, pero el
punto es que en el resultado final esto no se tiene que ver).
Inicial Final
0 1 0 1
Inicial Final
1 1 1 1
1
0 0 0 0
0 1 0 1
Mover (direccion)
Poner (color)
Mover (opuesto(direccion))
1. Fundamentos
7. Expresiones
7. La línea que vuelve
¡Ahora te toca a vos! Modificá el procedimiento que te dimos para que saque una
bolita roja, sólo si hay alguna.
¡Dame una pista!
procedure SacarRojoConMiedo() {
if (hayBolitas(Rojo)) {
Sacar(Rojo)
1. Fundamentos
8. Alternativa Condicional
4. Un ejemplo medio rebuscado
0 1 2 3
Linea(direccion,Azul,3)
Linea(siguiente(direccion),Azul,3)
procedure AsegurarUnaBolitaVerde(){
if (not hayBolitas(Verde)){
Poner (Verde)
1. Fundamentos
8. Alternativa Condicional
8. Dos caminos distintos
Para estos casos, en Gobstones tenemos una nueva palabra clave que nos
ayuda a cumplir nuestra tarea: el else.. En castellano significa si no y hace
justamente lo que necesitamos: ejecuta una serie de acciones si no se
cumple la condición que pusimos en el if.
Funciones
Cuando introdujimos la noción de procedimientos,, dijimos que:
1. Fundamentos
9. Funciones
1. Y esto, ¿con qué se come?
procedure MoverSegunBolitas() {
if (nroBolitas(Azul) + nroBolitas(Negro)
nroBolitas + nroBolitas(Rojo) + nroBolitas(Verde) > 10
10) {
Mover(Este)
} else {
Mover(Norte)
}
PonerN(nroBolitas(Verde),Rojo)
SacarN(nroBolitas(color),color)
1. Fundamentos
8. Alternativa Condicional
Alternativa Condicional
Hasta ahora, todos los programas y procedimientos que hicimos fueron
sobre tableros conocidos
conocidos,, sabíamos exactamente de qué tamaño era el
tablero, dónde estaba el cabezal y cuántas bolitas había en cada celda.
1. Fundamentos
9. Funciones
6. En libertad
Ejercicio 6: En libertad
Queremos definir la función esLibreCostados(), que determine si el cabezal
tiene libertad para moverse hacia los costados (es decir, Este y Oeste).
Antes que nada, pensemos, ¿de qué tipo tiene que ser el valor que
retorna nuestra función? Será...
Pero, ups, hay un problema más; hay que hacer DOS preguntas:
¿se puede mover al Este? Y ¿se puede mover al Oeste?.
function esUnCasilleroCargadoConRojoDominante()
esUnCasilleroCargadoConRojoDominante {
return (nroBolitasTotal() > 5 && rojoEsDominante())
}
2. Sacar con miedo, segundo intento
procedure SacarAzulConMiedo()
() {
if (hayBolitas(Azul)) {
Sacar(Azul)
}
}
1. Fundamentos
8. Alternativa Condicional
3. Eliminando la bolita roja
Ejercicio 3: Eliminando
Eliminando la bolita roja
Analicemos el procedimiento del ejercicio anterior:
procedure SacarAzulConMiedo()
() {
if (hayBolitas(Azul)) {
Sacar(Azul)
}
}
¡Ahora te toca a vos! Modificá el procedimiento que te dimos para que saque una
bolita roja, sólo si hay alguna.
¡Dame una pista!
procedure SacarRojoConMiedo() {
if (hayBolitas(Rojo)) {
Sacar(Rojo)
1. Fundamentos
8. Alternativa Condicional
4. Un ejemplo medio rebuscado
procedure CompletarCelda(){
if(hayBolitas(Negro)){
Poner (Rojo)
Poner (Azul)
Poner (Verde)
1. Fundamentos
8. Alternativa Condicional
5. ¿Y sólo sirve para ver si hay bolitas?
0 1
2 2
1 1
0 0
0 1
program{
if(puedeMover(Este)){
Mover(Este)
Sabiendo esto, intentá crear un programa que ponga 1 bolita negra sólo si hay
menos de 5 bolitas negras.
program{
if(nroBolitas(Negro)<5 ){
Poner (Negro)
1. Fundamentos
8. Alternativa Condicional
7. Cómo decirle que no...
Algo que también se puede hacer es negar una condición, algo que en
castellano puede sonar medio raro pero que en programación se hace un
montón.n. Los ejemplos anteriores quedarían: ¿¿no hay alguna bolita roja?
¿no me puedo mover al Este? ¿no
¿ hay más de 3 bolitas azules?
Original Negada
procedure AsegurarUnaBolitaVerde(){
if (not hayBolitas(Verde)){
Poner (Verde)
1. Fundamentos
8. Alternativa Condicional
8. Dos caminos distintos
Para estos casos, en Gobstones tenemos una nueva palabra clave que nos
ayuda a cumplir nuestra tarea: el else.. En castellano significa si no y hace
justamente lo que necesitamos: ejecuta una serie de acciones si no se
cumple la condición que pusimos en el if.
1. Fundamentos
8. Alternativa Condicional
9. Un tablero de luces
procedure PrenderOApagarLuz(){
if (not hayBolitas(Verde)){
Poner (Verde)
Sacar (Negro)
}else{
Poner (Negro)
Sacar (Verde)
}
}
Funciones
Cuando introdujimos la noción de procedimientos,, dijimos que:
1. Fundamentos
9. Funciones
1. Y esto, ¿con qué se come?
procedure MoverSegunBolitas() {
if (nroBolitas(Azul) + nroBolitas(Negro)
nroBolitas + nroBolitas(Rojo) + nroBolitas(Verde) > 10
10) {
Mover(Este)
} else {
Mover(Norte)
}
}
Entonces, lo que nos está faltando es algún mecanismo para poder darle
un nombre a esa expresión compleja;; algo análogo a
los procedimientos pero que sirva para encapsular expresiones.
function nroBolitasTotal() {
return (nroBolitas(Azul) + nroBolitas(Negro)
nroBolitas + nroBolitas(Rojo) + nroBolitas(Verde))
))
}
1. Fundamentos
9. Funciones
3. MoverSegunBolitas, versión 2
Ejercicio 3: MoverSegunBolitas, versión
2
Ahora que ya logramos mover la cuenta de las bolitas a una subtarea,
podemos mejorar el procedimiento que habíamos hecho antes.
procedure MoverSegunBolitas() {
Mover(Este)
} else {
Mover(Norte)
1. Fundamentos
9. Funciones
4. todasExcepto
Ejercicio 4: todasExcepto
Te toca ahora definir tu primera función: todasExcepto(color). Lo que tiene
que hacer es sencillo, contar cuántas bolitas hay en la celda actual sin
tener en cuenta las del color recibido por parámetro.
return (nroBolitasTotal()-nroBolitas(color))
En este casillero:
0
4 3
0 0
2 1
0
4 3
0 0
9 1
0
rojoEsDominante() retorna True (hay 9 bolitas rojas contra 8 de otros colores)
}
1. Fundamentos
9. Funciones
6. En libertad
Ejercicio 6: En libertad
Queremos definir la función esLibreCostados(), que determine si el cabezal
tiene libertad para moverse hacia los costados (es decir, Este y Oeste).
Antes que nada, pensemos, ¿de qué tipo tiene que ser el valor que
retorna nuestra función? Será...
Pero, ups, hay un problema más; hay que hacer DOS preguntas:
¿se puede mover al Este? Y ¿se puede mover al Oeste?.
function esUnCasilleroCargadoConRojoDominante()
esUnCasilleroCargadoConRojoDominante {
return (nroBolitasTotal() > 5 && rojoEsDominante())
}
function esLibreCostados(){
return(puedeMover(Este)&&puedeMover(Oeste))
return(puedeMover(Este)&&
1. Fundamentos
9. Funciones
7. Cualquier bolita nos deja bien
function hayAlgunaBolita(){
return(hayBolitas(Rojo)||hayBolitas(Verde)||hayBolitas(Negro)||hayBolitas(Azul))
}
1. Fundamentos
9. Funciones
8. Siempre al borde...
function estoyEnUnBorde(){
1. Fundamentos
9. Funciones
9. Las compañeras ideales
Definí la función hayBolitasAl(direccion, color) que informe si hay alguna bolita del color
especificado en la celda vecina hacia la dirección dada.
Ojo: como ya dijimos, la última línea siempre tiene que tener un return.
Mover (direccion)
return (nroBolitas(color)>0)
Pero, ¿no era que las funciones eran puras y no tenían efecto real? ¿Qué
pasa si una función hace BOOM?
Hagamos la prueba: vamos a probar la función hayBolitasAl del ejercicio anterior con
casos donde no pueda moverse el cabezal. Presioná Enviar y mirá el resultado.
MoverN(distancia,direccion)
return(hayBolitas(color))
1. Fundamentos
9. Funciones
12. Estoy rodeado de viejas bolitas
function estoyRodeadoDe(color){
return(hayBolitasAl(Norte,color)&&hayBolitasAl(Sur,co
return(hayBolitasAl(Norte,color)&&hayBolitasAl(Sur,color)&&hayBolitasAl(Este,color)&&hayBo
lor)&&hayBolitasAl(Este,color)&&hayBo
litasAl(Oeste,color))
return (estoyRodeadoDe(Rojo)||estoyEnUnBorde())
2. Programación Imperativa
2. Programación Imperativa
1. Funciones y tipos de datos
Sin embargo, en los programas "reales" rara vez trabajamos con tableros
y bolitas de colores: la programación va más allá de eso. ¿Cómo es
entonces esto de vivir fuera del tablero?
¡Acompañanos!
2. Programación Imperativa
1. Funciones y tipos de datos
¡Acompañanos!
function versosMartinFierro() {
imprimir("Aquí me pongo a cantar");
imprimir("Al compás de la vigüela;");
imprimir("Que el hombre que lo desvela");
imprimir("Una pena extraordinaria");
}
function versosMartinFierro() {
Ejercicio 5: ¿Y el program?
Ahora bien, más allá de que podamos consultar el resultado de una
función a través de la consola, también aprendimos anteriormente que los
programas tienen un punto de entrada: el program. ¿Dónde quedó?
imprimir("Hola, mundo!");
O si queremos un programa que tire tres veces los dados e imprima sus
resultados, podemos escribirlo así:
imprimir("Tirando dados");
imprimir("La primera tirada dio " + tirarDado());
imprimir("La segunda tirada dio " + tirarDado());
imprimir("La tercera tirada dio " + tirarDado());
imprimir("Tirando dados");
2. Programación Imperativa
3. Variables y procedimientos
Ejercicio 6: Coerciones
Volvamos un momento al código anterior. ¿Notás algo extraño en esta
expresión?
Veamos si queda claro, definí una función elefantesEquilibristas, que tome un número
de elefantes y devuelva una rima de una conocida canción:
> elefantesEquilibristas(3)
"3 elefantes se balanceaban"
> elefantesEquilibristas(462)
"462 elefantes se balanceaban"
function elefantesEquilibristas(numero){
return 2*pi*radio;
function areaCirculo(radio){
return pi*radio*radio;
function sumaSinSentido() {
return numero + 8;
}
function pasarUnDiaNormal() {
diasSinAccidentesConVelociraptores = diasSinAccidentesConVelociraptores + 1
}
function tenerAccidenteConVelociraptores() {
diasSinAccidentesConVelociraptores = 0;
}
pesosEnMiBilletera=pesosEnMiBilletera*2;
2. Programación Imperativa
3. Variables y procedimientos
function cuentaExtravagante() {
let numero = 8;
numero *= 2;
numero += 4;
Necesitamos una función que diga cuánta plata queda en tu cuenta (que
tiene un cierto saldo) si extráes un cierto monto:
Como ves, esto es casi una resta entre saldo y monto, con la salvedad de
que estamos poniendo un tope inferior:: no puede dar menos de cero .
return Math.max(saldo-monto,0);
monto,0);
2. Programación Imperativa
1. Funciones y tipos de datos
function esDiaFavorito(diaDelMes
diaDelMes) {
return diaDelMes === 1 ;
}
> esDiaFavorito(13)
false
> esDiaFavorito(1)
true
¡Ahora te toca a vos! Dani también dice que a alguien leGustaLeer, cuando la
cantidad de libros que recuerda haber leído es mayor a 20. Por ejemplo:
> leGustaLeer(15)
false
> leGustaLeer(45)
true
function leGustaLeer(cantLibros){
return cantLibros>20;
true
false
false
True
¿Y qué podemos hacer con los strings? Por ejemplo, compararlos, como a
cualquier otro valor:
Veamos si queda claro: definí la función esFinDeSemana que tome un string que
represente el nombre de un día de la semana, y nos diga si es "sábado" o "domingo".
> esFinDeSemana("sábado")
true
> esFinDeSemana("martes")
false
function esFinDeSemana(dia){
2. Programación Imperativa
1. Funciones y tipos de datos
> longitud("biblioteca")
10
> longitud("babel")
5
function longitudNombreCompleto(nombre,apellido){
return longitud(nombre)+longitud(apellido)+1;
}
Ejercicio 11: ¡GRITAR!
Una conocida banda, para agregar gritos varios a su canción, nos pidió
definir la función gritar, que toma un string y lo devuelve en mayúsculas y
entre signos de exclamación.
Por ejemplo:
> gritar("miguel")
"¡MIGUEL!"
> gritar("benito")
"¡BENITO!"
Definí la función gritar. Te dejamos para que uses la función convertirEnMayuscula, que,
ehm... bueno... básicamente convierte en mayúsculas un string .
function gritar(palabra){
return "¡"+convertirEnMayuscula(palabra)+"!";
2. Programación Imperativa
1. Funciones y tipos de datos
//Equivalente a Math.abs
function valorAbsoluto(unNumero
unNumero) {
if (unNumero >= 0) {
return unNumero;
} else {
return -unNumero;
}
}
Veamos si se entiende: definí la función maximo, que funcione como Math.max (¡no
vale usarla!) y retorne el máximo entre dos números. Por ejemplo, el máximo entre
4 y 5 es 5, y el máximo entre 10 y 4, es 10.
Agus se olvida siempre de como tiene que cuidar sus plantas , por eso
definió la función cuidadoSegun(dia) que le recuerda que los lunes tiene que
fertilizarlas, los viernes las tiene que fumigar y el resto de los días las tiene
que regar.
function cuidadoSegun(dia) {
if (dia === "lunes") {
return "fertilizar";
} else if (dia === "viernes") {
return "fumigar";
} else {
return "regar";
}
}
¡Ahora te toca a vos! Definí la función signo, que dado un número nos retorne:
1 si el número es positivo
0 si el número es cero
-1 si el número es negativo
function signo(numero){
if (numero<0){
return -1;
else if (numero===0){
return 0;
else {
return 1;
2. Programación Imperativa
1. Funciones y tipos de datos
function esMayorDeEdad(edad) {
if (edad >= 18) {
return true;
} else {
return false;
}
}
function esMayorDeEdad(edad) {
return edad >= 18;
}
Mucho más simple, ¿no?
es positivo, y
es menor a 100, y
no es el 15.
return numero>0&&numero<100&&numero!==15;
2. Programación Imperativa
1. Funciones y tipos de datos
Ejemplo:
> medallaSegunPuesto(1)
"oro"
> medallaSegunPuesto(5)
"nada"
if (puesto===1){
return "oro"
else if (puesto===2){
return "plata"
else if(puesto===3){
return "bronce"
else {
return "nada"
2. Programación Imperativa
1. Funciones y tipos de datos
Además, existen operaciones que sirven para todos los tipos de datos
datos, por
ejemplo:
2. Programación Imperativa
1. Funciones y tipos de datos
Ejercicio
jercicio 17: Datos de todo tipo
Uff, ¡vimos un montón de cosas! Aprendimos sobre la sintaxis de las
funciones en JavaScript, los tipos de datos y sus operaciones, e incluso
conocimos uno nuevo: los strings.
2. Programación Imperativa
1. Funciones y tipos de datos
¡Acompañanos!
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
Ejercicio 1: Comprando Hardware
Queremos comprar una computadora nueva , y nos gustaría saber cuánto
nos va a salir. Sabemos que:
> cuantoCuesta(25, 8)
4100
function cuantoCuesta(pulgadas,memoria){
return (pulgadas*60)+(memoria*200)+1000;
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
> meConviene(25, 8)
false // porque el monitor es demasiado chico
> meConviene(42, 12)
true // cumple las tres condiciones
return cuantoCuesta(pulgadas,memoria)<6000&&pulgadas>=32&&memoria>=8;
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
Ejercicio 3: Triangulos
¡Hora de hacer un poco de geometría! Queremos saber algunas cosas
sobre un triángulo:
return base+altura+hipotenusa;
function areaTriangulo(base,altura){
return (base*altura)/2;
}
Ejercicio 4: Cuadrados
Y ahora es el turno de los cuadrados; queremos saber
function perimetroCuadrado(lado){
return lado*4;
function areaCuadrado(lado){
return lado*lado;
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
> estaAfinado(440)
true
return frecuencia===440;
estaCerca(443)
true //está en el rango 437-443
estaCerca(442)
true //ídem caso anterior
estaCerca(440)
false //está en el rango,
//pero es exactamente 440
estaCerca(430)
false //está fuera del rango
function estaCerca(frecuencia){
return frecuencia<444&&frecuencia>436&&frecuencia!==440;
function escribirCartelito(titulo,nombre,apellido){
1. el título;
2. el nombre;
3. el apellido;
4. un booleano que nos indique si queremos un cartelito corto con
sólo título y apellido, o uno largo, como hasta ahora.
// cartelito corto
> escribirCartelito("Lic.", "Tomás", "Peralta", true)
"Lic. Peralta"
// cartelito largo
> escribirCartelito("Ing.", "Dana", "Velázquez", false)
"Ing. Dana Velázquez"
Solución
Biblioteca
Consola
1
//modificá esta función
2
function escribirCartelito(titulo,nombre,apellido,booleano){
3
if (!booleano){
4
return titulo+" "+nombre+" "+apellido;
5
} else {
6
return titulo+" "+apellido;
7
}
8
}
Enviar
¡Muy bien! Tu solución pasó todas las pruebas
function escribirCartelito(titulo,nombre,apellido,booleano){
if (!booleano){
} else {
}
}
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
function escribirCartelitoOptimo(titulo,nombre,apellido){
return escribirCartelito(titulo,nombre,apellido,longitud(nombre)+longitud(apellido)>15)
escribirCartelito(titulo,nombre,apellido,longitud(nombre)+longitud(apellido)>15)
}
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
Es allí que tomamos una moneda y decimos: si sale cara, comemos pizzas,
si no, empanadas.
Definí una función decisionConMoneda, que toma tres res parámetros y retorna el segundo
si el primero es "cara", o el tercero, si sale "ceca". Por ejemplo:
function decisionConMoneda(suerte,opcion1,opcion2){
if (suerte==="cara"){
return opcion1;
}else {
return opcion2;
}
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
> valorEnvido(12)
0
> valorEnvido(3)
3
if(carta>=1&&carta<=9){
return carta;
} else {
return 0;
}
2. Programación Imperativa
2. Práctica Funciones y Tipos de Datos
Si las dos cartas son del mismo palo, el valor del envido es la suma
de sus valores de envido más 20.
De lo contrario, el valor del envido es el mayor valor de envido
entre ellas.
function puntosDeEnvidoTotales(valor1,palo1,valor2,palo2){
if (palo1===palo2){
return valorEnvido(valor1)+valorEnvido(valor2)+20;
} else {
return Math.max(valorEnvido(valor1),valorEnvido(valor2));
}
Ejercicio 13: ¡Quiero vale cuatro!
Cuando se juega al truco, los equipos oponentes alternativamente
pueden subir la apuesta. Por ejemplo, si un jugador canta truco, otro
jugador puede cantarle retruco.. Obviamente, los puntos que están en
juego son cada vez mayores:
> valorCantoTruco("retruco")
3
Asumí que sólo te van a pasar como argumento un string que represente un canto
de truco. Por ejemplo, no vamos a probar la función para el
caso valorCantoTruco("zaraza")
function valorCantoTruco(canto){
if (canto==="truco"){
return 2;
} else if (canto==="retruco"){
return 3;
} else {
return 4;
2. Programación Imperativa
3. Variables y procedimientos
Ejercicio 1: ¿Y el tablero?
Hasta ahora en esta película hay un gran personaje que está faltando: el
tablero. Seguro está por aparecer, de forma triunfal y rimbombante...,
¿no?
1. El tablero nos servía para ver lo que nuestro programa hacía y qué
resultados generaba. Nos permitía también observar los cambios
de estado a causa del programa. Pero ahora ya tenemos
experiencia suficiente como para lanzarnos a programar sin tener
que "ver" lo que sucede.
2. Ahora contamos con la consola: una herramienta poderosa que
nos permite hacer pruebas más detalladas y flexibles.
¿No nos creés? Te presentamos un desafío: usando la consola, decí con tus propias
palabras qué hace la función funcionMisteriosa, que recibe dos números enteros como
argumentos.
¡Vas a ver que podés averiguarlo sin tener un tablero!
>
function funcionEgocentrica() {
imprimir("soy una función que imprime por pantalla");
imprimir("y estoy por devolver el valor 5");
return 5;
}
Sin embargo, sólo podemos escribir strings y, una vez que escribimos en
la pantalla, no hay vuelta atrás: no hay forma de retroceder o deshacer.
Solución
Consola
1
function versosMartinFierro() {
2
imprimir ("Aquí me pongo a cantar\nAl compás de la vigüela;\nQue el hombre que lo desvela\nUna
pena extraordinaria");
3
return 0;
4
5
}
6
Enviar
return 0;
¡De la misma forma que las funciones!: usando la palabra clave function.
function versosMartinFierro() {
imprimir("Aquí me pongo a cantar");
imprimir("Al compás de la vigüela;");
imprimir("Que el hombre que lo desvela");
imprimir("Una pena extraordinaria");
}
function versosMartinFierro() {
Ejercicio 5: ¿Y el program?
Ahora bien, más allá de que podamos consultar el resultado de una
función a través de la consola, también aprendimos anteriormente que los
programas tienen un punto de entrada: el program. ¿Dónde quedó?
imprimir("Hola, mundo!");
O si queremos un programa que tire tres veces los dados e imprima sus
resultados, podemos escribirlo así:
imprimir("Tirando dados");
imprimir("La primera tirada dio " + tirarDado());
imprimir("La segunda tirada dio " + tirarDado());
imprimir("La tercera tirada dio " + tirarDado());
imprimir("Tirando dados");
2. Programación Imperativa
3. Variables y procedimientos
Ejercicio 6: Coerciones
Volvamos un momento al código anterior. ¿Notás algo extraño en esta
expresión?
Veamos si queda claro, definí una función elefantesEquilibristas, que tome un número
de elefantes y devuelva una rima de una conocida canción:
> elefantesEquilibristas(3)
"3 elefantes se balanceaban"
> elefantesEquilibristas(462)
"462 elefantes se balanceaban"
function elefantesEquilibristas(numero){
Considerando
erando al número pi igual a 3.14159265358979 (no es infinito pero lo
suficientemente preciso para nuestros cáculos):
return 2*3.14159265358979*radio;
function areaCirculo(radio){
return 3.14159265358979*radio*radio;
2. Programación Imperativa
3. Variables y procedimientos
return 2*pi*radio;
function areaCirculo(radio){
return pi*radio*radio;
function sumaSinSentido() {
return numero + 8;
}
function cuentaExtravagante(unNumero) {
let elDoble = unNumero * 2;
if (elDoble > 10) {
return elDoble;
} else {
return 0;
}
}
function puedeLlevar(pesoEquipaje) {
return pesoEquipaje <= pesoMaximoEquipajeEnGramos;
}
Veamos si queda claro: definí una función ascensorSobrecargado, que toma una
cantidad de personas y retorna si entre todas superan la carga máxima de 300 kg.
Tené en cuenta que nuestra función va a utilizar dos variables globales:
function ascensorSobrecargado(cantper){
return pesoPromedioPersonaEnKilogramos*cantper>cargaMaximaEnKilogramos;
}
function pasarUnDiaNormal() {
diasSinAccidentesConVelociraptores = diasSinAccidentesConVelociraptores + 1
}
function tenerAccidenteConVelociraptores() {
diasSinAccidentesConVelociraptores = 0;
}
pesosEnMiBilletera=pesosEnMiBilletera*2;
2. Programación Imperativa
3. Variables y procedimientos
function cuentaExtravagante() {
let numero = 8;
numero *= 2;
numero += 4;
return numero;
}
¿Y esto para qué sirve? Por ejemplo, para modelar casos de alternancia
como prender y apagar una luz :
function apretarInterruptor() {
lamparaPrendida = !lamparaPrendida;
}
Definí el procedimiento usarCierre para que podamos abrir y cerrar el cierre de una
mochila.
function usarCierre(){
mochilaAbierta= !mochilaAbierta;
2. Programación Imperativa
4. Lógica booleana
2. Negar no cuesta nada
Por ejemplo, si contamos con una función esPar, basta con negarla para
saber si un número es impar.
function esImpar(numero) {
return !esPar(numero);
}
return edad>=18;
function esMenorDeEdad(edad){
return !esMayorDeEdad(edad);
return prof==="filósofo"&&nacio==="griego"&&km>2;
A B A^B
V V V
V F F
F V F
F F F
En el mundo de la lógica estas expresiones se llaman proposiciones. Pero…
¿qué cosas pueden ser una proposición? Sólo hace falta que porten un
valor de verdad, es decir, cualquier expresión booleana puede ser una
proposición.
¿No nos creés? Probá en la consola la función consumePocaEnergia, que recibe una
temperatura y una cantidad de lamparitas, y comprobá si se comporta como en la
tabla:
> consumePocaEnergia(24, 5)
> consumePocaEnergia(24, 0)
> consumePocaEnergia(21, 7)
> consumePocaEnergia(18, 1)
False
> esTonoClaro('rojo')
false
RESOLUCION
> esTonoClaro('blanco')
True
return
(!esTonoClaro(colorletra)&&esTonoClaro(colorfondo))||(esTonoClaro(colorletra)&&!esTonoCl
aro(colorfondo));
}
2. Programación Imperativa
4. Lógica booleana
8. La verdad es que no hay una verdad
la letra tiene tono claro el fondo tiene tono claro tiene contraste
return boolean1===!boolean2;
2. Programación Imperativa
4. Lógica booleana
10. Precedencia
5 * 3 + 8 / 4 - 3 = 14
return
(bebida==="té"&&temp>=95&&boolean)||(bebida==="mate"&&temp===80&&boolean);
}
> puedeSubirse(1.7, false, true)
function puedeSubirse(altura,boolean1,boolean2){
return
((altura<=alturaminimasola&&altura>=alturaminimaacomp)&&boolean1&&!boolean2)||(altur
a>=alturaminimasola&&!boolean1&&!boolean2);
seriesFavoritasDeAna
seriesFavoritasDeHector
["hola","mundo!"]
["hola","hola"]
2. Programación Imperativa
5. Listas
2. Y esto, es una lista
Ejercicio 2: Y esto, es una lista
Lo que acabamos de ver es cómo modelar fácilmente conjuntos de cosas.
Mediante el uso de [], en JavaScript contamos con una manera simple de
agrupar esos elementos en listas.
¿Acaso hay una cantidad máxima de elementos? ¡No, no hay límite! Las
listas pueden tener cualquier cantidad de elementos.
remover(unaLista,elemento);
agregar(otraLista,elemento)
otraLista,elemento)
2. Programación Imperativa
5. Listas
8. ¿Y dónde está?
posicion(diasLaborales, "osvaldo")
Ejercicio 9: Contiene
¡Ahora te toca a vos!
Definí la función contiene que nos diga si una lista contiene un cierto elemento.
> mesesDelAnio[0]
"enero"
> ["ese", "perro", "tiene", "la", "cola", "peluda"][1]
"perro"
¡Ojo! El número que le pases, formalmente llamado índice índice, debe ser
menor a la longitud de la lista, o cosas malas pueden suceder.
2. Programación Imperativa
5. Listas
11. Más premios
Teniendo
endo esto en cuenta, va un desafío: definí nuevamente la
función medallaSegunPuesto, pero esta vez usando como máximo un único if. Quizás
las listas te pueden ser útiles acá .
Te recordamos qué hace la función: tiene que devolver la medalla que le
correspondende a los primeros puestos de una competencia.
> medallaSegunPuesto(1)
"oro"
> medallaSegunPuesto(2)
"plata"
> medallaSegunPuesto(3)
"bronce"
> medallaSegunPuesto(4)
"nada"
> medallaSegunPuesto(5)
"nada"
return unaLista[puesto-1];
Imaginémonos que tenemos una lista con los precios de los productos
que compramos en el supermercado y queremos restar cada uno de ellos
a plataEnBilletera . Usando for podemos hacerlo así:
Si teníamos $500 en nuestra billetera, después del for nos van a quedar
$303 porque:
function saludar(personas) {
2. Programación Imperativa
6. Registros
1. Los primeros registros
nombreEstatuaDeLaLibertad = "Estatua
" de la Libertad";
locacionEstatuaDeLaLibertad = "Nueva York";
anioDeConstruccionEstatuaDeLaLibertad = "1886";
nombreCristoRedentor = "Cristo
Cristo Redentor";
Redentor
locacionCristoRedentor = "Rio
Rio De Janeiro";
Janeiro
anioDeConstruccionCristoRedentor = "1931";
estatuaDeLaLibertad
cristoRedentor
torreEiffel
tajMahal
coliseo
Por ejemplo, podríamos almacenar un libro de modo que cada campo del
registro fuese alguna característica: su título, su autor, su fecha de
publicación, y más.
> tajMahal
{ nombre: "Taj Mahal", locacion: "Agra, India", anioDeConstruccion: 1653 }
> tajMahal.locacion
"Agra, India"
> tajMahal.anioDeConstruccion
1653
Declaramos los planetas mercurio, marte y saturno como registros con la siguiente
información: nombre, temperaturaPromedio y si tieneAnillos. ¡Probalos en la consola!
> temperaturaDePlaneta(mercurio)
"Mercurio tiene una temperatura promedio de 67 grados"
> temperaturaDePlaneta(saturno)
"Saturno tiene una temperatura promedio de -139 grados"
> temperaturaDePlaneta(venus)
"Venus tiene una temperatura promedio de 462 grados"
saturno.temperaturaPromedio = -140;
> leeme
{ ruta: "C:\leeme.txt", creacion: "23/09/2004" }
> leeme
{ ruta: "C:\documentos\leeme.txt", creacion: "23/09/2004" }
registro.ruta=ruta
function esDelMilenioPasado(archivo){
return anio(archivo.creacion)<"2000";
}
Ejercicio 7: Postres complejos
Unos ejercicios atrás te contamos la diferencia entre listas y registros.
¡Pero eso no significa que no podamos usar ambas estructuras a la vez!
Por ejemplo, una lista puede ser el campo de un registro. Mirá estos
registros de postres, de los cuales sabemos cuántos minutos de cocción
requieren y sus ingredientes:
function masDificilDeCocinar(regPostre1,regPostre2){
if(longitud(regPostre1.ingredientes)>longitud(regPostre2.ingredientes)){
return regPostre1;
}else {
return regPostre2;
Definí el procedimiento agregarAPostresRapidos, que toma una lista con postres rápidos
y un postre por parámetro. Si el tiempo de cocción es de una hora o menos, se
agrega el registro a la lista.
function agregarAPostresRapidos(lisPost,regPostre){
if (regPostre.tiempoDeCoccion<=60){
agregar(lisPost,regPostre)
function endulzarMenu(regMenu){
agregar(regMenu.postre.ingredientes,"azúcar");
function gananciaSemestre(balances) {
return balances[0].ganancia + balances[1].ganancia +
balances[2].ganancia + balances[3].ganancia +
balances[4].ganancia + balances[5].ganancia;
}
"Gracias ", nos dijo Ana, y se fue calcular las ganancias usando la función
que le pasamos. Pero un rato más tarde, volvió contándonos que también
había registrado los balances del primer trimestre de este año:
Y nos preguntó: "¿Podría usar esta función que me dieron para calcular las
ganancias del primer trimestre?".
function gananciaTotal0(balancesDeUnPeriodo) {
let sumatoria = 0;
return sumatoria;
}
function gananciaTotal1(balancesDeUnPeriodo) {
let sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
return sumatoria;
}
¿Y si tuviera 2 elementos?
function gananciaTotal2(balancesDeUnPeriodo) {
let sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[1].ganancia;
return sumatoria;
}
¿Y si tuviera 3 elementos?
function gananciaTotal3(balancesDeUnPeriodo) {
let sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[1].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[2].ganancia;
return sumatoria;
}
function gananciaTotal4(balancesDeUnPeriodo) {
let sumatoria = 0;
return sumatoria;
if (balance.ganancia>0){
cantidad=cantidad+1;
return cantidad;
> gananciaPromedio([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
9
function gananciaPromedio(balancesDeUnPeriodo){
return (gananciaTotal(balancesDeUnPeriodo)/longitud(balancesDeUnPeriodo));
function gananciaPositiva(balancesDeUnPeriodo){
let sumatoria = 0;
if (balance.ganancia>0){
sumatoria=sumatoria+balance.ganancia;
return sumatoria;
function promedioGananciasPositivas(balancesDeUnPeriodo){
return
(gananciaPositiva(balancesDeUnPeriodo)/cantidadDeBalancesPositivos(balancesDeUnPeriodo)
)
Completá la función ganancias que toma una lista de balances y devuelve una lista
que solo posea solo las ganancias de cada uno.
> ganancias([
{ mes: "enero", ganancia: 40 },
{ mes: "febrero", ganancia: 12 },
{ mes: "marzo", ganancia: 8}
])
[40, 12, 8]
function ganancias(balancesDeUnPeriodo) {
agregar(ganancias,balance.ganancia);
return ganancias;
if(balance.ganancia>0){
agregar(balances,balance);
return balances;
}
E jercicio 10: Un promedio más positivo
Ahora que tenemos la función ganancias y balancesPositivos podemos utilizar
la función promedio genérica para saber cuál es el promedio de ganancia
de los balances positivos.
let ganancias=[];
for
agregar(ganancias,balance.ganancia );
return ganancias;
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
Usando esta nueva función, definí la función maximaGanancia que nos diga cuál es la
ganancia más alta entre los balances de un período de tiempo.
> maximaGanancia([
{ mes: "enero", ganancia: 87 },
{ mes: "febrero", ganancia: 12 },
{ mes: "marzo", ganancia: 8}
Definí la función minimaGananciaPositiva que nos diga cuál es la ganancia más baja de
todos los balances positivos.
> minimaGananciaPositiva([
{ mes: "enero", ganancia: -40 },
{ mes: "febrero", ganancia: 42 },
{ mes: "marzo", ganancia: 8},
{ mes: "abril", ganancia: -5}
])
8
return minimo(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
meses, la cual dada una lista con registros devuelve una lista de
meses ;
afortunados, que filtra aquellos registros que tuvieron una ganancia
mayor a $1000 ;
mesesAfortunados, devuelve aquellos meses que fueron afortunados.
> meses([
{ mes: "enero", ganancia: 870 },
{ mes: "febrero", ganancia: 1000 },
{ mes: "marzo", ganancia: 1020 },
{ mes: "abril", ganancia: 2300 },
{ mes: "mayo", ganancia: -10 }
])
["enero", "febrero", "marzo", "abril", "mayo"]
> afortunados([
{ mes: "enero", ganancia: 870 },
{ mes: "febrero", ganancia: 1000 },
{ mes: "marzo", ganancia: 1020 },
{ mes: "abril", ganancia: 2300 },
{ mes: "mayo", ganancia: -10 }
])
[ { mes: "marzo", ganancia: 1020 }, { mes: "abril", ganancia: 2300 }]
> mesesAfortunados([
{ mes: "enero", ganancia: 870 },
{ mes: "febrero", ganancia: 1000 },
{ mes: "marzo", ganancia: 1020 },
{ mes: "abril", ganancia: 2300 },
{ mes: "mayo", ganancia: -10 }
])
["marzo", "abril"]
function meses(regMeses){
let meses=[];
agregar(meses,estemes.mes);
return meses;
function afortunados(regMeses){
let afortunados=[];
if (mesrico.ganancia>1000){
agregar(afortunados,mesrico);
return afortunados;
function mesesAfortunados(regMeses){
let mesesAfortunados=[];
agregar(mesesAfortunados,supermes);
}
return mesesAfortunados;
3. Programación con Objetos
1. Objetos y mensajes
1. Fijando nuestro
tro objetivo
Pepita.comer_lombriz!
Pepita.comer_lombriz!
Pepita.comer_lombriz!
Pepita.volar_en_circulos!
3. Programación con Objetos
1. Objetos y mensajes
12. ¿Quién te entiende?
¿Pero podría haber más de un objeto que entienda los mismos mensajes?
A Pepita ya la conocemos bien: canta, come, etc. Su amiga Norita, por otro lado, no
aprendió nunca a decirnos su energía. Y Mercedes es una reconocida cantora.
Usando
sando la consola, averiguá cuál es la interfaz de cada una de ellas, y completá el
listado de mensajes que cada una entiende en el editor.
interfaz_pepita = %w(
energia
cantar!
comer_lombriz!
volar_en_circulos!
interfaz_norita = %w(
cantar!
comer_lombriz!
volar_en_circulos!
)
interfaz_mercedes = %w(
cantar!
3. Programación con Objetos
1. Objetos y mensajes
13. Interfaces compartidas