Está en la página 1de 247

Capítulo 2: Programación Imperativa

¿Ya estás para salir del tablero? ¡Acompañanos a aprender más


sobre programación imperativa y estructuras de datos de la mano del
lenguaje JavaScript!

Lecciones
1. Funciones y tipos de datos

  1. Introducción a JavaScript


  2. Funciones, definición
  3. Funciones, uso
  4. Probando funciones
  5. Haciendo cuentas
  6. Poniendo topes
  7. Libros de la buena memoria
  8. Booleanos
  9. Palabras, sólo palabras
  10. Operando strings
  11. ¡GRITAR!
  12. ¿Y qué tal si...?
  13. ¿De qué signo sos?
  14. El retorno del booleano
  15. Los premios
  16. Tipos de datos
  17. Datos de todo tipo

2. Práctica Funciones y Tipos de Datos

  1. Comprando Hardware


  2. ¿Me conviene?
  3. Triangulos
  4. Cuadrados
  5. ¿Está afinado?
  6. ¿Está cerca?
  7. Cartelitos
  8. Más Cartelitos
  9. Cartelitos óptimos
  10. Cara o ceca
  11. ¡Envido!
  12. ¡Quiero retruco!
  13. ¡Quiero vale cuatro!

3. Variables y procedimientos

  1. ¿Y el tablero?
  2. Impresión por pantalla
  3. Martin Fierro
  4. ¿Y los procedimientos?
  5. ¿Y el program?
  6. Coerciones
  7. El círculo de la vida
  8. PIenso que así es más fácil
  9. Esto no tiene valor
  10. Variables globales
  11. La buena fortuna
  12. ¿Y esto cuánto vale?

4. Lógica booleana

  1. ¡Que el último apague la luz!


  2. Negar no cuesta nada
  3. Los peripatéticos
  4. La verdad detrás de la conjunción
  5. ¡Juguemos al T.E.G.!
  6. Y ahora... ¿quién podrá ayudarnos?
  7. ¡Buen día!
  8. La verdad es que no hay una verdad
  9. ¡Hola! Mi nombre es Xor
  10. Precedencia
  11. Un ejercicio sin precedentes
  12. ¿Puedo subir?
5. Listas

  1. Series favoritas


  2. Y esto, es una lista
  3. Juegos de azar
  4. Listas vacías
  5. ¿Cuántos elementos tenés?
  6. Agregando sabor
  7. Trasladar
  8. ¿Y dónde está?
  9. Contiene
  10. Enésimo elemento
  11. Más premios
  12. No te olvides de saludar

6. Registros

  1. Los primeros registros


  2. Tu propio monumento
  3. Accediendo al campo
  4. Temperatura de planeta
  5. Moviendo archivos
  6. Registros de dos milenios
  7. Postres complejos
  8. Listas de registros
  9. 60 dulces minutos
  10. Hay un registro en mi registro
  11. ¡Azúcar!

7. Recorridos

  1. Las ganancias semestrales


  2. ¿Y el resto de las ganancias?
  3. Todas las ganancias, la ganancia
  4. Nos visita un viejo amigo
  5. Cuentas claras
  6. La ganancia promedio
  7. Quién gana, quién pierde
  8. Soy el mapa, soy el mapa
  9. A filtrar, a filtrar cada cosa en su lugar
  10. Un promedio más positivo
  11. Esto es lo máximo
  12. Como mínimo
  13. Los mejores meses del año

Apéndice
¿Querés saber más? Consultá el apéndice de este capítulo

Funciones y tipos de datos


¡Hola! Quizás no te diste cuenta pero ya tenés las bases de la programación:
ya sabés declarar funciones y procedimientos, usar variables, tomar
decisiones empleando la estructura de control if, hacer tareas múltiples
veces. 

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?

Para responder esta pregunta, primero nos adentraremos en el mundo de


JavaScript, un lenguaje muy popular que no tiene tablero, pero en el que de
todas formas podremos aplicar todo lo visto hasta ahora y descubrir nuevas
ideas y formas de resolver problemas 

¡Acompañanos!

Ejercicios

  1. Introducción a JavaScript


  2. Funciones, definición
  3. Funciones, uso
  4. Probando funciones
  5. Haciendo cuentas
  6. Poniendo topes
  7. Libros de la buena memoria
  8. Booleanos
  9. Palabras, sólo palabras
  10. Operando strings
  11. ¡GRITAR!
  12. ¿Y qué tal si...?
  13. ¿De qué signo sos?
  14. El retorno del booleano
  15. Los premios
  16. Tipos de datos
  17. Datos de todo tipo

Ejercicio 1: Introducción a JavaScript


¿Ya te cansaste de jugar con bolitas de colores?  Tenemos una buena noticia.
En este capítulo vamos a aprender programación imperativa de la mano de
uno de los lenguajes de programación más utilizados de la industria del
software: JavaScript.

Ejercicio 2: Funciones, definición


Gobstones y JavaScript tienen mucho en común. Por ejemplo, en ambos
lenguajes podemos definir funciones y usarlas muchas veces.

Sin embargo, como siempre que aprendas un lenguaje nuevo, te vas a topar
con un pequeño detalle: tiene una sintaxis diferente . La buena noticia es
que el cambio no será tan terrible como suena, así que veamos nuestra
primera función JavaScript:

function doble(numero) {
return 2 * numero;
}

Diferente, pero no tanto. Si la comparás con su equivalente Gobstones...

function doble(numero) {
return (2* numero)
}
...notarás que los paréntesis en el return no son necesarios, y que la última
línea la terminamos con ; .
Veamos si se va entendiendo: definí ahora la función mitad, que tome un número
por parámetro y retorne su mitad. Tené en cuenta que el operador de división en
JavaScript es /.
 ¡Dame una pista!

Para saber la mitad de un número debemos dividirlo por 2. ¡Cuidado!  No es


lo mismo hacer un número dividido 2 que 2 dividido ese número. Por
ejemplo:

10/2
5
2/10
0.2

CONSOLA
function mitad(numero){ return(1/2*numero)}
=> <function>
Solución
function mitad(numero){ return(1/2*numero)}
¡Muy bien! Tu solución pasó todas las pruebas

Perfecto, ¿viste que no era tan terrible? 

Si no le pusiste ; al final de la sentencia habrás visto que funciona igual. De


todas formas ponelo, ya que de esa manera evitamos posibles problemas.

function mitad(numero){ return(1/2*numero); }


Siempre que aprendamos un lenguaje nuevo vamos a tener que aprender
una nueva sintaxis. Sin embargo y por fortuna, si tenés los conceptos claros,
no es nada del otro mundo .
Aprendamos ahora a usar estas funciones.

Ejercicio 3: Funciones, uso


¿Y esto con qué se come? Digo, ehm.... ¿cómo se usan estas funciones?
¿Cómo hago para pasarles argumentos y obtener resultados?
Basta con poner el nombre de la función y, entre paréntesis, sus argumentos.
¡Es igual que en Gobstones!

doble(3)

Y además podemos usarlas dentro de otras funciones. Por ejemplo:

function doble(numero) {
return 2 * numero;
}

function siguienteDelDoble(numero) {
return doble(numero) + 1;
}

O incluso mejor:

function doble(numero) {
return 2 * numero;
}

function siguiente(numero) {
return numero + 1;
}

function siguienteDelDoble(numero) {
return siguiente(doble(numero));
}

Veamos si se entiende; definí las siguientes funciones:

 anterior: toma un número y devuelve ese número menos uno


 triple: devuelve el triple de un número
 anteriorDelTriple, que combina las dos funciones anteriores: multiplica a un
número por 3 y le resta 1
SOLUCION MIA PARA MEJORAR
function anterior(numero) {
return numero - 1;
}
function triple(numero) {
return 3 * numero;
}

function anteriorDelTriple(numero) {
return triple(numero) - 1;
}
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:

  anteriorDelTriple debe utilizar anterior

Resultados de las pruebas:

  anterior anterior(1) es 0
  anterior anterior(10) es 9
  triple triple(1) es 3
  triple triple(3) es 9
  anteriorDelTriple anteriorDelTriple(1) es 2
  anteriorDelTriple anteriorDelTriple(3) es 8
  anteriorDelTriple anteriorDelTriple(10) es 29

solución mia con error


function anterior(numero) {
return numero - 1;
}
function triple(numero) {
return 3 * numero;
}
Aca tendria que haber puesto asi
function anterior(numero) { function anteriorDelTriple(numero) {
return triple(numero) - 1; return (anterior(triple(numero)));
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:

  anteriorDelTriple debe utilizar triple
  anteriorDelTriple debe utilizar anterior
  la solución debe declarar anteriorDelTriple

Problemas que encontramos:

 parece que estás usando anteriorDelTriple pero no está definido. ¿Puede


que hayas escrito mal su nombre o tengas que definirlo?

 Detalles
Resultados de las pruebas:

Resultados de las pruebas:

  anterior anterior(1) es 0 Ver detalles

2 == 0

  anterior anterior(10) es 9 Ver detalles

29 == 9

  triple triple(1) es 3
  triple triple(3) es 9
  anteriorDelTriple anteriorDelTriple(1) es 2 Ver detalles

anteriorDelTriple is not defined

  anteriorDelTriple anteriorDelTriple(3) es 8 Ver detalles

anteriorDelTriple is not defined

  anteriorDelTriple anteriorDelTriple(10) es 29 Ver detalles

anteriorDelTriple is not defined


SOLUCION CON ERROR A MEJORAR EN LA CONSULTA
function anterior(numero){
return numero-1;
}
function triple(numero){
return numero*3;
}
function anteriorDelTriple(numero){
return triple(numero)-1;
anterior(numero);

me da bien pero me dice que hay para mejorar, la funcionanteriorDelTriple


no entiendo
Juan Ignacio E.  MENTORÍA  hace 23 días
¡Hola Gustavo!
Como bien dice el enunciado del problema podemos usar funciones dentro
de otras funciones.
La función anterior que definiste toma un número y devuelve ese número
menos uno y la función triple te devuelve el triple de un número, entonces
cómo podemos combinar estas dos funciones para definir anteriorDelTriple,
que multiplica a un número por 3 y le resta 1.
Prestale atención a este ejemplo que es muy similar a la solución del
problema:

function doble(numero) {
return 2 * numero;
}

function siguiente(numero) {
return numero + 1;
}

function siguienteDelDoble(numero) {
return siguiente(doble(numero));
}

Aquí la función doble(numero) devuelve el doble de un número, siguiente(numero)


toma un número y devuelve ese número más uno y siguienteDelDoble(numero)
combina las funciones doble(numero) y siguiente(numero) pasándole como
parámetro la función doble a siguiente y de esa manera devuelve el doble de
un número y le suma 1
Solución dada en la consulta con un error expreso de poner disfunction, que
colocando function da bien
disfunction anterior(numero) {
return numero - 1;
}
function triple(numero) {
return numero * 3;
}
function anteriorDelTriple(numero) {
return (anterior(triple(numero)))
}
Jose Maria W. hace 5 meses
hola, el ejercicio lo entendi (lo escribi mal a proposito para llegar acá) El
tema es que no entiendo la sintaxis de Java, es decir, cuando llevan
mayusculas o minusculas... , porque veo que la mayoria empiezan en
minusculas y llevan inicial de palabra en mayusculas, aunque mas adelante
en mitad de este capitulo alguna empiezan con mayusculas, acaso es
obligacion o meramente personal?
Otra pregunta es que se pone en el final de cada capitulo, que recomiendan
descargar el apendice asi nos queda la teoria, etc.., pero no encontre forma
de descargarlo para su posterior impresion
alejandra A.  MENTORÍA  hace 5 meses
¡Hola, Jose! ¿Cómo estás?
Java y JavaScript son dos lenguajes de programación diferentes. Tienen en
común que ambos son lenguajes de programación C, esto significa que
están estructurados de la misma manera. Sin embargo, son muy diferentes
en cuanto a su uso y funcionamiento. El lenguaje JavaScript es utilizado
ampliamente para construir software en todo el mundo, siendo una de las
principales tecnologías de la Web y se trata de un lenguaje interpretado, es
decir que se lee y traduce línea a línea al mismo tiempo que se ejecuta el
programa. Por otro lado, Java es un lenguaje compilado: pasa por una JVM
(Java Virtual Machine) para ser interpretado y traducido al lenguaje de la
«máquina».
El estilo o convención de nonombrado que se usa para escribir nombres
compuestos por varias palabras, en Javascript suele ser el camelCase , es
uno de los más utilizados y extendidos para este lenguaje. Consiste en
escribir la primera palabra en minúsculas y luego la primera letra de cada
palabra siguiente con la primera letra en mayúsculas. Esta sería la forma más
utilizada en Javascript aunque existen otras. Te dejo un link para que si
quisieras puedas seguir investigando:
https://lenguajejs.com/javascript/introduccion/convenciones-de-nombres/
En cuanto al Apéndice, si quisieras imprimirlo haciendo click derecho (o en
Windows presionando "Ctrl + P") podrás acceder al cuadro de diálogo de
impresión.
SOLUCION CORRECTA
function anterior(numero) {
return numero - 1;
}
function triple(numero) {
return numero * 3;
}
function anteriorDelTriple(numero) {
return (anterior(triple(numero)));
}
¡Muy bien! Tu solución pasó todas las pruebas

Quizás ahora estés pensando: si no tengo un tablero, ¿cómo sé si mi función


hace lo que debe? Acompañanos...

Ejercicio 4: Probando funciones


Quizás ya lo notaste pero, junto al editor, ahora aparece una solapa nueva:
la consola.
La consola es una herramienta muy útil para hacer pruebas rápidas sobre lo
que estás haciendo: te permite, por ejemplo, probar expresiones, funciones
que vengan con JavaScript, o incluso funciones que vos definas en el
editor.
La podés reconocer fácilmente porque arranca con el chirimbolito , que se
llama prompt.
Para entender mejor cómo funciona, en qué puede ayudarnos y algunos
consejos sobre su uso, te recomendamos mirar este video.
Veamos si se entiende, probá en la consola las siguientes expresiones:
 4+5
 Math.round(4.5)
 funcionMisteriosa(1, 2, 3) (ya la definimos por vos y la podés usar)
Veamos si se entiende, probá en la consola las siguientes expresiones:
  4 + 5
=> 9
  Math.round(4.5)
=> 5
  funcionMisteriosa(1, 2, 3)
=> 9
  

Ejercicio 5: Haciendo cuentas


Además de los operadores matemáticos +, -, / y *, existen muchas otras
funciones matemáticas comunes, algunas de las cuales ya vienen con
JavaScript y están listas para ser usadas.
Sin embargo, la sintaxis de estas funciones matemáticas es apenitas diferente
de lo que veníamos haciendo hasta ahora: hay que prefijarlas con Math.. Por
ejemplo, la función que nos sirve para redondear un número es Math.round:

function cuantoSaleAproximadamente(precio, impuestos) {


return Math.round(precio * impuestos);
}

Probá en la consola las siguientes expresiones:


 Math.round(4.4)
 Math.round(4.6)
 Math.max(4, 7)
 Math.min(4, 7)
CONSOLA
  Math.round(4.4)
=> 4
  Math.round(4.6)
=> 5
  Math.max(4, 7)
=> 7
  Math.min(4, 7)
=> 4

Ejercicio 6: Poniendo topes


Hagamos un alto en nuestro camino y miremos las
funciones Math.max y Math.min, que nos pueden ahorrar más trabajo del que
parece.
Necesitamos una función que diga cuánta plata queda en tu cuenta (que
tiene un cierto saldo) si extráes un cierto monto:

// el saldo es $100, el monto a extraer, $30


extraer(100, 30)
70 //quedan $70 ($100 - $30 = $70)

Pero como no queremos quedarnos en negativo, si el monto a extraer es


mayor al saldo, nuestro saldo debe quedar en cero.

extraer(100, 120)
0 //Ups, quisimos sacar más plata de la que teníamos.
//Nos quedamos con $0

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 .
En otras palabras (¡preparate!, esto te puede volar la
cabeza ) extraer devuelve el máximo entre la resta saldo - monto y 0.
¿Te animás a completar la solución que está en el editor?
 ¡Dame una pista!
¿No te convencimos de que el máximo entre saldo - monto y 0 resuelve nuestro
problema? Compará estos ejemplos con los dos anteriores:

Math.max(100 - 30, 0)
70 // da el máximo entre 70 y 0, que es 70

Math.max(100 - 120, 0)
0 // da el máximo entre -20 y 0, que es 0

Solución
1. function extraer(saldo, monto) {
2. return Math.max(..completar.., ..completar..);
3. }

SOLUCION MIA MAL


function extraer(saldo, monto) {
return Math.max(saldo-monto), 0);
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return Math.max(saldo-monto), 0);
^

SyntaxError: Unexpected token )

Hola, hice bien el ejercicio (ahi le puse a proposito la "F" mayuscula para
poder ingresar acá) pero no entendi como probarlo en la consola

Mercedes D. hace 5 meses


Hola José Maria! Para probar el ejercicio en la consola hay que copiarlo en
ese espacio y luego presionar enter. En este caso tenes que indicar: * El
nombre de la función: extraer * El saldo de la cuenta: un valor númerico * El
monto a extraer: un valor númerico
Ej: extraer (2400,200)

OTRA SOLUCION DE LA CONSULTA CON ERROR


function extraer(saldo, monto) {
return Math.max(saldo - monto, (0))0;
}
Vicente A. hace 6 días
Buenas noches. Me dice que el resultado funciono, pero que podría mejorar.
Me evacuan la duda por favor, gracias.

Guillermo Ignacio B.  MENTORÍA  hace 5 días


¡Hola Vicente! El código está bastante bien encaminado, pero fijate que
Math.max evalúa cual es el máximo entre dos números. Tomemos los
ejemplos de la pista, en el primer ejemplo se obtiene el máximo entre 100 - 30
(es decir, 70) y 0. Fijate que cada número a evaluar está separado por coma,
el primero es una expresión (cuyo resultado es un número) y el segundo
directamente es un número. Esto sería lo mismo que decir Math.max(70, 0) y
obtenemos como resultado 70. Pasando al código vemos que el primer
número está bien, saldo - monto, pero luego hay un 0 entre paréntesis, lo cual
no debería pasar, sino que hay que usar solo 0, ya que la idea es ver el
máximo entre saldo - monto y 0. Luego por fuera de los paréntesis hay otro 0, el
cual no debería estar, por lo que también habría que borrarlo. Modificando
esto el programa debería funcionar bien.

Solución correcta

1. function extraer(saldo, monto) {


2. return Math.max(saldo - monto, 0);
3. }
¡Muy bien! Tu solución pasó todas las pruebas

¡Bien hecho! Ahora andá y probalo en la consola 

Como ves, la función Math.max nos sirvió para implementar un tope inferior.


De forma análoga, la función Math.min nos puede servir para implementar
un tope superior.

Ah, y si estás pensando “en Gobstones podría haber hecho esto con un if”,
¡tenés razón!. Pero esta solución es mucho más breve y simple .

Solución correcta

1. function extraer(saldo, monto) {


2. return Math.max(saldo - monto, 0);
3. }
Consola
  extraer(200, 150)
=> 50
  extraer(50, 100)
=> 0
   

Ejercicio 7: Libros de la buena memoria


¡Veamos más operadores! Dani ama el primer día de cada mes , y por eso
definió esta función...

function esDiaFavorito(diaDelMes) {
return diaDelMes === 1 ;
}

...y la usa así (y la dejó en la biblioteca para que la pruebes):

esDiaFavorito(13)
false
esDiaFavorito(1)
true

Como ves, en JavaScript contamos con operadores como ===, >=, >, <,<= que


nos dicen si dos valores son iguales, mayores-o-iguales, mayores, etc. Los
vamos a usar bastante .

¡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

Definí y probá en la consola la función leGustaLeer.


SOLUCION MIA CON ERROR
function leGustaLeer(librosLeidos) {
return librosLeidos === 20 ;
}

Tu solución no pasó las pruebas PORQUE NO LEI BIEN LA CONSIGNA QUE ES IGUAL O
MAYOR A 20.
Resultados de las pruebas:

  si recuerda haber leído 25 libros, le gusta leer Ver detalles

 leGustaLeer(25) debe retornar true

  si recuerda haber leído 80 libros, le gusta leer Ver detalles

 esPar(80) debe retornar true

  si recuerda haber leído 1 libro, no le gusta leer


  si recuerda haber leído 15 libros, no le gusta leer
  leGustaLeer devuelve siempre algo

CONSOLA
 leGustaLeer(15)
=> false
  leGustaLeer(20)
=> true
  leGustaLeer(30)
=> false
   
SOLUCION MIA CORRECTA
function leGustaLeer(librosLeidos) {
return librosLeidos >= 20 ;
}
Consola
 leGustaLeer(20)
=> true
  leGustaLeer(80)
=> true
  leGustaLeer(15)
=> false
¡Muy bien! Tu solución pasó todas las pruebas

¡Bien hecho!

Capaz pasó desapercibido, pero leGustaLeer devuelve true o false, es decir, es


una función que devuelve booleanos. Eso significa que en JavaScript, no sólo
hay números sino que también..... hay booleanos

Ejercicio 8: Booleanos
Ahora miremos a los booleanos con un poco más de detalle:
 Se pueden negar, mediante el operador !: !hayComida
 Se puede hacer la conjunción lógica entre dos booleanos (and,
también conocido en español como y lógico), mediante el
operador &&: hayComida && hayBebida
 Se puede hacer la disyunción lógica entre dos booleanos (or, también
conocido en español como o lógico), mediante el
operador ||: unaExpresion || otraExpresion
Veamos si se entiende; definí las siguientes funciones:
 estaEntre, que tome tres números y diga si el primero es mayor al segundo y
menor al tercero.
 estaFueraDeRango: que tome tres números y diga si el primero es menor al
segundo o mayor al tercero
Ejemplos:

estaEntre(3, 1, 10)
true
estaEntre(90, 1, 10)
false
estaEntre(10, 1, 10)
false
estaFueraDeRango(17, 1, 10)
true

SSOLUCION MIA MAL


function estaEntre(60, 40, 75) {
return 60 && 40 && 75;
estaFueraDeRango (60, 40, 75)
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:

  la solución debe declarar estaFueraDeRango


  estaFueraDeRango debe tener tres parámetros
  estaEntre tiene código inalcanzable

Resultados:

solucion.js:1
function estaEntre(60, 40, 75) {
^^
SyntaxError: Unexpected number

Solución dada en la consulta con error


function estaEntre(num, rangoMin, rangoMax){
return (num>rangoMin) && (num<rangoMax);
}
function estaFueraDeRango(num, rangoMin, rangoMax){
return !((num > rangoMin) && (num < rangoMax));
}
Buenas.
En los casos estaEntre(10,1,10) y (4,4,9)el resultado es flase y con
estaFueraDeRango(10,1,10) y (4,4,9) el resultado es true, pero la plataforma
dice que es false
Lara F.  MENTORÍA  hace 10 meses
¡Hola, Uciel! El problema está en los operadores de la función
estaFueraDeRango, fijate que la consigna nos dice : que tome tres números y
diga si el primero es menor al segundo O mayor al tercero , por lo tanto el
único operador que necesitamos será el or. También fijate que el num debe
ser menor al rangoMin (<) y mayor al rangoMax (>). Intentá con esas
modificaciones
Con las modificaciones aplicadas y no pasa las pruebas
function estaEntre(num, rangoMin, rangoMax){
return (num>rangoMin) && (num<rangoMax);
}
function estaFueraDeRango(num, rangoMin, rangoMax){
return !((num > rangoMin) || (num < rangoMax));
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  estaEntre(10, 1, 10) es false
  estaEntre(4, 4, 9) es false
  estaEntre(12, 1, 10) es false
  estaEntre(200, 54, 112) es false
  estaEntre(67, 50, 100) es true
  estaEntre(2, 1, 100) es true
  estaFueraDeRango(10, 1, 10) es false
  estaFueraDeRango(4, 4, 9) es false
  estaFueraDeRango(12, 1, 10) es true Ver detalles

 false == true

  estaFueraDeRango(200, 54, 112) es true Ver detalles

 false == true
  estaFueraDeRango(67, 0, 100) es false
  estaFueraDeRango(2, 0, 100) es false
  estaEntre devuelve siempre algo
  estaFueraDeRango devuelve siempre algo
OOTRA SOLUCIONDE LA CONSULT CON ERROR
function estaEntre(num, rangoMin, rangoMax){
return (num>rangoMin) && (num<rangoMax);
}
function estaFueraDeRango(num, rangoMin, rangoMax){
return !((num > rangoMin) && (num < rangoMax));
}
El problema está en los operadores de la función estaFueraDeRango, fijate que la
consigna nos dice : que tome tres números y diga si el primero es menor al segundo O
mayor al tercero , por lo tanto el único operador que necesitamos será el or.
También fijate que el num debe ser menor al rangoMin (<) y mayor al rangoMax
(>). Intentá con esas modificaciones
SOLUCION CORRECTA
function estaEntre(num1, num2, num3){
return(num1 > num2 && num1 < num3)
}
function estaFueraDeRango(num1, num2, num3){
return(num1 > num2 && num1 > num3)
}
CONSOLA
 true
  estaEntre(40, 30, 60)
=> true
  estaFueraDeRango(3, 1, 10)
=> false
  estaFueraDeRango(60, 40, 30)
=> true
 ¡Muy bien! Tu solución pasó todas las pruebas

¡Bien hecho!

Ya fueron suficientes booleanos y cuentas por ahora, ¿no? Exploremos algo


más interesante: los strings.

Ejercicio 9: Palabras, sólo palabras


Muchas veces queremos escribir programas que trabajen con texto :
queremos saber cuántas palabras hay en un libro, o convertir minúsculas a
mayúsculas, o saber en qué parte de un texto está otro.
Para este tipo de problemas tenemos los strings, también llamados cadenas
de caracteres:
 "Ahora la bebé tiene que dormir en la cuna"
 'El hierro nos ayuda a jugar'
 "¡Hola Miguel!"
Como se observa, todos los strings están encerrados entre comillas simples
o dobles. ¡Da igual usar unas u otras! Pero sé consistente: por ejemplo, si
abriste comilla doble, tenés que cerrar comilla doble. Además, un string
puede estar formado por (casi) cualquier carácter: letras, números, símbolos,
espacios, etc.
¿Y qué podemos hacer con los strings? Por ejemplo, compararlos, como a
cualquier otro valor:

"hola" === "Hola"


false

"todo el mundo" === "todo el mundo"


true

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

 ¡Dame una pista!


Para saber si un día es fin de semana, ese día tiene que ser "sábado" o ese día
tiene que ser "domingo". Recordá que el "o lógico" opera booleanos, no
strings. 
SOLUCION MIA MAL
function esFinDeSemana(feriado){
return feriado === sabado || feriado === domingo)
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
solucion.js:2
return feriado === sabado || feriado === domingo)
^
SyntaxError: Unexpected token )

Solución de la consulta con error


function esFinDeSemana(dia){
return "dia"== "sábado" || "dia"== "domingo"
}
No entiendo xq el código me da OK para todos los días, pero para sábado y
domingo me da que es falso el ||
Muchas gracias.
Diana L.  MENTORÍA  hace 10 meses
¡Hola Marcos!
Cuando usamos los parámetros dentro de nuestra función, lo hacemos sin
usar las comillas. Por ejemplo : return dia == "sábado". Probá quitandole las
comillas.
Solución mia valida a mejorar
function esFinDeSemana(dia){
return dia == "sabado" || dia == "domingo"
}
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:
  esFinDeSemana debería usar los operadores de equivalencia === y !== en
lugar de los operadores de similitud == y !=
Resultados de las pruebas:

  esFinDeSemana("sábado")
  esFinDeSemana("domingo")
  esFinDeSemana("lunes")
  esFinDeSemana("jueves")

SOLUCION MIA CORRECTA


function esFinDeSemana(feriado){
return feriado === "sabado" || feriado === "domingo"
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 esFinDeSemana ("sabado")
=> true
  esFinDeSemana ("lunes")
=> false
  esFinDeSemana ("domingo")
=> true

Ejercicio 10: Operando strings


¿Y qué podemos hacer con los strings, además de compararlos? ¡Varias
cosas! Por ejemplo, podemos preguntarles cuál es su cantidad de letras:

longitud("biblioteca")
10
longitud("babel")
5

O también podemos concatenarlos, es decir, obtener uno nuevo que junta


dos strings:

"aa" + "bb"
"aabb"
"sus anaqueles " + "registran todas las combinaciones"
"sus anaqueles registran todas las combinaciones"

O podemos preguntarles si uno comienza con otro:

comienzaCon("una página", "una")


true
comienzaCon("la biblioteca", "todos los fuegos")
false

Veamos si queda claro: definí la función longitudNombreCompleto, que tome un nombre y


un apellido, y retorne su longitud total, contando un espacio extra para separar a
ambos:

longitudNombreCompleto("Cosme", "Fulanito")
14

SOLUCION MIA CON ERROR


function longitudNombreCompleto(longitud)
return longitud ("nombre" + "apellido");
Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return longitud ("nombre" + "apellido");
^^^^^^
SyntaxError: Unexpected token return

Biblioteca
/**/

function longitud(unString) /* ... */


// Retorna cuan largo es un string
//
// Por ejemplo:
//
// longitud("hola")
// 4

function convertirEnMayuscula(unString) /* ... */


// Convierte una palabra en mayúsculas
//
// Por ejemplo:
//
// convertirEnMayuscula("hola")
// "HOLA"
function comienzaCon(unString, otroString) /* ... */
// Retorna un booleano que nos dice si unString empieza con otroString
//
// Por ejemplo:
//
// comienzaCon("hola todo el mundo", "hola todo")
// true

SOLUCION CORRECTA
function longitudNombreCompleto(nombre,apellido){
return longitud(nombre+apellido+1) ESTE MAS 1 ES POR EL ESPACIO DE SEPARACION
} que seria la coma
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 longitudNombreCompleto("juan" , "perez")
=> 10
   
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 
 ¡Dame una pista!
Tené en cuenta que los signos de admiración "¡" y "!" (al igual que los
espacios y otros signos de puntuación) son strings y que los strings se
pueden concatenar usando el operador +.
Por ejemplo:

"todo" + "terreno"
"todoterreno"

"¿" + "Aló" + "?"


"¿Aló?"

BIBLIOTECA

/**/
function longitud(unString) /* ... */
// Retorna cuan largo es un string
//
// Por ejemplo:
//
// longitud("hola")
// 4

function convertirEnMayuscula(unString) /* ... */


// Convierte una palabra en mayúsculas
//
// Por ejemplo:
//
// convertirEnMayuscula("hola")
// "HOLA"
function comienzaCon(unString, otroString) /* ... */
// Retorna un booleano que nos dice si unString empieza con otroString
//
// Por ejemplo:
//
// comienzaCon("hola todo el mundo", "hola todo")
// true

SOLUCION MIA MAL


function convertirEnMayuscula("gritar"){
return gritar("nombre")
}
¡Ups! Tu solución no se puede ejecutar

Ver detalles

Objetivos que no se cumplieron:

  la solución debe declarar gritar


  la solución no debe declarar convertirEnMayuscula
  Para resolver este ejercicio recordá que contás con convertirEnMayuscula.

Eh, ¿qué pasó acá ?


No tenés que declarar convertirEnMayuscula; ya está lista para usar.
Pero a no desesperar, intentemos otra vez 
Resultados:

solucion.js:1
function convertirEnMayuscula("gritar"){
^^^^^^^^
SyntaxError: Unexpected string

Solución dada en la consulta con error


function gritar(nombre){
return "¡"+(convertirEnMayuscula + "nombre")+"!"
}
Maria Cecilia E. hace 10 meses
ayuda qu me esta faltando para que me de bien el resto... no estoy
entendiendo

Sergio Sebastian S. hace 10 meses


Hola Maria... convertirEnMayuscula es una funcion asi que deberias llamarla
asi: convertirEnMayuscula(xx) donde tendrias que poner el texto que vayas a
convertir en mayusculas en el medio 2do... cuando usas una variable
(nombre) no deberias usar comillas ""... eso usalo con los signos de
admiracion esta bien.

Maria Cecilia E. hace 10 meses


buenas, me dice que la funcion convertirEnMayusculas no deberia ser asi, ya
no se como correjir que me de bien
function convertirEnMayuscula(nombre{ return "¡"+(gritar+ nombre)+"!" }

Guillermo Ignacio B.  MENTORÍA  hace 10 meses


¡Hola María Cecilia! En este ejercicio hay que definir la función gritar que
tiene como parámetro un nombre, como bien hiciste la primera vez, por lo
que usemos ese código tuyo como referencia, y no este último que pusiste
en el comentario. La función está casi bien, sin embargo acordate que, como
dice Sergio, la función convertirEnMayuscula requiere un parámetro, que
justamente es el parámetro nombre. Esto quiere decir que lo tenés que
poner entre paréntesis, no se lo tenés que "sumar" a la función ni ponerlo
entre comillas. Es decir, debería ser: convertirEnMayuscula(nombre). Luego, como
bien hiciste, hay que concatenarle los signos de exclamación tal cual lo
escribiste, por lo que quedaría: "¡" + convertirEnMayuscula(nombre) + "!". Haciendo
esa modificación el programa debería funcionar bien.

function gritar(nombre){
return "¡"+ convertirEnMayuscula (nombre)+ "!";
}

Otra consulta con error


function ConvertirEnMayuscula(gritar) {return
("¡"+ConvertirEnMayuscula(gritar)+"!")}
Leonardo David N. hace 10 días
Buen dia! Me dice que debo declarar gritar! Me pueden ayudar? Y como ven
la cosa? Voy bien?

Catalina F.  MENTORÍA  hace 10 días


¡Hola Leonardo!
Antes de comenzar te doy dos consejitos para que podamos visualizar y
comprender mejor nuestro código. Es importante que pongamos las
instrucciones una debajo de la otra, y también que le asignemos a cada
cosa un nombre que sea significativo. Nuestra función tendría que llamarse
gritar, no ConvertirEnMayuscula, porque la función convertirEnMayuscula (con
minúscula) la tenemos en la </>Biblioteca. Ahora, en vez de colocarle gritar al
parámetro de la función gritar, podríamos ponerle palabra, porque lo que
vamos a convertir en mayúsculas es una palabra Nos quedaría:
function gritar(palabra){
return ...
}

Nuestro return está perfecto, lo único que tenemos que hacer es modificar
ConvertirEnMayuscula por convertirEnMayuscula y terminamos

Modificado

function gritar(nombre) {

return ("¡"+convertirEnMayuscula(gritar)+"!")}

Da error

 Tu solución no pasó las pruebas


Resultados de las pruebas:

  gritar("miguel") Ver detalles
 unString.toUpperCase is not a function

  gritar("gritar") Ver detalles
 unString.toUpperCase is not a function

  gritar("minuto") Ver detalles
unString.toUpperCase is not a function

SOLUCION CORRECTA

function gritar(nombre){
return "¡"+ convertirEnMayuscula (nombre)+ "!";
}
¡Muy bien! Tu solución pasó todas las pruebas
Consola
gritar("pepe")
=> "¡PEPE!"
  gritar("bandera")
=> "¡BANDERA!"
   

Ejercicio 12: ¿Y qué tal si...?


Ninguna introducción al lenguaje JavaScript estaría completa sin mostrar al
menos una estructura de control que ya conocemos: la alternativa
condicional. Veamos un ejemplo:

//Equivalente a Math.abs
function valorAbsoluto(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
BIBLIOTECA
/**/
function longitud(unString) /* ... */
// Retorna cuan largo es un string
// Por ejemplo:
//
// longitud("hola")
// 4
function convertirEnMayuscula(unString) /* ... */
// Convierte una palabra en mayúsculas
// Por ejemplo:
//
// convertirEnMayuscula("hola")
// "HOLA"
function comienzaCon(unString, otroString) /* ... */
// Retorna un booleano que nos dice si unString empieza con otroString
// Por ejemplo:
//
// comienzaCon("hola todo el mundo", "hola todo")
// true

SOLUCION CORRECTA MIA


function maximo(numero1, numero2) {
if (numero1 >numero2) {
return numero1;
} else {
return numero2;
}
}
 ¡Muy bien! Tu solución pasó todas las pruebas
Use como ejemplo del enunciado del ejercicio

//Equivalente a Math.abs
function valorAbsoluto(unNumero) {
if (unNumero >= 0) {
return unNumero;
} else {
return -unNumero;
}
}

CONSOLA
maximo(50, 30)
=> 50
  maximo(30, 50)
=> 50
  maximo(10, 60)
=> 60
OTRA RESPUESTA CORRECTA DADA POR EJERCICIOS RESUELTO POR LA PAGINA

Respuesta:

function maximo(numero1, numero2) {


   if (numero1 >= numero2) {
     return numero1;
   } else {
     return numero2;
   }
}

Ejercicio 13: ¿De qué signo sos?


Ya utilizamos la alternativa condicional para realizar una acción específica
cuando se cumple una condición y para cuando debemos elegir entre dos
acciones diferentes (según se cumpla o no).

Pero... ¿Si necesitamos más de dos alternativas?  Veamos un ejemplo:

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
  ¡Dame una pista!
 Un número es positivo cuando es mayor a 0 y negativo cuando
es menor a 0.

SOLUCION MIA NO VALIDA

function signo(numero) {
if (numero > 0){
return "1";
} else if (numero < 0){
return "-1";
}
}
Tu solución no pasó las pruebas

Ver detalles

Parece que algo no funcionó .

Cuidado con las comillas: signo tiene que devolver los números 1, -1 y 0, no


los strings "1", "-1" y "0".

Pero a no desesperar, intentemos otra vez 


Resultados de las pruebas:
  El signo de 10 es 1 por ser positivo
  El signo de 1 es 1 por ser positivo
  El signo de 0 es 0 Ver detalles
 undefined == 0

  El signo de -65 es -1 por ser negativo


  signo no devuelve strings Ver detalles
ojo, en algun caso estás devolviendo strings

OTRA SOLUCION MIA CON ERROR AL CORREGIR LA ANTERIOR


function signo(numero) {
if (numero > 0){
return 1;
} else if (numero < 0){
return -1;
}
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  El signo de 10 es 1 por ser positivo
  El signo de 1 es 1 por ser positivo
  El signo de 0 es 0 Ver detalles
 undefined == 0

  El signo de -65 es -1 por ser negativo


  signo no devuelve strings

otra solución dada en la consulta con error

function signo(numero) {
if (numero > 0) {
return 1 ;
} else {
if (numero = 0) {
return 0 ;
} } else{
if (numero < 0) {
return -1 ;
}}
}
lorencia Agustina P. hace 10 meses
Hola! se ve que estoy escribiendo algo mal, nueva sintaxis puede fallar, no sé
si deberia sacar los "else" o como hacer para que me tome los 3 "if", porque
si pongo solamente los "if" me da error tambien. Desde ya muchas gracias.

Daniela M.  MENTORÍA  hace 10 meses


¡Hola Florencia! Bien te explico como es la sintaxis. Vas a ver que por cada if,
se cierra la llave anterior al igual que el else. Si anidamos ifs (es decir si
hacemos un if dentro del otro) quedaria algo asi (el if chiquito puede estar
tanto dentro del if grande o del else grande, no necesariamente del else):
if (condicion){

lineas del if grande

}else{
lineas del else grande

if(condicion){

lineas del if chiquito

}else{

lineas del else chiquito

Florencia Agustina P. hace 10 meses


Hola Daniela, gracias por tu ayuda, traté de seguir tu consejo pero parece
que lo sigo escribiendo mal, no se si debería poner unas " " a los numeros?...
te muestro lo que escribí ahora:
function signo(numero) { if (numero > 0) { return 1 } else { if (numero == 0)
{return 0} else { if (numero < 0) {return -1 } }

Daniela M.  MENTORÍA  hace 10 meses


Bien vamos a ver las llaves que son importantes dale? Lo que voy a hacer es
ir eliminando llaves para ver si se cierran y abren todas apropiadamente.
function signo(numero) { if (numero > 0) { return 1 } else { if (numero == 0) {return 0} else
{ if (numero < 0) {return -1 } }
Ahora voy a sacar las llaves de la funcion entonces me quedaria esto:

if (numero > 0) { return 1 } else {


if (numero == 0) {return 0} else {
if (numero < 0) {return -1 }

Ahora vamos a sacar las llaves de los ifs, que abren y cierran los return
else {
else {

Fijate que los else no logran cerrar sus llaves. Como el primero encierra los
dos ultimos ifs y al else y, a su vez, el else encierra al ultimo if, hay que
insertar dos } al final del ultimo if.

function signo(numero) {
if (numero > 0) {
return 1 ;
} else {
if (numero = 0) {
return 0 ;
} } else{
if (numero < 0) {
return -1 ;
}}
}

if (numero > 0) { return 1 } else


if (numero == 0) {return 0} else {
if (numero < 0) {return -1 }

function signo(numero) {if (numero > 0) return 1 else {if (numero == 0) return 0 else if
(numero < 0) return -1 } }
SOLUCION QUE FUNCIONA CON COSAS A MEJORAR
function signo(numero) {if (numero > 0) return 1; else {if (numero == 0) return 0; else if
(numero < 0) return -1; } }
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:
  signo debería usar los operadores de equivalencia === y !== en lugar de
los operadores de similitud == y !=
Resultados de las pruebas:
  El signo de 10 es 1 por ser positivo
  El signo de 1 es 1 por ser positivo
  El signo de 0 es 0
  El signo de -65 es -1 por ser negativo
  signo no devuelve strings
SOLUCION CORRECTA
function signo(numero) {
if (numero > 0) return 1; else {if (numero === 0) return 0; else if (numero < 0) return -1;
}}
¡Muy bien! Tu solución pasó todas las pruebas
function signo(numero) { if (numero > 0){ return 1; } else if (numero < 0){ return -1;
else if (numero === 0) falta agregar esto
} } NO VAN FALTA ACA {

Ejercicio 14: El retorno del booleano


Para cerrar, ahora que ya vimos cómo escribir la alternativa condicional, es
momento de un pequeño recordatorio: si usás adecuadamente las
expresiones booleanas, ¡no es necesario utilizar esta estructura de control!

Supongamos que queremos desarrollar una función esMayorDeEdad, que nos


diga si alguien tiene 18 años o más. Una tentación es escribir lo siguiente:

function esMayorDeEdad(edad) {
if (edad >= 18) {
return true;
} else {
return false;
}
}

Sin embargo, este if es totalmente innecesario, dado que la expresión edad


>= 18 ya es booleana:

function esMayorDeEdad(edad) {
return edad >= 18;
}

Mucho más simple, ¿no? 


Para Ema un número es de la suerte si:
 es positivo, y
 es menor a 100, y
 no es el 15.

Definí la función esNumeroDeLaSuerte que dado un número diga si cumple la lógica


anterior. ¡No vale usar if!

/**/

function longitud(unString) /* ... */


// Retorna cuan largo es un string
//
// Por ejemplo:
//
// longitud("hola")
// 4

function convertirEnMayuscula(unString) /* ... */


// Convierte una palabra en mayúsculas
//
// Por ejemplo:
//
// convertirEnMayuscula("hola")
// "HOLA"

function comienzaCon(unString, otroString) /* ... */


// Retorna un booleano que nos dice si unString empieza con otroString
//
// Por ejemplo:
//
// comienzaCon("hola todo el mundo", "hola todo")
// true
function esMultiploDe(unNumero, esteOtro) {
return (esteOtro % unNumero) === 0
}

Solucion mia mal


function esNumeroDeLaSuerte(numero){
return positivo; <100; !== 15;
}
 ¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return positivo; <100; !== 15;
^
SyntaxError: Unexpected token <

SOLUCION CORRECTA
function esNumeroDeLaSuerte(numero){
return (numero > 0) && (numero < 100) && (numero !== 15); }
¡Muy bien! Tu solución pasó todas las pruebas

En general, como regla práctica, si tenés ifs que devuelven trues o falses,


probablemente lo estás haciendo mal . Y si bien funcionará, habrás escrito
código innecesariamente complejo y/o extenso.
Recordá: ¡menos código, más felicidad! 
CONSOLA
50
  110
=> 110
  15
=> 15
  -40
=> -40

Ejercicio 15: Los premios


El jurado de un torneo nos pidió la función medallaSegunPuesto  que retorne la
medalla que le corresponde a los primeros puestos, según la siguiente
lógica:
 primer puesto: le corresponde "oro"
 segundo puesto: le corresponde "plata"
 tercer puesto: le corresponde "bronce"
 otros puestos: le corresponde "nada"
Ejemplo:

medallaSegunPuesto(1)
"oro"
medallaSegunPuesto(5)
"nada"

Definí, y probá en la consola, la función medallaSegunPuesto

SOLUCION MIA CON UN ERROR A CORREGIR


function medallaSegunPuesto(numero){
if (numero === 1)return "oro"; else {
if (numero === 2)return "plata"; else if (numero === 3)return
"bronce"; else if (numero > 3)return "nada";
}
}(le falto poner paréntesis a cada premio y a nada y solo el ; al ultimo)
Tu solución no pasó las pruebas
Resultados de las pruebas:
  medallaSegunPuesto(1)
  medallaSegunPuesto(2)
  medallaSegunPuesto(3)
  medallaSegunPuesto(4)
  medallaSegunPuesto(5)
  medallaSegunPuesto(0) Ver detalles
undefined == 'nada'
function medallaSegunPuesto(numero){
if (numero===1){
return "oro";
}
if (numero===2){
return "plata"
}
if (numero===3){
return "bronce"
}
if (numero>3){
return "nada"
}else{
return "nada"
}
}
David Ignacio D.  MENTORÍA  hace 5 meses
¡Hola Maximiliano! ¿Cómo va? Efectivamente la solución funciona, pero ya
contamos con herramientas que nos permitan prescindir de tantas
alternativas condicionales.¡Te invito a que repasemos cada una de ellas junto
al ejercicio!:
 En este capítulo en particular, aprendimos sobre el funcionamiento de
las listas como conjuntos de elementos a los que podemos acceder
para realizar diferentes acciones. Y más específicamente, en el ejercicio
anterior "Ejercicio 10: Enésimo elemento", vimos al operador de
indexación que nos permite averiguar un elemento que se encuentre
en una posición dada de una lista.
 El ejercicio actual nos pide devolver una medalla (representada cada una
como un string) dado un puesto, que es un número de 1 a 3. Caso contrario,
querremos devolver simplemente "nada".
 Con esto en mente, podemos ya intuir que la solución requerirá de una lista
para devolver un elemento en base a un número dado. Y efectivamente es
así; para usarla, además, necesitaríamos guardarla en una variable como ya
vimos, de la siguiente forma:

let nombreDeLista = [elemento1, elemento2, ... elemento n];

 Entonces, ¡cada valor será accesible usando el mencionado operador de


indexación! En este punto entra otra cuestión, la cual es, que en una lista,
empezamos a contar los valores de izquierda a derecha desde el índice 0,
por lo que habrá que modificar ligeramente nuestro puesto para devolver la
medalla esperada.
 También, recordá que no queremos salirnos de nuestro índice ya que, como
expresa la consigna, obtendremos el valor undefined. Esto ya nos da la pauta
de que necesitaremos de una alternativa condicional que contemple si
nuestro argumento es un valor de 1 a 3, y en el caso contrario, ¡es cuando
debemos devolver "nada"!
Te aliento a repasar cada punto mencionado para llegar a una óptima resolución, ¡y
entender que las listas son una herramienta muy poderosa para estos casos!
Solución correcta
function medallaSegunPuesto(numero){
if (numero === 1)return ("oro") else {
if (numero === 2)return ("plata") else if (numero === 3)return ("bronce")
else return ("nada");
}
}

function medallaSegunPuesto(lugar){
if(lugar === 1){
return("oro")
} else if(lugar === 2) {
return("plata")
} else if(lugar === 3) {
return("bronce")
} else {
return("nada")
}
}
Muy bien! Tu solución pasó todas las pruebas
CONSOLA
medallaSegunPuesto(1)
=> "oro"
  medallaSegunPuesto(3)
=> "bronce"
  medallaSegunPuesto(5)
=> "nada"
   

Ejercicio 16: Tipos de datos


Como acabamos de ver, en JavaScript existen números, booleanos y strings:

Ejempl
Tipo de dato Representa Operaciones
o
Números cantidades 4947 +, -, *, %, <, etc
Boolean valores de verdad true &&, !, etc
Strings texto "hola" longitud, comienzaCon, etc
Además, existen operaciones que sirven para todos los tipos de datos, por
ejemplo:

 ===: nos dice si dos cosas son iguales


 !==: nos dice si dos cosas son diferentes

Es importante usar las operaciones correctas con los tipos de datos


correctos, por ejemplo, no tiene sentido sumar dos booleanos o hacer
operaciones booleanas con los números. Si usas operaciones que no
corresponden, cosas muy raras y malas pueden pasar. 

Probá en la consola las siguientes cosas:

 5 + 6 (ok, los números se pueden sumar)


 5 === 6 (ok, todas las cosas se pueden comparar)
 8 > 6 (ok, los números se pueden ordenar)
 !true (ok, los booleanos se pueden negar)
 false / true (no está bien, ¡los booleanos no se pueden dividir!)

CONSOLA
=> false
  8 > 6
=> true
  !true
=> false
  false / true
=> 0
   
Ejercicio 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.

¡Pero no tan rápido! 

Antes de terminar un último desafío: ¿Cuál es el valor de las siguientes expresiones?


¡Marcá todas las correctas!

4 + 4 vale 8

"4" + "4" vale "44"

4 + 4 vale "44"

"on" + "ce" vale "once"

true && false vale false

true && false vale 0

5 >= 6 vale false

! true vale false

La respuesta no es correcta

SOLUCION DE LA CONSULTA CON ERROR

4 + 4 vale 8

"4" + "4" vale "44"
4 + 4 vale "44"

"on" + "ce" vale "once"

true && false vale false

true && false vale 0

5 >= 6 vale false

! true vale false

Matías Nicolás S. hace 10 meses

Hola, no entiendo en cual estaría fallando, leí otra pregunta hecha y entendí
que lo que hago estaría bien puesto que •la 1ra que marqué son dos
numeros y se pueden sumar •la 2da y la 3ra que marqué son strings por lo
cual se "adhieren" •la 4ta que marqué afirma que una misma cosa o es cierta
y es falsa a la vez por lo que es una contradicción •la ultima que marqué
indica con su "!" que no es cierto. Ayuda :/
Felipe Hernán B. hace 10 meses

Hola la 5 es correcta, tiene que estar marcada porque la conjuncion entre un


valor verdadero y falso, el resultado es falso la 6 no debe estar marcada
como correcta porque una conjuncion no devuelve un numero como
resultado la siete es correcta porque es una comparacion booleana y por lo
tanto devuelve un valor booleano las demas estan bien.
Solución correcta en la consulta con aclaración
4 + 4 vale 8

"4" + "4" vale "44"

4 + 4 vale "44"

"on" + "ce" vale "once"

true && false vale false

true && false vale 0

5 >= 6 vale false

! true vale fals

Carolina Judith C. hace 23 días

Hola! tengo el ejercicio bien resuelto porque abrí consultas anteriores pero
hay algo que no entiendo: ¿por qué true && false vale false? ¿es porque son
opuestos entonces no podrían ir juntos? Gracias!
Claudio Fabián B. hace 23 días

Hola Carolina.
true && false es false, porque el operador que estás usando "&&" es el Y
lógico o cunjunción, su tabla de verdad es la siguiente:
A B resultado true true true true false false false true false false false false
sólo es verdadero cuando ambas proposiciones (A y B) son verdaderas (true)
Antes de terminar un último desafío: ¿Cuál es el valor de las siguientes expresiones?
¡Marcá todas las correctas!
SOLUCION CORRECTA
4 + 4 vale 8

"4" + "4" vale "44"

4 + 4 vale "44"

"on" + "ce" vale "once"

true && false vale false

true && false vale 0

5 >= 6 vale false

! true vale fals

¡La respuesta es correcta!

Terminaste Funciones y tipos de datos!


¡Excelente! 

Eso significa que ya estás entrando en calor en un nuevo lenguaje: pudiste


aplicar alternativas condicionales, funciones y expresiones. Y por si fuera
poco, aprendiste en el camino algunas herramientas nuevas: los strings.

¿Querés seguir aprendiendo? ¡Acompañanos a la siguiente lección!

Práctica Funciones y Tipos de Datos


Antes de continuar, ¡practiquemos un poco sobre lo que acabamos de
aprender!

Ejercicios

  1. Comprando Hardware


  2. ¿Me conviene?
  3. Triangulos
  4. Cuadrados
  5. ¿Está afinado?
  6. ¿Está cerca?
  7. Cartelitos
  8. Más Cartelitos
  9. Cartelitos óptimos
  10. Cara o ceca
  11. ¡Envido!
  12. ¡Quiero retruco!
  13. ¡Quiero vale cuatro!

Ejercicio 1: Comprando Hardware


Queremos comprar una computadora nueva, y nos gustaría saber cuánto
nos va a salir. Sabemos que:

 Los monitores cuestan $60 por cada pulgada


 La memoria cuesta $200 por cada GB
 El precio base estimado del resto de los componentes es de $1000

Definí la función cuantoCuesta que tome el número de pulgadas del monitor y la


cantidad de memoria, y calcule el costo estimado de nuestra computadora.

cuantoCuesta(25, 8)
4100

Solucion mia con error


function cuantoCuesta(precio1, precio2){
return Math.round(precio1 * precio2) +1000;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  cuantoCuesta(25, 8) devuelve 4200 Ver detalles
 1200 == 4100

  cuantoCuesta(42,16) devuelve 6720 Ver detalles


1672 == 6720

SOLUCION CON ERROR EN LA CONSULTA


function cuantoCuesta( pulgada, memoria) {
return{ pulgada * 60 + memoria * 200 + 1000}
}
Marcela B. hace 10 meses
hola, no entiendo porque me marca que esta mal el signo *

Daniela M.  MENTORÍA  hace 10 meses


¡Buenas noches Marcela! ¿Como estas? El problema deberia resolverse
sacando las llaves de lo que encierra despues del return. Si deseas encerrar
toda la condicion que queres devolver, que esta muy bien lo que hiciste, se
debe hacer con (). Entonces quedarian las llaves de la funcion y los
parentesis del return.

return (la condicion)

SOLUCION CORRECTA
function cuantoCuesta( pulgada, memoria) {
return (pulgada * 60 + memoria * 200 + 1000)
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
cuantoCuesta(25, 8)
=> 4100
   

Ejercicio 2: ¿Me conviene?


Ahora que sabemos cuantoCuesta una computadora, queremos saber si una
computadora me conviene. Esto ocurre cuando:
 sale menos de $6000, y
 tiene al menos un monitor de 32 pulgadas, y
 tiene al menos 8GB de memoria

Definí la función meConviene, que nuevamente tome el número de pulgadas y


cantidad de memoria y nos diga si nos conviene comprarla :

meConviene(25, 8)
false // porque el monitor es demasiado chico
meConviene(42, 12)
true // cumple las tres condiciones

En la Biblioteca ya está definida la función cuantoCuesta lista para ser invocada.


 ¡Dame una pista!

¿Y cómo invoco cuantoCuesta? Pasándole como primer argumento el número


de pulgadas y como segundo la cantidad de memoria.

function meConviene(pulgadas, memoria){


return (cuantoCuesta < 6000) ;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

Resultados de las pruebas:

  meConviene(25, 8) es falso
X  meConviene(40, 8) es verdadero Ver detalles
ojo, también vale si tiene 8GB
X  meConviene(40, 10) es verdadero Ver detalles
false == true
X  meConviene(32, 10) es verdadero Ver detalles
ojo, también vale si tiene 32 pulgadas
  meConviene(40, 4) es falso
  meConviene(50, 16) es falso
SOLUCION DADA EN LA CONSULTA CON ERROR
function meConviene (pulgadas,memoria){
return cuantoCuesta(32,8) > 6000 + (memoria>8) && (pulgadas>32);
}
Micaela Denise I. hace 10 meses
hola, buenas noches, solo me toma 3 como correctas. como podria
arreglarlo? gracias

Mauro M. hace 10 meses


hola el simbolo de mayor o igual se representa como ">=" y el de menor o
igual "<="

Micaela Denise I. hace 10 meses


hola!
function meConviene (pulgadas,memoria){ return cuantoCuesta(32,8) >=
6000 + (memoria>=8) && (pulgadas>=32); } lo hice asi y me sigue tomando
las mismas 3 correctas

Carlos Jorge T. hace 10 meses


Hola Micaela... La función cuantoCuesta(32,8) está usando parámetros fijos en
lugar de usar las variables que recibió como parámetro la función
meConviene(pulgadas, memoria). Debería ser: cuantoCuesta(pulgadas, memoria).
Además, la pregunta del precio debe ser la inversa: hay que preguntar
cuantoCuesta(pulgadas, memoria) < 6000 Por último, en lugar del "+" deberías
poner "&&": cuantoCuesta(pulgadas, memoria) < 6000 && (memoria>=8)...

Solucion con error


function meConviene (pulgadas,memoria){
return cuantoCuesta(pulgadas, memoria) < 6000 && (memoria>=8) &&
(pulgadas>32); }

SOLUCION CORRECTA
function meConviene (pulgadas,memoria){
return cuantoCuesta(pulgadas, memoria) < 6000 && (memoria>=8) &&
(pulgadas>=32); }
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
meConviene(25,8)
=> false
  meConviene(35,8)
=> true
  meConviene(35,12)
=> true
  meConviene(35,6)
=> false
   

Ejercicio 3: Triangulos
¡Hora de hacer un poco de geometría! Queremos saber algunas cosas sobre
un triángulo:

 perimetroTriangulo: dado los tres lados de un triángulo, queremos saber


cuánto mide su perímetro.
 areaTriangulo: dada la base y altura de un triángulo, queremos saber cuál
es su área.

Definí las funciones perimetroTriangulo y areaTriangulo


SOLUCION MIA CON ERROR
function perimetroTriangulo(lado1, lado2, lado3){
return perimetro(lado1 + lado2 + lado3);
}
function areaTriangulo(base, altura){
return (base * altura)/ 2;
}
¡Ups! Tu solución no se puede ejecutar

Resultados:

solucion.js:2
return perimetro(lado1 + lado2 + lado3);
^^^^^^ NO DEBE LLEVAR PERIMETRO Y LOS PARENTESIS

SyntaxError: Unexpected token return


Tu solución no pasó las pruebas
Problemas que encontramos:

 parece que estás usando perimetro pero no está definido. ¿Puede que


hayas escrito mal su nombre o tengas que definirlo?
 Detalles
Resultados de las pruebas:
  perimetroTriangulo(10, 10, 10) es 30 Ver detalles
 perimetro is not defined

  perimetroTriangulo(12, 10, 10) es 32 Ver detalles


 perimetro is not defined

  perimetroTriangulo(10, 14, 10) es 34 Ver detalles


  perimetroTriangulo(10, 10, 15) es 35 Ver detalles
  areaTriangulo(10, 10) es 50
  areaTriangulo(10, 2) es 10
Solucion en la consulta con error
function perimetroTriangulo(cateto1, cateto2, cateto3)
{
return (longitud(cateto1+ cateto2+ cateto3))
}
function areaTriangulo(base, altura)
{
return (base * altura) / 2;
}
uenas no se en queme estoy equivocando con la suma, o como se deberia
sumar?
Guillermo Ignacio B.  MENTORÍA  hace 10 meses
¡Hola Maria Cecilia! En la primera función no hay que calcularle la longitud a
la suma de lados por dos razones: 1) esta función está hecha para calcular la
longitud de strings y 2) no tiene sentido calcular la longitud de un número
(¿cuál sería la longitud de 4, por ejemplo?). Teniendo en cuenta esto, solo
tiene que devolver la suma. La segunda función está bien, por lo que
arreglando la primera, el programa debería funcionar bien.

SOLUCION MIA CORRECTA


function perimetroTriangulo(lado1, lado2, lado3){
return lado1 + lado2 + lado3;
}
function areaTriangulo(base, altura){
return (base * altura)/ 2;
}
 ¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
 perimetroTriangulo(20, 10, 5)
=> 35
  areaTriangulo(6, 2)
=> 6

Ejercicio 4: Cuadrados
Y ahora es el turno de los cuadrados; queremos saber
 perimetroCuadrado: dado un lado, queremos saber cuánto mide su
perímetro.
 areaCuadrado: dado un lado, queremos saber cuál es su area
Definí las funciones perimetroCuadrado y areaCuadrado
 ¡Dame una pista!
 Recordá que:
 el perímetro de un cuadrado se calcula como 4 veces su lado;
 el área de un cuadrado se calcula como su lado multiplicado por sí
mismo.
SOLUCION MIA CORRECTA
function perimetroCuadrado(lado){
return lado * 4;
}
function areaCuadrado(lado){
return lado * lado;
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 5: ¿Está afinado?


Cuando presionamos una tecla de un piano, éste produce un sonido que
tiene una cierta frecuencia. Y cuando presionamos el la central del piano, si
está afinado, vamos a escuchar una nota cuya frecuencia es 440Hz.
Definí una función estaAfinado, que reciba la frecuencia (un número) del la central, y
retorne si dicha frecuencia es igual a 440Hz.

estaAfinado(440)
true

SOLUCION MIA CORRECTA


function estaAfinado(frecuencia){
return frecuencia === 440;
}
¡Muy bien! Tu solución pasó todas las pruebas
Consola
  estaAfinado(440)
=> true
  estaAfinado(560)
=> false

   Ejercicio 6: ¿Está cerca?


Ahora queremos saber si el la central del piano está cerca de estar afinado.
Esto ocurre cuando está entre 437Hz y 443Hz, pero NO es exactamente
440Hz. Por ejemplo:

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

Definí la función estaCerca

SOLUCION MIA CON ERROR


function estaCerca(rango){
rango >= || rango <=;
}
Ups! Tu solución no se puede ejecutar
Resultados:
solucion.js:2
rango >= || rango <=;
^^

SyntaxError: Unexpected token ||

function estaCerca(rango){
rango >= && rango <=;
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
rango >= && rango <=;
^^

SyntaxError: Unexpected token &&

CON ERROR EN LA CONSULTA


function estaCerca(frecuencia){
return 437<=frecuencia<=443 && frecuencia!==440;
}
hola! no entiendo cual es mi error. Gracias.

Claudio H. hace 20 días


Hola Andrés: En general, en las comparaciones conviene poner primero la
variable y el valor después del operador. Cada comparación es
independiente, o sea que tenés que comparar si frecuencia es mayor o igual
que 437 y por otro lado si frecuencia es menor o igual a 443. La última
comparación es que frecuencia no es igual a 440. Para que frecuencia esté
en rango todas las condiciones tienen que ser verdaderas, así que se juntan
con && entre cada una de ellas (si todas son verdaderas resulta verdadero y
si alguna es falsa, resulta falso).

Belen T.  MENTORÍA  hace 20 días


Hola Andrés.¿Cómo estás?. Estás cerca de la solución. El detalle está en que
se tiene que verificar cada una de las comparaciones y ellas son
independientes entre sí, para eso tené en cuenta que los operadores
lógicos funcionan de la siguiente manera:
1. var1 >= 3: Devuelve true si el operando izquierdo es mayor o igual que
el operando derecho.
2. var2 <= 5: Devuelve true si el operando izquierdo es menor o igual que
el operando derecho.

Por ejemplo la siguiente función:


function esNumeroDeLaSuerte(unNumero) {
return unNumero >=0 && unNumero <100 && unNumero!==15; }
En este ejemplo la función es NumeroDeLaSuerte() ,cuando le pasamos un
número devuelve un número entre 0 y 100, pero distinto de 15.

function estaCerca(frecuencia){
return 437<=frecuencia<=443 && frecuencia!==440;
}
function estaCerca(frecuencia){
return frecuencia>=437 && frecuencia<=443 && frecuencia!==440;
}
SOLUCION CORRECTA
function estaCerca(frecuencia){
return frecuencia>=437 && frecuencia<=443 && frecuencia!==440;
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
estaCerca(450)
=> false
  estaCerca(420)
=> false
  estaCerca(439)
=> true

Ejercicio 7: Cartelitos
Para una importante conferencia, el comité organizador nos pidió que
escribamos cartelitos identificatorios que cada asistente va a tener.
Para eso, tenemos que juntar su nombre, su apellido, y su título (dr., dra., lic.,
etc) y armar un único string.

Definí la función escribirCartelito, que tome un título, un nombre y un apellido y forme un


único string. Por ejemplo:

escribirCartelito("Dra.", "Ana", "Pérez")


"Dra. Ana Pérez"

 ¡Dame una pista! LEER SIMPRE LA CONSIGNA Y DEFINIRLA EN ESE ORDEN EN function

Tené en cuenta que los espacios para separar las palabras también son
caracteres. ¡No te olvides de incluirlos al armar los cartelitos! 

Por ejemplo:

"Pepe" + " " + "Palotes"


"Pepe Palotes"

SOLUCION MIA CON ERROR


function escribirCartelito("titulo", "apellido", "nombre"){
return "titulo" + "apellido" + "nombre"
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
solucion.js:1
function escribirCartelito("titulo", "apellido", "nombre"){
^^^^^^^^

SyntaxError: Unexpected string

OTRA SOLUCION MIA CON ERROR


function escribirCartelito("titulo", "apellido", "nombre"){
return cartelito(titulo + apellido + nombre + 2)
}
¡Ups! Tu solución no se puede ejecutar DEBE IR PRIMERO EL NOMBRE NO VA +2
Resultados:

solucion.js:1
function escribirCartelito("titulo", "apellido", "nombre"){
^^^^^^^^
SyntaxError: Unexpected string

SOLUCION DE LA CONSULTA CON ERROR


function escribirCartelito(titulo, nombre, apellido){
return ("titulo"+" "+"nombre"+" "+"apellido");
}
Alan S. hace 9 meses
Hola! Buenas noches! Una consulta, no entiendo porque las variables dentro
del return deben ir sin comillas, ya que son strings, y tengo entendido que
tienen que llevar comillas las strings. Gracias!

Mayra M. hace 9 meses


¡Hola Alan! Lo que sucede es que las comillas las vamos a usar cuando
queremos literalmente el string, es decir, si nosotros hacemos "titulo" lo que
vamos a obtener es literalmente la palabra titulo, pero lo que necesitamos es
lo que está adentro del parametro titulo , en este caso es un string que
representa por ejemplo "Dra", "Dr", "Lic".

SOLUCION CORRECTA
function escribirCartelito(titulo, nombre, apellido){
return(titulo + " " + nombre + " " + apellido)
}
 ¡Muy bien! Tu solución pasó todas las pruebas
es para concatenar stings iguales (no usar el string con parámetros con comillas pq
nos devuelve el parámetro en vez del nombre que queremos)
CONSOLA
 escribirCartelito('licenciado','juan','Perez')
=> "licenciado juan Perez"
   

Ejercicio 8: Más Cartelitos


Ah, ¡pero no tan rápido! Algunas veces en nuestro cartelito  sólo queremos
el título y el apellido, sin el nombre. Por eso ahora nos toca mejorar nuestra
función escribirCartelito de forma que tenga 4 parámetros:
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.
Modificá la función escribirCartelito, de forma que se comporte como se describe arriba.
Ejemplo:

// cartelito corto
escribirCartelito("Lic.", "Tomás", "Peralta", true)
"Lic. Peralta"

// cartelito largo
escribirCartelito("Ing.", "Dana", "Velázquez", false)
"Ing. Dana Velázquez"

SOLUCION MIA CON ERROR


function escribirCartelito(titulo, nombre, apellido){
return(titulo + " " + nombre + " " + apellido)
}
function cartelitoCorto(titulo, apellido){
return (titulo + " " + apellido);
}
Tu solución no pasó las pruebas
Ver detalles
Objetivos que no se cumplieron:
 escribirCartelito debe usar if
Parece que algo no funcionó .
En escribirCartelito vas a tener que tomar decisiones, porque dependiendo del
cuarto argumento tendrás que devolver un cartel corto o un cartel
largo;  parece una tarea para un if.
Pero a no desesperar, intentemos otra vez 
Resultados de las pruebas:
  escribirCartelito("Dra.", "Ana", "Pérez", false), es "Dra. Ana Pérez"
  escribirCartelito("Dr.", "Julio", "Gelman", false), es "Dr. Julio Gelman"
  escribirCartelito("Dra.", "Ana", "Pérez", true), es "Dra. Pérez" Ver detalles
'Dra. Ana Pérez' == 'Dra. Pérez'
  escribirCartelito("Dr.", "Julio", "Gelman", true), es "Dr. Gelman" Ver
detalles
'Dr. Julio Gelman' == 'Dr. Gelman'
Solución en la consulta con error
//modificá esta función
function escribirCartelito(titulo, nombre, apellido, longitud){
if (longitud === false){return (titulo + " " + nombre + " " + apellido);}
else {return (titulo + " " + apellido);}
}
Manuela C. hace 11 meses
No entiendo como hacer que la función haga lo que tiene que hacer pero sin
hacer las operaciones booleanas innecesarias, que es la correción que se me
está haciendo. Si alguien lo sabe hacer y me pudiera explicar lo agradezco.

Diana L.  MENTORÍA  hace 11 meses


¡Hola Manuela!
Por operaciones booleanas innecesarias se está refiriendo a la comparación
de longitud == false. Los booleanos tienen muchisimo poder, por lo que no
necesitamos compararlos con otro booleano, si no que ¡podemos usarlo a él
mismo! Es decir, en lugar de hacer esa comparación, podes solamente hacer:
if(longitud) para el caso de tru
OTRA SOLUCION MIA CON ERROR
function escribirCartelito(titulo, nombre, apellido, largo){
if (largo) {return (titulo + " " + nombre + " " + apellido);}
else {return (titulo + " " + apellido);}
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  escribirCartelito("Dra.", "Ana", "Pérez", false), es "Dra. Ana Pérez" Ver
detalles
'Dra. Pérez' == 'Dra. Ana Pérez'
  escribirCartelito("Dr.", "Julio", "Gelman", false), es "Dr. Julio
Gelman" Ver detalles
'Dr. Gelman' == 'Dr. Julio Gelman'
  escribirCartelito("Dra.", "Ana", "Pérez", true), es "Dra. Pérez" Ver detalles
  escribirCartelito("Dr.", "Julio", "Gelman", true), es "Dr. Gelman" Ver
detalles
Hola, estuve trabado en este ejercicio pero ya pude encontrar la solución,
consistió en quitar la comparación en el IF y utilizar directamente el cuarto
parámetro al que llamé booleano. (Volví a escribirlo mal para no compartir el
código correcto explicitamente y poder hacer la consulta.)
Sin embargo, a pesar de resolverlo me quedaron algunas dudas:
1- ¿Como sabe el IF que pasando solamente el parametro como condicición
se trata de un true si no lo definí antes? Es decir, le tengo que decir de
alguna forma que si el cuarto parámetro es TRUE me devuelva el título + el
apellido (ignorando el nombre) y si no es true me devuelva el título +
nombre + apellido. Pareciera que javascript asume por defecto que va a
obtener un true.
2- ¿Como sabe javascript que el cuarto parámetro se trata de un booleano?
Podría tratarse de un string o un entero tambíen. Cuando me surgió esa
duda decidí ir a la consola y probar pasarle otro tipo de dato en el cuarto
parámetro a ver que sucedía. En lugar de TRUE o FALSE le pase un número
entero (por ejemplo 152) y para mi sorpresa la función se comportó como si
le hubiera pasado un true, hice el intento con un string (por ejemplo "Hola")
y sucedió lo mismo. La única manera que me devuelva el título + nombre +
apellido era pasando como parámetro false, eso me hace pensar que ponga
lo que ponga siempre se va a comportar como true a menos que indique
expresamente que es false.
3- En base a las otras 2 dudas ¿el return que devuelve el ELSE siempre
corresponde al false en un booleano?
Disculpen, me quedó bastante larga la consulta pero quería que entendieran
bien mis dudas.
Rocio G.  MENTORÍA  hace 5 meses
¡Hola Germán!
Son súper válidas tus dudas y este espacio está para que te ayudemos a
despejarlas:
 Ni el if ni JavaScript saben que el cuarto parámetro es un booleano.
Quienes programamos lo sabemos porque establecemos que la
función la vamos a definir con esos parámetros en particular. En este
caso, la función escribirCartelito va a estar definida por los parámetros
título, nombre, apellido (los tres strings) y el que establece si el cartel
es corto o largo (un booleano). Teniendo en cuenta esto, creamos las
estructuras necesarias en nuestra función para que cuando le pasemos
los argumentos (los valores) se comporte adecuadamente. Como
tenemos que crear una alternativa (escribir un cartelito largo o corto)
condicional (el último parámetro nos condiciona a una forma u otra)
vamos a usar al if para resolverlo. La condicón será el booleano (el
cuarto parámetro) y las diferentes alternativas, cada rama de esta
estructura.
 JavaScript no es quien asume que por defecto va a recibir un true.
Definimos al if sabiendo (por como está creado) que en la primera
rama del if va a ir la alternativa de cuando se cumple la condición
(cuando esa condición es verdadera, cuando es true) y que en la rama
del else irá el caso en que esta condicón no se cumpla (cuando sea
false).
 Respecto a lo que probás en la consola, eso tiene que ver con
JavaScript: es un lenguaje que da muchas libertades a la hora de
programar, por lo que hay que hacerlo bajo ese "riesgo" y siendo
consciente de lo que hacemos. A muy grandes rasgos, en JavaScript
los booleanos true y false son eso: true y false. Peeeero también existen
valores "falsy" y "truthy" que no son true o false pero son análogos a
esos booleanos. Uno de los valores falsy es el 0 (hay otros más como
el string vació "" también). Todo lo demás que no sea falsy, es truthy.
Entonces, cualquier otra cosa que no sea false, 0 o "", va a ser tomado
como verdadero. Por eso es que cuando ponés como cuarto
parámetro un número o un string (diferentes de 0 o ""), funciona igual.
OTRA SOLUCION DE LA CONSULT CON ERROR
function escribirCartelito(titulo, nombre, apellido, tf) {
if (tf===true) {
return titulo + " " + apellido;
}
}
Liliana Y. hace 19 días
Hola! me aparece como que se puede mejorar, que se hacen comparaciones
boleadas innecesarias.
//modificá esta función function escribirCartelito(titulo, nombre, apellido, tf) {
if (tf===true) { return titulo + " " + apellido; } else { return titulo + " " +
nombre + " " + apellido; } }
Me podrían ayudar? muchas gracias!

Guillermo Ignacio B.  MENTORÍA  hace 19 días


¡Hola Liliana! El código está bastante bien encaminado, solo falta modificar
una cosa. Acordate que el parámetro tf es un booleano, por lo que se puede
utilizar directamente en el if sin necesidad de compararlo. Es decir, cuando
nosotros usamos el if estamos usando una condición, cuyo resultado es un
booleano y eso es lo que ve el if. Pongamos un ejemplo, si tenemos la
condición de que una variable, altura, sea mayor a 7 para que se ejecute el
código deberíamos escribir: if (altura > 7), entonces si altura es 8, por ejemplo,
esto sería if (8 > 7) es decir if (true) y es justamente esto lo que evalúa el if.
Probá modificar el código con esto en mente y cualquier cosa si seguís con
dudas lo seguimos viendo.

Liliana Y. hace 19 días


Hola! muchas gracias por tu respuesta. Disculpa pero sigo sin entender. Si no
hago la comparacion, como hago para que salga el cartelito largo?

Maria Emilia W.  MENTORÍA  hace 18 días


Hola Liliana, Voy a sumar a lo que explicó Guillermo, para responderte esta
pregunta. Como bien dice él, if(condición) evalúa que lo que ingresa como
condición allí dentro sea igual a true, sino no entra y continúa hacia else.
Entonces, al colocar if( tf ) ya se está evaluando si ese parámetro booleano
que recibe es igual a true, y en caso que sea correcto, retornará lo que tiene
dentro. ¿Qué pasa en el caso contrario? if va a evaluar tf , y si resultá que lo
que se recibe es un false, directamente no ingresa y continúa hacia else. Por
este motivo es que si escribirCartelito(titulo, nombre, apellido, tf) recibe por el
parámetro tf un false o un true, va a retornar un cartelito largo o un cartelito
corto, según se observa en la descripción y en lo que colocás dentro del
procedimiento. Tené en cuenta que estoy respondiendo sobre el
procedimiento que escribiste en el primer mensaje, que es el que sólo
corrigiendo la condición estará correcto.

//modificá esta función


function escribirCartelito(titulo, nombre, apellido, largo) {
if (largo) {
return titulo + " " + apellido;
}
}
 Tu solución no pasó las pruebas
Resultados de las pruebas:
  escribirCartelito("Dra.", "Ana", "Pérez", false), es "Dra. Ana Pérez" Ver
detalles
undefined == 'Dra. Ana Pérez'
  escribirCartelito("Dr.", "Julio", "Gelman", false), es "Dr. Julio
Gelman" Ver detalles
undefined == 'Dr. Julio Gelman'
  escribirCartelito("Dra.", "Ana", "Pérez", true), es "Dra. Pérez"
  escribirCartelito("Dr.", "Julio", "Gelman", true), es "Dr. Gelman"
CON ERROR MIA
function escribirCartelito (titulo,nombre,apellido,esCorto){
if (esCorto ){
return (titulo +" " + apellido)
}else if (esCorto !== true) {
return (titulo+" "+nombre+" "+apellido);
}
}
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:
  escribirCartelito hace comparaciones booleanas innecesarias
Resultados de las pruebas:
  escribirCartelito("Dra.", "Ana", "Pérez", false), es "Dra. Ana Pérez"
  escribirCartelito("Dr.", "Julio", "Gelman", false), es "Dr. Julio Gelman"
  escribirCartelito("Dra.", "Ana", "Pérez", true), es "Dra. Pérez"
  escribirCartelito("Dr.", "Julio", "Gelman", true), es "Dr. Gelman"
solución mia correcta
function escribirCartelito (titulo,nombre,apellido,esCorto){
if (esCorto ){
return (titulo +" " + apellido)
}else {
return (titulo+" "+nombre+" "+apellido);
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Ejercicio 9: Cartelitos óptimos
Ahora que ya podemos escribir nuestros cartelitos identificatorios grandes y
chicos, queremos una nueva función que nos dé el cartelito de tamaño
óptimo:
 si nombre y apellido tienen, en total, más de 15 letras, queremos un
cartelito corto;
 de lo contrario, queremos un cartelito largo.

Definí la función escribirCartelitoOptimo que tome un título, un nombre y un apellido, y


utilizando escribirCartelito genere un cartelito corto o largo, según las reglas anteriores.
Ejemplo:

escribirCartelitoOptimo("Ing.", "Carla", "Toledo")


"Ing. Carla Toledo"
escribirCartelitoOptimo("Dr.", "Estanislao", "Schwarzschild")
"Dr. Schwarzschild"

 Te dejamos en la biblioteca la función escribirCartelito definida. ¡Usala cuando necesites!

 ¡Dame una pista!


Recordá que contás con las funciones longitud y escribirCartelito, no tenés que
definirlas solo invocarlas. 
SOLUCION CORRECTA MIA
function escribirCartelitoOptimo(titulo, nombre, apellido){
return escribirCartelito(titulo, nombre, apellido, quiereCartelCorto(nombre,
apellido))
}
function quiereCartelCorto(nombre, apellido){
return longitud(nombre+apellido)> 15
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 escribirCartelitoOptimo("Licenciado", "Pedro", "Perez")
=> "Licenciado Pedro Perez"
TAMBIEN ESTA BIEN ESTA RESPUESTA
function escribirCartelitoOptimo(titulo, nombre, apellido){
return escribirCartelito(titulo, nombre, apellido, longitud(nombre+apellido)> 15)
}
CONSOLA
 escribirCartelitoOptimo("licenciado", "Juan", "Perez")
=> "licenciado Juan Perez"

Ejercicio 10: Cara o ceca


Hay veces en las que tenemos difíciles decisiones que tomar en nuestras
vidas (como por ejemplo, si comer pizzas o empanadas ), y no tenemos más
remedio que dejarlas libradas a la suerte.

Es allí que tomamos una moneda y decimos: si sale cara, comemos pizzas, si
no, empanadas.
Definí una función decisionConMoneda, que toma tres parámetros y retorna el
segundo si el primero es "cara", o el tercero, si sale "ceca". Por ejemplo:

decisionConMoneda("cara", "pizzas", "empanadas")


"pizzas"

SOLUCION MIA MAL


function decisionConMoneda(cara, pizzas, empanadas){
if cara
return pizzas
}
else {
return empanadas
}
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
if cara
^^^^

SyntaxError: Unexpected identifier

SOLUCION ENLA CONSULTA CON ERROR


function decisionConMoneda(moneda,cara,ceca){
if ("moneda"!=="cara") {
return "pizzas";
}else{
return "empanadas";
}
}
Manuel D. hace 10 meses
Hola muy buenas, tengo algunos problemas con este código. Creo que tiene
cierta logica pero estoy trabado aca hace un tiempo. Cualquier orientacion
me ayudaría y no encuentro lógica en otras respuestas. Gracias de
antemano!

Juan Carlos O. hace 10 meses


Hola fijate que vos estas poniendo por parametro cara, ceca y eso lo
intrducis donde va moneda, seria algo asi function
decisionConMoneda(moneda , comida1 , comida2){

Guillermo Ignacio B.  MENTORÍA  hace 10 meses


¡Hola Manuel! Como bien dice Juan Carlos, el enunciado nos dice que si el
valor de la moneda es "cara" hay que devoler el segundo parámetro, y de lo
contrario hay que devolver el tercer parámetro, por lo que podríamos
nombrar a los parámetros moneda, comida1* y comida2. Lo de "pizzas" y
"empanadas" es un ejemplo de como debería funcionar nada más. Ahora
bien, en este caso la comparación que tenés que hacer es ver si el parámetro
moneda es igual al string "cara", y en caso de que sea cierto hay que
devolver el segundo parámetro, es decir comida1, y en caso de que esto no
se cumpla hay que devolver el tercer parámetro, comida2. Probá modificar
el código con esto en mente y si seguís con dudas podés volver a consultar.

OTRA SOLUCION DE LA CONSULTA CON ERROR


function decisionConMoneda(cara, comida1, comida2) {
if (cara) {
return comida1;
} else {
return comida2;
}
}
Jerónimo Mauro G. hace 5 meses
Hola buenas tardes, en realidad el ejercicio ya lo resolvi realizando la
comparacion correspondiente para el primer parametro (cara===....) Pero
volvi a ejecutarlo mal a proposito para tener la posibilidad de hacer una
consulta ya que hay algo que no entiendo. En el ejercicio de Mas Cartelitos,
tomabamos el 4to parametro como booleano (no fue necesario definirlo),
para decidir si el cartel seria corto (true) o largo (false). Ahora para resolver
este ejercicio no me lo permite ya que no esta definido como booleano y
tengo que realizar la comparacion! Qué es lo que determina que para un
ejercicio me tome el comando "if(corto)" y para el otro no me tome
"if(cara)"? Como se si un parametro esta definido o no como booleano?

David Ignacio D.  MENTORÍA  hace 5 meses


¡Hola Jerónimo! ¿Cómo va? Me parece muy bien que quieras aclararte esta
duda forzando el error. Para entender esto que planteás, pensemos los 2 en
la alternativa condicional como tal. En este momento, ya se sabe que esta
herramienta decide el flujo del programa en base a una o más condiciones.
Como ya vimos, dichas condiciones deben tener un valor de verdad
(Verdadero o Falso), tomando una forma similar a:
if(condición) {
//bloque 1
}
else {
//bloque2
}

Por ejemplo, en el ejercicio del cartelito, decidíamos cómo devolverlo en


base a su longitud teniendo 2 valores como bases (corto o largo), los cuales
podían expresarse con un valor booleano pasado por parámetro "esCorto" o
"esLargo". En el ejercicio actual, ¡nuestros parámetros no son booleanos!
sino strings, por lo que no podemos deducir sus valores de verdad. Sin
embargo, esto lo solucionamos con el operador lógico de equivalencia "==="
al querer decidir entre una opción u otra en base al texto que represente el
primer parámetro.
SOLUCION CORRECTA
function decisionConMoneda(moneda, comida1, comida2) {
if (moneda === "cara") {
return comida1;
} else {
return comida2;
}
}
Muy bien! Tu solución pasó todas las pruebas
OTRA SOLUCION CORRECTA
function decisionConMoneda(moneda, pizzas, empanadas) {
if (moneda === "cara") {
return pizzas;
} else {
return empanadas;
}
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
ecisionConMoneda("cara", "pizzas", "empanadas")
=> "pizzas"
  decisionConMoneda("seca", "pizzas", "empanadas")
=> "empanadas"

Ejercicio 11: ¡Envido!


Queremos saber el valor de las cartas de truco cuando jugamos al envido.
Sabemos que:
 todas las cartas del 1 al 7, inclusive, valen su numeración
 las cartas del 10 al 12, inclusive, valen 0
 no se juega con 8s ni con 9s
Definí una función valorEnvido, que tome un número de carta y retorne su valor de
envido.

valorEnvido(12)
0
valorEnvido(3)
3

 ¡Dame una pista!

 Asumí que sólo te vamos a pasar cartas con valores dentro de los rangos
del 1 al 7 y del 10 al 12

SOLUCION MIA CON ERROR


function valorEnvido(valores){
return valores <=7 && valores !==0;
}
 Tu solución no pasó las pruebas
Objetivos que no se cumplieron:

  valorEnvido debe devolver un número que represente cuanto envido


tenés, no un booleano que indique si tenés o no envido
Otro mio con error

function valorEnvido(valores){
return valores !==0 && valores <=7;
}
Resultados de las pruebas:

  valorEnvido(2) es 2 Ver detalles


 true == 2

  valorEnvido(1) es 1
  valorEnvido(5) es 5 Ver detalles
 true == 5

  valorEnvido(7) es 7 Ver detalles


 true == 7

  valorEnvido(12) es 0
  valorEnvido(11) es 0
  valorEnvido(10) es 0
  valorEnvido no devuelve strings

SOLUCION DE LA CONSULTA CON ERROR


function valorEnvido(numero) {
if(1<=numero<=7) {return numero}
if(10<=numero<=12) {return 0 }
}
hola! no entiendo por qué en el primer "if" hace bien el rango de numero de
carta pero en el segundo caso no funciona, no me devuelve "0"

Diana L.  MENTORÍA  hace 10 meses


¡Hola Florencia!
Para realizar más de una comparación tenemos que usar el &&, por ejemplo
si queremos saber si un numero esta entre 5 y 10 hacemos:
if(numero >= 5 && numero <= 10)
Intentá resolverlo separando las comparación con &&.

SOLUCION CORRECTA
function valorEnvido(numero) {
if(numero >= 1 && numero <= 7){
return numero;}
else if(numero >= 10 && numero <= 12) {
return 0;
}
}
¡Muy bien! Tu solución pasó todas las pruebas
OTRA SOLUCION CORRECTA
function valorEnvido(numero){
if(numero >= 1 && numero <= 7)
{return numero}
if(numero >= 10 && numero <= 12)
{return 0}
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 12: ¡Quiero retruco!


Bueno, ehm, no, pará, primero queremos calcular cuántos puntos de envido
suma un jugador. Sabemos que:

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

Utilizando la función valorEnvido (que ya definimos por vos), definí la


función puntosDeEnvidoTotales que tome los valores y palos de dos cartas y diga
cuánto envido suman en total. Ejemplo:

puntosDeEnvidoTotales(1, "espadas", 4, "espadas")


25
puntosDeEnvidoTotales(2, "copas", 3, "bastos")
3

 ¡Dame una pista!


Recordá que para obtener el número más grande entre dos números
tenemos la función Math.max.

SOLUCION MIA CON ERROR


function puntosDeEnvidoTotales(valorenvido, palos) {
return Math.max((valorenvido * 2), palos;
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return Math.max((valorenvido * 2), palos;
^^^^^

SyntaxError: missing ) after argument list

SOLUCION MIA CON ERROR


function puntosDeEnvidoTotales(valores, palos) {
return Math.max(valores, "palos" + valores, "palos")+ 20;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  puntosDeEnvidoTotales(4, "espadas", 3, "espadas") es 27 Ver detalles
 NaN == 27

  puntosDeEnvidoTotales(6, "copas", 11, "copas") es 26 Ver detalles


 NaN == 26

  puntosDeEnvidoTotales(6, "copas", 7, "espadas") es 7 Ver detalles

solución de la consulta con error


function puntosDeEnvidoTotales(num,palo,num2,palo2){
if(palo===palo2){
return num + num2 + 20;
}
else{
return Math.max(num,num2);
}
}
Tania O. hace 11 meses
Hola! me sale este error, pero hice la prueba en consola y me anda bien
(puntosDeEnvidoTotales(6, "copas", 11, "copas") es 26). En consola me da
bien 37 asi que no se porque en el resultado de la prueba no me lo hace
bien.

Sergio Sebastian S. hace 11 meses


Recorda el valor de cada carta (esta en Biblioteca) las cartas 10,11,12 valen
0... Asi que podes usar valorEnvido(....) antes de sumarlas!

function puntosDeEnvidoTotales(num,palo,num2,palo2){
if(palo===palo2){
return valorenvido(num + num2 + 20);
}
else{
return Math.max(num,num2);
}
}
SOLUCION DE LA CONSULTA CON ERROR

function puntosDeEnvidoTotales (numero1, palo1, numero2, palo2){


if (palo1 === palo2) {return valorEnvido(numero1) + valorEnvido(numero2) + 20;}
else {return Math.max(valorEnvido(numero1), valorEnvido(numero2))}}
Hola a todos! Pude resolver este ejercicio, pero me costó y tuve que leer las
consultas de este foro tan útil (lo mismo me ocurrió con dos o tres más de
esta unidad). Recién apreté ENTER después del primer return para que me
diera error y poder preguntar algunas cosas. En primer lugar, ¿por qué da
error si toco ENTER y bajo de línea? O más bien, ¿qué función tienen las
líneas?, ¿da lo mismo poner ENTER y bajar de línea antes o después de un
corchete, un return, un else, etc.? ¿Y si hago todo sin poner ENTER? En
segundo lugar, ¿cómo se leen los mensajes de error? Me refiero por ejemplo
a que pone cosas como js.21, que supongo señalan el lugar del error, pero
no sé interpretarlo. También me refiero a que a veces me dice que no
esperaba un else (unexpected) pero el problema no era el else, sino que
capaz me había faltado cerrar algún corchete. Desde ya, gracias por las
respuestas que puedan dar!

Diana L.  MENTORÍA  hace 21 días


¡Hola Juan! ¿Cómo te va?
Vamos por partes:
En cuanto al enter luego del return, lo que sucede es que cuando escribimos
la palabra return, la computadora entiende que lo que sigue inmediatamente
(en la misma línea) es el retorno de la función, si tenemos lo siguiente:

return
algo;

La computadora entiende que no queremos retornar nada, que tenemos


return y al lado no hay nada. Esto nos tira el error código inalcanzable, que
nos quiere decir que "hay código que nunca se podrá ejecutar". ¿Qué
significa esto? Sabemos que cuando hacemos return estamos cortando el
flujo de la función, ya que después de retornar algo, no tiene sentido que se
ejecuten más cosas (el objetivo de una función es retornar algo). Por ejemplo
si tenemos:

function unaFuncion(){
return 5;
hacer_algo();
hacer_otra_cosa();
}

Nunca nunca existirá una chance de que la computadora ejecute las líneas
hacer_algo() y hacer_otra_cosa(); por lo que vimos antes, una vez que lee el
retorno, se olvida de la función y sigue con otra cosa. Por esto es que
llamamos a ese código inalcanzable. ¿Y qué pasa si tengo el retorno pero en
otra línea como el primer ejemplo? Justamente, la computadora como
dijimos piensa que le estamos diciendo que retorne nada, y eso hace,
retorna nada y corta la ejecución, haciendo que lo que realmente queríamos
que fuera el retorno, nunca se ejecute.
En cuanto a separar por líneas en otros casos, esto más que nada lo hacemos
por una cuestión de orden. Es más entendible un código si lo tenemos
organizado e indentado (con sangrías que nos permitan ver más fácilmente
a qué bloque de código pertenecen las llaves). Una ventaja de tenerlo en
distintas líneas es que podemos ver los errores más fáciles. Por ejemplo
veamos este código:

function funcionLoca(parametro1){let variable = parametro1 + 5; if(variable < 10){return


10;}else{ return 5;}
Ahora ordenemoslo (e indentemoslo, podemos hacerlo dandole click al
botón Dar formato):

function funcionLoca(parametro1){
let variable = parametro1 + 5;
if(variable < 10){
return 10;
}else{
return 5;
}

¿Notaste el error de sintaxis que tenemos? ¡Nos falta una llave! En el primer
ejemplo está muy complicado darnos cuenta, tenemos que estar contando
las llaves para ver cuál pertenece a cuál; mientras que en el segundo ejemplo
podemos ver que cada llave de cierre está alineada con el comienzo del
bloque, fijate que no hay ninguna llave alineada con el bloque de la función,
es decir que ninguna llave está alineada con la palabra function -> ¡es la llave
que nos falta!

function funcionLoca(parametro1){
let variable = parametro1 + 5;
if(variable < 10){
return 10;
}else{
return 5;
}
} //la llave queda alineada con el bloque que cierra

En cuanto a los errores, los números que marcan sí representan la línea en


donde está el error, sin embargo tenemos que tener en cuenta que puede
que no coincida con nuestro código, porque al momento de ejecutarse la
solución, también se carga lo que esté en la </> Biblioteca. Aprender a
interpretar errores es algo que lleva su práctica y con el tiempo nos sale
rápido, un consejo es que no siempre vamos a entenderlos (nos pasa a los
que programamos hace años también), en estos casos siempre podemos
recurrir a algún buscador como Google para buscar el error que nos está
lanzando. Internet es tan grande y tanta gente programa, que es muy
posible que a alguien le haya ocurrido un error parecido y haya preguntado
en algun foro. No siempre vamos a encontrar exactamente lo que queremos,
pero nos puede ayudar a guiarnos. En el contexto de este curso sin embargo,
tenemos la ventaja de que está el foro (¡y el equipo de mentorías!) en donde
siempre que veamos un error que no entendamos, podemos consultarlo acá.
Cada error es diferente, y no podemos generalizarlos a todos juntos (por ello
te invito a preguntar por errores concretos cuando lo necesites 😉), pero
para el caso de que nos dice que no esperaba un else, por ejemplo algo así:

solucion.js:4
else {
^^^^
SyntaxError: Unexpected token else

Nos dice que no esperaba el else porque si tenemos alguna llave abierta, la
computadora va a esperar que se cierre en algún punto (lo mismo con
paréntesis), y si no lo hacemos y en lugar de eso le abrimos otra estructura la
computadora dice "che para, ¿qué es este else? Yo esperaba una llave, no
esperaba un else". Si bien no nos menciona explicitamente que es un error
de llaves, nos da a entender que cerca del else tenemos un errore de sintaxis,
por lo que nos conviene prestar atención al buscarlo en especial en las líneas
que estén por arriba o debajo.

SOLUCION CORRECTA
function puntosDeEnvidoTotales (numero1, palo1, numero2, palo2){
if (palo1 === palo2) {
return valorEnvido(numero1) + valorEnvido(numero2) + 20;}
else {return Math.max(valorEnvido(numero1), valorEnvido(numero2))
}
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA

 puntosDeEnvidoTotales(2, "palo", 5, "palo")
=> 27

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:
Canto Puntos en juego

truco 2

retruco 3

vale
4
cuatro

Definí la función valorCantoTruco, que tome el canto y retorne cuántos puntos vale.

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")
SOLUCION MIA CON ERROR
function valorCantoTruco(canto, puntosenjuego){
return if puntosenjuego === 3, "retruco";
}
 ¡Ups! Tu solución no se puede ejecutar
Resultados:solucion.js:2

return if puntosenjuego === 3, "retruco";


^^
SyntaxError: Unexpected token if

OTRA SOLUCION MIA CON ERROR


function valorCantoTruco(canto, puntosenjuego){
return puntosenjuego === 3, "retruco";
}
 Tu solución no pasó las pruebas
Resultados de las pruebas:

  valorCantoTruco("retruco") es 3 Ver detalles


 'retruco' == 3

  valorCantoTruco("truco") es 2 Ver detalles


 'retruco' == 2
  valorCantoTruco("vale cuatro") es 4 Ver detalles

SOLUCION DE LA CONSULTA
function valorCantoTruco (canto) {
if("truco"===canto) {
return 2 }
if ("retruco" ===canto) {
return 3}
else { return "valecuatro" }
}
Luz Candela D. hace 10 meses
Lo unico que me falta es la parte del vale cuatro y no sé porque sale que está
mal.

Luis B. hace 10 meses


Hola! Porque te estaría faltando un if, el del "vale cuatro", que retorna 4.
Si "vale cuatro"==canto, que devuelva 4
Creo que else no es necesario en este ejercicio. saludos

Diana L.  MENTORÍA  hace 10 meses


¡Hola Luz!
En el caso del else, es cuando queremos que retorne el valor del "vale
cuatro", entonces deberíamos retornar 4 en lugar del string "valecuatro".
Como dice Luis, también podés agregar un if y directamente no usar un else,
de todas formas también vas a necesitar retornar el 4 en ese caso.

SOLUCION DE LA CONSULTA

function valorCantoTruco (canto) {


if("truco"===canto) {
return 2 }
if ("retruco" ===canto) {
return 3}
if (“valevuatro” ===canto {
return 4 }
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  valorCantoTruco("retruco") es 3
  valorCantoTruco("truco") es 2
  valorCantoTruco("vale cuatro") es 4 Ver detalles
undefined == 4
OTRA SOLUCION CON ERROR
function valorCantoTruco(canto){
if(canto==="truco"){return 2;}
else if(canto==="retruco"){return 3;}
if(canto==="vale cuatro"){return 4;}
}
Angel Eduardo M. hace 17 días
buenas, una duda ¿ cuando es conveniente usar if o else if?o no inside nada el else antes
del if como ejemplo function valorCantoTruco(canto){ if(canto==="truco"){return 2;} else
if(canto==="retruco"){return 3;} if(canto==="vale cuatr"){return 4;} }

Diana L.  MENTORÍA  hace 16 días


¡Buenas tardes Angel! ¿Cómo te va?
Muy interesante la pregunta. Cuando usamos un condicional, estamos de alguna forma
dividiendo los posibles resultados en dos: o pasa una cosa o pasa la otra; todo
dependiendo de una condición. Algo que tenemos que entender es que cuando hacemos:

if(condicion){
algo;
}else{
otra_cosa;
}

Si la condición no se cumple (por cual sea la razón), vamos a parar al else,


pero evaluamos la condición. Pero, ¿qué pasa si tenemos más de dos
resultados posibles? Por ejemplo si queremos saber si un número es menor,
mayor o igual que 5 -> tenemos tres posibles resultados:
 El número es mayor que 5 -> queremos guardar en una variable "Es
mayor"
 El número es menor que 5 -> queremos guardar en una variable "Es
menor"
 El número es igual que 5 -> queremos guardar en una variable "¡Es el
5!"
Podríamos decir, bueno pongo tres condicionales:
if(numero === 5){
resultado = "¡Es el 5!"
}
if(numero < 5){
resultado = "Es menor"
}

if(numero > 5){


resultado = "Es mayor"
}

El problema (que no es gran problema pero está bueno tenerlo en cuenta)


que si nosotros ingresamos el número 5, la computadora ejecutará el primer
if, que ya nos devuelve el resultado, pero seguirá con los demás también,
porque son condicionales que están aparte, no tienen nada que ver uno con
otro. Si bien ya tenemos el resultado, y sabemos que no cumplirá ninguna
de las condiciones de los demás, estamos ejecutándolo igual. Acá es cuando
entre en juego el else if:
if(numero < 5){
resultado = "Es menor"
}else if(numero === 5){ //tengo una segunda condición
resultado = "¡Es el 5!"
}else{
resultado = "Es mayor"
}

Si el número no es menor (no entra en la condición del if), significa que


puede ser o el mismo número o que es mayor. De nuevo tengo dos posibles
resultados, entonces pregunto una vez más: ¿es el 5? Si esta condición
tampoco se cumple, por descarte nos queda que es mayor. La diferencia con
el primer caso, es que acá si el número sí es el 5, ejecuta la primera rama, y
como ya tenemos el resultado, no ejecuta nada más. Porque de esta forma
estamos en una sola estructura condicional, que irá descartando parte por
parte hasta que nos quedemos con el "resto" (que no cumplió ninguna
condición) que será nuestro else. Por ejemplo si tuvieramos más que 3
posibles resultados, podemos ir usando diferentes condiciones con el else if:
if(numero > 5){
resultado = "Es mayor"
}else if(numero === 5){ //tengo una segunda condición
resultado = "¡Es el 5!"
}else if(numero === 4){
resultado = "¡Es el 4!"
}else if(numero === 3){
resultado = "¡Es el 3!"
}else{
resultado = "Es menor que 3"
}

Sin embargo, en este tipo de ejercicios, en donde retornamos algo, por


ejemplo si hicieramos:
if(numero === 5){
return "¡Es el 5!"
}

if(numero < 5){


return "Es menor"
}

if(numero > 5){


return "Es mayor"
}

Como el return nos corta la ejecución de la función, a nivel ejecución será lo


mismo que hacer:
if(numero < 5){
return "Es menor"
}else if(numero === 5){
return "¡Es el 5!"
}else{
return "Es mayor"
}

Por más que a nivel ejecución sean lo mismo, está bueno tener presente la
diferencia conceptual.
¡Saludos!

Angel Eduardo M. hace 16 días


muchas gracias por la repuesta. Ósea que con el else if se arma un arbol de
condiciones las cuales al cumplirse una condicion de ese arborl te da su
return y deja de revisar las demas candiciones ; y en el caso del if son
condiciones aisladas las cuales por mas que se cumpla una condicion lo
mismo se revisan las demas condiciones.
El else if te serviria para ahorrar tiempo de procesamiento en la ejecucion de
un programa

SOLUCION CORRECTA
function valorCantoTruco(canto){
if(canto==="truco"){return 2;}
else if(canto==="retruco"){return 3;}
if(canto==="vale cuatro"){return 4;}
}

¡Muy bien! Tu solución pasó todas las pruebas


¡Terminaste Práctica Funciones y Tipos de Datos!
¡Muy bien! 

En esta lección practicaste los temas abarcados en la primera lección con


ejercicios un poco más desafiantes.

¡Seguinos para aprender nuevos conceptos de la programación imperativa! 

Variables y procedimientos
JavaScript, como la mayoría de los lenguajes comerciales (es decir, lenguajes
que se usan para desarrollar software "real"), no es tan puro en su
separación de funciones y procedimientos. Veamos por qué...

Ejercicios

  1. ¿Y el tablero?
  2. Impresión por pantalla
  3. Martin Fierro
  4. ¿Y los procedimientos?
  5. ¿Y el program?
  6. Coerciones
  7. El círculo de la vida
  8. PIenso que así es más fácil
  9. Esto no tiene valor
  10. Variables globales
  11. La buena fortuna
  12. ¿Y esto cuánto vale?

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?
No. En JavaScript, lamentamos informarte, no hay tablero.

 Bueeeno, no llores, quizás fuimos un poco duros: en JavaScript no hay


tablero, ¡porque no lo necesitás!  Suceden dos cosas:

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!
funcionMisteriosa(5, 2)
=> "woooooww!"
  funcionMisteriosa(2, 1)
=> "woow!"
  funcionMisteriosa(2, 5)
=> "woowwwww!"

Ejercicio 2: Impresión por pantalla


Ahora que ya te convencimos de que no necesitamos al tablero, vamos a
mostrarte que sí hay algo parecido en JavaScript : la impresión por pantalla.
Veamos un ejemplo:

function funcionEgocentrica() {
imprimir("soy una función que imprime por pantalla");
imprimir("y estoy por devolver el valor 5");
return 5;
}

Probá funcionEgocentrica en la consola.
funcionEgocentrica()
soy una función que imprime por pantalla
y estoy por devolver el valor 5
=> 5
   
Ejercicio 3: Martin Fierro
¿Qué acabamos de hacer con esto? Al igual que Poner(bolita), imprimir es una
funcionalidad que siempre está disponible. Si llamamos a la función anterior,
veremos que, además de devolver el valor 5, imprime dos líneas:

soy una función que imprime por pantalla


y estoy por devolver el valor 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.

Veamos si va quedando claro, definí la function versosMartinFierro que imprima por


pantalla los primeros versos del Martín Fierro:

Aquí me pongo a cantar


Al compás de la vigüela;
Que el hombre que lo desvela
Una pena extraordinaria

Esta function debe retornar 0
 ¡Dame una pista!

Ah, ¿y cómo se hace para imprimir varias líneas? ¡Llamando a imprimir varias


veces !

imprimir("esta es una linea");


imprimir("esta es otra linea");

SOLUCION MIA CON ERROR


function versosMartinFierro() {
imprimir("Aqui me pongo a cantar");
imprimir("Al compas de la viguela;");
imprimir("Que el hombre que lo desvela");
imprimir("Una pena extraordinaria");
imprimir("y estoy por devolver el valor 0");
return 0;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  versos deberia imprimir los versos Ver detalles
'Aqui me pongo a cantar\nAl compas de la viguela;\nQue el hombre
que lo desvela\nUna pena extraordinaria\n' == 'Aquí me pongo a
cantar\nAl compás de la vigüela;\nQue el hombre que lo desvela\nUna
pena extraordinaria\n'
  versos deberia retornar 0

SOLUCION CORRECTA
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");
return 0;
}
 ¡Muy bien! Tu solución pasó todas las pruebas

¡Bien hecho! 
Sin embargo, ¿tiene sentido que versosMartinFierro devuelva 0? ¿Usamos para
algo este resultado? 
Acá parecería que llamamos a esta function porque nos interesa su efecto de
imprimir líneas; nos da igual lo que retorna. Quizás más que una función,
necesitamos definir un procedimiento. ¿Se podrá hacer esto en JavaScript?
La respuesta, ¡en el siguiente ejercicio!

CONSOLA
  versosMartinFierro()
Aquí me pongo a cantar
Al compás de la vigüela;
Que el hombre que lo desvela
Una pena extraordinaria
=> 0

Hasta aca tengo 137 aprobados


Ejercicio 4: ¿Y los procedimientos?
En el ejercicio anterior, construiste una function que se ejecutaba con el sólo
fin de imprimir por pantalla. Y por ello, tuvimos que devolver un valor
cualquiera. ¿No te huele mal?
Además, hagamos memoria: cuando queremos reutilizar código, podíamos
declarar:

 funciones, que siempre retornan algo y no producen ningún efecto


 procedimientos, que no retornan nada, y producen efectos

Entonces versosMartinFierro, no es una función... ¡sino un procedimiento!


¿Cómo se declaran procedimientos en JavaScript?

¡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");
}

Envía esta nueva versión de versosMartinFierro


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");
}
Muy bien! Tu solución pasó todas las pruebas

Esto puede ser un poco perturbador : JavaScript no diferencia funciones de


procedimientos: todos pueden tener efectos y todos pueden o no tener
retorno.

Vos sos responsable de escribir una function que tenga sentido y se comporte


o bien como un procedimiento (sin retorno y con efecto) o bien como una
función (con retorno y sin efecto).

Si empezás a mezclar funciones con retornos y efecto, funcionará, pero tu


código se volverá de a poco más difícil de entender. Esto nos va a pasar
mucho en JavaScript: que puedas hacer algo no significa que debas hacerlo 

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ó?
La respuesta es tan simple como sorprendente: en JavaScript todo lo que
escribamos fuera de una function será, implícitamente, dicho punto de
entrada. Por ejemplo, si queremos un programa que imprime por pantalla el
clásico "Hola, mundo!", lo podremos escribir así:

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

Copiá y enviá este programa


imprimir("Tirando dados");
imprimir("La primera tirada dio " + tirarDado());
imprimir("La segunda tirada dio " + tirarDado());
imprimir("La tercera tirada dio " + tirarDado());
¡Muy bien! Tu solución pasó todas las pruebas

¿Ooooups, y el resultado? ¿Dónde está lo que imprimimos por pantalla? ¿Es


que nuestro programa no anduvo?
No, para nada, es que simplemente no te estamos mostrando lo que sale por
pantalla .
¿Por qué? ¿Porque somos malvados? Bueno, quizás en parte , pero tenemos
además una buena razón: cuando escribís programas reales, es
muy, muy frecuente que no sea fácil ver lo que el imprimir imprime, por
decenas de motivos. Entonces, como rara vez vas poder ver a tiempo lo que
se imprime en la pantalla, terminan siendo una técnica poco útil.
Moraleja: en los ejercicios que quedan, no uses imprimir salvo que te lo
pidamos explícitamente.
¡Nos vemos en el próximo ejercicio!
CONSOLA
 tirarDados()
Tirando dados
La primera tirada dio 5
La segunda tirada dio 4
La tercera tirada dio 5
tirarDados();
^

ReferenceError: tirarDados is not defined

Ejercicio 6: Coerciones
Volvamos un momento al código anterior. ¿Notás algo extraño en esta
expresión?

"La primera tirada dio " + primeraTirada

Utilizamos el operador + de una forma diferente, operando un string y un


número, y lo que hizo fue concatenar al string con la representación textual
del número. Es decir que:

 si operamos dos números con +, se suman


 si operamos dos strings con +, se concatenan
 si operamos un string y un número +, se convierte implícitamente el
número a string, y luego se concatenan, al igual que antes

En JavaScript, estas conversiones implícitas, también llamadas coerciones,


ocurren mucho.

¡Quizás incluso más de lo que nos gustaría! 

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"
SOLUCION MIA CON ERROR
function elefantesEquilibristas(numero){
"elefantes se balanceaban" + numero
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  elefantesEquilibristas(3) Ver detalles
undefined == '3 elefantes se balanceaban'
  elefantesEquilibristas(30) Ver detalles
undefined == '30 elefantes se balanceaban'
  elefantesEquilibristas(4356) Ver detalles
  elefantesEquilibristas(128) Ver detalles

SOLUCION CON ERROR EN LA CONSULTA


function elefantesEquilibristas(numero){
return numero + "elefantes se balanceaban";
}
Noelia Aylen F. hace 10 meses
Hola! No sé que estoy haciendo mal.
Facundo C. hace 10 meses
Hola Noelia. Eso nos pasa porque al concatenar numero y "elefantes se
balanceaban" te queda, por ejemplo: 4elefantes se balanceaban Nos haría
falta un espacio entre el número y el texto, de tal forma que nos quede: 4
elefantes se balanceaban. Un saludo!

Facundo C. hace 10 meses


Nos sigue faltando el espacio. Podríamos poner ""+ ""+""+""+""+""... y aún
así no hay espacios. Espero poder ayudar con eso.

ornella P.  MENTORÍA  hace 10 meses


¡Hola Noelia y Facundo! Facundo esta muy bien lo que aportaste pero entre
las comillas hay que dejar un espacio entre ellas, por ej " "+" ". Noelia,
efectivamente faltaria ese minimo detalle que te dijo Facundo, acordate del
espacio que tenes que dejar en las comillas.

Martin G.  MENTORÍA  hace 10 meses


¡Hola Mariana!
El ejercicio nos dice que escribas una función elefantesEquilibristas, que tome
un número de elefantes, osea que elefantesEquilibristas() tendria que tomar un
número (elefantesEquilibristas(numero)) y devolver una rima como esta: "3 elefantes
se balanceaban", osea que tiene que devolver un número más el string "elefantes se
balanceaban" (numero + string). No te olvides de los espacios entre palabras.

Mariana M. hace 10 meses


unction elefantesEquilibristas(numero) {  return "elefantes se
balanceaban"(numero + " " + " " + " " + " "+ " "+ " "); } lo probe asi y
tampoco me da no se en que me estot equivocando

Lara F.  MENTORÍA  hace 10 meses


¡Hola, Mariana! Los espacios que sumas luego de numero es decir + " " + " " + " "
+ " "+ " "+ " " no son necesarios. Lo que necesitamos es que primero aparezca
el numero y luego el string "elefantes se balanceaban", de forma tal que por
ejemplo si tengo elefantesEquilibristas(10) nos retorne "10 elefantes se balanceaban",
fijate que solo vamos a necesitar un espacio. es decir un " " entre el numero y
el string "elefantes se balanceaban".

SOLUCION CORRECTA
function elefantesEquilibristas(numero){
return(numero + " " + "elefantes se balanceaban");
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
elefantesEquilibristas(5)
=> "5 elefantes se balanceaban"
   

Ejercicio 7: El círculo de la vida


En programación buscamos que resolver nuestros problemas usando…
programas . Y entre los problemas que casi nadie quiere resolver están los
matemáticos. Sobre todo aquellos que aparecen números como pi con
infinitos decimales imposibles de recordar. 

Considerando al número pi igual a 3.14159265358979 (no es infinito pero lo


suficientemente preciso para nuestros cáculos):

Definí las funciones perimetroCirculo y areaCirculo que reciben el radio de un círculo y a


partir del mismo nos retornan su perímetro y su área.
 ¡Dame una pista!
El perímetro se calcula como dos veces pi por el radio de un círculo. El área,
en cambio, es el resultado de hacer pi por radio por radio.

SOLUCION MIA NO CORRECTA

function perimetroCirculo(perímetro) return (perímetro ===


3.14159265358979 * radio)
};
function areaCirculo(área)
{ return (área === 3.14159265358979 * (radio * radio))};
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:

  perimetroCirculo debe tener un parámetro

Problemas que encontramos:

 parece que estás usando radio pero no está definido. ¿Puede que hayas


escrito mal su nombre o tengas que definirlo?

 Detalles
Resultados de las pruebas:

  El perimetro de un circulo de radio 1 es 6.28318530717958 Ver detalles


 perimetroCirculo de 1 debería ser aproximadamente 6.28318530717958

  El perimetro de un circulo de radio 2 es 12.56637061435916 Ver


detalles

 perimetroCirculo de 2 debería ser aproximadamente 12.56637061435916

  El perimetro de un circulo de radio 0 es 0


  El area de un circulo de radio 1 es 3.14159265358979 Ver detalles
  El area de un circulo de radio 2 es 12.56637061435916 Ver detalles
  El area de un circulo de radio 0 es 0 Ver detalles

SOLUCION CORRECTA

function perimetroCirculo(radio){
return 3.14159265358979*(radio*2);
}
function areaCirculo(radio){
return 3.14159265358979*(radio*radio);
}

OTRA SOLUCION CORRECTA


function perimetroCirculo(radio){
return(3.14159265358979 * 2 * radio)
}
function areaCirculo(radio) {
return(3.14159265358979 * radio * radio)
}
¡Muy bien! Tu solución pasó todas las pruebas

Excelente, la precisión de nuestros cálculos es innegable , pero tuvimos que


escribir un número larguísimo. Pensemos que pi aparece en un montón de
fórmulas matemáticas. ¿Es necesario escribir este número cada vez?¿No
podemos hacer algo más cómodo? 

CONSOLA
 perimetroCirculo(20,3.14159265358979)
=> 125.6637061435916
  areaCirculo(20, 3.14159265358979)
=> 1256.637061435916

Ejercicio 8: PIenso que así es más fácil


Por suerte existe una herramienta que va a simplificar nuestra tarea de ahora
en adelante: las variables. 

Las variables nos permiten nombrar y reutilizar valores. Similar a cómo los


procedimientos y funciones nos permiten dar nombres y reutilizar soluciones
a problemas más pequeños. Por ejemplo, si hacemos...

let primerMes = "enero"

...estamos asignándole el valor "enero" a la variable primerMes. En criollo,


estamos dándole ese valor a la variable. 
Cambiá los lugares donde aparece 3.14159265358979 por la variable pi en las funciones
que tenemos definidas.
SOLUCION DADA POR MUMUKI A MODIFICAR POR LO PEDIDO

let pi = 3.14159265358979;
function perimetroCirculo(radio){
return(3.14159265358979 * 2 * radio)
}
function areaCirculo(radio) {
return(3.14159265358979 * radio * radio)
}
SOLUCION MODIFICADA CORRECTA
let pi = 3.14159265358979;
function perimetroCirculo(radio){
return(pi * 2 * radio)
}
function areaCirculo(radio) {
return(pi * radio * radio)
}
¡Muy bien! Tu solución pasó todas las pruebas

¡Excelente! Gracias a la variable pi no tuvimos que escribir el número cada


vez que teníamos que usarlo y ¡nuestro programa quedó mucho más
entendible! 

Ejercicio 9: Esto no tiene valor


Ya que vas entendiendo cómo se asignan las variables, te traemos algo para
pensar: ¿qué pasa si intento usar una variable a la que nunca le asigné un
valor? 
Tenemos esta función definida:

function sumaSinSentido() {
return numero + 8;
}
Probala en la consola y fijate qué sucede.
CONSOLA
  15
=> 15
  15 + 8
=> 23
  2 + 8
=> 10

Ejercicio 10: Variables globales


Entonces, ¿es necesario darle valor a nuestras variables antes de usarlas?
¡Sí!  Cuando declarás una variable tenés que darle un valor inicial, lo cual se
conoce como inicializar la variable.
¡Y sorpresa! Podemos declarar variables tanto directamente en el programa,
como dentro de una function:

function cuentaExtravagante(unNumero) {
let elDoble = unNumero * 2;
if (elDoble > 10) {
return elDoble;
} else {
return 0;
}
}

Las variables declaradas dentro de una function, conocidas como variables


locales, no presentan mayor misterio. Sin embargo, hay que tener un
particular cuidado: sólo se pueden utilizar desde dentro de la function en
cuestión. Si quiero referenciarla desde un programa:

let elCuadruple = elDoble * 4;

Kaboom, ¡se romperá! 

Sin embargo, las variables declaradas directamente en el programa,


conocidas como variables globales, pueden ser utilizadas desde
cualquier function. Por ejemplo:

let pesoMaximoEquipajeEnGramos = 5000;


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:

 pesoPromedioPersonaEnKilogramos, la cual ya está declarada,


 cargaMaximaEnKilogramos que vas a tener que declarar.

SOLUCION MIA CON ERROR


let cargaMaximaEnKilogramos = 300

function ascensorSobrecargado(pesoPromedioPersonaEnKilogramos){

return pesoPromedioPersonaEnKilogramos <= cargaMaximaEnKilogramos;

Tu solución no pasó las pruebas


Resultados de las pruebas:
  ascensorSobrecargado(4) con pesoPromedioPersonaEnKilogramos =
70 Ver detalles
false == true
  ascensorSobrecargado(4) con pesoPromedioPersonaEnKilogramos =
80
  asensorSobrecagado(2) con pesoPromedioPersonaEnKilogramos =
80 Ver detalles
false == true
  ascensorSobrecargado(5) con pesoPromedioPersonaEnKilogramos =
80
OTRA SOLUCION MIA CON ERROR
let cargaMaximaEnKilogramos = 300
function ascensorSobrecargado(pesoPromedioPersonaEnKilogramos){
return pesoPromedioPersonaEnKilogramos >=
cargaMaximaEnKilogramos;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  ascensorSobrecargado(4) con pesoPromedioPersonaEnKilogramos =


70
  ascensorSobrecargado(4) con pesoPromedioPersonaEnKilogramos =
80 Ver detalles
false == true
 asensorSobrecagado(2) con pesoPromedioPersonaEnKilogramos = 80

  ascensorSobrecargado(5) con pesoPromedioPersonaEnKilogramos =
80 Ver detalles
false == true
SOLUCION CON ERROR DE LA CONSULTA

let cargaMaximaEnKilogramos=300

function ascensorSobrecargado(personas){

let pesoPromedioPersonaEnKilogramos = 90

return (pesoPromedioPersonaEnKilogramos*personas)>=cargaMaximaEnKilogramos

Diana L.  MENTORÍA  hace 9 meses


¡Hola Pamela!
Como pesoPromedioPersonaEnKilogramos es una variable global, no necesitamos
declararla dentro de la función. De igual manera, no tenemos que definirla
nunca, porque como dice el enunciado, ya fue declarada (nos viene de
regalo 😉). En cambio cargaMaximaEnKilogramos nos dicen que no está
declarada, por eso está perfecto sí declararla, como hiciste en la línea 1.
Si eliminas la línea 3 debería andar.
SOLUCION CORRECTA

let cargaMaximaEnKilogramos=300
function ascensorSobrecargado(personas){
return
(pesoPromedioPersonaEnKilogramos*personas)>=cargaMaximaEnKilogramos;
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 11: La buena fortuna


Las variables no serían tan interesantes si no se pudieran modificar.
Afortunadamente, JavaScript nos da nuevamente el gusto y nos lo permite:

function pasarUnDiaNormal() {
diasSinAccidentesConVelociraptores = diasSinAccidentesConVelociraptores
+1
}
function tenerAccidenteConVelociraptores() {
diasSinAccidentesConVelociraptores = 0;
}
¡Ahora vamos a hacer algo de dinero !
Definí el procedimiento aumentarFortuna que duplique el valor de la variable
global pesosEnMiBilletera. No declares la variable, ya lo hicimos por vos (con una cantidad
secreta de dinero) .
 ¡Dame una pista!

¿Cómo usar aumentarFortuna? Por ejemplo así:

// Consulto la varible a ver cuanto tiene:


pesosEnMiBilletera
500 // ¡Ojo! Esto es a fines ilustrativos;
// ¡podría tener cualquier cantidad!
// Aumento mi fortuna:
aumentarFortuna()
// Consulto de nuevo mi fortuna:
pesosEnMiBilletera // ¡Aumentó!
1000

SOLUCION MIA CON ERROR

function aumentarFortuna (){


return pesosEnMiBilletera * 2;
}
Tu solución no pasó las pruebas

Ver detalles

Objetivos que no se cumplieron:

  la solución no debe usar return


  la solución debe asignar pesosEnMiBilletera
Eh, ¿qué pasó acá ?

Recordá que sólo tenés que asignar la variable global; no uses return porque


no hay que devolver nada.

¡Corrijamos el problema!
Resultados de las pruebas:

  el aumentarFortuna duplica variable global pesosEnMiBilletera Ver


detalles

100 == 200

  el aumentarFortuna se puede llamar múltiples veces Ver detalles

30 == 240
OTRA CON ERROR MIA

function aumentarFortuna (){

pesosEnMiBilletera * 2;

Tu solución no pasó las pruebas


Objetivos que no se cumplieron:

  la solución debe asignar pesosEnMiBilletera

Resultados de las pruebas:

  el aumentarFortuna duplica variable global pesosEnMiBilletera Ver


detalles

100 == 200

  el aumentarFortuna se puede llamar múltiples veces Ver detalles

30 == 240
Consulta con error

function aumentarFortuna() {

(pesosEnMiBilletera*2);

Hernan A. hace 10 meses


Te está faltando guardo el cálculo qud hiciste en la variable global... algo así:
pesosEnMiBilletera = pesosEnMiBilletera*2;
Guillermo Ignacio B.  MENTORÍA  hace 10 meses
¡Hola Lautaro! Algo similar a lo que dice Hernan, fijate que no estás
guardando el resultado de la operación en ningún lado. Para hacer esto
fijate que hay un ejemplo en el ejercicio: diasSinAccidentesConVelociraptores =
diasSinAccidentesConVelociraptores + 1 Acá, a la derecha le sumamos 1 a la
variable diasSinAccidentesConVelociraptores y se lo asignamos a la misma
variable. Algo similar hay que hacer en este caso con pesosEnMiBilletera
SOLUCION CORRECTA

function aumentarFortuna (){


pesosEnMiBilletera = pesosEnMiBilletera * 2;
}
¡Muy bien! Tu solución pasó todas las pruebas

Actualizaciones como duplicar, triplicar, incrementar en uno o en una cierta


cantidad son tan comunes que JavaScript presenta algunos atajos:

x += y; //equivalente a x = x + y;
x *= y; //equivalente a x = x * y;
x -= y; //equivalente a x = x - y;
x++; //equivalente a x = x + 1;

¡Usalos cuando quieras! 

CONSOLA

pesosEnMiBilletera
=> 0
  aumentarFortuna()
=> undefined
  pesosEnMiBilletera // ¡aumento!
=> 0
   
Ejercicio 12: ¿Y esto cuánto vale?
Vimos que una variable solo puede tener un valor, entonces cada vez que le
asignamos uno nuevo, perdemos el anterior. Entonces, dada la función:

function cuentaExtravagante() {
let numero = 8;
numero *= 2;
numero += 4;
return numero;
}
¡La respuesta es correcta!
¿Qué retorna cuentaExtravagante?

"numero"
8
16
20
true
Enviar

 ¡La respuesta es correcta!

¡Terminaste Variables y procedimientos!


¡Perfecto!

A lo largo de esta lección hiciste muchas cosas nuevas:

 imprimiste por pantalla; 


 conociste los procedimientos en el lenguaje JavaScript, que si bien se
definen igual que las funciones son bien distintos; 
 utilizaste los dos tipos de variables, locales y globales, y aprendiste sus
diferencias. 
¡Veamos que depara la siguiente lección! 

Lógica booleana
Como ya viste a lo largo de varios ejercicios, cuando programamos
trabajamos con booleanos que representan valores de verdad. Podemos
operar con ellos mediante lo que denominamos operadores lógicos, como la
conjunción y la disyunción. ¡Vamos a aprender un poco más sobre ellos! 

Ejercicios

  1. ¡Que el último apague la luz!


  2. Negar no cuesta nada
  3. Los peripatéticos
  4. La verdad detrás de la conjunción
  5. ¡Juguemos al T.E.G.!
  6. Y ahora... ¿quién podrá ayudarnos?
  7. ¡Buen día!
  8. La verdad es que no hay una verdad
  9. ¡Hola! Mi nombre es Xor
  10. Precedencia
  11. Un ejercicio sin precedentes
  12. ¿Puedo subir?

Ejercicio 1: ¡Que el último apague la luz!


Empecemos por algo sencillo, ¿te acordás del operador ! ? Se lo denomina
negación, not o complemento lógico y sirve para negar un valor booleano.

Si tengo el booleano representado por tieneHambre, el complemento será !


tieneHambre.

¿Y esto para qué sirve?  Por ejemplo, para modelar casos de alternancia


como prender y apagar una luz :
let lamparaPrendida = true;

function apretarInterruptor() {
lamparaPrendida = !lamparaPrendida;
}

¡Ahora te toca a vos!

Definí el procedimiento usarCierre para que podamos abrir y cerrar el


cierre de una mochila.
SOLUCION CORRECTA

let mochilaAbierta = true;


function usarCierre (){
mochilaAbierta = !mochilaAbierta;
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 2: Negar no cuesta nada


Por el momento no parece una idea muy interesante, pero nos puede servir
para reutilizar la lógica de una función que ya tenemos definida.

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);
}
¡Ahora te toca a vos! Definí esMayorDeEdad, que recibe una edad, y
luego esMenorDeEdad a partir de ella.
SOLUCION MIA CON ERROR

function esMayorDeEdad(edad){
return !esMenorDeEdad(edad); El error es que inverti lo que va en function
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:

  la solución debe declarar esMenorDeEdad


  esMenorDeEdad debe utilizar esMayorDeEdad

Problemas que encontramos:


 parece que estás usando esMenorDeEdad pero no está definido. ¿Puede
que hayas escrito mal su nombre o tengas que definirlo?
 Detalles
Resultados de las pruebas:
  alguien de 20 años es mayor de edad Ver detalles
esMenorDeEdad is not defined
  alguien de 18 años es mayor de edad Ver detalles
esMenorDeEdad is not defined
  alguien de 17 años no es mayor de edad Ver detalles
esMenorDeEdad is not defined

SOLUCION EN LA CONSULTA CON ERROR

function esMayorDeEdad (edad){


return edad >= 18;
}
function esMenorDeEdad(){
return !esMayorDeEdad;
}
Paula G. hace 11 meses
Siento que es simple, pero en dos pruebas me devuelve error. Acá es un
booleano, si no es mayor de edad, es menor. No entiendo porqué no
funciona

Sergio Sebastian S. hace 11 meses


Hola Paula! tu ejercicio esta bien plenateado.. pero tenes un pequeño error..
cuando usas esMenorDeEdad(){ tendrias que pasarle una edad ejemplo
esMenorDeEdad(edad) y cuando llamas a la funcion esMayorDeEdad deberias
pasarle el parametro de la edad entre los parentesis.

SOLUCION CORRECTA
function esMayorDeEdad (edad){
return edad >= 18;
}
function esMenorDeEdad(edad){
return(!esMayorDeEdad(edad));
}
 ¡Muy bien! Tu solución pasó todas las pruebas

Cada una de las funciones representa un estado de dos posibles: ser mayor o
ser menor de edad. No se puede ser ambos al mismo tiempo y tampoco se
puede evitar pertenecer a alguno de los dos grupos. Es decir, ¡siempre sos
uno u otro! 
Por eso decimos que son complementarios y que juntos forman el conjunto
universal.

Ejercicio 3: Los peripatéticos


Otro de los operadores con el que ya te encontraste es la conjunción lógica
(también llamada y lógico, o and por su nombre en inglés), que sólo retorna
verdadero cuando todas las expresiones que opera son verdaderas.
Podemos encadenar varias de ellas mediante el operador && y alcanza con
que sólo una de ellas sea falsa para que toda la expresión resulte falsa.
Por ejemplo, si cuento con la función:

function esCantanteProlifico (cdsEditados, recitalesRealizados, graboAlgunDVD) {


return cdsEditados >= 10 && recitalesRealizados > 250 && graboAlgunDVD;
}

y tenemos un cantante que no grabó un DVD, entonces no se lo


considera prolífico, incluso aunque haya editado más de 10 CDs y dado más
de 250 recitales.

Definí una función esPeripatetico que tome la profesión de una persona, su nacionalidad


y la cantidad de kilómetros que camina por día. Alguien es peripatético cuando es un
filósofo griego y le gusta pasear (camina más de 2 kilómetros por día). Ejemplo:

esPeripatetico("filósofo", "griego", 5)
true
esPeripatetico("profesor", "uruguayo", 1)
false
SOLUCION MIA CON ERROR

function esPeripatetico(profesion, nacionalidad, kilometrospordia){


return profesion = filosofo && nacionalidad = griego && kilometrospordia
= 2; mi error aca es poner solo un igual van 3
} el error aca es que debe ser >
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return profesion = filosofo && nacionalidad = griego && kilometrospordia = 2;
^^^^^^^^^^^^^^^^^^^^^^^^

SOLUCION CORRECTA

function esPeripatetico(profesion, nacionalidad, kilometrospordia){


return profesion === "filosofo" && nacionalidad === "griego" &&
kilometrospordia > 2;
}
 ¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 esPeripatetico("contador", "ruso", 3)
=> false
  esPeripatetico("filosofo", "griego", 3)
=> true
   

Ejercicio 4: La verdad detrás de la conjunción


En la lógica booleana, se puede definir el comportamiento de un operador
con una tabla de verdad donde A y B son las expresiones o valores de
verdad a ser operados y el símbolo ^ representa la conjunción. Cada celda
tiene una V si representa verdadero o F si representa falso.
Por ejemplo, supongamos que una casa consume poca energía si se usa el
aire acondicionado a 24 grados y tiene al menos 5 lamparitas bajo consumo.
Podemos representar las expresiones de la siguiente forma:
 A: En la casa se usa el aire acondicionado a 24 grados
 B: La casa tiene al menos 5 lamparitas bajo consumo
 A ^ B: La casa consume poca energía
Como indicamos, la casa consume poca energía (A^B) cuando
tanto A como B son verdaderos. Esto se puede representar mediante la
siguiente tabla de verdad:
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)
 consumePocaEnergia(24,5)
=> true
  consumePocaEnergia(24, 0)
=> false
  consumePocaEnergia(21, 7)
=> false
  consumePocaEnergia(18, 1)
=> false

Ejercicio 5: ¡Juguemos al T.E.G.!


¿Y si basta con que una de varias condiciones se cumpla para afirmar que
una expresión es verdadera? Podemos utilizar otro de los operadores que ya
conocés, ¡la disyunción lógica! 

Recordá que se lo representa con el símbolo || y también se lo conoce como


el operador or.
En el famoso juego T.E.G., un jugador puede ganar de dos formas:
cumpliendo su objetivo secreto o alcanzando el objetivo general de
conquistar 30 países.

function gano(cumplioObjetivoSecreto, cantidadDePaisesConquistados) {


return cumplioObjetivoSecreto || cantidadDePaisesConquistados >= 30;
}
Probá en la consola las siguientes expresiones:

  gano(true, 25)
  gano(false, 30)
  gano(false, 20)
  gano(true, 31)

¿Te animás a construir la tabla de verdad de la disyunción lógica?


CONSOLA

 gano(true, 25)
=> true
  gano(false, 30)
=> true
  gano(false, 20)
=> false
  gano(true, 31)
=> true

Ejercicio 6: Y ahora... ¿quién podrá


ayudarnos?
Nuestra amiga Dory  necesitaba hacer algunos trámites en el banco, pero
cuando llegó notó que estaba cerrado. 

Para evitar que le ocurra nuevamente, vamos a definir una función que
ayude a la gente despistada como ella.

Sabemos que el banco está cerrado cuando:

 Es feriado, o
 Es fin de semana, o
 No estamos dentro del horario bancario.
La función dentroDeHorarioBancario ya la definimos por vos: recibe un
horario  (una hora en punto que puede ir desde las 0 hasta las 23) y nos dice
si está comprendido en la franja de atención del banco.

Definí las funciones esFinDeSemana y estaCerrado.


MI SOLUCION CON ERROR

function estaCerrado(esFeriado, dia, horario) {


return
}
function dentroDeHorarioBancario(horario) {
return horario >= 10 && horario <= 15;}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:

  la solución debe declarar esFinDeSemana


  la solución debe utilizar dentroDeHorarioBancario

Resultados de las pruebas:

  un lunes feriado a las 14hs el banco está cerrado Ver detalles


  un miércoles feriado a las 20hs el banco está cerrado Ver detalles
  un jueves corriente a las 13hs el banco no está cerrado Ver detalles
  un sábado corriente a las 11hs el banco está cerrado Ver detalles
  un domingo corriente a las 19hs el banco está cerrado Ver detalles
  un domingo corriente a las 13hs el banco está cerrado Ver detalles
  un martes corriente a las 16hs el banco está cerrado Ver detalles

SOLUCION DE LA CONSULT CON ERROR

function esFinDeSemana(dia) {
return dia === "sabado" || dia === "domingo"
}
function estaCerrado(esFeriado, dia, horario) {
return esFeriado || dentroDeHorarioBancario(horario) || esFinDeSemana(dia)
}
Julian Gonzalo A. hace 10 meses
Me sale error en: un jueves corriente a las 13hs el banco no está cerrado un
martes corriente a las 16hs el banco está cerrado
No entiendo que estoy haciendo mal.
Sergio Sebastian S. hace 10 meses
Hola Julian... los comparadores || son para O en este caso estas diciendo si es
Feriado O esta dentro del horario bancario O es fin de semana .. .devolver
TRUE Es feriado esta genial.. si es feriado el banco esta cerrado... es fin de
semana... esta bien... si es fin de semana el banco esta cerrado... ahora el
horario... da TRUE si ES HORARIO BANCARIO vos necesitas lo contrario..
y por segundo.. revisa sabado creo que lleva tilde.-
SOLUCION DE LA CONSULTA CON ERROR
function esFinDeSemana(dia) {
return dia === "sabado" || dia === "domingo"
}
function estaCerrado(esFeriado, dia, horario) {
return esFeriado || dentroDeHorarioBancario(!horario) || esFinDeSemana(dia)
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  un lunes feriado a las 14hs el banco está cerrado


  un miércoles feriado a las 20hs el banco está cerrado
  un jueves corriente a las 13hs el banco no está cerrado
  un sábado corriente a las 11hs el banco está cerrado
  un domingo corriente a las 19hs el banco está cerrado
  un domingo corriente a las 13hs el banco está cerrado
  un martes corriente a las 16hs el banco está cerrado Ver detalles

false == true

SOLUCION CORRECTA
function esFinDeSemana(dia) {
return dia === "sabado" || dia === "domingo"
}
function estaCerrado(esFeriado, dia, horario) {
return esFeriado || !dentroDeHorarioBancario(horario) || esFinDeSemana(dia)
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
 estaCerrado ("sabado")
=> "sabado"
  esFinDeSemana("sabado")
=> true
  esFinDeSemana("martes")
=> false

Ejercicio 7: ¡Buen día!


Sabemos que el seguimiento de árboles genealógicos puede tornarse complicado
cuando hay muchas personas y relaciones involucradas.
Por ejemplo, en la familia Buendía ocurre que:
 Arcadio es hijo de José Arcadio y de Pilar Ternera
 Aureliano José es hijo del Coronel Aureliano y Pilar Ternera
 Aureliano Segundo y Remedios son hijos de Arcadio y Sofía De La Piedad
Para empezar a analizar esta familia, ya definimos las funciones madreDe y padreDe:
CONSOLA

padreDe(aurelianoJose)
"Coronel Aureliano"
madreDe(aurelianoSegundo)
"Sofía De La Piedad"

Ahora te toca a vos definir la función sonMediosHermanos. Recordá que los medios


hermanos pueden compartir madre o padre pero no ambos porque... ¡en ese caso
serían hermanos! 
 ¡Dame una pista!
Quizás te sirva definir las funciones tienenLaMismaMadre y tienenElMismoPadre.
SOLUCION MIA MAL
function tienenLaMismaMadre(Arcadio, Aureliano){
return madreDe;
}
function tienenElMismoPadre (){
return padreDe;
function sonMediosHermanos(){
return tienenLaMismaMadre && ! tienenElMismoPadre === sonMediosHermanos;
}
Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:35
});
^

SyntaxError: Unexpected token )

OTRA SOLUCION MIA MAL


function tienenLaMismaMadre(Arcadio, Aureliano){
return madreDe;
}
function tienenElMismoPadre (){
return padreDe;}
function sonMediosHermanos(){
return tienenLaMismaMadre && ! tienenElMismoPadre === sonMediosHermanos;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  arcadio y aurelianoJose son medios hermanos Ver detalles

 false == true

  aurelianoSegundo y remedios no son medios hermanos


  aurelianoSegundo y aurelianoJose no son medios hermanos
  remedios y arcadio no son medios hermanos
  martinPerez y felipePerez son medios hermanos  Ver detalles

false == true

solución de la consulta con error


function tienenLaMismaMadre(nom1, nom2){
return madreDe(nom1) === madreDe(nom2)
}

function tienenElMismoPadre(nom1,nom2){
return padreDe(nom1) === padreDe(nom2)
}

function sonMediosHermanos(nom1, nom2){


return (tienenElMismoPadre && !tienenLaMismaMadre) || (tienenLaMismaMadre && !
tienenElMismoPadre)
}
Luciana C. hace 10 meses
Me marca que estan bien todas las que SI son hermanos, pero no en las que
son MEDIOS hermanos. ya no se en que me estoy confundiendo

Carlos Jorge T. hace 10 meses


Hola Luciana. En tu última función "sonMediosHermanos" estás invocando a
las funciones "tienenLaMismaMadre" y "tienenElMismoPadre" sin pasarle los
parámetros "nom1" y "nom2". La definición de esas dos funciones está
perfecta y la lógica del "return" de "sonMediosHermanos" también.

SOLUCION CON ERROR

function tienenLaMismaMadre(nom1, nom2){


return madreDe(nom1) === madreDe(nom2)
}
function tienenElMismoPadre(nom1,nom2){
return padreDe(nom1) === padreDe(nom2)
}
function sonMediosHermanos(nom1, nom2){
return (tienenElMismoPadre(nom1, nom2) && !tienenLaMismaMadre) ||
(tienenLaMismaMadre(nom1, nom2) && !tienenElMismoPadre)
}
Tu solución no pasó las pruebas

  arcadio y aurelianoJose son medios hermanos Ver detalles


  aurelianoSegundo y remedios no son medios hermanos
  aurelianoSegundo y aurelianoJose no son medios hermanos
  remedios y arcadio no son medios hermanos
  martinPerez y felipePerez son medios hermanos Ver detalles

OTRA SOLUCION DE LA CONSULTA A CORREJIR


function tienenLaMismaMadre (hijo1, hijo2 ) {
return madreDe (hijo1) === madreDe (hijo2);
}
function tienenElMismoPadre ( hijo1, hijo2 ) {
return padreDe ( hijo1 ) === padreDe ( hijo2 );
}
function sonMediosHermanos ( hijo1 , hijo2 ) {
return tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre
( hijo1 , hijo2 ) ;
}
Micaela Denise I. hace 10 meses
hola buenas noches, me toma martinPerez y felipePerez son medios
hermanos como incorrecto
segun entiendo en SON MEDIOS HERMANOS faltaria agregaria que NO
tieneLaMismaMadre pero tieneElMismoPadre
!tienenLaMismaMadre ( hijo1 , hijo2 ) && tienenElMismoPadre ( hijo1 ,
hijo2 );
pero no se como resolverlo, ayuda !!

Daniela M.  MENTORÍA  hace 10 meses


¡Buenas noches Mica! ¿Como estas? Sabemos que, que tengan la misma
madre y que a la vez no la tengan, es medio ilogico o ¿No?. Entonces
sabemos que por un lado tenemos tienenLaMismaMadre ( hijo1 , hijo2 ) && !
tienenElMismoPadre ( hijo1 , hijo2 ) y, por el otro, !tienenLaMismaMadre ( hijo1 , hijo2 )
&& tienenElMismoPadre ( hijo1 , hijo2 ). Tenemos dos condiciones distintas que
dentro de ellas tienen dos condiciones a la vez. Esta bueno cerrar cada una
entre parentesis pero faltaria el operador logico que lo evalue. Por ahora
esta quedando asi:

( tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre ( hijo1 ,


hijo2 ) ) ??? ( ( hijo1 , hijo2 ) && tienenElMismoPadre ( hijo1 , hijo2 ) )

Si son medios hermanos, entonces significa que cumple la primer parte o


cumple la segunda. Ese o, que es el que deberia tomar el lugar de los signos
de pregunta, se escribe | |.
Espero que asi se entienda mejor como poder evaluar mas de una condicion.
Cualquier cosa consulta y te doy una mano.
Micaela Denise I. hace 10 meses
Hola daniela, entonces:
( tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre ( hijo1 ,
hijo2 ) ) || ( ( hijo1 , hijo2 ) && tienenElMismoPadre ( hijo1 , hijo2 ) )
la logica seria... hijo 1 e hijo 2 tienen la misma madre y diferente padre ..
como primer condicion O || hijo1 e hijo 2 tienen el mismo padre... como
segunda condicion.
lo plantee asi y me toma como error todo ahora
Daniela M.  MENTORÍA  hace 10 meses
¿Cual es el error que te pone?
Micaela Denise I. hace 10 meses
lo pongo asi completo como para que veas todo
function tienenLaMismaMadre (hijo1, hijo2 ) { return madreDe (hijo1) ===
madreDe (hijo2); }
function tienenElMismoPadre ( hijo1, hijo2 ) { return padreDe ( hijo1 ) ===
padreDe ( hijo2 ); }
function sonMediosHermanos ( hijo1 , hijo2 ) { ( tienenLaMismaMadre ( hijo1
, hijo2 ) && !tienenElMismoPadre ( hijo1 , hijo2 ) ) || ( ( hijo1 , hijo2 ) &&
tienenElMismoPadre ( hijo1 , hijo2 ) )
} y me responde que no paso la prueba pero no me tira error.
simplemente en rojo
Daniela M.  MENTORÍA  hace 10 meses
Bien. Fijate que en la segunda condicion hay un parentesis con parametros
solo, le falta la funcion que corresponde. Fijate si arreglando eso funciona. Si
lo vemos bien, lo que falta es !tienenLaMismaMadre (hijo1, hijo2)

Micaela Denise I. hace 10 meses


ahora si.. y tambien faltaba la palabra return en medios hermanos ... ahora
me lo tomo! gracias por la paciencia!! <3

function tienenLaMismaMadre (hijo1, hijo2 ) { return madreDe (hijo1) ===


madreDe (hijo2); }
function tienenElMismoPadre ( hijo1, hijo2 ) { return padreDe ( hijo1 ) ===
padreDe ( hijo2 ); }
function sonMediosHermanos ( hijo1 , hijo2 ) {
return tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre
( hijo1 , hijo2 ) || !tienenLaMismaMadre ( hijo1 , hijo2 ) &&
tienenElMismoPadre ( hijo1 , hijo2 ) )
} LE HABIA COLOCADO ESTE ) DE MAS POR ESO DABA ERROR
SOLUCION CORRECTA
function tienenLaMismaMadre (hijo1, hijo2 ) { return madreDe (hijo1) ===
madreDe (hijo2); }
function tienenElMismoPadre ( hijo1, hijo2 ) { return padreDe ( hijo1 ) ===
padreDe ( hijo2 ); }
function sonMediosHermanos ( hijo1 , hijo2 ) {
return tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre
( hijo1 , hijo2 ) || !tienenLaMismaMadre ( hijo1 , hijo2 ) &&
tienenElMismoPadre ( hijo1 , hijo2 );
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 8: La verdad es que no hay una


verdad
Ahora pensemos cómo sería la tabla de verdad que representa el
comportamiento de la función que acabás de hacer.
Las proposiciones serán tienenLaMismaMadre y tienenElMismoPadre, y los valores
de verdad que porten dependerán de qué dos personas estén evaluando.
El booleano final resultará de operarlas mediante sonMediosHermanos:

tienen la misma madre tienen el mismo padre son medios hermanos

true true false

true false true

false true true

false false false

Probá tu función sonMediosHermanos con los siguientes valores y


comprobá si se comporta como la tabla:

  sonMediosHermanos(arcadio, aurelianoJose)
  sonMediosHermanos(aurelianoSegundo, remedios)
  sonMediosHermanos(aurelianoJose, remedios)

 ¡Dame una pista!


Recordá que en la familia Buendía:

 Arcadio es hijo de José Arcadio y de Pilar Ternera


 Aureliano José es hijo del Coronel Aureliano y Pilar Ternera
 Aureliano Segundo y Remedios son hijos de Arcadio y Sofía De La
Piedad
 sonMediosHermanos(arcadio, aurelianoJose)
 => true
   sonMediosHermanos(aurelianoSegundo, remedios)
 => false
   sonMediosHermanos(aurelianoJose, remedios)
 => false

Ejercicio 9: ¡Hola! Mi nombre es Xor


Ahora cambiemos las funciones tienenLaMismaMadre y tienenElMismoPadre por
proposiciones genéricas A y B. Además, representemos la operación que
realiza sonMediosHermanos con el símbolo ⊻. Lo que obtenemos es... ¡una nueva
tabla! 

A B A⊻B

V V F

V F V

F V V

F F F

Este comportamiento existe como un operador dentro de la lógica y se lo


denomina xor o disyunción lógica excluyente.

A diferencia del and, or y not, el xor no suele estar definido en los


lenguajes.  Sin embargo, ahora que sabés cómo funciona, si alguna vez lo
necesitás podés definirlo a mano. 

Veamos si se entiende: definí la función genérica xor, que tome dos booleanos y


retorne el valor de verdad correspondiente.
SOLUCION MIA CON ERROR

function A(hijo1, hijo2 ) { return madreDe (hijo1) === madreDe (hijo2); }

function B ( hijo1, hijo2 ) { return padreDe ( hijo1 ) === padreDe ( hijo2 ); }

function A ⊻ B( hijo1 , hijo2 ) {


return tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre
( hijo1 , hijo2 ) || !tienenLaMismaMadre ( hijo1 , hijo2 ) &&
tienenElMismoPadre ( hijo1 , hijo2 );

¡Ups! Tu solución no se puede ejecutar


Resultados:

solucion.js:3
function A ⊻ B( hijo1 , hijo2 ) {
^

SyntaxError: Invalid or unexpected token

OTRA SOLUCION MIA CON ERROR

function A(hijo1, hijo2 ) { return madreDe (hijo1) === madreDe (hijo2); }

function B ( hijo1, hijo2 ) { return padreDe ( hijo1 ) === padreDe ( hijo2 ); }

function A xor B( hijo1 , hijo2 ) {

return tienenLaMismaMadre ( hijo1 , hijo2 ) && !tienenElMismoPadre


( hijo1 , hijo2 ) || !tienenLaMismaMadre ( hijo1 , hijo2 ) &&
tienenElMismoPadre ( hijo1 , hijo2 );

¡Ups! Tu solución no se puede ejecutar


Resultados:

solucion.js:3
function A xor B( hijo1 , hijo2 ) {
^^^

SyntaxError: Unexpected identifier

SOLUCION DADA EN LA CONSULTA COR ERROR

function xor(A,B){

return (A===false||B===false)&& A!=B


}

Camila P. hace 10 meses


Hola no se me ocurre como podria reducir aun mas la expresion sin quitarle
funcionalidad

Carlos Jorge T. hace 10 meses


Hola Camila... Si te fijás bien en la tabla de verdad, para que una función sea
XOR, simplemente debe devolver true cuando ambos parámetros son
diferentes, es decir, cuando (A != B). Si A y B son iguales, entonces debe
devolver false.

function xor(A,B){

(A === B)

return (false);}{

else (true);}

 ¡Ups! Tu solución no se puede ejecutar


Resultados:

solucion.js:4
else (true);}
^^^^

SyntaxError: Unexpected token else

OTRA SOLUCION DE LA CONSULTA CON ERROR

function xor(A,B){

if (A !== B) {

return true;

} else (false);

Paula G. hace 11 meses


hola! no logro ver donde esta el error ya que le di el if y me da con 2
soluciones error
Mayra M. hace 11 meses
¡Hola Paula! Lo que sucede es que (A !== B) ya es una expresión booleana y
de por si nos devuelve True o False, por lo que no es necesario preguntarlo en
el if. No se si me explique bien, si no es asi, podes volver a consultarme,
¡Saludos!

function xor(A,B){

(A !== B) {

return true;

} else (false);

¡Ups! Tu solución no se puede ejecutar


Resultados:

solucion.js:2
(A !== B) {
^

SyntaxError: Unexpected token {

OTRA SOLUCION DE LA CONSULTA

function xor(a, b){

return (a && !b)||&(!a && b);

Daiana G. hace 4 meses


Agregué un & para poder consultar, porque funciona pero no logro
entender porqué no debemos incluir las combinaciones donde da false,
como (a&&b). Gracias!!
Catalina F.  MENTORÍA  hace 4 meses
¡Hola Daiana!
Esto se debe a que xor es una disyunción lógica excluyente, lo que quiere
decir que funciona como un or estricto: solo da verdadero cuando solo una
de las proposiciones es verdadera y la otra es falsa. Si pusieramos a&&b o
!a&&!b xor nos devolvería falso, porque solo es verdadero cuando o una o la
otra es verdadera únicamente.
¡Ups! Tu solución no se puede ejecutar
Resultados: dio este error por & alli

solucion.js:2
return (a && !b)||&(!a && b);
^

SyntaxError: Unexpected token &

SOLUCION CORRECTA
function xor(a, b){
return (a && !b)||(!a && b);
}
¡Muy bien! Tu solución pasó todas las pruebas
OTRA SOLUCION CORRECTA
function xor(a, b){
  return(a !== b)
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 10: Precedencia


Cuando una expresión matemática tiene varios operadores, sabemos que las
multiplicaciones y divisiones se efectuarán antes que las sumas y las restas:

5 * 3 + 8 / 4 - 3 = 14

Al igual que en matemática, cuando usamos operadores lógicos las


expresiones se evalúan en un orden determinado llamado precedencia.

¿Cuál es ese orden? ¡Hagamos la prueba!


Teniendo definida la siguiente función, según la cual las tarjetas de débito
ofrecen una única cuota, y las de crédito, seis:

function pagaConTarjeta(seCobraInteres, tarjeta, efectivoDisponible) {


return !seCobraInteres && cuotas(tarjeta) >= 3 || efectivoDisponible < 100;
}

Probala en la consola con los valores:

  pagaConTarjeta(true, "crédito", 320)


  pagaConTarjeta(false, "crédito", 80)
  pagaConTarjeta(true, "débito", 215)
  pagaConTarjeta(true, "débito", 32)

 pagaConTarjeta(true, "crédito", 320)
=> false
  pagaConTarjeta(false, "crédito", 80)
=> true
  pagaConTarjeta(true, "débito", 215)
=> false
  pagaConTarjeta(true, "débito", 32)
=> true

Ejercicio 11: Un ejercicio sin precedentes


Si prestaste atención a la función anterior, habrás notado que la operación
con mayor precedencia es la negación !, seguida de la conjunción && y por
último la disyunción | |. ¿Pero qué pasa si quiero alterar el orden en que se
resuelven? 

Al igual que en matemática, podemos usar paréntesis para agrupar las


operaciones que queremos que se realicen primero.

Definí la función puedeJubilarse que recibe la edad y el sexo de una persona,


además de los años de aportes jubilatorios que posee:

puedeJubilarse(62, 'F', 34)


true
El mínimo de edad para realizar el trámite para las mujeres es de 60 años, mientras que
para los hombres es 65. En ambos casos, se deben contar con al menos 30 años de
aportes.
¡Intentá resolverlo en una única función! Después vamos a ver cómo quedaría si
delegamos. 
SOLUCION MIA MAL
function puedeJubilarse(edad, sexo, añosAporte){
return !edad && sexo && añosAporte=>30 || añosAporte < 30;
}
Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return !edad && sexo && añosAporte=>30 || añosAporte < 30;
^

SyntaxError: Unexpected token !

SOLUCION DE L CONSULTA CON ERROR


function puedeJubilarse (edad, sexo, ap) {
return edad > 60 && "mujer" && ap >= 30 || edad > 65 && "hombre" && ap >= 30;
}
Tobias Marcelo B. hace 10 meses
buenas a todos!!! no entiendo como me da error si el ultimo resultado me da
bien..... (preguntando los mismos parametros)

Carlos Jorge T. hace 10 meses


Hola Tobías. Estás cerca... No estás usando el parámetro sexo. Debería ser:
sexo == "F" y sexo == "M", para Femenino o Masculino. Vos simplemente
pusiste "hombre" y "mujer" a secas. Además, estás preguntando dos veces si
aportes es mayor o igual a 30. Va a funcionar igual, pero podrías simplificar
un poco el return para que pregunte una sola vez por los aportes. Te doy una
pista pero en lenguaje común: si aportes es mayor o igual a 30 Y (sexo es "hombre" Y
edad es mayor o igual a 65 O sexo es mujer y edad es mayor o igual a 60) . Traducilo a
Traducilo a Gobstones.

SOLUCIONES DE LA CONSULTA MAL

function puedeJubilarse (edad, sexo, ap) {

return edad >= 60 && "mujer" && ap >= 30 || edad > 65 && "hombre" && ap >= 30;
}

function puedeJubilarse(edad, sexo, aportes) {


Return aportes >= 30 && sexo == “hombre” && edad >= 65 || sexo = “mujer” &&
edad>= 60;
}
function puedeJubilarse (edad, sexo, ap) {
return edad >= 60 && sexo ="mujer" && ap >= 30 || edad > 65 && sexo="hombre" &&
ap >= 30;
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
return edad >= 60 && sexo ="mujer" && ap >= 30 || edad > 65 && sexo="hombre" &&
ap >= 30;
^^^^^^^^^^^^^^^^^^

ReferenceError: Invalid left-hand side in assignment

SOLUCION DE LA CONSULTA CON ERROR


function puedeJubilarse (edad,sexo,aportes) {
return aportes >=30^(edad >=60 && sexo === "f" || edad >=65 && sexo === "m");
}
Nahyara Alejandra M. hace alrededor de 1 mes
No puedo resolver este ejercicio. Me cuesta la cuestión de saber dónde van
los paréntesis. Leí muchas consultas de compañerxs y todavía no lo puedo
resolver, no encuentro mi error.

Benjamin A. hace alrededor de 1 mes


Los parentesis, te sirven para agrupar condiciones, las operaciones se van
resolviendo de adentro hacia afuera, Ejemplo:
((gato === "felino" && gato === "blanco") || (gato === "felino" && gato
=== "negro")) 1º// Resolvemos lo que está en parentesis mas interno
( true/false || true/false ) 2º // Resolvemos la operacion "OR"
En este ejemplo tenemos 2 grupos de condiciones separadas por un
operador logico || (or)

Maria Emilia W.  MENTORÍA  hace alrededor de 1 mes


¡Hola Nahyara! Como dice Benjamin, los paréntesis sirven para agrupar
condiciones. En tu código esto se refleja cuando agrupas : (edad >=60 && sexo
=== "f" || edad >=65 && sexo === "m") , y utilizar el operador OR, es decir, las dos
barras paralelas || , que estás diciendo que puede cumplir una condición o la
otra. Además de esto, contás con la condición aportes >=30, la cual debe
cumplirse si o si para poder jubilarse. En tu código, sabiendo esto, deberías
decirle que dicha condicion se debe cumplir, además de alguna de las otras
dos. Para concatenar condiciones utilizamos el operador &&.
Por otro lado, y no menos importante, fijate que en el ejemplo que brinda el
ejercicio aparece F y no f, por lo que deberían ir en mayúscula. Es muy
importante prestar atención a ello, para que los resultados nos den
correctos.
SOLUCION CORRECTA
function puedeJubilarse (edad,sexo,aportes) {
return (edad >=60 && sexo === "F" || edad >=65 && sexo === "M") && aportes >=30;
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA

puedeJubilarse(67, "M", 29)
=> false
  puedeJubilarse(67, "M", 32)
=> true
  puedeJubilarse(59, "F", 30)
=> false
  puedeJubilarse(60, "F", 25)
=> false
  puedeJubilarse(60, "F", 30)
=> true
¿Y si delegamos? Podríamos separar la lógica de la siguiente manera:

function puedeJubilarse(edad, sexo, aniosAportes) {


return cumpleEdadMinima(edad, sexo) &&
tieneSuficientesAportes(aniosAportes);
}

Al delegar correctamente, hay veces en las que no es necesario alterar el


orden de precedencia, ¡otro punto a favor de la delegación! 
Tu solución no pasó las pruebas
Problemas que encontramos:
 parece que estás usando cumpleEdadMinima pero no está definido.
¿Puede que hayas escrito mal su nombre o tengas que definirlo?
 Detalles
Resultados de las pruebas:
  una mujer de 62 años con 40 años de aportes puede jubilarse Ver
detalles

 cumpleEdadMinima is not defined

  una mujer de 63 años con 25 años de aportes no puede jubilarse 

Ejercicio 12: ¿Puedo subir?


En un parque de diversiones de la ciudad instalaron una nueva montaña
rusa  y nos pidieron ayuda para que le digamos a las personas si pueden
subirse o no antes de hacer la fila. Los requisitos para subir a la atracción
son:
 Alcanzar la altura mínima de 1.5m (o 1.2m si está acompañada por una
persona adulta)
 No tener ninguna afección cardíaca

Definí la función de 3 parámetros puedeSubirse que recibe una altura de una persona en


metros, si está acompañada y si tiene alguna afección cardíaca. Ejemplo:

puedeSubirse(1.7, false, true)


false // no puede subirse
// porque aunque tiene mas de 1.5m,
// tiene una afección cardíaca

SOLUCION MIA CON ERROR

function puedeSubirse(alturamínima, acompaniadaadulto, afeccióncardíaca){


return (alturamínima = 1,2 && acompaniadaadulto || alturamínima >= 1,5 )
&& !afeccióncardíaca;
}
Tu solución no pasó las pruebas DEBE LLEVAR PUNTO NO COMA
Resultados de las pruebas:

  una persona que mide 1.5m, no está acompañada por un adulto y no


tiene afecciones cardíacas puede subirse a la atracción
  una persona que mide 1.7m, no está acompañada por un adulto y
tiene afecciones cardíacas no puede subirse a la atracción
  una persona que mide 1.2m, está acompañada por un adulto y no
tiene afecciones cardíacas puede subirse a la atracción
  una persona que mide 1.2m, no está acompañada por un adulto y no
tiene afecciones cardíacas no puede subirse a la atracción Ver detalles
 true == false

  una persona que mide 1.1m, está acompañada por un adulto y no


tiene afecciones cardíacas no puede subirse a la atracción Ver detalles

true == false

OTR SOLUCION MIA CON ERROR

function puedeSubirse(alturamínima, acompaniadaadulto, afeccióncardíaca){


return (alturamínima = 1,2 && !acompaniadaadulto || alturamínima >= 1,5 )
&& !afeccióncardíaca;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  una persona que mide 1.5m, no está acompañada por un adulto y no


tiene afecciones cardíacas puede subirse a la atracción
  una persona que mide 1.7m, no está acompañada por un adulto y
tiene afecciones cardíacas no puede subirse a la atracción
  una persona que mide 1.2m, está acompañada por un adulto y no
tiene afecciones cardíacas puede subirse a la atracción
  una persona que mide 1.2m, no está acompañada por un adulto y no
tiene afecciones cardíacas no puede subirse a la atracción Ver detalles
 true == false

  una persona que mide 1.1m, está acompañada por un adulto y no


tiene afecciones cardíacas no puede subirse a la atracción Ver detalles

true == false
function puedeSubirse(altura, acompañante, afección) { return ((altura>=1.5
&& acompañante==="no") || (altura>=1.2 && acompañante==="si")) && !
afección ; }

CON LA MODIFICACIÓN

function puedeSubirse(altura, acompañante, afección) { return altura>=1.5 !


afección || altura>=1.2 && acompañante; }

MIA CON ERROR

function puedeSubirse(alturamínima, acompañadaadulto, afeccióncardíaca){


return alturamínima >= 1,5 && !afeccióncardíaca || alturamínima >= 1.2
&& acompañadaadulto;
}
Tu solución no pasó las pruebas EL ERROR ES QUE PUSE UNA COMA EN VEZ DE UN PUNTO

Resultados de las pruebas:

  una persona que mide 1.5m, no está acompañada por un adulto y no


tiene afecciones cardíacas puede subirse a la atracción
  una persona que mide 1.7m, no está acompañada por un adulto y
tiene afecciones cardíacas no puede subirse a la atracción
  una persona que mide 1.2m, está acompañada por un adulto y no
tiene afecciones cardíacas puede subirse a la atracción
  una persona que mide 1.2m, no está acompañada por un adulto y no
tiene afecciones cardíacas no puede subirse a la atracción Ver detalles
 true == false

  una persona que mide 1.1m, está acompañada por un adulto y no


tiene afecciones cardíacas no puede subirse a la atracción Ver detalles

SOLUCION CORRECTA
function puedeSubirse(alturamínima, acompañadaadulto, afeccióncardíaca){
return alturamínima >= 1.5 && !afeccióncardíaca || alturamínima >= 1.2
&& acompañadaadulto;
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 puedeSubirse(1.5, false, false)
=> true
  puedeSubirse(1.7, true, false)
=> true
  puedeSubirse(1.7,false, true)
=> false

¡Terminaste Lógica booleana!


¡Felicitaciones! 

En esta guía aprendiste tres tipos de operadores lógicos: conjunción &&, que


es verdadero si todas sus proposiciones son verdaderas; disyunción ||, que es
verdadero si alguna de sus proposiciones es verdadera; y xor, que es
verdadero si sólo una de sus proposiciones es verdadera.

Además, aprendiste acerca de la precedencia de estos operadores, y cómo


los paréntesis pueden ayudarnos a alterar esa precedencia según nuestras
necesidades. 

Listas
La programación no sería tan divertida y poderosa si sólo pudieramos
trabajar con una cosa por vez: muchas veces no vamos a querer
simplemente operar un string, un booleano o un número, sino varios a la vez.

¡Llegó entonces el momento de aprender a tratar conjuntos de cosas!


Presentamos a... ¡las listas! 

Ejercicios

  1. Series favoritas


  2. Y esto, es una lista
  3. Juegos de azar
  4. Listas vacías
  5. ¿Cuántos elementos tenés?
  6. Agregando sabor
  7. Trasladar
  8. ¿Y dónde está?
  9. Contiene
  10. Enésimo elemento
  11. Más premios
  12. No te olvides de saludar

Ejercicio 1: Series favoritas


Supongamos que queremos representar al conjunto de nuestras series
favoritas. ¿Cómo podríamos hacerlo?

let seriesFavoritasDeAna = ["Game of Thrones", "Breaking Bad", "House of Cards"];


let seriesFavoritasDeHector = ["En Terapia", "Recordando el Show de Alejandro Molina"]

Como ves, para representar a un conjunto de strings, colocamos todos esos


strings que nos interesan, entre corchetes ( [ y ]) separados por comas. Fácil,
¿no?

Probá en la consola las siguientes consultas:

 seriesFavoritasDeAna
 seriesFavoritasDeHector
 ["hola","mundo!"]
 ["hola","hola"]

CONSOLA
["hola", "mundo!"]
=> ["hola","mundo!"]
  [seriesFavoritasDeAna]
=> [["Game of Thrones","Breaking Bad","House of Cards"]]
  [seriesFavoritasDeHector]
=> [["En Terapia","Recordando el Show de Alejandro Molina"]]
  ["hola","hola"]
=> ["hola","hola"]

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.

Y no sólo eso, sino que además, el orden es importante. Por ejemplo, no es


lo mismo ["hola", "mundo"] que ["mundo", "hola"]: ambos tienen los mismos
elementos, pero en posiciones diferentes.

Probá en la consola las siguientes consultas:

 listasIguales(["hola", "mundo"], ["mundo", "hola"])


 listasIguales(["hola", "mundo"], ["hola", "mundo"])
 listasIguales(["hola", "mundo"], ["hola", "todo", "el", "mundo"])
 listasIguales(["hola"], ["hola", "mundo"])
 ["hola", "mundo"] === ["mundo", "hola"]
 personas
 ["mara", "julian"] === personas
 personas === personas

¿Qué conclusiones podés sacar? 


consola
listasIguales(["hola", "mundo"], ["mundo", "hola"])
=> false
  listasIguales(["hola", "mundo"], ["hola", "mundo"])
=> true
  listasIguales(["hola", "mundo"], ["hola", "todo", "el", "mundo"])
=> false
  listasIguales(["hola"], ["hola", "mundo"])
=> false
  ["hola", "mundo"] === ["mundo", "hola"]
=> false
  personas
=> ["mara","julian"]
  ["mara", "julian"] === personas
=> false
  personas === personas
=> true

BIBLIOTECA
/**/
function longitud(unString) /* ... */
// Retorna cuan largo es un string
//
// Por ejemplo:
// longitud("hola")
// 4
function convertirEnMayuscula(unString) /* ... */
// Convierte una palabra en mayúsculas
//
// Por ejemplo:
// convertirEnMayuscula("hola")
// "HOLA"
function comienzaCon(unString, otroString) /* ... */
// Retorna un booleano que nos dice si unString empieza con otroString
//
// Por ejemplo:
// comienzaCon("hola todo el mundo", "hola todo")
// true
/**/
function imprimir(unString) /* ... */
// Imprime por pantalla unString
// Por ejemplo:
// imprimir("¡estoy imprimiendo!")
// ¡estoy imprimiendo!
function tirarDado( ) /* ... */
// Retorna un número al azar entre 1 y 6
//
// Por ejemplo:
// tirarDado()
// 5
// tirarDado()
// 1
// tirarDado()
// 2

function listasIguales(unArray, otroArray) /* ... */


// Retorna un booleano que nos dice si dos listas son iguales
//
// Por ejemplo:
// listasIguales([1, 2, 3], [1, 2, 3])
// true
// listasIguales([1, 2, 3], [4, 5, 3])
// false
function longitud(unStringOLista) /* ... */
// Retorna el largo de un string o una lista
//
// Por ejemplo:
// longitud("hola")
// 4
// longitud([5, 6, 3])
// 3
function agregar(unaLista, unElemento) /* ... */
// Inserta unElemento al final de unaLista.
// Este es un procedimiento que no retorna nada pero modifica a unaLista:
//
// let cancionesFavoritas = ["La colina de la vida", "Zamba por vos"]
// agregar(cancionesFavoritas, "Seminare")
// cancionesFavoritas
// ["La colina de la vida", "Zamba por vos", "Seminare"]
function remover(unaLista) /* ... */
// Quita el último elemento de unaLista y lo retorna.
//
// let listaDeCompras = ["leche", "pan", "arroz", "aceite", "yerba"]
// remover(listaDeCompras)
// "yerba"
// listaDeCompras
// ["leche", "pan", "arroz", "aceite"]
function posicion(unaLista, unElemento) /* ... */
// Retorna la posición se encuentra un elemento.
// Si el elemento no está en la lista, retorna -1
//
// let premios = ["dani", "agus", "juli", "fran"]
// posicion(premios, "dani")
// 0
// posicion(premios, "juli")
// 2
// posicion(premios, "feli")
// -1

var personas = ["mara", "julian"];

Ejercicio 3: Juegos de azar


Pero, pero, ¿sólo podemos crear listas de strings? ¿Y si quiero, por ejemplo,
representar los números de la lotería que salieron la semana pasada? ¿O las
tiradas sucesivas de un dado? ¿O si salió cara o ceca en tiradas sucesivas de
una moneda?

let numerosDeLoteria = [2, 11, 17, 32, 36, 39];


let tiradasDelDado = [1, 6, 6, 2, 2, 4];
let salioCara = [false, false, true, false];

Como ves, también podemos representar conjuntos de números o


booleanos, de igual forma: escribiéndolos entre corchetes y separados por
comas. Podemos tener listas de números, de strings, de booleanos, etc.
¡Incluso podríamos tener listas de listas!
Veamos si queda claro. Probá en la consola las siguientes consultas:

 numerosDeLoteria
 salioCara
 [[1, 2, 3], [4, 5, 6]]

CONSOLA
 numerosDeLoteria
=> [2,11,17,32,36,39]
  salioCara
=> [false,false,true,false]
  [[1, 2, 3], [4, 5, 6]]
=> [[1,2,3],[4,5,6]]

BIBLIOTECA

/**/
function longitud(unString) /* ... */
// Retorna cuan largo es un string
//
// Por ejemplo:
//
// longitud("hola")
// 4

function convertirEnMayuscula(unString) /* ... */


// Convierte una palabra en mayúsculas
//
// Por ejemplo:
//
// convertirEnMayuscula("hola")
// "HOLA"

function comienzaCon(unString, otroString) /* ... */


// Retorna un booleano que nos dice si unString empieza con otroString
//
// Por ejemplo:
//
// comienzaCon("hola todo el mundo", "hola todo")
// true

/**/

/**/
function imprimir(unString) /* ... */
// Imprime por pantalla unString
//
// Por ejemplo:
//
// imprimir("¡estoy imprimiendo!")
// ¡estoy imprimiendo!

function tirarDado() /* ... */


// Retorna un número al azar entre 1 y 6
//
// Por ejemplo:
//
// tirarDado()
// 5
// tirarDado()
// 1
// tirarDado()
// 2

/**/
function listasIguales(unArray, otroArray) /* ... */
// Retorna un booleano que nos dice si dos listas son iguales
//
// Por ejemplo:
//
// listasIguales([1, 2, 3], [1, 2, 3])
// true
// listasIguales([1, 2, 3], [4, 5, 3])
// false

function longitud(unStringOLista) /* ... */


// Retorna el largo de un string o una lista
//
// Por ejemplo:
//
// longitud("hola")
// 4
// longitud([5, 6, 3])
// 3

function agregar(unaLista, unElemento) /* ... */


// Inserta unElemento al final de unaLista.
// Este es un procedimiento que no retorna nada pero modifica a unaLista:
//
// let cancionesFavoritas = ["La colina de la vida", "Zamba por vos"]
// agregar(cancionesFavoritas, "Seminare")
// cancionesFavoritas
// ["La colina de la vida", "Zamba por vos", "Seminare"]

function remover(unaLista) /* ... */


// Quita el último elemento de unaLista y lo retorna.
//
// let listaDeCompras = ["leche", "pan", "arroz", "aceite", "yerba"]
// remover(listaDeCompras)
// "yerba"
// listaDeCompras
// ["leche", "pan", "arroz", "aceite"]

function posicion(unaLista, unElemento) /* ... */


// Retorna la posición se encuentra un elemento.
// Si el elemento no está en la lista, retorna -1
//
// let premios = ["dani", "agus", "juli", "fran"]
// posicion(premios, "dani")
// 0
// posicion(premios, "juli")
// 2
// posicion(premios, "feli")
// -1

let numerosDeLoteria = [2, 11, 17, 32, 36, 39];


let tiradasDelDado = [1, 6, 6, 2, 2, 4];
let salioCara = [false, false, true, false];

Ejercicio 4: Listas vacías


Genial, ¡parece que una lista puede contener cualquier tipo de elemento!
Podemos tener listas de booleanos, de números, de strings, de listas...
Y no sólo eso, sino que además pueden contener cualquier cantidad de
elementos: uno, dos, quince, cientos.
¿Podremos entonces tener listas vacías, es decir, que no tengan elementos?
¡Por supuesto!

let unaListaVacia = [ ]

Probá escribir en la consola unaListaVacia


CONSOLA
  unaListaVacia
=> []

Ejercicio 5: ¿Cuántos elementos tenés?


Por el momento ya sabemos qué cosas podemos representar con listas, y
cómo hacerlo. Pero, ¿qué podemos hacer con ellas?
Empecemos por lo fácil: saber cuántos elementos hay en la lista. Esto lo
podemos hacer utilizando la función longitud, de forma similar a lo que
hacíamos con los strings.
Realizá las siguientes consultas en la consola:

 longitud([ ])
 longitud(numerosDeLoteria)
 longitud([4, 3])

CONSOLA

longitud([])
=> 0
  longitud(numerosDeLoteria)
=> 6
  longitud([4, 3])
=> 2

En biblioteca var numerosDeLoteria = [2, 11, 17, 32, 36, 39];

Ejercicio 6: Agregando sabor


Las listas son muy útiles para contener múltiples elementos. ¡Pero hay más!
También podemos agregarle elementos en cualquier momento, utilizando la
función agregar, que recibe dos parámetros: la lista y el elemento. Por
ejemplo:

let pertenencias = ["espada", "escudo", "antorcha"];


//longitud(pertenencias) devuelve 3;

agregar(pertenencias, "amuleto mágico");


//ahora longitud(pertenencias) devuelve 4

Como vemos, agregar suma un elemento a la lista, lo cual hace que su tamaño


aumente. ¿Pero en qué parte de la lista lo agrega? ¿Al principio? ¿Al final?
¿En el medio?

Averigualo vos mismo: inspeccioná en la consola qué elementos


contiene pertenencias, agregale una "ballesta" y volvé a inspeccionar pertenencias.
Además existe un procedimiento remover, que sólo recibe la lista por parámetro.
Investigá en la consola qué hace. 

CONSOLA

  agregar (pertenencias, "ballesta")
=> 4
  remover(pertenencias, "ballesta")
=> "ballesta"

Ejercicio 7: Trasladar
Bueno, ya hablamos bastante; ¡es hora de la acción !

Definí un procedimiento trasladar, que tome dos listas, saque el último elemento de la


primera y lo agregue a la segunda.
Ejemplo:

let unaLista = [1, 2, 3];


let otraLista = [4, 5];

trasladar(unaLista, otraLista);

unaLista //debería ser [1, 2]


otraLista //debería ser [4, 5, 3]

 ¡Dame una pista!

¿Tenés dudas sobre cómo quitar y agregar elementos?


Repasemos agregar y remover:

 agregar(lista, elemento): agrega elemento al final de lista.


 remover(lista): saca el último elemento de lista y lo devuelve.

SOLUCION MIA CON ERROR

let unaLista = [1, 2, 3];


remover (unaLista);
let otraLista = [4, 5];
agregar (otraLista, 3);
trasladar
¡Ups! Tu solución no se puede ejecutar

Ver detalles

Objetivos que no se cumplieron:

  la solución debe declarar un procedimiento trasladar


  la solución no debe debe declarar variables

Parece que algo no funcionó .


No es necesario que declares ninguna variable, sólo definí trasladar.
Además, en este ejercicio tenés que definir el procedimiento trasladar.
Recordá que los procedimientos no retornan nada.

¡Intentemos de nuevo!
Resultados:

solucion.js:5
trasladar

SOLUCION CON ERROR EN LA CONSULTA

function trasladar(a, b) {
remover(a)
agregar(b, !a)
}
Leandro C. hace 10 meses
Buenas tardes. No logro comprender cómo manipular el elemento de la lista
que saca "remover" para utilizarlo como parámetro en "agregar" :-/ Sé que
"remover" lo devuelve, pero ¿Cómo lo utilizo? Desde ya, muchas gracias.

Diana L.  MENTORÍA  hace 10 meses


¡Buenas Leandro!
Podés simplemente poner el remover como parámetro de agregar. Digamos
que remover como además de realizar una acción, devuelve el elemento,
entonces podemos decir que remover(a) por ejemplo representa un
elemento, y justo lo que necesitamos darle como parámetro a agregar es un
elemento: agregar(lista, elemento). Intentá reemplazar en la línea 3 el elemento
por lo que está en la línea 2.

Leandro C. hace 10 meses


function trasladar(a, b) { remover(a) agregar(b, remover(a)); }
probé así y también con comillas por si tomaba literal el elemento removido,
pero de ninguna forma funciona T_T

Diana L.  MENTORÍA  hace 10 meses


¡Casi esta 😄!
Por más que esté siendo usado como parámetro, sigue realizando la acción
de remover el elemento, por lo que alcanza con llamarla una sola vez (que ya
lo estamos haciendo en la línea 3), si quitás la línea 2 debería andar bien.

OTR SOLUCION MIA CON ERROR

function trasladar(unaLista, otraLista){


remover(unaLista)
agregar(otraLista);
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  trasladar mueve el último elemento de una lista de 3 elementos a una


de dos elementos Ver detalles
 [ 4, 5, undefined ] deepEqual [ 4, 5, 3 ]

  trasladar mueve el último elemento de una lista de 4 elementos a una


de 4 elementos Ver detalles

[ 4, 5, 6, 7, undefined ] deepEqual [ 4, 5, 6, 7, 40 ]

SOLUCION DE LA CONSULTA CON ERROR

let unaLista = [1, 2, 3];


let otraLista = [4, 5];
function trasladar(unaLista, otraLista) {
return agregar(otraLista, remover(unaLista));
}
Julian Gonzalo A. hace 10 meses
Pude resolverlo parcialmente, porque me sale este cartel: la solución no
debe debe declarar variables Como hago para no poner variables?

Martin G.  MENTORÍA  hace 10 meses


¡Hola Julian!
Simplemente tenés que borrar los dos let que pusiste arriba y el ejercicio te
va a dar OK. Los let solo son usados en los ejemplos para monstrarte como
debe funcionar el procedimiento trasladar y en este caso no son necesarios
para hacer el procedimiento.

SOLUCION DE LA CONSULTA CON ERROR

function trasladar(unaLista, otraLista) {


return agregar(otraLista, remover(unaLista));
}
Tu solución funcionó, pero hay cosas que mejorar
Ver detalles
Objetivos que no se cumplieron:
  la solución debe declarar un procedimiento trasladar
Parece que algo no funcionó .
En este ejercicio tenés que definir el procedimiento trasladar. Recordá que los
procedimientos no retornan nada.
Pero a no desesperar, intentemos otra vez 
Resultados de las pruebas:
  trasladar mueve el último elemento de una lista de 3 elementos a una
de dos elementos
  trasladar mueve el último elemento de una lista de 4 elementos a una
de 4 elementos

OTRA SOLUCION DE LA CONSULTA CON ERROR


function trasladar(unaLista, otraLista){
remover(unaLista,)
agregar(otraLista, (remover(unaLista)))
}
Hector Adrian M. hace 9 meses
Ignacio, en tu 2da linea, no hay necesidad de remover unaLista

Ignacio P. hace 9 meses


function trasladar(unaLista, otraLista){ remover(unaLista) agregar(otraLista,
(remover(unaLista))) , intento que agregue el elemento que saque en
"unaLista", la función completa a "otraLista"... sino, qué agrego?...o cómo
agrego? }

Hector Adrian M. hace 9 meses


El error dice, Resultados: solucion.js:180 remover(unaLista,) 1ro, no necesitas
remover todavia, para el ejercicio, y 2do, tenes una coma dsps de unaLista,
por eso te tira el error.

Diana L.  MENTORÍA  hace 9 meses


¡Hola Ignacio!
Como dice Hector, no hace falta que hagas la línea 2 del código,
necesitamos solamente remover una sola vez el elemento, si miramos:

remover(unaLista) //remuevo una vez


agregar(otraLista, (remover(unaLista))) //remuevo otra vez, es decir que
agrego a la lista el segundo item que removí

Para no remover dos veces, podemos dejar simplemente la línea


agregar(otraLista, (remover(unaLista))) , quitando el primer remover, de esta forma
estamos quitando un solo elemento y agregando ese mismo.
SOLUCION CORRECTA
function trasladar(unaLista, otraLista){
agregar(otraLista, (remover(unaLista)))
}
¡Muy bien! Tu solución pasó todas las pruebas

OTRA SOLUCION CORRECTA


function trasladar(unaLista, otraLista){
  agregar(otraLista, remover(unaLista))
}
¡Muy bien! Tu solución pasó todas las pruebas

Hasta ahora anduvimos agregando, quitando y consultando longitudes.


¿Qué más podemos hacer con las listas? ¡Seguinos!

Ejercicio 8: ¿Y dónde está?


Otra cosa que queremos hacer con las listas es saber en qué posición se
encuentra un elemento. Para ello utilizamos la función posicion de la siguiente
manera:

posicion(["a", "la", "grande", "le", "puse", "cuca"], "grande"); //devuelve 2

let diasLaborales = ["lunes", "martes", "miercoles", "jueves", "viernes"]


posicion(diasLaborales, "lunes"); //devuelve 0

Como ves, lo curioso de esta función es que pareciera devolver siempre uno
menos de lo esperado. Por ejemplo, la palabra "grande" aparece tercera, no
segunda; y "lunes" es el primer día laboral, no el cero. ¿Es que los creadores
de JavaScript se equivocaron? 

¡No! Se trata de que en JavaScript, al igual que en muchos lenguajes, las


posiciones de las listas arrancan en 0: el primer elemento está en la posición
0, el segundo en la 1, el tercero en la 2, y así.

¿Y qué sucede si le pasás como argumento a posicion un elemento que no tiene?


¡Averigualo!
Probá lo siguiente:

posicion(diasLaborales, "osvaldo")

  posicion(diasLaborales, "osvaldo")
=> -1
   

Ejercicio 9: Contiene
¡Ahora te toca a vos!

Definí la función contiene que nos diga si una lista contiene un cierto elemento.


contiene([1, 6, 7, 6], 7)
true
contiene([1, 6, 7, 6], 6)
true
contiene([], 7)
false
contiene([8, 5], 7)
false

 ¡Dame una pista!

La función posicion que vimos en el ejercicio anterior nos puede ayudar a


resolver el problema. Te recordamos como se usa :

posicion(["africa", "america", "asia", "europa", "oceania"]


, "asia")
2 // porque "africa" en esa lista está en la posición 0, "america" en la 1, "asia" en la 2, etc

Ah, ojo  porque como vimos posicion devuelve algo particular cuando la lista


no contiene el elemento. ¿No te acordás? ¡Volvé a probar en el ejercicio
anterior!

SOLUCION MIA CON ERROR

function contiene ([1, 6, 7, 6], 7){

return

mi error es no usar lo de la biblioteca function posicion(unaLista, unElemento O NUMERO) /* ... */

¡Ups! Tu solución no se puede ejecutar


Objetivos que no se cumplieron:

  Para resolver este ejercicio recordá que contás con posicion.

Resultados:

solucion.js:1
function contiene ([1, 6, 7, 6], 7){
^

SyntaxError: Unexpected number

SOLUCION DE LA CONSULTA CON ERROR

function contiene(lista, posicion) {

lista[1, 6, 7, 6] ;

posicion[lista] ;

Florencia Agustina P. hace 11 meses


Hola! dice que "contiene" debe tener a "posicion"... cuando pongo a
posicion(lista[...]) toma a posicion com una funcion que no existe; y cuando
pongo posicion[lista] la mitad de las pruebas me dan error; si es que entendí
bien, la lista está escrita correctamente? desde ya muchas gracias.

Lara F.  MENTORÍA  hace 11 meses


¡Hola, Florencia! Para este ejercicio no es necesario definir ninguna lista de
números. La función contiene tiene que recibir una lista y un numero (es
decir, los parámetros son lista y numero, por lo que sería function contiene(lista,
numero)), luego, mediante el comando posicion debe devolver si este número
se encuenta en la lista. Probá hacer modificaciones con estas sugerencias.
Cualquier cosa podés volver a consultar 😊

Lucas Nahuel N. hace 11 meses


Hola! Tenes que retornar la posicion de la lista(recordá que los parametros
que el usuario debe ingresar son: la lista y el elemento que desea saber si
está en dicha lista), a la vez, la posicion del elemento tiene que ser mayor a
0. Ya que, si retornamos un -1 quiere decir que cierto elemento no existe.
Espero explicarme bien.

Florencia Agustina P. hace 11 meses


Hola Lara, siguiendo tu consejo escribí: function contiene(lista, numero)
{ posicion[numero] ; } me sigue saliendo mal en la mitad de las pruebas, dice
"undefined == true"

Lara F.  MENTORÍA  hace 11 meses


En la Biblioteca podés fijarte como funciona posición: posicion(unaLista,
unElemento), en este caso va a recibir respectivamente lista y numero, por lo
tanto para especificar que recibe una lista no van a ser necesarios los
corchetes [ ], al ingresar el parámetro lista queda claro.

Florencia Agustina P. hace 11 meses


ahora lo escribí así: function contiene(lista, numero) { return posicion(lista,
numero) ; } pero me sigue dando error :((( quizas necesito bibliografia
adicional para entender bien la sintaxis de "listas".

Sergio Sebastian S. hace 11 meses


Hola Flore!.. posicion te va a dar la POSICION si es que se encuentra Pensa
que lo que esperas de resultado es TRUE o FALSE y ahora solo le estas
devolviendo UN NUMERO asi que quizas deberias comparar el resultado de
posicion (que es un numero) con los numeros que dan... Si es -1 significa que
no lo encontro...

Sergio Sebastian S. hace 11 meses


Hola Flore!.. posicion te va a dar la POSICION si es que se encuentra Pensa
que lo que esperas de resultado es TRUE o FALSE y ahora solo le estas
devolviendo UN NUMERO asi que quizas deberias comparar el resultado de
posicion (que es un numero) con los numeros que dan... Si es -1 significa que
no lo encontro...

Lara F.  MENTORÍA  hace 11 meses


Como dice Sergio, posicion va a devolver el "puesto" en que se ubica tal
numero. Por ejemplo: Si tengo la lista, miLista = [5, 14, 6, 8] , y quiero saber
en que orden está el numero 6, al ejecutar posicion(miLista, 6) me va a
devolver 2 (recordemos que las listas comienzan en 0). En cambio, si quiero
saber en que orden se encuenta el numero 3, al ejecutar posicion(miLista, 3)
me va a devolver -1 porque el numero 3 no se encuenta en la lista. En este
ejercicio necesitamos que la devolución sea true o false. Va a ser true
cuando el numero efectivamente se encuentre en la lista (es decir, cuando
posicion(lista, numero) nos devuelva un numero igual o mayor a 0), y va a ser
false cuando el numero no esté en la lista (que es lo mismo que pensar que
posicion(lista, numero) nos devuelva -1). Entonces, lo que debemos expresar
es que: * Si el numero que nos devuelve posicion(lista, numero) es diferente
de -1, es porque el numero se encuentra en la lista, entonces contiene será
true.

Florencia Agustina P. hace 11 meses


probé dos formas: 1° intento: function contiene(lista, numero) { posicion >=
0 ; } 2° intento: function contiene(lista, numero) { posicion !== -1 ; } en
ambos me casos, me da error en la mitad de las pruebas, con el mismo
detalle "undefined == true"

Lara F.  MENTORÍA  hace 11 meses


¡Estás muy cerca! En cualquiera de las dos formas que intentaste lo que
estaría faltando es pasarle los parámetros lista y numero a posicion para que
pueda ejecutarse.

Jose H. hace 11 meses


Hola Florencia! Tenes que escribir una funcion para saber si la LISTA contiene
un ELEMENTO X.
para saber si tu LISTA contiene el elemento X. Lo que tenes que hacer es
buscar al elemento X. Para "buscarlo" en la biblioteca esta la funcion ---
posicion() ---- a la cual le tenes que pasar dos argumentos.
el primer argumento es tu lista y en el segundo el elemento.
si no encuentra el elemento va a devolver un -1 .... pero si lo encuentra va a
devolver su posicion.. [0, 1, 2, 3, 4]
despues a esa posicion la tenes que comparar para saber si la contiene o
no.... si la contiene devuelve TRUE sino FALSE.
cuando utilizas una funcion de la biblioteca... usa parentesis. ---- posicion()

Emilio F. hace 11 meses


Para resolverlo se requiere, que se compare si lo que se busca existe o no, y
como dijeron anteriormente, el valor Y dentro de la lista X, puede existir o
no, pero "posicion" nos devuelve un valor que tendremos que verificar si es
valido o no, de acuerdo a lo que nos enseñaron en lecciones anteriores de
"listas".

Florencia Agustina P. hace 11 meses


Estimados, gracias por su ayuda, si lo hice antes pero no lo puse porque
decia lo mismo, de igual manera lo volví a hacer por las dudas. intenté:
function contiene(lista, numero) { posicion(lista, numero) >= 0 ; } y: function
contiene(lista, numero) { posicion(lista, numero) !== -1 ; } es decir, puse los
parametros a posicion() pero pasa lo mismo "undefined == true"

Lara F.  MENTORÍA  hace 11 meses


¡Hola, Florencia! Está faltando el return antes de invocar posicion(lista,
numero) , con eso ya debería funcionar correctamente, si no es así podés
seguir consultando 😊

OTRA SOLUCION DE CONSULTA CON ERROR

function contiene(lista, numero) {

return posicion(lista, numero) => 0;

Ariel M. hace 10 meses


Sinceramente creo que está todo bien, me marca error en el paréntesis que
abre después de posicion, no encuentro el error, me estoy rompiendo la
cabeza.
Leonel R. hace 10 meses
Hola, la posición del elemento en la lista debe ser mayor o igual que cero
(>=0) , vos lo tenés al revés solo eso
function contiene(lista, numero) {
return posicion(lista, numero) > = 0;
}

ESTO DA ESTE ERROR este es el error porque están separados

Ups! Tu solución no se puede ejecutar


Resultados:

solucion.js:2
return posicion(lista, numero) > = 0;
^
SyntaxError: Unexpected token =

modificado

function contiene(lista, numero) {


return posicion(lista, numero) > 0;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  contiene([1, 6, 7, 6], 7) es true
  contiene([1, 6, 7, 6], 6) es true
  contiene([], 7) es false
  contiene([8, 5], 7) es false
  contiene([1, 8, 5], 7) es false
  contiene([1, 1, 1], 1) es true Ver detalles
false == true

SOLUCION CORRECTA
function contiene(lista, numero) {
return posicion(lista, numero) >= 0; }
function contiene(lista, numero) {
return posicion(lista, numero) !== -1; }
¡Muy bien! Tu solución pasó todas las pruebas

OTRA SOLUCION CORRECTA


function contiene(lista, numero) {

return posicion(lista, numero) >= 0;


}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA

contiene([1, 6, 7, 6], 7)
=> true
  contiene([], 7)
=> false
  contiene([9, 4], 3)
=> false
¡Bien hecho!

Si venís prestando atención a los ejemplos de consulta, habrás notado que


las listas también pueden tener elementos duplicados: [1, 2, 1], ["hola", "hola"],
etc.

Por tanto, posicion en realidad devuelve la posición de la primera


aparición del elemento en la lista. Por ejemplo:

posicion(["qué", "es", "eso", "eso", "es", "queso"], "es")


1 //devuelve 1 porque si bien "es" también está en la posición 4, aparece primero en la
posición 1.

Ejercicio 10: Enésimo elemento


Así como existe una función para averiguar en qué posición está un
elemento, también puede ocurrir que queramos saber lo contrario: qué
elemento está en una cierta posición. 
Para averiguarlo podemos usar el operador de indexación, escribiendo
después de la colección y entre corchetes [ ] la posición que queremos para
averiguar:

mesesDelAnio[0]
"enero"
["ese", "perro", "tiene", "la", "cola", "peluda"][1]
"perro"

¡Ojo! El número que le pases, formalmente llamado índice, debe ser menor a


la longitud de la lista, o cosas malas pueden suceder. 

Probalo en la consola: ¿qué sucede si le pedís el elemento 0 a una lista vacía? ¿O si le


pedís el elemento 48 a una lista de 2 elementos?
CONSOLA
 0
=> 0
  48
=> 48

Ejercicio 11: Más premios


Si le pedís un elemento en una posición igual o mayor al tamaño de la lista,
vas a obtener undefined. No parece algo terrible, pero el problema es que
con undefined no podés hacer nada realmente útil.

Así que la advertencia es: ¡no te pases de índice! 

Teniendo 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 corresponde
a los primeros puestos de una competencia.

medallaSegunPuesto(1)
"oro"
medallaSegunPuesto(2)
"plata"
medallaSegunPuesto(3)
"bronce"
medallaSegunPuesto(4)
"nada"
medallaSegunPuesto(5)
"nada"

 ¡Dame una pista!

¿En qué nos puede ser útil una lista aquí? Pensá que la medalla que recibe la
persona está directamente relacionada con la posición en la que sale en la
competencia. 

SOLUCION MIA CON ERROR


function medallaSegunPuesto(posición, numero){
if posición(numero === 1)
return ("oro");}
else { posición (numero === 2)
return ("plata");
}
else { posición (numero === 3)
return ("bronce");}
else {
return ("nada");
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
if posición(numero === 1)
^^^^^^^^

SyntaxError: Unexpected identifier

Solución con error en la consulta


let medallas = ["oro", "plata", "bronce"]

function medallaSegunPuesto(puesto){
if (1 <= puesto <= 3) {
return medallas[(puesto - 1)]
} else {
return "nada"
}
}
Sofia R. hace 10 meses
Hola, cuando envio me dice que el codigo funciona bien con los puestos 1, 2
y 3, pero cuando es un numero fuera de esos, me resulta en undefined. No
se que estoy haciendo mal, hace una que estoy pobando cosas. Ayuda :(

Diana L.  MENTORÍA  hace 10 meses


¡Hola Sofia!
Si bien matemáticamente está bien definir: 1 <= puesto <= 3, en programación
esto lo hacemos en dos pasos:

 Se cumple que el puesto es mayor o igual a 1 1 <= puesto


 Se cumple que el puesto es menor o igual a 3 puesto <= 3
Como queremos que se cumplan ambas cosas a la vez, podemos
concatenarlas con el y lógico: &&.

OTRA RESPUESTA DE LA CONSULTA CON ERROR


let medalla= ["oro", "plata", "bronce"];
function medallaSegunPuesto (puesto) {
if (puesto >=1 && puesto <=3) {
return medalla[puesto-1];
}
else {
return "nada
}
}
Nahyara Alejandra M. hace alrededor de 1 mes
Hola! Ya resolví este ejercicio, pero lo puse mal para hacer una consulta. Lo
resolví viendo las consultas de compañerxs, pero realmente no entiendo
cómo funciona el return en este caso. Alguien que me pueda explicar?
Gracias.

Nahyara Alejandra M. hace alrededor de 1 mes


En el próximo ejercicio tampoco entiendo la función del of, no la explican.

Martin G.  MENTORÍA  hace alrededor de 1 mes


¡Hola Nahyara!
Retornamos medalla[puesto-1] ya que el índice en la lista arranca en 0 con lo
cual si tenemos la lista medalla=["oro", "plata", "bronce"] y queremos el puesto 1
deberíamos traer el valor en la posición 0 (que en la lista sería "oro"), es decir
medalla - 1 (medalla[puesto-1] ).
Respecto al próximo ejercicio, el for..of es una estructura de control que nos
permite recorrer listas y se verá en profundidad en la Lección 7. Igualmente
pensalo de la siguiente forma: para (for) un elemento (let unElemento) de (of)
una lista (unaLista) se hará determinada acción. Trasladado a código sería:

for ( let unElemento of unaLista)


{

// hacer algo
}

Espero haber sido claro. Si aún te quedan dudas, no dudes en volver a


preguntar en esta misma consulta.
¡Saludos!

Ezequiel Jose Z. hace alrededor de 1 mes


Hola Nahyara, Lo que devuelve el return es el elemento de la lista medalla
ubicado en la posición "puesto - 1". Recorda que los elementos dentro de
una lista se enumeran de 0 en adelante. En este caso el elemento "oro" se
encuentra en la posición 0.
Espero que sirva la respuesta. Saludos.-

Nahyara Alejandra M. hace alrededor de 1 mes


Ahora sí! Muchas gracias por la explicacion!

SOLUCION CORRECTA
let medalla= ["oro", "plata", "bronce"];
function medallaSegunPuesto (puesto) {
if (puesto >=1 && puesto <=3) {
return medalla[puesto-1];
}
else {
return "nada"
}
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
medallaSegunPuesto(1)
=> "oro"
  medallaSegunPuesto(3)
=> "bronce"
  medallaSegunPuesto(5)
=> "nada"

Ejercicio 12: No te olvides de saludar


Vamos a conocer una manera de recorrer los elementos de una lista con un
nuevo amigo: el for. 
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í:

for(let precio of [10, 100, 87 ]) {


plataEnBilletera = plataEnBilletera - precio
}

donde plataEnBilletera es una variable que se va modificando a medida que


recorremos los precios.

Si teníamos $500 en nuestra billetera, después del for nos van a quedar $303


porque:

 Al principio plataEnBilletera era 500 y el primer precio de la lista es 10.


Luego de hacer 500 - 10, plataEnBilletera es 490.
 A los 490 que quedaron en nuestra billetera, le restamos el segundo
precio de la lista: 100. Ahora plataEnBilletera es 390.
 El último precio a restar es 87, por lo que, al hacer 390 - 87, la
variable plataEnBilletera terminará siendo 303.

Completá la función saludar que recibe una lista de personas e imprime un saludo para


cada una de ellas.

saludar(["Don Pepito", "Don Jose"])


hola Don Pepito
hola Don Jose

saludar(["Elena", "Hector", "Tita"])


hola Elena
hola Hector
hola Tita

 ¡Dame una pista!

Tené en cuenta que el saludo que imprimimos siempre es "hola" y luego el


nombre de la persona. ¡No te olvides del espacio!

function saludar(personas) {
for(let persona of personas) {
}
}
SOLUCION MIA CON ERROR
function saludar(personas) {
for(let persona of personas) {["Don Pepito", "Don Jose"]; }
{for(let persona of personas)["Elena", "Hector", "Tita"];

}
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

 saludar deberia imprimir los saludos de una persona Ver detalles

 '' == 'hola Jorge\n'

 saludar deberia imprimir los saludos de dos personas Ver detalles

 '' == 'hola Joana\nhola Gladys\n'

 saludar deberia imprimir los saludos de tres personas Ver detalles

 '' == 'hola Graciela\nhola Ana\nhola Tito\n'

  saludar no deberia retornar nada

SOLUCION DE LA CONSULTA CON ERROR

function saludar(personas) {
for(let persona of ["Elena", "Hector", "Tita"]) {
saludar() = "hola " + "persona" ;
}
}

Florencia Agustina P. hace 11 meses


Por lo poco que entiendo, las dos primeras lineas estan bien, esto es
correcto? no sé como escribir desde la tercera linea.

Diana L.  MENTORÍA  hace 11 meses


¡Hola Florencia! ¿Cómo andas?

 La parte del for está casi casi perfecta, lo que está faltando es que en


lugar de usar una lista escrita en el código por nosotros como: ["Elena",
"Hector", "Tita"], podemos usar la lista que nos viene por
parámetro: personas. Los parámetros nos ayudan a flexibilizar nuestra
función, asi podemos probar con muchas listas de personas distintas.
 En cuanto a la tercera línea, lo que buscamos es imprimir en pantalla
"hola" más el nombre de la persona. Para esto usamor la
función imprimir que funciona de la siguiente forma: por ejemplo si
queremos imprimir el nombre de una persona que nos viene por
parámetro más un signo de admiración:

function imprimirAUnaPersona(unaPersona) {
imprimir(persona+ "!");
}

Fijate que usé el parámetro unaPersona sin comillas. Entonces si usamos


nuestra función con un nombre, como:

imprimirAUnaPersona("Diana")

Lo que nos imprimirá será: Diana!


Probá tener usar la función imprimir() y tener en cuenta la lista que viene por
parámetro.
¡Saludos!

Florencia Agustina P. hace 11 meses


Hola Diana, ando un poco mejor gracias a vos :D... ahora escribí: function
saludar(personas) { for(let persona of [personas]) { imprimir("hola " +
personas) ; } } me da error cuando deberia saludar a dos o tres personas me
da bien cuando hay que saludar a una o ninguna persona
Diana L.  MENTORÍA  hace 11 meses
¡Ya casi sale!

 Lo que está faltando, es que cuando usamos el parámetro personas, la


máquina ya sabe que es una lista, porque cuando invocamos hacemos:

saludar(["Elena", "Hector", "Tita"])


Entonces no es necesario que pongamos los corchetes, probá usando
solamente personas en lugar de [personas].

 También tené cuidado que cuando usamos un for, estamos iterando


uno por uno en la lista que tenemos (en este caso las personas), por lo
que necesitamos dentro del mismo usar persona en singular, que
representa la iteración en la lista. La primera vez que itere, siguiendo el
ejemplo anterior, hará:

imprimir("hola"+ "Elena")
Ya que es nuestra primera persona en la lista de personas.
Espero que te sirva ¡saludos!

Joaquin B. hace 11 meses


Yo tengo la misma duda, estoy trabado aca!
function saludar(personas) { for(let persona of personas) { imprimir ("Hola " +
persona) } }

Florencia Agustina P. hace 11 meses


function saludar(personas) { for(let persona of persona) { imprimir("hola" + "
" + persona) ; } } resultado: " parece que estás usando persona pero no está
definido. ¿Puede que hayas escrito mal su nombre o tengas que definirlo?"

Lara F.  MENTORÍA  hace 11 meses


¡Hola, Florencia! Fijate que en let persona of persona el segundo persona debería
ser personas con S final, porque refiere al parámetro, por eso nos indica que
persona no está definido. Con esa correción ya debería funcionar 😊
Joaquín, en tu caso lo que habría que modificar es que "hola" debe ir en
minúscula, incluso la primera letra. Si sigue fallando luego de esa corrección
te recomiendo que publiques una consulta desde tu ejercicio para poder
charlarlo mejor 😊

Florencia Agustina P. hace 11 meses


Gracias Diana y Lara! ya pude, se me pasó ponerle la s a persona

OTRA SOLUCION DE LA CONSULTA CON ERROR


function saludar(personas) {
for(let persona of personas)
{ imprimir("hola " + personas);
}
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  saludar deberia imprimir los saludos de una persona


  saludar deberia imprimir los saludos de dos personas Ver detalles
 'hola Joana,Gladys\nhola Joana,Gladys\n' == 'hola Joana\nhola Gladys\n'

  saludar deberia imprimir los saludos de tres personas Ver detalles


 'hola Graciela,Ana,Tito\nhola Graciela,Ana,Tito\nhola Graciela,Ana,Tito\n' == 'hola Graciela\nhola
Ana\nhola Tito\n'

  saludar no deberia retornar nada

function saludar(personas) {
for(let persona of personas) {
imprimir ("hola" + " " + persona)
}
}
Stefano Domenico P. hace 5 meses
Hola, ya resolví el problema y estuve leyendo las consultas pero quisiera
sacarme una duda para ver si estoy entendiendo. Con respecto al uso del
for.. No me queda del todo claro cómo la función deduce a cada “persona” si
yo no las defino. Es porque al usar el for, las declaro ahí antes del let? O sea
que el for vendría a ser como un let dentro de let. No sé si se entiende mi
pregunta. Es una duda similar a la de Catalina Mozotegui. Gracias!

Diana L.  MENTORÍA  hace 5 meses


¡Hola Stefano! ¿Cómo te va?
Veamos paso por paso qué es lo que hace la computadora para ejecutar un
for:
 Tengamos en cuenta que la función recibe por parámetro una lista, es
decir que al momento de usarla, en la consola por ejemplo, aquel que
esté usando nuestro programa será el que declare esta lista, por
ejemplo podemos hacer en la consolta:

saludar(["Diana", "Stefano"])

Estoy elegiendo yo usar la función con esa lista que acabo de inventar.
 La computadora, como siempre hace con los parámetros, va a
reemplazar en cada lugar donde dice personas (el nombre que le dimos
al parámetro) por la lista que inventamos:

function saludar(["Diana", "Stefano"]) {


for(let persona of ["Diana", "Stefano"]) {
imprimir ("hola" + " " + persona)
}
}

 Ahora, lo que hicimos con let persona of, fue darle un nombre a cada
elemento de la lista, para que la computadora pueda iterar lo que esté
dentro del for, es decir que va a "agarrar" un elemento, le pondrá el
nombre persona (que declaramos) y ejecutará reemplazando persona por
el elemento. Es decir, por ejemplo si toma el primer elemento: "Diana",
reemplazará en todo lugar donde diga persona:

imprimir ("hola" + " " + "Diana")

Una vez que ejecutó eso, ahora le asignará a persona el valor del siguiente
elemento, en ese caso: "Stefano", entonces reemplazará otra vez en donde
decía persona y ejecutará:

imprimir ("hola" + " " + "Stefano")

Lo mismo hará si tuvieramos más elementos, irá reemplazando uno por uno
y ejecutando.
Cualquier cosa que sigan dudas, lo volvemos a ver 😊.
SOLUCION CORRECTA
function saludar(personas) {
for(let persona of personas) {
imprimir ("hola" + " " + persona)
}
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 saludar(["Don Pepito", "Don Jose"])
hola Don Pepito
hola Don Jose
=> undefined
   
¡Terminaste Listas!
¡Felicitaciones! 
Acabas de conocer una estructura de datos que te permite agruparlos: ¡la
lista! 
También aprendiste qué datos puede tener dentro, cómo agregarle o sacarle
elementos, conocer sus posiciones, obtener su longitud y los elementos por
posición.
Por último viste una introducción a cómo recorrerla, aunque este tema lo
profundizaremos un poco más adelante. 

Registros
Muchas veces, cuando representamos cosas de la vida real en nuestros
programas, necesitamos poder agrupar múltiples características de esas
cosas de alguna forma.

Te presentamos una estructura que nos va a ayudar en esa tarea: los


registros. 

Ejercicios

  1. Los primeros registros


  2. Tu propio monumento
  3. Accediendo al campo
  4. Temperatura de planeta
  5. Moviendo archivos
  6. Registros de dos milenios
  7. Postres complejos
  8. Listas de registros
  9. 60 dulces minutos
  10. Hay un registro en mi registro
  11. ¡Azúcar!

Ejercicio 1: Los primeros registros


Una historiadora está recopilando información acerca de distintos
monumentos a lo largo y ancho del mundo . En principio solo quiso saber el
nombre, ubicación, y año de construcción de cada monumento. 

Para eso almacenó cada dato en una variable:

nombreEstatuaDeLaLibertad = "Estatua de la Libertad";


locacionEstatuaDeLaLibertad = "Nueva York";
anioDeConstruccionEstatuaDeLaLibertad = "1886";
nombreCristoRedentor = "Cristo Redentor";
locacionCristoRedentor = "Rio De Janeiro";
anioDeConstruccionCristoRedentor = "1931";

Ahí es cuando se dio cuenta que no era conveniente : si bien la información


entre las variables estaba relacionada, la estaba almacenando por separado.
Entonces pensó: ¿no existirá alguna forma de representar las distintas
características o propiedades de una misma cosa de forma agrupada?

Luego de investigar un poco, encontró una mejor manera para guardar la información
de los monumentos. Probá en la consola escribiendo:

estatuaDeLaLibertad
cristoRedentor
torreEiffel
tajMahal
coliseo

CONSOLA
 estatuaDeLaLibertad
=> {nombre:"Estatua de la Libertad",locacion:"Nueva York,
Estados Unidos de América",anioDeConstruccion:1886}
  cristoRedentor
=> {nombre:"Cristo Redentor",locacion:"Rio de Janeiro,
Brasil",anioDeConstruccion:1931}
  torreEiffel
=> {nombre:"Torre Eiffel",locacion:"París,
Francia",anioDeConstruccion:1889}
  tajMahal
=> {nombre:"Taj Mahal",locacion:"Agra,
India",anioDeConstruccion:1653}
  coliseo
=> {nombre:"Coliseo",locacion:"Roma,
Italia",anioDeConstruccion:80}
   

Ejercicio 2: Tu propio monumento


Los monumentos que probaste en el ejercicio anterior están representados
como registros, y cada una de sus características (nombre, locación, año de
construcción) son campos del registro. Por cierto, ¡podemos crear registros
de cualquier cosa, con los campos que querramos!

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. 

¡Es tu momento del monumento! Guardá en las


variables torreAzadi y monumentoNacionalALaBandera registros de esos
monumentos, oriundos de las ciudades de Teherán, Irán y Rosario,
Argentina respectivamente. ¿Te animás a investigar en qué año se terminaron de
construir para completar ese campo? 
 ¡Dame una pista!

Quizá te sea útil ver cómo declaramos algún monumento en el ejercicio


anterior.

Por ejemplo, esta es la Torre Eiffel:


let torreEiffel = { nombre: "Torre Eiffel", locacion: "París, Francia",
anioDeConstruccion: 1889 };

TORRE AZADI torreAzadi Inaugurada en 1971, la Torre Azadi o Torre de la


Libertad, como también se la conoce, es el símbolo de la ciudad de Teherán. Sus 50
metros de altura dan la bienvenida en una de las entradas a la capital de Irán.

Inauguración: 20 de junio de 1957

SOLUCION MIA CON ERROR

let torreAzadi = {nombre: "torre Azadi", locacion: "Teheran, Iran",


anioDeConstruccion: 1971 },

let monumentoNacionalALaBandera = {nombre: "monumento Nacional A La


Bandera", locacion: "Rosario", "Argentina", anioDeConstruccion: 1957;

¡Ups! Tu solución no se puede ejecutar


Resultados:

solucion.js:2
let monumentoNacionalALaBandera = {nombre: "monumento Nacional A La Bandera", locacion:
"Rosario", "Argentina", anioDeConstruccion: 1957;
^^^

SyntaxError: Unexpected strict mode reserved word

SOLUCION CORRECTA

let torreAzadi = {nombre: "Torre Azadi", locacion: "Teherán, Irán",


anioDeConstruccion: 1971}

let monumentoNacionalALaBandera = {nombre: "Monumento Nacional A La


Bandera", locacion: "Rosario, Argentina", anioDeConstruccion: 1957 }
¡Muy bien! Tu solución pasó todas las pruebas

¡Buenas habilidades de búsqueda!  Los registros, al igual que las listas, son


una estructura de datos porque nos permiten organizar información. Pero
¿en qué se diferencia un registro de una lista?

En las listas podemos guardar muchos elementos de un mismo tipo que


representen una misma cosa (por ejemplo todos números, o todos strings).
No existen límites para las listas: pueden tener muchos elementos, ¡o
ninguno!

En un registro vamos a guardar información relacionada a una única cosa


(por ejemplo un monumento o una persona), pero los tipos de los campos
pueden cambiar. Por ejemplo, el nombre y la ubicación de un monumento
son strings, pero su año de construcción es un número.

Ejercicio 3: Accediendo al campo


Cuando consultaste los registros existentes, se veía algo parecido a lo
siguiente:

tajMahal
{ nombre: "Taj Mahal", locacion: "Agra, India", anioDeConstruccion: 1653 }

Esa consulta era porque estábamos viendo al registro tajMahal completo,


incluyendo todos sus campos. ¡Pero también se puede consultar por un
campo particular! Mirá

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!
CONSOLA
mercurio
=> {nombre:"Mercurio",temperaturaPromedio:67,tieneAnillos:false}
  marte
=> {nombre:"Marte",temperaturaPromedio:-63,tieneAnillos:false}
  saturno
=> {nombre:"Saturno",temperaturaPromedio:-139,tieneAnillos:true}

Ejercicio 4: Temperatura de planeta


Ahora que agregamos registros de planetas, ¡trabajemos un poco con ellos! 

Definí una función temperaturaDePlaneta que reciba como argumento un registro


de planeta y retorne un string que indique su nombre y su temperatura promedio.
¡Tiene que funcionar para cualquier planeta!  Por ejemplo:

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"

 ¡Dame una pista!

¡Prestá atención a los strings que devuelven los ejemplos! Sólo la parte
correspondiente a cada planeta varía, como el nombre y la temperaturaPromedio.
Además, tenés que dejar espacios entre las palabras que rodean
a nombre y temperaturaPromedio. Mirá...

nombre tiene una temperatura promedio de temperaturaPromedio grados

SOLUCION DE LA CONSULTA CON ERROR


function temperaturaDePlaneta(nombre){
return nombre+" "+"tiene una temperatura promedio de"+"
"+temperaturaPromedio+" "+"grados";
}
Edgardo Marcelo G. hace 10 meses
Hola, necesito una mano, sé que puede ser los parametros que esten
mal,pero no sé que otra opcion escribir gracias

Diana L.  MENTORÍA  hace 10 meses


¡Hola Edgardo!
Lo que vamos a recibir por parámetro es un planeta que representa un
registro, si vamos al Ejercicio 3: Accediendo al campo podemos ver los
campos que tienen estos: nombre, temperaturaPromedio y tieneAnillos. Por ejemplo
podríamos suponer que un planeta está definido así:
let mercurio = {nombre: "Mercurio", temperaturaPromedio: 67, tieneAnillos: false};

Nosotros vamos a poder hacer: temperaturaDePlaneta(mercurio).


¿Cómo accedemos al nombre de Mercurio? ¿Y la temperatura promedio?
Si queremos saber el valor de un campo de un registro, podemos usar la
siguiente sintaxis:
registro.campo

Por ejemplo
mercurio.nombre

Me va a retornar "Mercurio", que justamente es el nombre que queremos


concatenar en el retorno de temperaturaDePlaneta. Entonces si llamamos al
parámetro planeta (un poco más acorde a lo que representa), podríamos
hacer: planeta.nombre y a eso concatenarlo con "tiene una temperatura..." etc.
Lo mismo se puede aplicar para la temperatura, podemos acceder sabiendo
que el campo se llama: temperaturaPromedio

OTRA SOLUCION DE CONSULTA CON ERROR


function temperaturaDePlaneta(planeta){
imprimir (planeta.nombre +" "+ " tiene una temperatura promedio
de "+" " + planeta.temperaturaPromedio + "grados");
}
Elida Beatriz L. hace 10 meses
no se que es lo indefinido, porque el texto que devuelve es el correcto

Mayra M. hace 10 meses


¡Hola Elida! ¿Como estás? Lo que sucede es que estaría faltando el return, por
otro lado, no es necesario imprimir y los espacios para dividir el nombre del
planeta y la temperatura promedio ya se lo estas dando dentro de _ " tiene
una temperatura promedio de "_ por lo que no es necesario hacer +" "+,
simplemente basta con sumarlos. Espero haberte ayudado

CCON ERROR
function temperaturaDePlaneta(planeta){
return (planeta.nombre + " tiene una temperatura promedio de " +
"grados");
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  temperaturaDePlaneta funciona para Mercurio Ver detalles


 'Mercurio tiene una temperatura promedio de grados' == 'Mercurio tiene una temperatura promedio
de 67 grados'

  temperaturaDePlaneta funciona para Saturno Ver detalles


 'Saturno tiene una temperatura promedio de grados' == 'Saturno tiene una temperatura promedio de -
139 grados'

  temperaturaDePlaneta funciona para Venus Ver detalles


  temperaturaDePlaneta funciona para Marte Ver detalles
  temperaturaDePlaneta funciona para cualquier planeta Ver detalles

function temperaturaDePlaneta(planeta){
return (planeta).nombre +' tiene una temperatura promedio de '+
(planeta).temperaturaPromedio +' grados';
}
no hace falta ponerle los parentesis
SOLUCION CORRECTA
function temperaturaDePlaneta(planeta){
return (planeta).nombre +' tiene una temperatura promedio de '+
(planeta).temperaturaPromedio +' grados';
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 5: Moviendo archivos


Por el momento estuvimos creando y consultando registros. ¿No sería
interesante poder... modificarlos? 

La sintaxis para modificar campos de registros es muy similar a lo que


hacemos para cambiar los valores de las variables. Por ejemplo, para cambiar
la temperatura de un planeta:

saturno.temperaturaPromedio = -140;

Ahora imaginá que tenemos un registro para representar un archivo, del que
sabemos su ruta (dónde está guardado) y su fecha de creación. Si queremos
cambiar su ruta podemos hacer...

leeme
{ ruta: "C:\leeme.txt", creacion: "23/09/2004" }
moverArchivo(leeme, "C:\documentos\leeme.txt")

Luego el registro leeme tendrá modificada su ruta:

leeme
{ ruta: "C:\documentos\leeme.txt", creacion: "23/09/2004" }

¡Es tu turno! Definí el procedimiento moverArchivo, que recibe un registro y una


nueva ruta y modifica el archivo con la nueva ruta.
SOLUCION MIA CON ERROR
let Archivo = {ruta: "C:\registro.txt", creacion: "23/09/2004"}
moverArchivo(registro, "C:\documentos\registro.txt)"}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
moverArchivo(registro, "C:\documentos\registro.txt)"}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

SyntaxError: missing ) after argument list

SOLUCION DADA EN LA CONSULTA


function moverArchivo(registro,nuevaRuta){
registro.ruta = nuevaRuta}
María Esperanza I. hace 10 meses
Buenas tardes, quiero decirles que lo hice bien, le saqué el } para poder
escribirles. lo hice porque miré las consultas pero no entiendo qué hice, la
lógica detrás. Lo único que entendí es que moví el archivo de lugar. Desde
ya, gracias.

Sergio Sebastian S. hace 10 meses


hola Maria... registro es una estructura (objeto) con muchos datos dentro..
(puede tener cantidad X) vamos a poner en este ejemplo 3 datos..
registro.ruta ="/tmp/remoto/" registro.nombre= "perfil.jpg"
registro.peso =20000
como veras.. tiene datos guardados dentro de registro de la misma manera
que podriamos tener varias variables sueltas esto se hace para que las
variables que estan conectadas de alguna manera esten todas juntas... es
mucho mas ordenado.
entonces lo que estas haciendo vos... basicamente es tomar.. registro.ruta =
"/tmp/remoto/" y darle una nueva ubicacion.. EJEMPLO registro.ruta
="/home/maria/Imagenes/" obviamente como vos no sabes la ruta,
simplemente le pones la ruta que te pasan como 2do parametro..
Se entiende?

Solución de la consulta con error


function moverArchivo(registro,nuevaruta) {
registro.nuevaRuta = "C:/documentos/registro.txt";
}
María Eugenia G. hace 1 día
Hola, ya revise las otras consultas y no comprendo mi error. Seguiré
intentando... hasta que me puedan aclarar cual ha sido error u omisión.
Muchas gracias

Franco P. hace 1 día


Hola Maria! Fijate que la "nuevaruta" no tiene que estar definido, Ya que es
una variable! En lugar de eso, Tenes que indicarle que la Ruta del archivo,
Ahora tiene que ser esta variable "nuevaruta"
tendria que quedar algo como registro.nuevaRuta = nuevaruta

David Ignacio D.  MENTORÍA  hace alrededor de 18 horas


¡Hola María! ¿Cómo va?
La consigna del ejercicio actual nos pide definir moverArchivo, procedimiento
que, dados un registro y una ruta, modifica el primero con la dada ruta. Para
lograrlo, analicemos la estructura del registro. Sabemos que este es un
registro cuyos campos son ruta (no nuevaRuta) y creacion, pudiendo acceder a
ellos como

registro.ruta
// y
registro.creacion

En el caso de moverArchivo, nos interesará modificar este primer campo, de


modo que se asigne la nuevaruta dada por el parámetro y no una específica
como sucede en la solución presentada.

OTRA SOLUCION CON ERROR


function moverArchivo(archivo,leeme){
{ruta: "archivo"};
}
Erlan Bruno C. hace 5 días
Hola yo sé que estoy casi solucionando, pero no sé donde esta el otro error.

Delfina G.  MENTORÍA  hace 5 días


¡Hola, Erlan! ¿Cómo va?
En este ejercicio se incorpora la idea de cómo modificar campos de
registros. La forma de hacerlo es similar a lo aprendimos para cambiar
valores de variables, por ejemplo: Si quisiésemos cambiar la temperatura de
un planeta, podríamos armar una función similar a esta:
function cambiarTemperatura(temperaturaNueva){
saturno.temperaturaPromedio = temperaturaNueva;
}

Para la función moverArchivo() deberíamos hacer algo parecido a ello para


modificar el campo ruta; teniendo en cuenta que el registro lo recibiremos
como primer argumento. También recibiremos la ubicación del archivo como
segundo argumento y tenemos que tener en cuenta que para utilizar ese
argumento recibido dentro de nuestra función, debemos utilizarlo sin
comillas para que el programa comprenda que nos referimos a eso
recibido y no a un string que contiene la palabra "archivo".
¿Te animás a intentarlo nuevamente con estas aclaraciones? Si quedan
dudas podés compartirnos nuevamente el código por acá y te ayudamos.
¡Espero sirvan las aclaraciones! Saludos

Erlan Bruno C. hace 5 días


Hola yo intetenté hacer de otra manera pero aún no me sale, perdón.

Erlan Bruno C. hace 5 días


function moverArchivo(archivo){ {archivo.ruta, archivo.nuevaRuta};
}

Delfina G.  MENTORÍA  hace 5 días


¡Hola, Erlan!
Ningún problema, estamos para ayudarte y la idea es que puedas despejar
todas las dudas por acá.

 Por un lado, tenemos que cambiar los parámetros que definimos en


nuestra función, ya que el ejemplo que nos dan de cómo se la
invocará es: moverArchivo(leeme, "C:\documentos\leeme.txt") donde vemos
que se le enviara leeme (el cual es un registro que representa el archivo
en cuestión) y luego se le enviará la ruta. Por lo tanto, nuestra
función debe tener dos parámetros: el archivo y la ruta.
 Por otro lado, nos muestra que el archivo leeme es un registro con la
siguiente estructura: { ruta: "C:\leeme.txt", creacion: "23/09/2004" } . Por lo
cual, está muy bien que ingresemos a la ruta utilizando archivo.ruta. Lo
que debemos hacer luego de llegar a la misma, es darle el nuevo
valor. ¿cuál sería este valor? la ruta nueva, es decir, la ruta que se
reciba como segundo argumento. La forma de modificar ese registro
sería algo así: archivo.ruta = algunValor, siendo ese valor la ruta ¿y cómo
sabemos cuál es la ruta? utilziando el nombre que definimos para el
segundo parámetro el cual representará a lo que se reciba como
argumento.

¿Te imaginás cómo debería verse el código con alguno o ambos cambios?
Intentalo y si no sale, podés volver a compartir la solución por acá y lo
revisamos. Estamos para despejar las dudas. Saludos

SOLUCION MIA CON ERROR


function moverArchivo(registro){
registro.ruta, registro.nuevaRuta;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  moverArchivo le cambia la ruta a un archivo al pasar una ruta


nueva Ver detalles
 '/usr/miarchivo.doc' == '/home/miarchivo.doc'

  moverArchivo le mantiene la ruta a un archivo si se pasa la misma


  moverArchivo no modifica la fecha de creación del archivo

SOLUCION CORRECTA
function moverArchivo(registro, nuevaRuta){
registro.ruta = nuevaRuta;
}
¡Muy bien! Tu solución pasó todas las pruebas

OTRA SOLUCION CORRECTA


function moverArchivo(registro, nuevaRuta){
let leeme = registro.ruta = nuevaRuta;
}
 ¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 6: Registros de dos milenios


En el ejercicio anterior modificamos la ruta del registro, pero no utilizamos
su fecha de creación. ¡Usémosla! Queremos saber si un archivo es del
milenio pasado, lo que ocurre cuando su año es anterior a 2000. 

Definí la función esDelMilenioPasado, que recibe un archivo y retorna un


booleano.

esDelMilenioPasado({ ruta: "D:\fotonacimiento.jpg", creacion: "14/09/1989"


})
true

 ¡Dame una pista!


Quizá te pueda servir la función anio:

anio("04/11/1993")
1993

SOLUCION MIA CON ERROR


function esDelMilenioPasado(registro, nuevaRuta){
let leeme = registro.ruta = "D:\fotonacimiento.jpg", anio
"04/11/1993";
}
 ¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
let leeme = registro.ruta = "D:\fotonacimiento.jpg", anio "04/11/1993";
^^^^^^^^^^^^
SyntaxError: Unexpected string

CON ERROR
function esDelMilenioPasado(registro, nuevaRuta){

let leeme = registro.ruta = "D:\fotonacimiento.jpg", creacion: "04/11/1993";

}
 ¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
let leeme = registro.ruta = "D:\fotonacimiento.jpg", creacion: "04/11/1993";
^
SyntaxError: Unexpected token :

Solución consulta con error


function esDelMilenioPasado(archivo, anio) {
return ("01/01/2000" >= anio)
}
María De Las Mercedes B. hace 11 meses
Hola, estoy dando vueltas con esta, no se si está mal el formato del año o
me está faltando algo en la consigna

Adelqui M. hace 11 meses


Hola! El método esDelMilenioPasado solo debe recibir un archivo como
parámetro. Prueba usas el método de la biblioteca llamado anio(fecha) para
saber el año de creacion del archivo. Luego si lo comparas con el año sin
necesidad de meses y dias.

María De Las Mercedes B. hace 11 meses


Muchas gracias!!

María De Las Mercedes B. hace 11 meses


function esDelMilenioPasado(anio) { return (anio < 2000) }
Me sigue dando la mitad con error

Adelqui M. hace 11 meses


Hola de nuevo! Lo que debes hacer es comparar si 2000 es mayor al año de
creacion de un archivo. No recibes un anio como argumento, sino un
archivo. Deberia ser function esDelMilenioPasado(archivo). Entonces llamas
al método anio() que esta en la Biblioteca y le pasas la creacion del archivo
asi: anio(archivo.creacion) y esto es lo que deberias comparar con 2000.

María De Las Mercedes B. hace 11 meses


Ahhh, ahora si. Probaba con creacion.anio y tampoco la pegaba. Gracias
SOLUCION CONSULTA
function esDelMilenioPasado(registro){
return anio(registro.creacion) < 2000;}
Rocio M. hace 10 meses
Hola! pude resolver el ejercicio correctamente sin embargo no entiendo
porque debo utilizar anio(registro.creacion) y no directamente poner
registro.creacion < 2000, espero que puedan aclararme esto, muchas
gracias!

Martin G.  MENTORÍA  hace 10 meses


¡Hola Rocio!
Se debe utilizar de esa forma ya que anio es una función que justamente lo
que va a hacer es sacar el año de una fecha que nosotros le pasamos por
parametro. Lo podemos ver en ¡Dame una pista!:
anio("04/11/1993")
1993

En este caso, la fecha que le vamos a pasar es la de creación del registro,


osea registro.creación, entonces la función anio va a sacar el año de
registro.creación y comapra si es menor a 2000.

Rocio M. hace 10 meses


Ahh no me habia dado cuenta que registro.creacion incluida el mes y el dia,
me super aclaraste gracias!
EN LA BIBLIOTECA NOS DA LA PISTA

Nos dice el año de una fecha


function anio(fecha) /* ... */

SOLUCION CORRECTA
function esDelMilenioPasado(registro){
return anio(registro.creacion) < 2000;}
Muy bien! Tu solución pasó todas las pruebas

OTRA SOLUCION CORRECTA


function esDelMilenioPasado(archivo){
return(anio(archivo.creacion) < 2000)
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 "1993"
=> "1993"
  esDelMilenioPasado({ruta: "D:\fotonacimiento.jpg", creacion: "4/11/19
93" })
=> true

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:

let flanCasero = { ingredientes: ["huevos", "leche", "azúcar", "vainilla"],


tiempoDeCoccion: 50 }
let cheesecake = { ingredientes: ["queso crema", "frambuesas"], tiempoDeCoccion: 80 }
let lemonPie = { ingredientes: ["jugo de limón", "almidón de maíz", "leche", "huevos"],
tiempoDeCoccion: 65 }

Definí la función masDificilDeCocinar, que recibe dos registros de postres como


argumentos y retorna el que tiene más ingredientes de los dos.

masDificilDeCocinar(flanCasero, cheesecake)
{ ingredientes: ["huevos", "leche", "azúcar", "vainilla"], tiempoDeCoccion: 50 }

 ¡Dame una pista!


¡Recordá que podés usar la función longitud! Y si los dos postres tienen la
misma cantidad de ingredientes, podés devolver cualquiera de los dos. 
SOLUCION MIA CON ERROR
function masDificilDeCocinar(ingredientesPostre1, ingredientesPostre2)
{
if (ingredientesPostre1 > ingredientesPostre2){
return ingredientesPostre1} else {return ingredientesPostre2;
}
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
  El flan casero es más difícil de cocinar que el cheesecake Ver detalles

 { ingredientes: [ 'queso crema', 'frambuesas' ],


 tiempoDeCoccion: 80 } == { ingredientes: [ 'huevos', 'leche', 'azúcar', 'vainilla' ],
 tiempoDeCoccion: 50 }

  El lemonPie es más difícil de cocinar que el cheesecake


  Si dos postres son igual de difíciles de cocinar, devuelve cualquiera de
los dos
SOLUCION DE LA CONSULTA CON ERROR
let flanCasero = { ingredientes: ["huevos", "leche", "azúcar", "vainilla"], tiempoDeCoccion:
50 }
let cheesecake = { ingredientes: ["queso crema", "frambuesas"], tiempoDeCoccion: 80 }
let lemonPie = { ingredientes: ["jugo de limón", "almidón de maíz", "leche", "huevos"],
tiempoDeCoccion: 65 }
function masDificilDeCocinar(postre1, postre2) {
if (longitud(postre1.ingredientes) > longitud(postre2.ingredientes))
return postre1;
{
if (longitud(postre1.ingredientes) < longitud(postre2.ingredientes))
return postre2;
{
if (longitud(postre1.ingredientes) === longitud(postre2.ingredientes))
return postre1 || postre2 }
}}
Pamela S. hace 10 meses
Hola! ¿Cómo podría evitar el operador lógico en la última expresion? Gracias
de antemano
Gisela Soledad A. hace 10 meses
Hola Pamela, si te fijas en Dame una pista!, te dice que si tienen la misma
cantidad de ingredientes podés devolver cualquiera de los dos.
Con el primer if decis que si el postre1 tiene más ingredientes que el
postre2, devuelva postre1, si esta condicion no se cumple es porque postre2
tenia más ingredientes o tenía la misma cantidad, por lo que si no se cumple
la condicion, deberia retornar postre 2
Con ese sólo if y agregando el else cumplirías todos los requisitos

let flanCasero = { ingredientes: ["huevos", "leche", "azúcar", "vainilla"], tiempoDeCoccion:


50 }
let cheesecake = { ingredientes: ["queso crema", "frambuesas"], tiempoDeCoccion: 80 }
let lemonPie = { ingredientes: ["jugo de limón", "almidón de maíz", "leche", "huevos"],
tiempoDeCoccion: 65 }
function masDificilDeCocinar(postre1, postre2) {
if (longitud(postre1.ingredientes) > longitud(postre2.ingredientes))
return postre1;}
else {
return postre2; }
SOLUCION CORRECTA
let flanCasero = { ingredientes: ["huevos", "leche", "azúcar", "vainilla"],
tiempoDeCoccion: 50 }
let cheesecake = { ingredientes: ["queso crema", "frambuesas"],
tiempoDeCoccion: 80 }
let lemonPie = { ingredientes: ["jugo de limón", "almidón de maíz",
"leche", "huevos"], tiempoDeCoccion: 65 }
function masDificilDeCocinar(postre1, postre2) {
if (longitud(postre1.ingredientes) > longitud(postre2.ingredientes))
return postre1;
else {
return postre2;
}
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 masDificilDeCocinar(cheesecake, lemonPie)
=> {ingredientes:["jugo de limón","almidón de
maíz","leche","huevos"],tiempoDeCoccion:65}
  masDificilDeCocinar(lemonPie, flanCasero)
=> {ingredientes:
["huevos","leche","azúcar","vainilla"],tiempoDeCoccion:50}
  masDificilDeCocinar(flanCasero, lemonPie)
=> {ingredientes:["jugo de limón","almidón de
maíz","leche","huevos"],tiempoDeCoccion:65}
Toma el registro 2 o ultimo

Ejercicio 8: Listas de registros


En el ejercicio anterior te mostramos que un registro puede tener una lista
entre sus campos. ¿Y al revés? ¿Podemos tener una lista de registros? 

¡Sí! Así como trabajamos con listas de números, booleanos, strings o más
listas, también podemos listar registros. Se puede hacer todo lo que hacías
antes, como por ejemplo remover, saber su longitud o preguntar por el
elemento de cierta posición utilizando los corchetes [ ].

Probá en la consola las listas postresFavoritos y monumentosDeAmerica. Hay un postre que no


mostramos antes, ¿te das cuenta cuál es solamente leyendo sus ingredientes? 
CONSOLA
postresFavoritos
=> [{ingredientes:["galletitas","dulce de
leche","crema"],tiempoDeCoccion:20},{ingredientes:
["huevos","leche","azúcar","vainilla"],tiempoDeCoccion:50},
{ingredientes:["queso
crema","frambuesas"],tiempoDeCoccion:80},{ingredientes:["jugo
de limón","almidón de
maíz","leche","huevos"],tiempoDeCoccion:65}]
  monumentosDeAmerica
=> [{nombre:"Monumento Nacional a la
Bandera",locacion:"Rosario,
Argentina",anioDeConstruccion:1957},{nombre:"Estatua de la
Libertad",locacion:"Nueva York, Estados Unidos de
América",anioDeConstruccion:1886},{nombre:"Cristo
Redentor",locacion:"Rio de Janeiro,
Brasil",anioDeConstruccion:1931}]

Ejercicio 9: 60 dulces minutos


A veces no sólo queremos comer algo rico, sino que queremos comerlo lo
antes posible.  

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.
 ¡Dame una pista!
¡Recordá que tiempoDeCoccion está expresado en minutos! Por lo tanto, si
queremos que se cocine en una hora o menos, tenés que fijarte que
ese tiempoDeCoccion sea menor a 60 minutos. 
Además, como agregarAPostresRapidos es un procedimiento, no t iene que
retornar nada. Sólo tenés que agregar (¿te acordás de este procedimiento?) el
postre a la lista si es rápido.
SOLUCION MIA CON ERROR
function agregarAPostresRapidos(postresrapidos, unpostre){
tiempoDeCoccion (unpostre < 60)
agregar(postresrapidos, unpostre)
}
Tu solución no pasó las pruebas
Problemas que encontramos:

 parece que estás usando tiempoDeCoccion pero no está definido. ¿Puede


que hayas escrito mal su nombre o tengas que definirlo?
 Detalles
Resultados de las pruebas:
  Un postre de una hora y media no es rápido Ver detalles
 tiempoDeCoccion is not defined

  Un postre de media hora es rápido Ver detalles


 tiempoDeCoccion is not defined

  Un postre de 45 minutos es rápido Ver detalles


OTRA SOLUCION MIA CON ERROR
function agregarAPostresRapidos(postresrapidos, unpostre){
unpostre < 60
agregar(postresrapidos, unpostre)
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  Un postre de una hora y media no es rápido Ver detalles


 3 == 2

  Un postre de media hora es rápido


  Un postre de 45 minutos es rápido
SOLUCION CORRECTA
function agregarAPostresRapidos(postresrapidos, unpostre){
if (unpostre.tiempoDeCoccion <= 60){
agregar(postresrapidos, unpostre)
}
}
¡Muy bien! Tu solución pasó todas las pruebas

OTRA SOLUCION
function agregarAPostresRapidos(lista, postre){
  if(postre.tiempoDeCoccion <= 60){
    agregar(lista, postre)
  }
}
¡Muy bien! Tu solución pasó todas las pruebas

Ejercicio 10: Hay un registro en mi


registro
¿Te acordás cuando vimos que una lista podía estar compuesta por otras listas? ¡Con los
registros aplica la misma idea!  Si tenemos alguna estructura de datos compleja, puede
ocurrir que no alcance con representarla únicamente mediante strings, números,
booleanos y listas, sino que necesitemos otro registro dentro.
¡No se puede vivir a base de postres! Bueno, quizás sí, pero mantengamos una
alimentación saludable . Mediante un registro queremos modelar un menú completo:
consiste en un plato principal , los vegetales de la ensalada que acompaña , y un
postre  como lo veníamos trabajando, es decir, sigue siendo un registro.

Por ejemplo, el siguiente es un menú con bife de lomo como plato principal, una ensalada
de papa, zanahoria y arvejas como acompañamiento y un cheesecake de postre. Como el
registro es un poco extenso, y para que sea más legible, lo vamos a escribir de la siguiente
forma:

let menuDelDia = {
platoPrincipal: "bife de lomo",
ensalada: ["papa", "zanahoria", "arvejas"],
postre: { ingredientes: ["queso crema", "frambuesas"], tiempoDeCoccion: 80
}
};
Averiguá qué devuelve el campo ingredientes del campo postre del registro menuInfantil.
¡Está un registro adentro del otro! La sintaxis es la siguiente:

menuInfantil.postre.ingredientes
CONSOLA
 menuInfantil.postre.ingredientes
=> ["galletitas","dulce de leche","crema"]

Ejercicio 11: ¡Azúcar!


Para terminar, trabajemos una vez más con los menúes.

Definí un procedimiento endulzarMenu, que recibe un registro menú y le


agrega azúcar a los ingredientes de su postre. Si ya tiene azúcar, no importa...
¡le agrega más! 

 ¡Dame una pista!

Recordá que cada menú tiene un postre y que cada postre tiene ingredientes. 

SOLUCION MIA CON ERROR


function endulzarMenu(menu, postre){
if postre = ingredientes
}
 ¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
if postre = ingredientes
^^^^^^
SyntaxError: Unexpected identifier

SOLUCION DE LA CONSULTA CON ERROR


function endulzarMenu (menu) {
agregar (menu.postre.ingredientes, "Azucar");
}
Miguel Pascual M. hace 10 meses
En la cónsola funciona pero en la función no.. En la cónsola, ejercicio anterior
(Ejercicio 10: Hay un registro en mi registro), probé: agregar
(menuInfantil.postre.ingredientes, "Azucar") Y agregó el azúcar sin
problemas, en la lista de ingredientes. Pero aquí resulta en un error, quisiera
saber cuál es.. Gracias

Gisela Soledad A. hace 10 meses


Hola Miguel, probá escribir azúcar como dice en la consigna: "azúcar"
Saludos

María Belén B. hace 10 meses


Hola Miguel, lo que estaría faltando es que definieras un Menú para pasarlo
como parámetro a la función: endulzarMenu(menu), a ese "menu" lo tenes
que definir como un let menu y agregarle dentro el postre con los
ingredientes. Ojalá te sirva!!

Mauro G. hace 10 meses


No hay que definir ningún menú... el ejercicio ya de fondo pasa un menú.
Funciona correctamente sin declararlo Saludos!

ornella P.  MENTORÍA  hace 10 meses


¡Hola Miguel! Esta muy bueno lo que aportaron tus compañeros. Fijate el
pequeño error cuando declarás Azucar, es como dice el ejercicio "azúcar" (en
minúscula y con acento). Por otro lado en la línea dos, entre postre e
ingredientes tenemos una , (coma). Espero que haya sido de ayuda.

Miguel Pascual M. hace 10 meses


Gracias por todas las respuestas. No era necesario definir el menú, ya que es
lo que se pasa a la función; es responsabilidad del programa definir su menú
para pasarlo correctamente. La cuestión estaba completamente en que le
agregué "Azúcar" en vez de "azúcar". En la cónsola funcionaba porque no
respondía a ningún enunciado, pero aquí se pedía explícitamente agregarlo
de esa manera. Voy a tener que prestar más atención a lo solicitado en los
enunciados jeje. Gracias a todos, saludos!
OTRA SOLUCION DE LA CONSULTA CON ERROR
function endulzarMenu (menu, postre){
agregar(menu.postre.ingredientes, "azúcar");
}
Jorge S. hace 10 meses
Hola gente, no entiendo que mejorar, si bien se soluciona entiendo que
podría estar mejor, ¿me dan una mano? por favor

Diana L.  MENTORÍA  hace 10 meses


¡Hola Jorge!
Si analizamos lo que está dentro de la función:

agregar(menu.postre.ingredientes, "azúcar");

Estamos usando el parámetro menu, pero en ningún momento estamos


usando un parámetro postre; estamos usando un postre, pero es un campo
del registro, no es un parámetro. Podemos ver que los parámetros el editor
de texto nos los pone en verde, al igual que los strings. Por esto es que el
error que tira es: endulzarMenu debe tener un parámetro; porque
solamente vamos a querer como parámetro el menu: endulzarMenu (menu).

SOLUCION CORRECTA
function endulzarMenu (menu) {
agregar (menu.postre.ingredientes, "azúcar");
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA

¡Terminaste Registros!
Durante la lección aprendiste cuál es la utilidad de esta estructura de datos
llamada registro, cómo acceder a sus campos y modificarlos, y hasta viste
que pueden anidarse (es decir, que haya un registro dentro de otro).
¡Felicitaciones! 
Recorridos
En lecciones anteriores definimos funciones, usamos registros y listas. Ahora
que tenemos todas esas herramientas, llega el momento de combinarlas y
aprender a correr las listas y hacer cosas más complejas. ¡Acompañanos!

Ejercicios

  1. Las ganancias semestrales


  2. ¿Y el resto de las ganancias?
  3. Todas las ganancias, la ganancia
  4. Nos visita un viejo amigo
  5. Cuentas claras
  6. La ganancia promedio
  7. Quién gana, quién pierde
  8. Soy el mapa, soy el mapa
  9. A filtrar, a filtrar cada cosa en su lugar
  10. Un promedio más positivo
  11. Esto es lo máximo
  12. Como mínimo
  13. Los mejores meses del año

Ejercicio 1: Las ganancias semestrales


Ana, contadora de una conocida empresa , tiene registros para representar
los balances de cada mes y una lista para guardarlos. Por ejemplo, para el
último semestre del año pasado registró los siguientes:

En julio ganó $50, en agosto perdió $12, etc


let balancesUltimoSemestre = [
{ mes: "julio", ganancia: 50 },
{ mes: "agosto", ganancia: -12 },
{ mes: "septiembre", ganancia: 1000 },
{ mes: "octubre", ganancia: 300 },
{ mes: "noviembre", ganancia: 200 },
{ mes: "diciembre", ganancia: 0 }
];

Y nos acaba de preguntar: "¿puedo saber la ganancia de todo un semestre?"

"Obvio, solo tenemos que sumar las ganancias de todos los balances", dijimos,
y escribimos el siguiente código:

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:

//En enero la empresa ganó $80, en febrero, $453, en marzo $1000


let balancesPrimerTrimestre = [
{ mes: "enero", ganancia: 80 },
{ mes: "febrero", ganancia: 453 },
{ mes: "marzo", ganancia: 1000 }
];

Y nos preguntó: "¿Podría usar esta función que me dieron para calcular las
ganancias del primer trimestre?".

¿Tiene algún problema la función gananciaSemestre que escribimos


anteriormente? ¿Funcionará con los balances trimestrales? ¿Y con los
cuatrimestrestrales?
¡Probala en la consola!
BIBLIOTECA
let balancesUltimoSemestre = [{ mes: "julio", ganancia: 50 }, { mes: "agosto", ganancia: -
12 }, { mes: "septiembre", ganancia: 1000 }, { mes: "octubre", ganancia: 300 }, { mes:
"noviembre", ganancia: 200 }, { mes: "diciembre", ganancia: 0 }];
let balancesPrimerTrimestre = [{ mes: "enero", ganancia: 80 }, { mes: "febrero", ganancia:
453 }, { mes: "marzo", ganancia: 1000 }];

function gananciaSemestre(balances) {
return balances[0].ganancia + balances[1].ganancia +
balances[2].ganancia + balances[3].ganancia +
balances[4].ganancia + balances[5].ganancia;
}

CONSOLA
balancesPrimerTrimestre
=> [{mes:"enero",ganancia:80},{mes:"febrero",ganancia:453},
{mes:"marzo",ganancia:1000}]
  balancesCuartoTrimestre
balancesCuartoTrimestre;
^

ReferenceError: balancesCuartoTrimestre is not defined


balancesUltimoSemestre
=> [{mes:"julio",ganancia:50},{mes:"agosto",ganancia:-12},
{mes:"septiembre",ganancia:1000},
{mes:"octubre",ganancia:300},{mes:"noviembre",ganancia:200},
{mes:"diciembre",ganancia:0}]

Ejercicio 2: ¿Y el resto de las ganancias?


La función gananciaSemestre anterior tiene dos problemas :
1. Es muy repetitiva y tediosa de escribir. ¡Tenemos que hacer muchas
sumas a mano!
2. No es genérica, como bien dice su nombre, sólo sirve para sumar las
ganancias de 6 balances:
 si la lista tiene más de seis balances, sólo suma los primeros;
 si tiene menos, no funciona (¿te acordás cuando te dijimos que si te
ibas de índice cosas malas podían ocurrir? )
Lo que nos gustaría es poder sumar las ganancias de todos los balances de
una lista, sin importar cuántos haya realmente; queremos una
función gananciaTotal, que pueda sumar balances de cualquier período de
meses: semestres, cuatrimestres, trimestres, etc. ¡Qué difícil!
¡Relajá! Ya tenemos nuestra versión; probala con las siguientes consultas:
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 3 }
])
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 3 },
{ mes: "marzo", ganancia: 1 },
{ mes: "abril", ganancia: 8 },
{ mes: "mayo", ganancia: 8 },
{ mes: "junio", ganancia: -1 }
])
gananciaTotal([])

Después seguinos para contarte cómo la hicimos.


CONSOLA
gananciaTotal([{mes: "enero", ganancia: 2}, {mes: "febrero", 
ganancia: 3}])
=> 5
  gananciaTotal([ {mes: "enero", ganancia: 2}, {mes: "febrero"
, ganancia: 3}, {mes: "marzo", ganancia: 1}, {mes: "abril", g
anancia: 8}, {mes: "mayo", ganancia: 8}, {mes:"junio", gananc
ia: -1}])
=> 21
  gananciaTotal([])
=> 0

Ejercicio 3: Todas las ganancias, la


ganancia
Ahora que sabemos la función que necesitamos ( gananciaTotal), razonemos
cómo hacerla...
Vamos de a poquito : si la lista no tuviera elementos, ¿cuánto debería ser la
sumatoria? ¡0!

function gananciaTotal0(balancesDeUnPeriodo) {
let sumatoria = 0;
return sumatoria;
}
¿Y si tuviera exactamente 1 elemento? Sería... 0.... ¿más ese elemento?
¡Exacto!

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

¿Empezás a ver un patrón? Tratá de escribir gananciaTotal4 que funcione


para 4 elementos.

SOLUCIONCORRECTA
function gananciaTotal4(balancesDeUnPeriodo) {
let
sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[1].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[2].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[3].ganancia;
return sumatoria;
}
 ¡Muy bien! Tu solución pasó todas las pruebas

¡Bien hecho! 

¿Y si la lista tuviera cualquier cantidad de elementos? Si seguimos repitiendo


este patrón, veremos que una sumatoria de una lista siempre arranca igual,
con let sumatoria = 0, y termina igual, devolviendo la variable local
sumatoria (return sumatoria).

function gananciaTotalN(unPeriodo) {
let sumatoria = 0; // esto siempre está
//... etc
return sumatoria; //esto siempre está
}

Lo que cambia son las acumulaciones (sumatoria = sumatoria + ...);


necesitamos una por cada elemento de la lista. Dicho de otra forma,
tenemos que visitar cada elemento del mismo, sin importar cuántos tenga.
Pero, ¿cómo hacerlo? ¿No te suena conocida esta idea de repetir algo
muchas veces?

  Ejercicio 4: Nos visita un viejo amigo


Lo que tenemos que hacer, entonces, es repetir la operación de acumular
varias veces, una por cada elemento de la lista. ¡Digamos hola  (nuevamente)
al for...of!

function gananciaTotal(balancesDeUnPeriodo) {
let sumatoria = 0;
for (let balance of balancesDeUnPeriodo) {
sumatoria = sumatoria + balance.ganancia;
}
return sumatoria;
}

Como ves, el for...of nos permite visitar y hacer algo con cada elemento de
una lista; en este caso, estaremos visitando
cada balance de balancesDeUnPeriodo.
¿Aún no te convenciste? Nuevamente, probá las siguientes expresiones en la consola:

gananciaTotal([])
gananciaTotal([
{ mes: "noviembre", ganancia: 5 }
])
gananciaTotal([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 10 },
{ mes: "marzo", ganancia: -20 }
])
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 10 },
{ mes: "marzo", ganancia: -20 },
{ mes: "abril", ganancia: 0 },
{ mes: "mayo", ganancia: 10 }
])

BIBLIOTECA
function gananciaTotal(balancesDeUnPeriodo) {
let sumatoria = 0;
for (let balance of balancesDeUnPeriodo) {
sumatoria = sumatoria + balance.ganancia;
}
return sumatoria; }

CONSOLA
 gananciaTotal([])
=> 0
  gananciaTotal([ {mes: "noviembre", ganancia: 5} ])
=> 5
  gananciaTotal([ {mes: "marzo", ganancia: 8}, {mes: "agosto", ganancia
: 10} ])
=> 18
  gananciaTotal([ {mes: "enero", ganancia: 2}, {mes: "febrero", gananci
a: 10}, {mes: "marzo", ganancia: -20} ])
=> -8
gananciaTotal([ {mes: "enero", ganancia: 2}, {mes: "febrero", ganancia
: 10}, {mes: "marzo", ganancia: -20}, {mes: “abril”, ganancia: 0},
{mes: “mayo”, ganancia: 10} ])
=> 2

Ejercicio 5: Cuentas claras


¡Ana tiene nuevos requirimientos! Ahora nos pidió lo siguiente: "Quiero saber
cuántos balances fueron positivos, es decir, aquellos en los que la ganancia fue
mayor a cero".

Completá la función cantidadDeBalancesPositivos. Si prestás atención,


notarás que tiene una estructura similar al problema anterior.

 ¡Dame una pista!

Lo importante en este ejercicio es pensar cuál es el valor inicial de cantidad y


cuándo incrementa ese valor.

SOLUCION A CORREGIR

function cantidadDeBalancesPositivos(balancesDeUnPeriodo) {
let cantidad = ????;
for (let balance of balancesDeUnPeriodo) {
????
}
return cantidad;
}

SOLUCION MIA CON ERROR


function cantidadDeBalancesPositivos(balancesDeUnPeriodo) {
let cantidad = 3;
for (let balance of balancesDeUnPeriodo) {
5
}
return cantidad;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  cantidadDeBalancesPositivos([{ mes: noviembre, ganancia: 5 }]) es


1 Ver detalles

3 deepEqual 1

  cantidadDeBalancesPositivos([{ mes: marzo, ganancia: 8 }, { mes:


agosto, ganancia: 10 }]) es 2 Ver detalles

3 deepEqual 2

  cantidadDeBalancesPositivos([]) es 0 Ver detalles

3 deepEqual 0

  cantidadDeBalancesPositivos([[{ mes: marzo, ganancia: 0 }, { mes:


agosto, ganancia: 0 }]]) es 0 Ver detalles

3 deepEqual 0

  cantidadDeBalancesPositivos([{ mes: enero, ganancia: 10 }, { mes:


febrero, ganancia: -10 }, { mes: marzo, ganancia: 2 }, { mes: abril,
ganancia: 100 }]) es 3
  cantidadDeBalancesPositivos([{ mes: enero, ganancia: -1 }, { mes:
febrero, ganancia: -2 }, { mes: marzo, ganancia: -3 }]) es 0 Ver detalles

3 deepEqual 0

OTRA SOLUCION MIA CON ERROR


function cantidadDeBalancesPositivos(balancesDeUnPeriodo) {
let cantidad = 5;
for (let balance of balancesDeUnPeriodo) {
3
}
return cantidad;
}
Tu solución no pasó las pruebas
Resultados de las pruebas:

  cantidadDeBalancesPositivos([{ mes: noviembre, ganancia: 5 }]) es


1 Ver detalles
 5 deepEqual 1

  cantidadDeBalancesPositivos([{ mes: marzo, ganancia: 8 }, { mes:


agosto, ganancia: 10 }]) es 2 Ver detalles
 5 deepEqual 2

  cantidadDeBalancesPositivos([]) es 0 Ver detalles


  cantidadDeBalancesPositivos([[{ mes: marzo, ganancia: 0 }, { mes:
agosto, ganancia: 0 }]]) es 0 Ver detalles
 5 deepEqual 0

  cantidadDeBalancesPositivos([{ mes: enero, ganancia: 10 }, { mes:


febrero, ganancia: -10 }, { mes: marzo, ganancia: 2 }, { mes: abril,
ganancia: 100 }]) es 3 Ver detalles
 5 deepEqual 3

  cantidadDeBalancesPositivos([{ mes: enero, ganancia: -1 }, { mes:


febrero, ganancia: -2 }, { mes: marzo, ganancia: -3 }]) es 0 Ver detalles

SOLUCION DE LA CONSULTA
function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
cantidad= cantidad + 1}
}
return cantidad;
}}
Michelle L. hace 10 meses
Hola! El ejercicio me salió pero le agregue una llave al final para poder
consultar porque no me quedo muy clara la lógica. En la linea 5, cantidad
sumaria 1, por cada vez que en la linea anterior, la ganancia de cada balance
sea mayor a 0, no? Y podemos acceder a los balances gracias al for/of que
nos permite modificar o contar un solo elemento de una lista, no? Perdón
quiero estar segura porque si no lo entiendo bien no se si me saldría
aplicarlo en otro ejercicio... gracias desde ya!

Sergio Sebastian S. hace 10 meses


Hola Michelle... trato de explicarte como yo entiendo... balancesDeUnPeriodo es
un ARRAY ... que contiene Muchos balances adentro (muchas variables
dentro de una) La estructura de balancesDeUnPeriodo es que tienen una
variable llamada ganancia.. EJEMPLO
balancesDeUnPeriodo(enero).ganancia=1000
balancesDeUnPeriodo(febrero).ganancia=-1000
balancesDeUnPeriodo(marzo).ganancia=1200 ......
el loop for basicamente lo que hace es agarrar ese ARRAY y dividirlo por
cada uno... y los va mostrando uno por uno en este caso con el nombre
balance... vos dentro de las llaves { ........................} del for,accedes a este balance
individual donde podes hacer lo que quieras, en este caso, usar una variable
externa que empieza en 0 y sumar +1 cada vez que encuentre un balance
que supere el numero 0....
y luego devolves ese valor, de esa manera sabes cuantos balances hay en
positivo..
SI mas adelante vas a tener que usarlo muchas veces, y en programacion es
MUY UTIL los array y los loops

OTRA SOLUCION DE LA CONSULTA


function cantidadDeBalancesPositivos(balancesDeUnPeriodo) {
let cantidad = 0;
for (let balance of balancesDeUnPeriodo) {
cantidad = cantidad + (balance.ganancia > 0) este es el error
}
return cantidad;

function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
cantidad= cantidad + 1} esto es lo correcto
}
return cantidad;
}}

Ignacio P. hace 9 meses

Hola como estan? Le saque "{" para hacer una consulta, no termino de
comprender como funciona este codigo, sobre todo el " for (let balance of
balancesDeUnPeriodo)"... me podrian explicar?
Juan Carlos O. hace 9 meses

Hola, te dejo una explicacion que me anote de un mentor a ver si te ayuda.


Veamos, si recordas ejercicios anteriores con let lo que hacemos es declarar
una variable, como por ejemplo venimos usandolo para declarar una lista
que solo será una variable en una función, por ejemplo let
miListaDeCompras = ["arroz", "azucar", "fideos", "yerba"] . En el caso de for
hacemos algo muy similar, declaramos una variable que representa cada
elemento de una lista o registro, entonces si por ejemplo definimos : for (let
producto of miListaDeCompras) lo que hacemos es declarar la variable
producto y lo que hará for es recorrer elemento a elemento (producto a
producto) la lista miListaDeCompras, y luego entre las llaves lo que haremos
es expresar que queremos que se haga con cada elemento de la lista (es
decir con producto) al recorrerlos. Lo ideal es que cuando declaremos esa
variable sea con un nombre representativo para ubicarnos mejor, entonces si
tengo el registro balancesDeUnPeriodo se supone que cada elemento del
registro es un balance y por eso declaro la variable como balance. En este
caso:
for (let balance of balancesDeUnPeriodo){ cantidad=cantidad+
(balance.ganancia>0); } Lo que hacemos es recorrer cada balance de la lista
balancesDeUnPeriodo, y como lo que queremos es que a la variable
cantidad le sumemos cada balance que haya sido positivo, ponemos la
condición balance.ganancia>0 para que solo se sumen los balances que
cumplan con esto. ( lo copie de un mentor ojala te sirva)
Miguel Pascual M. hace 9 meses

Hola Ignacio cómo estás


Te cuento, la idea está, pero en esta instrucción

cantidad = cantidad + (balance.ganancia > 0)

estás sumando a "cantidad", un booleano, un valor de verdadero o


falso. Cantidad es un entero, positivo, y la expresión (balance.ganancia
> 0) te entrega "true" o "false". Claramente no se pueden sumar.
Tendrías que generar un condicional para que, si la ganancia es positiva,
se aumente en 1 el contador (SERIA ESTO if(balance.ganancia > 0){
cantidad= cantidad + 1}
Probalo, cualquier cosa si no funciona o no lo entendés respondé por este
mismo hilo y te ayudamos. Suerte, saludos!

OTRA SOLUCION DE LA CONSULTA


function cantidadDeBalancesPositivos(balancesDeUnPeriodo) {
let cantidad = 0 ;
for (let balance of balancesDeUnPeriodo) { if (balance.ganancia > 0) cantidad
= cantidad + 1

}
return cantidad;
}
?
Amilcar Daniel F. hace 17 días
El ejercicio los "resolví" copiando y pegando de algunas respuestas, y con la
ayuda de alguien que programa en EXCEL, pero NO USANDO /
ENTENDIENDO la lógica, lo cual ya en el ejercicio 5 y ejer. 6 me impide
progresar debido a NO ENTIENDO LA LOGICA. Asumiendo que usamos lo
que vamos aprendiendo en los ejercicios anteriores:
En los anteriores ejercicios se definió que:
(EJERCICIO 4) gananciaTotal([ { mes: "enero", ganancia: 2 }, { mes: "febrero",
ganancia: 10 }, { mes: "marzo", ganancia: -20 } ])
(EJERCICIO 5) Y es este ejercicio aparece "balance.ganancia" (lo puse en
mayúsculas para que se vea, no así en el ejercicio RESUELTO) cuando
entiendo que debería ser "gananciaTotal.ganancia":
function cantidadDeBalancesPositivos(balancesDeUnPeriodo) { let cantidad =
0 ; for (let balance of balancesDeUnPeriodo) { if BALANCE.GANANCIA > 0)
cantidad = cantidad + 1
} return cantidad; }
¿Hay algún vídeo o algún tutor que me ayude a razonar este ejercicio en
vistas de los próximos? ¡Desde ya muchas gracias!
Diana L.  MENTORÍA  hace 16 días

¡Hola Amilcar! ¿Cómo estás?


Algo que tenemos que destacar, es que esto:

gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 10 },
{ mes: "marzo", ganancia: -20 }
])

Es una invocación de la función gananciaTotal, es decir que estamos usando


la función gananciaTotal con una lista concreta de balances, como lo es:

[
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 10 },
{ mes: "marzo", ganancia: -20 }
]

Fijate que tenemos varios balances separados por comas, dentro de


corchetes (así definimos una lista). Esta función nos está retornando el valor
total de las ganancias, es decir que suma todas las ganancias y nos
devuelve un solo número.
Por el otro lado, en este ejercicio queremos balance por balance fijarnos si
la ganancia es mayor a 0, no podemos usar la función gananciaTotal porque no
nos permite justamente iterar por cada balance.
Para complementar, esta bueno que entendamos cómo funciona el for, para
esto te dejo esta consulta, que si bien es de un ejercicio más adelantado, te
puede servir para entender el funcionamiento del for.

EJERCICIO 13 LOS MEJORES MESES DEL AÑO


SOLUCION (PARA APRENDER COMO FUNCIONA EL FOR)
function meses (listaDeRegistros){
let meses = [];
for (let registro of listaDeRegistros) {
agregar(meses, registro.mes)
}
return meses
}
function afortunados (listaDeRegistros) {
let afortunados = [];
for (let registro of listaDeRegistros) {
if (registro.ganancia > 1000) {
agregar (afortunados, registro)
}
}
return afortunados
}
function mesesAfortunados(listaDeRegistros){
return meses(afortunados(listaDeRegistros));}
Matías G. hace 18 días
Buenas tardes; Necesito ayuda para poder comprender, No logro entender de donde toma
la información tanto de "listaDeRegistros" como de "registro"; siendo parámetros que
nunca definí.
Podrían ayudarme?

Ana C. hace 18 días


Creo que es lo que hace el comando for. For...of nos permite visitar y hacer algo con cada
elemento de una lista en este caso (listaDeRegistros) for (let registro of listaDeRegistros) en
este caso, estaremos visitando cada registro de listaDeRegistros
ambos nombres los pones vos, pero se entiende que la palabra que pones al lado de let es
la unidad de la lista(que esta entre parentesis y repetis luego del of)
Matías G. hace 18 días
Entiendo entonces que "registro" serían: 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"]
cada uno de esos?
Pero, "listaDeRegistros" no la definí en ningún momento, como se estarían enlazando con
esos datos?

Guillermo Ignacio B.  MENTORÍA  hace 17 días


¡Hola Matías! Recordá que justamente al definir, por ejemplo, function meses
(listaDeRegistros), se está definiendo listaDeRegistros como un parámetro de la función, es
decir, al hacer esto estás definiendo este parámetro. Luego, cuando se ejecuta el código
(lo cual lo hace la plataforma) este parámetro se reemplaza por el argumento en cuestión,
que en este caso es del estilo que mostrás en el ejemplo, es decir, una lista de registros.
Resumiendo, un parámetro se define al definir la función (o el procedimiento), y un
argumento es el valor que va a reemplazar a este parámetro cuando se ejecuta la función.
Espero haberme explicado bien, pero si seguís con dudas lo seguimos viendo.

Matías G. hace 17 días


Gracias Guillermo, hasta ahí entiendo...
Pero como se cruza la información del parámetro "listaDeRegistros" con el contenido de
las listas definidas anteriormente? O que información contiene o debo darle a
"listaDeRegistros"?

Diana L. MENTORÍA hace 17 días


¡Hola Matías! ¿Cómo te va?
Si recordamos en Gobstones, cuando aprendimos sobre los parámetros habíamos dicho
que estos eran como un "agujero" que no iba a tener un valor hasta el momento en el que
lo invocábamos. Por ejemplo si teníamos:

procedure PonerYMover(color, direccion){


Poner(color)
Mover(direccion)
}

Nuestros parámetros color y direccion no tenían ningún valor, pero cuando


invocábamos el procedimiento con argumentos :

PonerYMover(Rojo, Este)

La computadora reemplazaba color por Rojo y direccion por Este, es decir que
llenaba esos "agujeros" con valores concretos, y ejecutaba entonces:

Poner(Rojo)
Mover(Este)

En JavaScript sucede exactamente lo mismo, al momento de definir el


parámetro listaDeRegistros, como mencionó Guillermo, estamos dejando el "agujero", un
espacio en blanco que solamente se completará al momento usar la función con un
argumento. Con esto dicho, podemos usar cualquier lista de registros que se nos ocurra,
¡podemos inventar una si queremos! Siempre y cuando respete la sintaxis de los balances
(dado que estamos trabajando con balances). Sabemos que los registros de balances, por
lo que nos muestra el enunciado, tienen dos campos: mes y ganancia, podemos crear
un registro como:

{mes: "febrero", ganancia: 9999}

Y de la misma forma, podríamos crear una lista de registros inventados, respetando esa
sintaxis:

[{mes: "febrero", ganancia: 9999}, {mes: "marzo", ganancia: 159}, {mes: "diciembre",
ganancia: 444}]

Esta lista, o cualquier otra que inventemos, ¡puede ser usada en nuestras funciones! Así
como usabamos el procedimiento dandole los valores concretos como Rojo o Este,
podemos darle a nuestra función un valor concreto como la lista que vimos recién (que no
definimos en ningún lugar):

meses([{mes: "febrero", ganancia: 9999}, {mes: "marzo", ganancia: 159}, {mes:


"diciembre", ganancia: 444}])

Ahora el "agujero" que era listaDeRegistros, se llenará con la lista que


acabamos de darle, ejecutando entonces:

//estamos simulando lo que ejecutaría la computadora


function meses ([{mes: "febrero", ganancia: 9999}, {mes: "marzo", ganancia: 159}, {mes:
"diciembre", ganancia: 444}]){
let meses = [];
for (let registro of [{mes: "febrero", ganancia: 9999}, {mes: "marzo", ganancia: 159},
{mes: "diciembre", ganancia: 444}]) {
agregar(meses, registro.mes) } return meses }

¿Y ahora cómo sabe qué es registro? Ahí viene la magia del for, cuando
hacemos for(let nombre of lista), estamos definiendo una variable (nombre) que
nos permitirá iterar por cada elemento de la lista lista, que en este caso es
nuestra lista inventada de registros. ¿Cómo lo hace? Por cada elemento de
la lista, el for ejecutará reemplazando en cada lugar que diga registro (que es
el nombre que le dimos) por el elemento. Sigamos viendo qué se ejecutaría
con el ejemplo anterior. La primera vez, el for tomará el primer elemento:
{mes: "febrero", ganancia: 9999} que es un registro. Reemplaza entonces en cada
lugar que diga registro por {mes: "febrero", ganancia: 9999} y ejecuta:

agregar(meses, {mes: "febrero", ganancia: 9999}.mes)

Como el mes es "febrero", agrega a la lista meses el valor "febrero". ¡Terminó el


primer elemento! Sigue entonces con el siguiente: {mes: "marzo", ganancia: 159}.
Hace exactamente lo mismo que antes, ejecuta pero reemplazando registro
por el nuevo elemento: {mes: "marzo", ganancia: 159}:

agregar(meses, {mes: "marzo", ganancia: 159}.mes)

Agregando entonces a la lista de meses el valor "marzo". Sigue con el siguiente,


y último, elemento: {mes: "diciembre", ganancia: 444} y ejecuta:

agregar(meses, {mes: "diciembre", ganancia: 444}.mes)

Agregando entonces a la lista de meses el valor "diciembre". ¡Y listo! Termino de


ejecutar con todos los elementos de la lista de registros, por lo que termina
de ejecutar el for y finalmente retorna la lista de meses.
¿Se ve cómo funciona el for y la lista?

SOLUCION CORRECTA
function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
cantidad= cantidad + 1}
}
return cantidad;
}
¡Muy bien! Tu solución pasó todas las pruebas

cantidad es lo que en programación se conoce como contador, una variable


que se incrementa cada vez que hacemos algo dentro de un for...of o solo
aquellas veces que se cumpla una condición (como en este caso ).

Ejercicio 6: La ganancia promedio


Pasemos al siguiente requerimiento de Ana. Ya podemos calcular una
sumatoria de ganancias y también crear contadores, ahora vamos a calcular
promedios. 

Ana quisiera saber dado un conjunto cualquiera de balances cuál es


su gananciaPromedio.

gananciaPromedio([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
9

 ¡Dame una pista!

¿Qué es un promedio?  Veámoslo con un ejemplo:

En un grupo de 3 personas, Felipe de 3, Delfina de 8 y Eli de 10 años, la edad


promedio es de 7 años. Porque 3 + 8 + 10 es igual a 21, dividido la cantidad
de gente en el grupo (3 personas) da 7.

Para esto contás con las funciones gananciaTotal y longitud. 

SOLUCION MIA CON ERROR


function gananciaPromedio(gananciaTotal) {
if gananciaPromedio = gananciaTotal/sumatoria.ganancia;
return gananciaPromedio;
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:2
if gananciaPromedio = gananciaTotal/sumatoria.ganancia;
^^^^^^^^^^^^^^^^

SyntaxError: Unexpected identifier


SOLUCION DE LA CONSULTA CON ERROR
function gananciaPromedio(balancesDeUnPeriodo) {
return (gananciaTotal(balancesDeUnPeriodo ) /
longitud(balancesDeUnPeriodo))
}}
Catalina M. hace 9 meses
El ejercicio pude resolverlo, le puse una llave de mas al final para poder
consultarles. No me queda claro en este ejercicio como funciona longitud,
exactamente que mide? Cuantos conceptos hay en balancesDeUnPeriodo?

Agustín Federico S. hace 9 meses


longitud() mide la cantidad de elementos que contiene una lista

Diana L.  MENTORÍA  hace 9 meses


¡Buenas otra vez Catalina! 😊
 Veamos primero que representa balancesDeUnPeriodo, habíamos visto en
ejercicios anteriores que un balance era un registro que tenía dos
campos: mes y ganancia, por ejemplo:

let unBalance = { mes: "julio", ganancia: 50 }

 Con eso en mente, al igual que nosotros podiamos tener una lista de
strings, por ejemplo:

let unaLista = ["hola", "soy", "una", "lista"]

Podemos también tener una lista de balances, en donde cada elemento es


un registro como unBalance que usamos antes de ejemplo, veamos como
sería:

let balancesDeUnPeriodo = [{ mes: "julio", ganancia: 50 }, { mes: "agosto", ganancia:


500 }, { mes: "enero", ganancia: 85 }]
Escrito de otra forma para que sea más simple la lectura:

let balancesDeUnPeriodo = [
{ mes: "julio", ganancia: 50 },
{ mes: "agosto", ganancia: 500 },
{ mes: "enero", ganancia: 85 }
]

Fijate que seguimos separando los elementos con comas, pero ahora los
elementos son registros.

 longitud habíamos visto que servía para contar la cantidad de letras de


una palabra, esta función hace lo mismo con las listas: cuenta la
cantidad de elementos. Si tenemos una lista [1,2,3], que tiene 3
elementos, y hacemos:

longitud([1,2,3])

Nos va a retornar 3, ya que la longitud de la lista (la cantidad de elementos)


es 3. Si lo probamos con nuestro ejemplo de balances de un periodo:

longitud(balancesDeUnPeriodo)
=> 3

También nos retorna 3, porque si te fijás declaramos la lista (que es un


ejemplo, no es la misma del ejercicio) con 3 elementos: - Elemento 1: { mes:
"julio", ganancia: 50 } - Elemento 2: { mes: "agosto", ganancia: 500 } -
Elemento 3: { mes: "enero", ganancia: 85 }

 Con esto, si sabemos que gananciaTotal nos da el total de las ganancias


de la lista (en este caso con nuestro ejemplo sería: 50+500+85 = 635),
y longitud nos da la cantidad de elementos (3 como vimos), y sabemos
que un promedio se calcula como la suma de todo dividido la
cantidad, podemos decir que podemos calcular el promedio como la
división de gananciaTotal por longitud (sería 635/3=211 en este ejemplo).
OTRA SOLUCION DE LA CONSULTA
function gananciaPromedio(balancesDeUnPeriodo) {
let sumatoria=0;
for (let balance of balancesDeUnPeriodo) {
sumatoria=sumatoria+gananciaTotal(balancesDeUnPeriodo);
sumatoria=gananciaTotal(balancesDeUnPeriodo)/
longitud(balancesDeUnPeriodo);
}
return sumatoria;

function gananciaPromedio(balancesDeUnPeriodo) {
let sumatoria=0;
{
sumatoria=gananciaTotal(balancesDeUnPeriodo)/
longitud(balancesDeUnPeriodo);
}
return sumatoria;}

Micaela Analía B. hace 4 meses


hola, saqué "}" para preguntar. Por qué despues del "for...of" no se puede
escribir todo junto, de la siguiente manera?:
sumatoria=sumatoria+gananciaTotal(balanceDeUnPeriodo)/longitud(balanc
eDeUnPeriodo).   Por otro lado, no me queda claro qué son las "sumatorias",
qué función cumplen y por qué siempre es igual a "0"?.

Catalina F.  MENTORÍA  hace 4 meses


¡Hola Micaela!
Voy a responderte las consultas de atrás para adelante :)
La sumatoria es siempre 0 en un principio, porque en esa intancia aún no le
sumamos nada. Para hacer un promedio de un balance (o de cualquier
cosa), necesitamos sí o sí la suma de todos los balances y cuántos son,
porque la cuenta que haremos será ganancias/cantidad. La única forma de
obtener la cantidad es haciendo una sumatoria (o cantidad, podés ponerle el
nombre que quieras). Para sumar balances en sumatoria tenemos que hacerlo
uno por uno, por eso siempre le sumamos 1, y siempre empieza en 0. Si
empezara en 4 o cualquier otro número no nos daría la cantidad correcta de
balances para hacer el promedio.
Sabiendo esto, no podemos hacer
sumatoria=sumatoria+gananciaTotal(balanceDeUnPeriodo)/longitud(balanceDeUnPeriodo) ,
porque la sumatoria y el promedio son dos cosas distintas :) . Lo que sí
podemos hacer, que vos estás sugiriendo y está muy bueno, es retornar
directamente gananciaTotal(balancesDeUnPeriodo) / longitud(balanceDeUnPeriodo) .
Pero, en ese caso, no deberíamos hacer la variable sumatoria, ni el for.
Directamente retornaríamos esa expresión.

SOLUCION CORRECTA
function gananciaPromedio(balancesDeUnPeriodo) {
let sumatoria=0;
{
sumatoria=gananciaTotal(balancesDeUnPeriodo)/
longitud(balancesDeUnPeriodo);
}
return sumatoria;}
 ¡Muy bien! Tu solución pasó todas las pruebas

OTRA SOLUCION CORRECTA


function gananciaPromedio(balancesDeUnPeriodo) {
let sumatoria=0;
for (let balance of balancesDeUnPeriodo) {
sumatoria=sumatoria+gananciaTotal(balancesDeUnPeriodo);
sumatoria=gananciaTotal(balancesDeUnPeriodo)/
longitud(balancesDeUnPeriodo);
}
return sumatoria;
}
¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
 gananciaPromedio
=> <function>
  gananciaPromedio([ {mes: "marzo", ganancia: 8}, {mes: "agosto", ganan
cia: 10}])
=> 9
  gananciaPromedio([ {mes: "marzo", ganancia: 8}, {mes: "agosto", ganan
cia: 10}])
=> 9
Ejercicio 7: Quién gana, quién pierde
Viendo que podemos hacer todo lo que nos pide, Ana quiere saber la
ganancia promedio de los balances positivos. 

Definí las funciones:

 gananciaPositiva, que es la suma de las ganancias de los balances positivos


 promedioGananciasPositivas invocando gananciaPositiva y cantidadDeBalanc
esPositivos
  ¡Dame una pista!

 gananciaPositiva es muy similar a cantidadDeBalancesPositivos, solo que


ahora necesitas una sumatoria en vez de un contador. 

 En la Biblioteca vas a encontrar cantidadDeBalancesPositivos para ayudarte


a resolver este ejercicio. Tené en cuenta que va a estar tal y como vos
la definiste, por lo que si tiene errores, pueden impactar en tu solución
actual. 

BIBLIOTECA
function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
cantidad= cantidad + 1}
}
return cantidad;
}
SOLUCION MIA CON ERROR
function gananciaPositiva (balancesDeUnPeriodo){
let sumatoria = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
sumatoria= sumatoria + 1}
}
return sumatoria;
}
function promedioGananciasPositivas (gananciaPositiva){
if gananciaPositiva = cantidadDeBalancesPositivos / sumatoria
}
return gananciaPositiva;
}
Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:11
if gananciaPositiva = cantidadDeBalancesPositivos / sumatoria
^^^^^^^^^^^^^^^^

SyntaxError: Unexpected identifier

SOLUCION DE LA CONSULTA CON ERROR


function gananciaPositiva(balancesDeUnPeriodo) {
let sumatoria = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
sumatoria = sumatoria + (balance.ganancia);
}
return sumatoria
}
}
function promedioGananciasPositivas(balancesDeUnPeriodo) {
return gananciaPositiva(balancesDeUnPeriodo) /
cantidadDeBalancesPositivos(balancesDeUnPeriodo);
}
Mauro A. hace 11 meses
Buenas tardes, cuando en la línea 2 pongo "sumatoria = 2" el ejercicio me
termina dando bien, pero tengo entendido que debería ser 0, no estaría
encontrando el error.

Lara F.  MENTORÍA  hace 11 meses


¡Hola, Mauro! El código está perfecto y como decis, la sumatoria debe ser
igual a 0. Está fallando por la ubicación de las llaves de cierre, que deberían
quedar de esta forma:

}
}
return sumatoria;
}

De esta forma se cierran correctamente el for y el if para que luego pueda


retornar la sumatoria. Si sigue habiendo algún error luego de que
modifiques esto comentanos el código que intentaste y lo vemos, ¡suerte!

OTRA CONSULTA CON ERROR SOLUCIONADA


function gananciaPositiva(balancesDeUnPeriodo){
let sumatoria=0
for(let balance of balancesDeUnPeriodo){
if (balance.ganancia>0){
return sumatoria = sumatoria + balance.ganancia
}
}
return sumatoria
}

function promedioGananciasPositivas(balancesDeUnPeriodo){
return
gananciaPositiva(balancesDeUnPeriodo)/cantidadDeBalancesPositivos(balanc
esDeUnPeriodo)
}
Ignacio Z. hace 10 meses
Hola, que tal? Vengo observando las dudas de mis compañeros, que casi
siempre son las mismas que las que tengo yo, afortunadamente, y las
respuestas son muy buenas. Aun asi , estos ultimos ejercicios de este
capitulo me vienen costando mucho y vengo consultando las dudas casi a
diario para poder resolver cada uno, y eso no se si esta muy bueno. En este
caso fui construyendo el codigo a partir de lo que observe sobre las dudas
de mis compañeros, pero aun así, no se me ocurre mas nada para mejorarlo
o arreglarlo y me sigue tirando error. Si alguien me puede dar una mano les
agradeceria mucho. Saludos.

Juan Carlos O. hace 10 meses


Fijate el return que pusiste en la linea 5, esta demas .

Juan Carlos O. hace 10 meses


mira el ejercicio 5 que es parecido

Mayra M. hace 10 meses


¡Hola Ignacio! ¿Como estás? Como bien dice Juan el conflicto está en el
return de la lina 5, sacandolo funcionaria perfecto. Sin embargo, me gustaria
que profundicemos un poco en el ejercicio a ver si puedo ayudarte a
entender lo que hace y porque. En gananciaPositiva(balancesDeUnPeriodo) tenes
declarada una variable que empieza en 0 -> let sumatoria = 0. Lo que queremos
hacer con esta variable es ir incrementando su valor sumandole el valor de
las ganancias positivas de un periodo. El problema está en que por
parametro nos llega una una lista de balances y lo que necesitamos son las
ganancias de esos balances para poder preguntar si las sumamos o
no(depende de que sean o no positivas). Acá entra en juego el for(let balance of
balancesDeUnPeriodo)que lo que hace es "decir" por cada balance de balances
de un periodo quiero que.... Y ahi hacemos la pregunta if (balance.ganancia >
0), de nuevo, queremos saber si la ganancia es positiva, y ¿Como accedemos
a la ganancia? Bueno.. como estamos dentro del for, sabemos que podemos
preguntarle cosas a cada balance de los balances, asi que podemos hacer
balance.ganancia, si este valor es positivo, lo queremos sumar a la variable que
declaramos al principio, sumatoria = sumatoria + balance.ganancia. Sino, no hacemos
nada. Finalmente sabemos que toda la suma de las ganancias de los
balances del periodo las tenemos en la variable sumatoria, es por eso que
vamos a querer retornar esta variable. Por último declaramos
promedioGananciasPositivas((balancesDeUnPeriodo) que lo que nos pide es sacar el
promedio de las ganancias positivas, por suerte ya declaramos
anteriormente la suma de las mismas y también sabemos la cantidad asi que
solo queda dividir la primera por la segunda.
SOLUCION CORRECTA
function gananciaPositiva(balancesDeUnPeriodo) {
let sumatoria = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
sumatoria = sumatoria + (balance.ganancia);
}
}
return sumatoria

}
function promedioGananciasPositivas(balancesDeUnPeriodo) {
return gananciaPositiva(balancesDeUnPeriodo) /
cantidadDeBalancesPositivos(balancesDeUnPeriodo);
}
 ¡Muy bien! Tu solución pasó todas las pruebas

Como podés ver todos los promedios se basan en el mismo principio .


Sumar una cantidad determinada elementos y dividir el resultado por esa
cantidad. Si quisiéramos realizar una función promedio genérica sería algo
así:

function promedio(listaDeNumeros) {
return sumatoria(listaDeNumeros) / longitud(listaDeNumeros);
}

function sumatoria(listaDeNumeros) {
let sumatoria = 0;
for (let numero of listaDeNumeros) {
sumatoria = sumatoria + numero;
}
return sumatoria;
}

¡Pero nosotros no tenemos una lista de números sino de registros!  ¿Y


entonces? 
CONSOLA
promedioGananciasPositivas([ {mes: "marzo", ganancia: 8}, {mes: "novie
mbre", ganancia: 10}, {mes: "febrero", ganancia: 10}])
=> 9.333333333333334
Ejercicio 8: Soy el mapa, soy el mapa
Lamentablemente no se puede usar la función promedio con nuestra lista de
registros . Lo que necesitamos es una lista que tenga solo las ganancias de
cada balance. Para ello debemos transformar, o mapear, cada elemento de la
lista.

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]

 ¡Dame una pista!

¿Quizá necesites agregar ganancias a una lista? ¿Te acordas de agregar? 

SOLUCION MIA CON ERROR

function ganancias(balancesDeUnPeriodo) {
let ganancias = [ ];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.mes)
}
return ganancias;
}
Tu solución no pasó las pruebas MI ERROR ES QUE PUSE MES EN VEZ DE GANANCIA
Resultados de las pruebas:

  ganancias de los balances de un trimestre retorna una lista con 3


ganancias Ver detalles
 [ 'marzo', 'agosto', 'septiembre' ] deepEqual [ 10, 2, 0 ]
  ganancias de los balances de un cuatrimestre retorna una lista con 4
ganancias Ver detalles

[ 'marzo', 'junio', 'agosto', 'noviembre' ] deepEqual [ 8, 3, 10, 5 ]

SOLUCION DE LA CONSULTA CON ERROR

function ganancias(balancesDeUnPeriodo) {
let ganancias = [ ];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias,balance.ganancia)
}
return ganancias; }

Mariana F. hace 19 días


Hola a todos! este ejercicio lo pude hacer pero tengo algunas dudas acerca
de la sintaxis del "for ...of" no entiendo bien su funcionamiento- por ejemplo:
en los ej que hemos realizado la sintaxis es for(let balance of
balancesDeUnPeriodo) puntualmente no entiendo el "let balance" por qué se
le da el nombre de balance? que funcion cumple esa palabra en la linea de
codigo? Entiendo que el "balancesDeUnPeriodo" hace referencia a la lista
que contiene todos los balances con sus respectivos registros pero me
cuesta entender la linea de codigo for(let balance of....).- Alguien me podria
desmenuzar esa linea y explicarme el significado de cada uno de los
elementos que lo componen? Espero se entienda mi consulta! Muchas
gracias de antemano

Ana C. hace 19 días


For...of nos permite visitar y hacer algo con cada elemento de una lista en
este caso (balancesDeUnPeriodo) for (let balance of balancesDeUnPeriodo)
en este caso, estaremos visitando cada registro de balancesDeUnPeriodo .
ambos nombres los pones vos, pero se entiende que la palabra que pones al
lado de let es la unidad de la lista(que esta entre parentesis y repetis luego
del of) . Que por cada balance que haya en balancesDeUnPeriodo haga algo.
Este algo que hay que hacer es, en este caso, que agregues en la lista
ganancias el valor de la propiedad ganancia de ese balance. . agregar toma
como 1er argumento una lista donde querés agregar algo y como 2do
argumento ese algo que querés agregar. . Para acceder al valor de la
propiedad 'ganancia' de un 'balance' podés hacerlo con balance.ganancia y
precisamente la ganancia de cada balance es lo que necesitás agregar a la
lista. .

Mariana F. hace 18 días


Excelente! muy clara tu explicacion, te agradezco mucho.- Interpreto las
consignas que se solicitan pero a veces me cuesta volcarlas al lenguaje!
Muchas gracias, me quedó muy claro

Ana C. hace 18 días


Te digo que para entenderlo mejor a veces tenes que buscar las consultas
sobre el mismo tema que tenga mas validaciones, y quizas guardarte
algunas que te sean utiles en un archivo aparte para ir entendiendo mejor
algunos conceptos. Me alegro que te haya servido!

SOLUCION CORRECTA

function ganancias(balancesDeUnPeriodo) {
let ganancias = [ ];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia)
}
return ganancias;
}
¡Muy bien! Tu solución pasó todas las pruebas

¡Excelente!  Ahora ya sabemos cómo transformar cada elemento de una lista


para obtener una lista nueva . De esta manera podemos usar promedio con
nuestra lista de balances. Pero, ¿se puede utilizar la función promedio solo
para los balances positivos? 

CONSOLA
ganancias([{ mes: "enero", ganancia: 40}, {mes: "febrero", ga
nancia: 12}, {mes: "marzo", ganancia: 8}])
=> [40,12,8]
Ejercicio 9: A filtrar, a filtrar cada cosa en
su lugar
Con la programación se puede hacer cualquier cosa, o casi . Ya hicimos una
función para poder saber la cantidad de balances positivos
(cantidadDeBalancesPositivos), ahora vamos a ver cómo podemos hacer
para saber cuáles son esos balances. 

Completá la función balancesPositivos que toma los balances de un período


y devuelve una lista con aquellos cuya ganancia fue mayor a cero.

 ¡Dame una pista!

balances es una lista que contiene justamente eso, balances . Pero no


todos, tienen que cumplir una condición.

SOLUCION MIA CON ERROR

function balancesPositivos(balancesDeUnPeriodo) {
let balances = [];
for (let balance of balancesDeUnPeriodo) {
if (balance.periodo > 0)
}
return balances;
}
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:5
}
^

SyntaxError: Unexpected token }


Solución de la consulta con error

function balancesPositivos(balancesDeUnPeriodo) {
let balances = [ ];

for (let balance of balancesDeUnPeriodo) {


if(balance.ganancia>0){

agregar(balances,"mes: " + balance.mes + ", ganancia: " +balance.ganancia );


}
}
return balances;
}
Ariel M. hace 11 meses
No puedo encontrar el error!! Nose si hace falta poner otro (agregar) mas,
uno para el mes y otro para la ganancia. Porque intente de varias formas y
no le encuentro la vuelta.Gracias.

Hernan A. hace 11 meses


¿Probaste con 'agregar' directamente el 'balance' (sin desmenuzar el mes y la
ganancia) a la lista 'balances'? Así como lo estás haciendo la lista 'balances'
se está llenando con strings en vez de registros. Exitos 👍

Martin G.  MENTORÍA  hace 11 meses


¡Hola Ariel!
El problema está en agregar agregar(balances,"mes: " + balance.mes + ", ganancia: "
+balance.ganancia );, acordate que nosotros vamos a agregar a la lista balances un
balance cuando la ganancia de este es mayor a 0. Ahora mismo, vos estas
agregando la ganancia de un balance a la lista y strings inecesarios, cuando
en realidad solo tendrias que agregar balance solo.
if (balance.ganancia>0){
agregar (balances, balance)
}
}

El siguiente codigo se leeria asi: si la ganancia de un balance es mayor a 0, voy a


agregar ese balance a la lista balances, y nada más.
¡Suerte!

Ariel M. hace 11 meses


Muchas Gracias!! Me funciono de esta forma! if (balance.ganancia>0)
{ agregar (balances, balance) } }

SOLUCION CORRECTA

function balancesPositivos(balancesDeUnPeriodo) {
let balances = [ ];

for (let balance of balancesDeUnPeriodo) {


if(balance.ganancia>0){

agregar(balances, balance);
}
}
return balances;
}
 ¡Muy bien! Tu solución pasó todas las pruebas

¡Muy bien!  Ahora ya sabemos cómo filtrar una lista. En criollo, aprendimos a


obtener los elementos de una lista que cumplen una condición determinada.
En este caso obtuvimos una nueva lista con los balances que presentaban
una ganancia positiva. 

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

Definí la función gananciasDeBalancesPositivos y luego usala junto


a promedio para definir promedioDeBalancesPositivos.
 ¡Dame una pista!

Para poder tener la lista que recibe por parámetro promedio vas a tener que
definir gananciasDeBalancesPositivos. Esta función primero filtra los balances
positivos y luego los mapea a ganancias. Recordá que función hace cada una
de estas cosas. 

En la Biblioteca vas a encontrar algunas de las funciones de ejercicios


anteriores para ayudarte a resolver este ejercicio. Tené en cuenta que van a
estar tal y como vos las definiste, por lo que si tienen errores, pueden
impactar en tu solución actual. 

BIBLIOTECA
function ganancias(balancesDeUnPeriodo) {
let ganancias = [ ];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia)
}
return ganancias;
}

function balancesPositivos(balancesDeUnPeriodo) {
let balances = [ ];

for (let balance of balancesDeUnPeriodo) {


if(balance.ganancia>0){

agregar(balances, balance);
}
}
return balances;
}

function promedio(listaDeNumeros) {
return sumatoria(listaDeNumeros) / longitud(listaDeNumeros);
}

function sumatoria(listaDeNumeros) {
let sumatoria = 0;
for (let numero of listaDeNumeros) {
sumatoria = sumatoria + numero;
}
return sumatoria;
}

SOLUCION MIA CON ERROR


function gananciasDeBalancesPositivos(balancesDeUnPeriodo) {
let sumatoria = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
sumatoria = sumatoria + (balance.ganancia);
}
}
return sumatoria
}
function promedioGananciasPositivas(balancesDeUnPeriodo) {
return gananciaPositiva(balancesDeUnPeriodo) /
cantidadDeBalancesPositivos(balancesDeUnPeriodo);
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:

  promedioDeBalancesPositivos debe utilizar promedio
  gananciasDeBalancesPositivos debe utilizar ganancias
  gananciasDeBalancesPositivos debe utilizar balancesPositivos
  La solución parece tener un error de tipeo: debe usar ganancias, pero
usa ganancia. ¿Quizás quisiste decir ganancias?

Problemas que encontramos:

 parece que estás usando promedioDeBalancesPositivos pero no está


definido. ¿Puede que hayas escrito mal su nombre o tengas que
definirlo?

 Detalles
Resultados de las pruebas:

  gananciasDeBalancesPositivos devuelve todas las ganancias si todas


son mayores a cero Ver detalles
 17 deepEqual [ 10, 2, 5 ]

  gananciasDeBalancesPositivos devuelve solo las ganancias que son


mayores a cero Ver detalles
 10 deepEqual [ 10 ]
  gananciasDeBalancesPositivos devuelve una lista vacía si ninguna
ganancia es mayor a 0 Ver detalles
  promedioDeBalancesPositivos devuelve el promedio de todas las
ganancias que son mayores a cero Ver detalles

CONSULTA CON ERROR

function gananciasDeBalancesPositivos(balancesDeUnPeriodo){
return ganancias( balancesPositivos(balancesDeUnPeriodo));
}
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
let promedio = [ ]
for(let ganancias of gananciaPositivos){
promedio(gananciaPositivos)
}
return ganancias
}

Alberto Jose M. hace 10 meses


Hola, no logro cumplir el ultimo requisito, podrian ayudarme con mi funcion,
gracias por el apoyo

Guillermo Ignacio B.  MENTORÍA  hace 10 meses


¡Hola Alberto! Antes que nada, la primera función está bien, así que miremos
la segunda.
 En primer lugar lo que recibe la función es, al igual que en la primera,
una lista de balances, por lo que debería llamarse igual al parámetro
de la primera función para que quede claro y sea consistente (es decir,
balancesDeUnPeriodo). No recibe ganancia positivas, sino la lista
completa de balances.
 Fijate que en la Biblioteca ya hay una función para calcular el
promedio, por lo que no hay que hacer una lista, sino directamente
usar la función promedio.
 Al igual que en la primera función la idea acá es que uses la función
promedio en el resultado de aplicar gananciasDeBalancesPositivos
sobre balancesDeUnPeriodo. Acordate que si tenés dos funciones,
funcion1 y funcion2, y una lista, balances, para usar la funcion1 en el
resultado de aplicar la funcion2 sobre balances tenés que hacer:
funcion1(funcion2(balances))

OTRA SOLUCION CON ERROR


function gananciasDeBalancesPositivos(balancesDeUnPeriodo)
{
return ganancias(balancesPositivos(balancesDeUnPeriodo));
}
function
promedioDeBalancesPositivos(gananciasDeBalancesPositivos(balancesDeUnP
eriodo))
{
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
Juan Carlos S. hace 13 días
Hola, la primera función está bien y según entiendo, me devuelve una lista
de números, no una lista de balances. De manera que el resultado de la
primera función, se lo aplico a la segunda, pero no anda y no entiendo por
qué. Gracias.

Martin G.  MENTORÍA  hace 12 días


¡Hola Juan!
El detalle está en el parámetro de la segunda función
(promedioDeBalancesPositivos), estás pasando una función como parámetro,
cuando en realidad necesitamos los balances de un periodo.

function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(......));

Juan Carlos S. hace 12 días


Claro, yo le paso la función como parámetro, pero lo que yo quiero tomar es
el resultado de esa función, al igual que lo hago en la línea 3. Por ejemplo. Si
yo escribiera: function promedioDeBalancesPositivos(balancesDeUnPeriodo)
le estaría pasando mi balance en crudo, sin que esté afectado por la primera
función que escribí, no?

Martin G.  MENTORÍA  hace 12 días


¡Hola Juan!
Al pasar la función como parámetro va a generar error de sintaxis en todos
los casos que lo intentemos, lo podemos ver en el resultado del ejercicio:
solucion.js:6
function promedioDeBalancesPositivos(gananciasDeBalancesPositivos(balancesDeUnPeriodo))
^

SyntaxError: Unexpected token (

Respondiendo a tu pregunta:
Si, en promedioDeBalancesPositivos al pasarle por parámetro a balancesDeUnPeriodo
estaríamos pasando una lista que no esta afectada por la función que
creamos anteriormente, pero no hay problema ya que dentro de
promedioDeBalancesPositivos vamos a utilizar nuestra nueva función
gananciasDeBalancesPositivos la cual va a modificar a balancesDeUnPeriodo y nos va
a devolver la ganancia de los balances positivos. Y luego utilizamos a
promedio para devolver el promedio de ganancia de los balances positivos.
Por ejemplo:

//Creamos nuestra función que recibe la lista balancesDeUnPeriodo


function promedioDeBalancesPositivos(balancesDeUnPeriodo)
{
//Vamos a retornar el promedio (promedio()) de la ganancia de los balances positivos
(gananciasDeBalancesPositivos()) de la lista balance que recibimos como parámetro
(balancesDeUnPeriodo)
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}

SOLUCION CORRECTA
function gananciasDeBalancesPositivos(balancesDeUnPeriodo)
{
return ganancias(balancesPositivos(balancesDeUnPeriodo));
}

function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
promedio([ {mes: "enero", ganancia: 40}, {mes: "febrero", ganancia: 12
}, {mes: "marzo", ganancia: 8}])
=> null ESTO ESTA MAL
VA ESTO EN LA CONSOLA
 promedioDeBalancesPositivos([ {mes: "enero", ganancia: 40}, {mes: "fe
brero", ganancia: 12}, {mes: "marzo", ganancia: 8}])
=> 20

Ejercicio 11: Esto es lo máximo


Vamos a conocer una nueva función, maximo, que nos permite conocer cuál
es el mayor valor en una lista de números. Por ejemplo:

maximo([5, 8, 10, 42, 87, 776])


776

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

 ¡Dame una pista!

Podés usar la función ganancias que hiciste antes . Tené en cuenta que va a


estar tal y como vos la definiste, por lo que si tiene errores, pueden impactar
en tu solución actual. 

SOLUCION MIA CON ERROR


function maximaGanancia(balancesDeUnPeriodo) {
let maximaGanancia = [];
for (let balance of balancesDeUnPeriodo) {
agregar(maximaGanancia, balance.ganancia)
}
return maximaGanancia;
}
function ganancias(balancesDeUnPeriodo) {
let ganancias =[];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia);
}
return ganancias;
}

Tu solución no pasó las pruebas


Objetivos que no se cumplieron:

  maximaGanancia debe utilizar maximo
  maximaGanancia no debe usar foreach

Resultados de las pruebas:

  maximaGanancia devuelve la ganancia mas alta Ver detalles


 [ -40, 42, 19, -5 ] == 42

  maximaGanancia devuelve la ganancia mas alta aun si son todas


negativas Ver detalles
 [ -40, -13, -19, -5 ] == -5

  maximaGanancia devuelve cero si el resto de las ganancias son


negativas Ver detalles

[ 0, -13, -19, -5 ] == 0

Solución mal de la consulta


function maximaGanancia(balancesDeUnPeriodo) {
let ganancias =[];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia);
}
return maximo(ganancias);
}

me arroja que no debo usar el FOR pero no le veo otra amnera de realizarlo.
maximaGanancia no debe usar foreach .
dice que funcionó, pero no comprendo la manera correcta de realizarlo.
alguna ayuda.

Diana L.  MENTORÍA  hace 4 meses


¡Hola Eric! ¿Cómo te va?
Si nos fijamos en esta parte:
let ganancias =[];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia);
}

Estamos creando una lista con las ganancias, ¿no teníamos una función que
hacía esto? ¡Claro! ganancias, esta función si le dabamos una lista de balances,
nos retornaba una lista de números que representan las ganancias:
ganancias([{mes: "abril", ganancia: 50}, {mes: "octubre", ganancia: 700}])
=> [50,700]

Podemos reutilizar esta función que ya declaramos, y se encuentra en


nuestra </>Biblioteca. Fijate que a lo que devuelve ganancias podemos aplicarle
maximo, ya que es una lista de números.

SOLUCION CORRECTA

function maximaGanancia(balancesDeUnPeriodo){

return maximo(ganancias(balancesDeUnPeriodo))

¡Muy bien! Tu solución pasó todas las pruebas

CONSOLA
  maximaGanancia([ {mes: "enero", ganancia: 87}, {mes: "febrero", ganan
cia: 12}, {mes: "marzo", ganancia: 95}])
=> 95

Si hay una función para calcular el máximo de una lista también hay una para
calcular el mínimo. ¿Te imaginás como se llama?
Ejercicio 12: Como mínimo
Suponemos que adivinaste el nombre. En caso que no, es minimo. 

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

 ¡Dame una pista!

Para poder hacer esta nueva función probablemente te sirva


tanto minimo como gananciasDeBalancesPositivos. 

minimo se utiliza como maximo:

minimo([5, 8, 10, 42, 87, 776])


5

En la Biblioteca vas a encontrar algunas de las funciones de ejercicios


anteriores para ayudarte a resolver este ejercicio. Tené en cuenta que van a
estar tal y como vos las definiste, por lo que si tienen errores, pueden
impactar en tu solución actual. 

BIBLIOTECA

function ganancias(balancesDeUnPeriodo) {
let ganancias = [];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia)
}
return ganancias;
}
function balancesPositivos(balancesDeUnPeriodo) {
let balances = [];

for (let balance of balancesDeUnPeriodo) {


if(balance.ganancia>0){

agregar(balances, balance);
}
}
return balances;
}

function gananciasDeBalancesPositivos(balancesDeUnPeriodo)
{
return ganancias(balancesPositivos(balancesDeUnPeriodo));
}

function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}

function minimo(numeros) /* ... */


// Retorna el menor valor dentro de una lista de números:
//
// minimo([5, 7, 8, 9, 3])
// => 3

SOLUCION MIA CON ERROR

function minimaGananciaPositiva(balancesPositivos ){
return minimo(ganancias(balancesPositivos));
}

LA SOLUCION CORRECTA ES ESTA

function minimaGananciaPositiva(balancesDeUnPeriodo){
return minimo(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
 Tu solución no pasó las pruebas
Resultados de las pruebas:

  minimaGananciaPositiva devuelve la ganancia mas baja de todas las


positivas si hay negativas Ver detalles
 -40 == 8

  minimaGananciaPositiva devuelve la unica ganancia positiva en caso


de que todo el resto sean negativas Ver detalles
 -40 == 42

  minimaGananciaPositiva devuelve la ganancia mas baja de todas si


son todas positivas

SOLUCION CORRECTA

function minimaGananciaPositiva(balancesDeUnPeriodo){
return minimo(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA

 minimaGananciaPositiva([ {mes: "enero", ganancia: -40}, {mes: "febrer
o", ganancia: 42}, {mes: "marzo", ganancia: 8}, {mes: "abril", gananci
a: 3}])
=> 3
Muy bien!  Solo queda un ejercicio por delante.

Ejercicio 13: Los mejores meses del año


¡Vamos a terminar esta lección con todo! 

Para eso vamos a hacer las siguientes funciones:

 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"]

Definí las funciones meses, afortunados, mesesAfortunados.


 ¡Dame una pista!

En la función meses es necesario mapear, en afortunados filtrar y


en mesesAfortunados tenés que usar las dos anteriores. 
Definí la función gananciasDeBalancesPositivos y luego usala junto
a promedio para definir promedioDeBalancesPositivos.
 ¡Dame una pista!

Para poder tener la lista que recibe por parámetro promedio vas a tener que
definir gananciasDeBalancesPositivos. Esta función primero filtra los balances
positivos y luego los mapea a ganancias. Recordá que función hace cada una
de estas cosas. 

function gananciasDeBalancesPositivos(balancesDeUnPeriodo)
{
return ganancias(balancesPositivos(balancesDeUnPeriodo));
}

function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}

SOLUCION MIA CON ERROR

function meses (balancesDeUnPeriodo){


let meses = []

}
function afortunados ()

function mesesAfortunados()
¡Ups! Tu solución no se puede ejecutar
Resultados:

solucion.js:7
function mesesAfortunados()
^^^^^^^^

SyntaxError: Unexpected token function

Solución con error de la consulta

function meses(balancesDeUnPeriodo) {
let meses = [];
for(let balance of balancesDeUnPeriodo) {
agregar(meses, balance.mes);
}
return meses;
}
function afortunados(balancesDeUnPeriodo) {
let afortunados = [];
for(let balance of balancesDeUnPeriodo) {
if (balance.ganancia > 1000) {
afortunados = afortunados + balance.ganancia;
}
}
return afortunados;
}
function mesesAfortunados(balanceDeUnPeriodo) {
return meses(afortunados(balanceDeUnPeriodo));
}

Constanza O. hace 10 meses


Hola! intente corregir con una ayuda que me dieron pero me siguen
saltando los mismos errores..no entiendo esto

Martin G.  MENTORÍA  hace 10 meses


¡Hola Constanza!
En la función afortunados, si balance.ganancia > 1000, nosotros agregamos ese
balance a la lista afortunados. No tenemos que hacer afortunados = afortunados +
balance.ganancia;. Solucionando eso, el ejercicio te tendria que dar OK.

Constanza O. hace 10 meses


Es que lo hice con agregar tambien de la forma que me decis pero me marca
los mismos 2 errores

Diana L.  MENTORÍA  hace 10 meses


¡Buenas Constanza!
¿Nos podrás compartir el código en el que usas agregar? Así vemos bien en
dónde está el error 😊

Constanza O. hace 10 meses


function afortunados(balancesDeUnPeriodo) { let afortunados = []; for(let
balance of balancesDeUnPeriodo) { if (balance.ganancia > 1000) {   agregar
(afortunados , balance.ganancia); } } return afortunados; }

Martin G.  MENTORÍA  hace 10 meses


Si la ganancia del balance es mayor a 1000 (balance.ganancia > 1000), a ese
balance lo agregamos a la lista. Vos ahora mismo estas agregando la
ganancia del balance a la lista agregar (afortunados , balance.ganancia) , cuando en
realidad solo tenemos que agregar el balance solo balance.

function afortunados(balancesDeUnPeriodo) {
let afortunados = [];
for(let balance of balancesDeUnPeriodo) {
if (balance.ganancia > 1000) {
afortunados = afortunados + balance.ganancia;
SOLUCION CORRECTA
function meses(balancesDeUnPeriodo){
let meses= [];
for (let balance of balancesDeUnPeriodo){
agregar (meses,balance.mes);
}
return meses;
}
function afortunados(balancesDeUnPeriodo){
let afortunados = [];
for (let balance of balancesDeUnPeriodo){
if (balance.ganancia>1000){
agregar (afortunados,balance);
}
}
return afortunados;
}
function mesesAfortunados(balancesDeUnPeriodo){
return meses(afortunados(balancesDeUnPeriodo));
}
 ¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
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"]

¡Terminaste Recorridos!
En esta última lección te reencontraste con el for...of y resolviste problemas
más complejos con él . Más especificamente creaste funciones para filtrar y/o
transformar los elementos de una lista.

¡Muy buen trabajo! 

Capítulo 3: Programación con Objetos


El paradigma de objetos, a veces también conocido como orientado a
objetos nos propone solucionar problemas y modelar nuestra realidad
empleando objetos que se comunican entre ellos intercambiando mensajes.
¡Adentrémonos en el mundo de los objetos y Ruby!

Lecciones
1. Objetos y mensajes

  1. Fijando nuestro objetivo


  2. ¡Hola Pepita!
  3. Un mundo de objetos
  4. El derecho a la Identidad
  5. Mensajes, primera parte
  6. Mensajes, segunda parte
  7. No entendí...
  8. Un poco de sintaxis
  9. Interfaz
  10. Hacer versus Devolver
  11. Tu primer programa con objetos
  12. ¿Quién te entiende?
  13. Interfaces compartidas
  14. Argumentos
  15. Más argumentos
  16. Mensajes por todas partes
  17. Recapitulando

2. Definiendo objetos: métodos y estado

  1. Creando a Pepita


  2. Pepita, ¿me entendés?
  3. Los mejores, los únicos, los métodos en objetos
  4. Perdiendo energía
  5. Atributos
  6. Conociendo el país
  7. Leyendo el estado
  8. Cuestión de estado
  9. ¿Dónde estás?
  10. Volando alto
  11. Delegar es bueno
  12. ¿Es mi responsabilidad?

3. Polimorfismo y encapsulamiento

  1. ¿Pepita está feliz?


  2. Reencuentro alternativo
  3. Repitamos qué pasa si no
  4. Voy a hacer, pero como yo quiero
  5. Llegó Pepo
  6. ¡A entrenar!
  7. Pachorra todoterreno
  8. Una golondrina diferente
  9. Un entrenamiento más duro
  10. ¿¿Polimor-qué??
  11. Forzando el polimorfismo
  12. Empieza el set
  13. El encapsulamiento
  14. Vamos terminando
  15. ¡Se va la que falta!

4. Referencias

  1. Variables
  2. Las variables son referencias
  3. Referencias implícitas
  4. Múltiples referencias
  5. Identidad, revisada
  6. Equivalencia
  7. Objetos bien conocidos
  8. Atributos y parámetros
  9. Lo 100to
  10. Objetos compartidos
  11. Para cerrar

5. Colecciones

  1. Entrando en Calor


  2. Creando una lista
  3. Algunos mensajes básicos
  4. Set o no set
  5. Mejorando la Juegoteca
  6. ¿Bloques? ¿Eso se come?
  7. Bloques con parámetros
  8. Filtrando quienes cumplen
  9. El que busca encuentra
  10. ¿Alguno cumple? ¿Todos cumplen?
  11. El viejo y querido map
  12. ¿Cuántos cumplen? ¿Cuánto suman?
  13. Jugando a todo

6. Clases e Instancias

  1. Zombi caminante


  2. Atacando un zombi
  3. Otro zombi caminante
  4. ¡¿Vivos?!
  5. Clases
  6. Instancias
  7. Al menos tenemos salud
  8. Inicializando instancias
  9. Ahora sí: invasión
  10. Al menos tenemos (menos) salud
  11. Súper zombi
  12. Ejercitando
  13. Aliados

7. Herencia

  1. Aflojá con el aparatito


  2. Notebook
  3. No repitan conmigo
  4. Su superclase
  5. Arte abstracto
  6. ¿Me estás cargando?
  7. Prueba sorpresa
  8. Vamos de paseo
  9. Subí nomás
  10. Inconsciente colectivo
  11. Es un trabajo para super
  12. El regreso de los zombis
  13. Herencia zombie
  14. Concretemos la herencia
  15. La defensa

8. Excepciones

  1. ¡Sin energía!


  2. Sólo Volar Si...
  3. Una falla silenciosa
  4. ¡Fallar!
  5. Lanzando excepciones
  6. Abortando la evaluación
  7. Paren todo
  8. El orden importa
  9. Estudiando a las golondrinas
  10. Un buen mensaje

Apéndice
¿Querés saber más? Consultá el apéndice de este capítulo
Ejercicio 1: Fijando nuestro objetivo
Anteriormente hablamos de los paradigmas de programación. En este
capítulo vamos a ver otra forma de pensar el mundo de la programación.

El paradigma de programación con objetos o programación orientada


a objetos nos propone tratar con…¡Adiviná! Sí, nos permite trabajar con
objetos. 

En este video te contamos qué son esos famosos objetos y cómo interactúan
entre sí.

Ejercicio 2: ¡Hola Pepita!


Para empezar en este mundo, conozcamos a Pepita, una golondrina.

Pepita, además de ser un ave que come y vuela (como todo pájaro), es un
objeto, que vive en el mundo de los objetos, al cual conocemos
como ambiente.

¿No nos creés que Pepita está viva y es un objeto? Escribí en la


consola Pepita y fijate qué sucede. Cuando te convenzas, pasá al siguiente
ejercicio.

 ¡Dame una pista!

La consola es el recuadro que tenés a la derecha del texto, y sirve para hacer
pruebas rápidas. 

Usarla es muy sencillo: escribí lo que querés probar y luego presioná la


tecla Enter para ver su resultado. Si alguna vez usaste alguna terminal, como
la de GNU/Linux, la mecánica es la misma.

Pepita
=> Pepita

Ejercicio 3: Un mundo de objetos


Como vimos, Pepita es un objeto. Pero Pepita no está sola en este mundo. ¡Hay
muchos más!

Por ejemplo, existe otra golondrina, llamada Norita, que también vive en


este ambiente.

Como ya te vendrás dando cuenta, en este paradigma bajo el cual estamos


trabajando absolutamente todo es un objeto: también los números, las
cadenas de texto (o strings) y los booleanos.

Probalo! Hacé las siguientes consultas en la consola:

Pepita
Norita
87
'hola mundo'
true

De todas formas tené cuidado. A Pepita y Norita las creamos por vos. Y los


números y booleanos vienen de regalo. Si probás con otra cosa, como por
ejemplo Felix, te va a tirar un error.
 Pepita
=> Pepita
  Norita
=> Norita
  87
=> 87
'hola mundo'
=> "hola mundo"
  true
=> true

Ejercicio 4: El derecho a la Identidad


Un aspecto muy importante de los objetos es que tienen identidad: cada
objeto sabe quién es y gracias a esto sabe también que es diferente de los
demás. Por ejemplo, Pepita sabe que ella es diferente de Norita, y viceversa.

En Ruby, podemos comparar por identidad a dos objetos utilizando el


operador == de la siguiente forma:

Pepita == Norita
¡Intentalo por tu propia cuenta! Ejecutá las siguientes pruebas en la consola:

Pepita == Norita
Norita == Pepita
Norita == Norita
"hola" == "chau"

 ¡Dame una pista!

¿Te cansaste de escribir? Te dejamos un truquito para usar la consola más


rápido: si apretás la flecha para arriba , se repite lo último que escribiste. 

CONSOLA
Pepita == Norita
=> false
  Norita == Pepita
=> false
  Norita == Norita
=> true
  "hola" == "chau"
=> false

Ejercicio 5: Mensajes, primera parte


Ya entendimos que en un ambiente hay objetos, y que cada uno de ellos
tiene identidad: sabe que es diferente de otro.

Pero esto no parece ser muy útil. ¿Qué cosas sabrá hacer una golondrina
como Pepita? ¿Sabrá, por ejemplo, cantar!? 

Averigualo: enviale un mensaje cantar! y fijate qué pasa...

Pepita.cantar!

 ¡Dame una pista!

El signo de exclamación ! es parte del nombre del mensaje, no te olvides de


ponerlo. 

CONSOLA
Pepita.cantar!
=> "pri pri pri"

Ejercicio 6: Mensajes, segunda parte


Ehhhh, ¿qué acaba de pasar acá? 

Para comunicarnos con los objetos, debemos enviarles mensajes. Cuando un


objeto recibe un mensaje, este responde haciendo algo. En este
caso, Pepita produjo el sonido de una golondrina: pri pri pri ...imaginate acá
que escuchamos este sonido... .

¿Qué mas sabrá hacer Pepita? ¿Sabrá, por ejemplo, bailar!? 

¡Descubrámoslo! Enviale el mensaje bailar!

Pepita.bailar!

Ejercicio 7: No entendí...
¡Buu, Pepita no sabía bailar! 

En el mundo de los objetos, sólo tiene sentido enviarle un mensaje a un


objeto si lo entiende, es decir, si sabe hacer algo como reacción a ese
mensaje. De lo contrario, se lanzará un error un poco feo (y en inglés ) como
el siguiente:

undefined method `bailar!' for Pepita:Module

Descubramos qué otras cosas sabe hacer Pepita. Probá enviarle los siguientes
mensajes y fijate cuáles entiende y cuales no ¡y anotalos!  Este conocimiento
nos servirá en breve.
Pepita.comer_lombriz!
=> nil
  Pepita.volar_en_circulos!
=> nil
  Pepita.se_la_banca?
undefined method `se_la_banca?' for Pepita:Module (NoMethodError)

copiar desde aca en ejercicios resueltos


Ejercicio 8: Un poco de sintaxis
¡Pausa! Analicemos la sintaxis del envío de mensajes:

1. Pepita.energia es un envío de mensaje, también llamado colaboración;


2. energia es el mensaje;
3. energia es el nombre del mensaje (en este caso es igual, pero ya
veremos otros en los que no);
4. Pepita es el objeto receptor del mensaje.

 Es importante respetar la sintaxis del envío de mensajes. Por ejemplo, las
siguientes NO son colaboraciones validas, porque no funcionan o no hacen
lo que deben:

CONSOLA
energia
Pepita energia
Pepita..energia

¿Eh, no nos creés?  ¡Probalas!

CONSOLA DEL EJERCICIO


energia
undefined local variable or method `energia' for main:Object
(NameError)
  Pepita energia
undefined local variable or method `energia' for main:Object
(NameError)
  Pepita..energia
undefined local variable or method `energia' for main:Object
(NameError)

Ejercicio 7(8): Un poco de sintaxis


¡Pausa! Analicemos la forma correcta de escribir el envío de mensajes, es
decir su sintaxis:

1. pepita.volar( ) es un envío de mensaje, también llamado colaboración


2. volar( ) es el mensaje
3. pepita es el objeto receptor del mensaje
 Es importante respetar la sintaxis del envío de mensajes. Por ejemplo, las
siguientes NO son colaboraciones validas, porque no funcionan o no hacen
lo que deben:

  volar( )
  volar.pepita( )
  pepita volar( )
  pepita.volar

¿Eh, no nos creés?  ¡Probalo!


volar()
ERROR: extraneous input '(' expecting ')'
ERROR: Couldn't resolve reference to Referenciable 'volar'.
  volar.pepita()
ERROR: Couldn't resolve reference to Referenciable 'volar'.
  pepita volar()
ERROR: missing ')' at 'volar'
ERROR: no viable alternative at input ')'
ERROR: extraneous input ')' expecting '}'
ERROR: Couldn't resolve reference to Referenciable 'volar'.
  pepita.volar
ERROR: Bad message: volar)

Ejercicio 9: Interfaz
Como vimos, un objeto puede entender múltiples mensajes; a este conjunto
de mensajes que podemos enviarle lo denominamos interfaz. Por ejemplo,
la interfaz de Pepita es:

 energia: nos dice cuanta energía tiene (un número);


 cantar!: hace que cante;
 comer_lombriz!: hace que coma una lombriz;
 volar_en_circulos!: hace que vuele en circulos.

Lo cual también se puede graficar de la siguiente forma:


¡Un momento! ¿Por qué algunos mensajes terminan en ! y otros no? Enviá nuevamente
esos mensajes. Fijate qué devuelve cada uno (lo que está a la derecha del = >) y tratá de
descubrir el patrón.
 ¡Dame una pista!

nil es la forma que tenemos en Ruby de representar a "la nada" (que,


casualmente, ¡también es un objeto!).

CONSOLA
Pepita.energia
=> 100
  Pepita.cantar!
=> "pri pri pri"
  Pepita.comer_lombriz!
=> nil
  Pepita.volar_en_circulos!
=> nil
   

Ejercicio 10: Hacer versus Devolver


Cuando se envía un mensaje a un objeto, y este lo entiende, puede
reaccionar de dos formas diferentes:

 Podría producir un efecto, es decir hacer algo. Por ejemplo, el


mensaje cantar! reproduce el sonido del canto de Pepita.
 O también podría devolver otro objeto. Por ejemplo el
mensaje energia devuelve siempre un número.

 En realidad, un mensaje podría reaccionar con una combinación de las


formas anteriores: tener un efecto y devolver algo. Pero esto es una muy mala
idea.

¿Y qué hay de los mensajes como comer_lombriz! y volar_en_circulos!? ¿Hicieron algo? ¿Qué


clase de efecto produjeron? ¿Devuelve energia siempre lo mismo? 
Descubrilo: enviale a Pepita esos tres mensajes varias veces en distinto orden y fijate si
cambia algo.
CONSOLA
 Pepita.comer_lombriz!
=> nil
  Pepita.volar_en_circulos!
=> nil
Pepita.energia
=> 110
  Pepita.volar_en_circulos!
=> nil
  Pepita.comer_lombriz!
=> nil

Ejercicio 11: Tu primer programa con


objetos
¡Exacto! El efecto que producen los
mensajes comer_lombriz! y volar_en_circulos! es el de alterar la energía de Pepita.
En concreto:

 comer_lombriz! hace que la energia de Pepita aumente en 20 unidades;


 volar_en_circulos! hace que la energia de Pepita disminuya en 10
unidades.

Como convención, a los mensajes con efecto (es decir, que hacen algo) les


pondremos un signo de exclamación ! al final.
Veamos si se entiende: escribí un primer programa que consista en hacer
que Pepita coma y vuele hasta quedarse con 150 unidades de energía. Acordate
que Pepita arranca con la energía en 100.
 ¡Dame una pista!
No te olvides de que siempre tenés que poner el objeto receptor del
mensaje. Por ejemplo esto es válido:

Pepita.energia

pero esto no:

energia

SOLUCION CORRECTA
1. Pepita.comer_lombriz!
2. Pepita.volar_en_circulos!
3. Pepita.comer_lombriz!
4. Pepita.volar_en_circulos!
5. Pepita.comer_lombriz!
6. Pepita.volar_en_circulos!
7. Pepita.comer_lombriz!
¡Muy bien! Tu solución pasó todas las pruebas

Podemos sacar dos conclusiones:

1. Los objetos no reaccionan necesariamente siempre igual a los mismos


mensajes. Podrían hacer cosas diferentes, o en este caso, devolver
objetos distintos.
2. ¡Un programa es simplemente una secuencia de envío de mensajes!

También podría gustarte