Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lecciones
1. Funciones y tipos de datos
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
6. Registros
7. Recorridos
Apéndice
¿Querés saber más? Consultá el apéndice de este capítulo
Sin embargo, en los programas "reales" rara vez trabajamos con tableros y
bolitas de colores: la programación va más allá de eso. ¿Cómo es entonces
esto de vivir fuera del tablero?
¡Acompañanos!
Ejercicios
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;
}
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!
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
doble(3)
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));
}
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
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
anteriorDelTriple debe utilizar triple
anteriorDelTriple debe utilizar anterior
la solución debe declarar anteriorDelTriple
Detalles
Resultados de las pruebas:
2 == 0
29 == 9
triple triple(1) es 3
triple triple(3) es 9
anteriorDelTriple anteriorDelTriple(1) es 2 Ver detalles
function doble(numero) {
return 2 * numero;
}
function siguiente(numero) {
return numero + 1;
}
function siguienteDelDoble(numero) {
return siguiente(doble(numero));
}
extraer(100, 120)
0 //Ups, quisimos sacar más plata de la que teníamos.
//Nos quedamos con $0
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.js:2
return Math.max(saldo-monto), 0);
^
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
Solución correcta
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
function esDiaFavorito(diaDelMes) {
return diaDelMes === 1 ;
}
esDiaFavorito(13)
false
esDiaFavorito(1)
true
leGustaLeer(15)
false
leGustaLeer(45)
true
Tu solución no pasó las pruebas PORQUE NO LEI BIEN LA CONSIGNA QUE ES IGUAL O
MAYOR A 20.
Resultados de las pruebas:
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!
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
Resultados:
solucion.js:1
function estaEntre(60, 40, 75) {
^^
SyntaxError: Unexpected number
false == true
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!
esFinDeSemana("sábado")
true
esFinDeSemana("martes")
false
esFinDeSemana("sábado")
esFinDeSemana("domingo")
esFinDeSemana("lunes")
esFinDeSemana("jueves")
CONSOLA
esFinDeSemana ("sabado")
=> true
esFinDeSemana ("lunes")
=> false
esFinDeSemana ("domingo")
=> true
longitud("biblioteca")
10
longitud("babel")
5
"aa" + "bb"
"aabb"
"sus anaqueles " + "registran todas las combinaciones"
"sus anaqueles registran todas las combinaciones"
longitudNombreCompleto("Cosme", "Fulanito")
14
solucion.js:2
return longitud ("nombre" + "apellido");
^^^^^^
SyntaxError: Unexpected token return
Biblioteca
/**/
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!"
"todo" + "terreno"
"todoterreno"
BIBLIOTECA
/**/
function longitud(unString) /* ... */
// Retorna cuan largo es un string
//
// Por ejemplo:
//
// longitud("hola")
// 4
Ver detalles
solucion.js:1
function convertirEnMayuscula("gritar"){
^^^^^^^^
SyntaxError: Unexpected string
function gritar(nombre){
return "¡"+ convertirEnMayuscula (nombre)+ "!";
}
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
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!"
//Equivalente a Math.abs
function valorAbsoluto(unNumero) {
if (unNumero >= 0) {
return unNumero;
} else {
return -unNumero;
}
}
//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:
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.
function signo(numero) {
if (numero > 0){
return "1";
} else if (numero < 0){
return "-1";
}
}
Tu solución no pasó las pruebas
Ver detalles
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.
}else{
lineas del else grande
if(condicion){
}else{
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 ;
}}
}
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 {
function esMayorDeEdad(edad) {
if (edad >= 18) {
return true;
} else {
return false;
}
}
function esMayorDeEdad(edad) {
return edad >= 18;
}
/**/
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
medallaSegunPuesto(1)
"oro"
medallaSegunPuesto(5)
"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"
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:
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.
4 + 4 vale 8
"4" + "4" vale "44"
4 + 4 vale "44"
"on" + "ce" vale "once"
5 >= 6 vale false
! true vale false
La respuesta no es correcta
4 + 4 vale 8
"4" + "4" vale "44"
4 + 4 vale "44"
"on" + "ce" vale "once"
5 >= 6 vale false
! true vale false
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
"4" + "4" vale "44"
4 + 4 vale "44"
"on" + "ce" vale "once"
5 >= 6 vale false
! true vale fals
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"
5 >= 6 vale false
! true vale fals
Ejercicios
cuantoCuesta(25, 8)
4100
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
meConviene(25, 8)
false // porque el monitor es demasiado chico
meConviene(42, 12)
true // cumple las tres condiciones
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
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:
Resultados:
solucion.js:2
return perimetro(lado1 + lado2 + lado3);
^^^^^^ NO DEBE LLEVAR PERIMETRO Y LOS PARENTESIS
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
estaAfinado(440)
true
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
function estaCerca(rango){
rango >= && rango <=;
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
solucion.js:2
rango >= && rango <=;
^^
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.
¡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:
solucion.js:1
function escribirCartelito("titulo", "apellido", "nombre"){
^^^^^^^^
SyntaxError: Unexpected string
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"
// cartelito corto
escribirCartelito("Lic.", "Tomás", "Peralta", true)
"Lic. Peralta"
// cartelito largo
escribirCartelito("Ing.", "Dana", "Velázquez", false)
"Ing. Dana Velázquez"
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"
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:
solucion.js:2
if cara
^^^^
valorEnvido(12)
0
valorEnvido(3)
3
Asumí que sólo te vamos a pasar cartas con valores dentro de los rangos
del 1 al 7 y del 10 al 12
function valorEnvido(valores){
return valores !==0 && valores <=7;
}
Resultados de las pruebas:
valorEnvido(1) es 1
valorEnvido(5) es 5 Ver detalles
true == 5
valorEnvido(12) es 0
valorEnvido(11) es 0
valorEnvido(10) es 0
valorEnvido no devuelve strings
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
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.
solucion.js:2
return Math.max((valorenvido * 2), palos;
^^^^^
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
return
algo;
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;
}
¿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
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
truco 2
retruco 3
vale
4
cuatro
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
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.
SOLUCION DE LA CONSULTA
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;} }
if(condicion){
algo;
}else{
otra_cosa;
}
Por más que a nivel ejecución sean lo mismo, está bueno tener presente la
diferencia conceptual.
¡Saludos!
SOLUCION CORRECTA
function valorCantoTruco(canto){
if(canto==="truco"){return 2;}
else if(canto==="retruco"){return 3;}
if(canto==="vale cuatro"){return 4;}
}
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.
¿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!"
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:
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.
Esta function debe retornar 0
¡Dame una pista!
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
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");
}
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());
Ejercicio 6: Coerciones
Volvamos un momento al código anterior. ¿Notás algo extraño en esta
expresió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 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"
Detalles
Resultados de las pruebas:
SOLUCION CORRECTA
function perimetroCirculo(radio){
return 3.14159265358979*(radio*2);
}
function areaCirculo(radio){
return 3.14159265358979*(radio*radio);
}
CONSOLA
perimetroCirculo(20,3.14159265358979)
=> 125.6637061435916
areaCirculo(20, 3.14159265358979)
=> 1256.637061435916
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
function sumaSinSentido() {
return numero + 8;
}
Probala en la consola y fijate qué sucede.
CONSOLA
15
=> 15
15 + 8
=> 23
2 + 8
=> 10
function cuentaExtravagante(unNumero) {
let elDoble = unNumero * 2;
if (elDoble > 10) {
return elDoble;
} else {
return 0;
}
}
function ascensorSobrecargado(pesoPromedioPersonaEnKilogramos){
let cargaMaximaEnKilogramos=300
function ascensorSobrecargado(personas){
let pesoPromedioPersonaEnKilogramos = 90
return (pesoPromedioPersonaEnKilogramos*personas)>=cargaMaximaEnKilogramos
let cargaMaximaEnKilogramos=300
function ascensorSobrecargado(personas){
return
(pesoPromedioPersonaEnKilogramos*personas)>=cargaMaximaEnKilogramos;
}
¡Muy bien! Tu solución pasó todas las pruebas
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!
Ver detalles
¡Corrijamos el problema!
Resultados de las pruebas:
100 == 200
30 == 240
OTRA CON ERROR MIA
pesosEnMiBilletera * 2;
100 == 200
30 == 240
Consulta con error
function aumentarFortuna() {
(pesosEnMiBilletera*2);
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;
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
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
function apretarInterruptor() {
lamparaPrendida = !lamparaPrendida;
}
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:
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.
esPeripatetico("filósofo", "griego", 5)
true
esPeripatetico("profesor", "uruguayo", 1)
false
SOLUCION MIA CON ERROR
solucion.js:2
return profesion = filosofo && nacionalidad = griego && kilometrospordia = 2;
^^^^^^^^^^^^^^^^^^^^^^^^
SOLUCION CORRECTA
CONSOLA
esPeripatetico("contador", "ruso", 3)
=> false
esPeripatetico("filosofo", "griego", 3)
=> true
gano(true, 25)
gano(false, 30)
gano(false, 20)
gano(true, 31)
gano(true, 25)
=> true
gano(false, 30)
=> true
gano(false, 20)
=> false
gano(true, 31)
=> true
Para evitar que le ocurra nuevamente, vamos a definir una función que
ayude a la gente despistada como ella.
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.
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:
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
padreDe(aurelianoJose)
"Coronel Aureliano"
madreDe(aurelianoSegundo)
"Sofía De La Piedad"
solucion.js:35
});
^
false == true
false == true
function tienenElMismoPadre(nom1,nom2){
return padreDe(nom1) === padreDe(nom2)
}
sonMediosHermanos(arcadio, aurelianoJose)
sonMediosHermanos(aurelianoSegundo, remedios)
sonMediosHermanos(aurelianoJose, remedios)
A B A⊻B
V V F
V F V
F V V
F F F
solucion.js:3
function A ⊻ B( hijo1 , hijo2 ) {
^
solucion.js:3
function A xor B( hijo1 , hijo2 ) {
^^^
function xor(A,B){
function xor(A,B){
(A === B)
return (false);}{
else (true);}
solucion.js:4
else (true);}
^^^^
function xor(A,B){
if (A !== B) {
return true;
} else (false);
function xor(A,B){
(A !== B) {
return true;
} else (false);
solucion.js:2
(A !== B) {
^
solucion.js:2
return (a && !b)||&(!a && b);
^
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
5 * 3 + 8 / 4 - 3 = 14
pagaConTarjeta(true, "crédito", 320)
=> false
pagaConTarjeta(false, "crédito", 80)
=> true
pagaConTarjeta(true, "débito", 215)
=> false
pagaConTarjeta(true, "débito", 32)
=> true
solucion.js:2
return !edad && sexo && añosAporte=>30 || añosAporte < 30;
^
return edad >= 60 && "mujer" && ap >= 30 || edad > 65 && "hombre" && ap >= 30;
}
solucion.js:2
return edad >= 60 && sexo ="mujer" && ap >= 30 || edad > 65 && sexo="hombre" &&
ap >= 30;
^^^^^^^^^^^^^^^^^^
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:
true == false
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
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
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.
Ejercicios
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"]
¿Acaso hay una cantidad máxima de elementos? ¡No, no hay límite! Las listas
pueden tener cualquier cantidad de elementos.
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
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 imprimir(unString) /* ... */
// Imprime por pantalla unString
//
// Por ejemplo:
//
// imprimir("¡estoy imprimiendo!")
// ¡estoy imprimiendo!
/**/
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
let unaListaVacia = [ ]
longitud([ ])
longitud(numerosDeLoteria)
longitud([4, 3])
CONSOLA
longitud([])
=> 0
longitud(numerosDeLoteria)
=> 6
longitud([4, 3])
=> 2
CONSOLA
agregar (pertenencias, "ballesta")
=> 4
remover(pertenencias, "ballesta")
=> "ballesta"
Ejercicio 7: Trasladar
Bueno, ya hablamos bastante; ¡es hora de la acción !
trasladar(unaLista, otraLista);
Ver detalles
¡Intentemos de nuevo!
Resultados:
solucion.js:5
trasladar
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.
[ 4, 5, 6, 7, undefined ] deepEqual [ 4, 5, 6, 7, 40 ]
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?
posicion(diasLaborales, "osvaldo")
posicion(diasLaborales, "osvaldo")
=> -1
Ejercicio 9: Contiene
¡Ahora te toca a vos!
return
Resultados:
solucion.js:1
function contiene ([1, 6, 7, 6], 7){
^
lista[1, 6, 7, 6] ;
posicion[lista] ;
solucion.js:2
return posicion(lista, numero) > = 0;
^
SyntaxError: Unexpected token =
modificado
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
CONSOLA
contiene([1, 6, 7, 6], 7)
=> true
contiene([], 7)
=> false
contiene([9, 4], 3)
=> false
¡Bien hecho!
mesesDelAnio[0]
"enero"
["ese", "perro", "tiene", "la", "cola", "peluda"][1]
"perro"
medallaSegunPuesto(1)
"oro"
medallaSegunPuesto(2)
"plata"
medallaSegunPuesto(3)
"bronce"
medallaSegunPuesto(4)
"nada"
medallaSegunPuesto(5)
"nada"
¿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.js:2
if posición(numero === 1)
^^^^^^^^
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 :(
// hacer algo
}
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"
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:
function saludar(personas) {
for(let persona of ["Elena", "Hector", "Tita"]) {
saludar() = "hola " + "persona" ;
}
}
function imprimirAUnaPersona(unaPersona) {
imprimir(persona+ "!");
}
imprimirAUnaPersona("Diana")
imprimir("hola"+ "Elena")
Ya que es nuestra primera persona en la lista de personas.
Espero que te sirva ¡saludos!
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!
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:
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:
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á:
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.
Ejercicios
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}
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.
solucion.js:2
let monumentoNacionalALaBandera = {nombre: "monumento Nacional A La Bandera", locacion:
"Rosario", "Argentina", anioDeConstruccion: 1957;
^^^
SOLUCION CORRECTA
tajMahal
{ nombre: "Taj Mahal", locacion: "Agra, India", anioDeConstruccion: 1653 }
tajMahal.locacion
"Agra, India"
tajMahal.anioDeConstruccion
1653
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"
¡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á...
Por ejemplo
mercurio.nombre
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:
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
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")
leeme
{ ruta: "C:\documentos\leeme.txt", creacion: "23/09/2004" }
solucion.js:2
moverArchivo(registro, "C:\documentos\registro.txt)"}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
registro.ruta
// y
registro.creacion
¿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 CORRECTA
function moverArchivo(registro, nuevaRuta){
registro.ruta = nuevaRuta;
}
¡Muy bien! Tu solución pasó todas las pruebas
anio("04/11/1993")
1993
solucion.js:2
let leeme = registro.ruta = "D:\fotonacimiento.jpg", anio "04/11/1993";
^^^^^^^^^^^^
SyntaxError: Unexpected string
CON ERROR
function esDelMilenioPasado(registro, nuevaRuta){
}
¡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 :
SOLUCION CORRECTA
function esDelMilenioPasado(registro){
return anio(registro.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
masDificilDeCocinar(flanCasero, cheesecake)
{ ingredientes: ["huevos", "leche", "azúcar", "vainilla"], tiempoDeCoccion: 50 }
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
¡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 [ ].
OTRA SOLUCION
function agregarAPostresRapidos(lista, postre){
if(postre.tiempoDeCoccion <= 60){
agregar(lista, postre)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
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"]
Recordá que cada menú tiene un postre y que cada postre tiene ingredientes.
solucion.js:2
if postre = ingredientes
^^^^^^
SyntaxError: Unexpected identifier
agregar(menu.postre.ingredientes, "azúcar");
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
"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:
Y nos preguntó: "¿Podría usar esta función que me dieron para calcular las
ganancias del primer trimestre?".
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;
^
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;
}
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!
function gananciaTotalN(unPeriodo) {
let sumatoria = 0; // esto siempre está
//... etc
return sumatoria; //esto siempre está
}
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
SOLUCION A CORREGIR
function cantidadDeBalancesPositivos(balancesDeUnPeriodo) {
let cantidad = ????;
for (let balance of balancesDeUnPeriodo) {
????
}
return cantidad;
}
3 deepEqual 1
3 deepEqual 2
3 deepEqual 0
3 deepEqual 0
3 deepEqual 0
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!
function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0;
for (let balance of balancesDeUnPeriodo) {
if(balance.ganancia > 0){
cantidad= cantidad + 1} esto es lo correcto
}
return cantidad;
}}
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
}
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
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 10 },
{ mes: "marzo", ganancia: -20 }
])
[
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 10 },
{ mes: "marzo", ganancia: -20 }
]
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)
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):
¿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:
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
gananciaPromedio([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
9
solucion.js:2
if gananciaPromedio = gananciaTotal/sumatoria.ganancia;
^^^^^^^^^^^^^^^^
Con eso en mente, al igual que nosotros podiamos tener una lista de
strings, por ejemplo:
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([1,2,3])
longitud(balancesDeUnPeriodo)
=> 3
function gananciaPromedio(balancesDeUnPeriodo) {
let sumatoria=0;
{
sumatoria=gananciaTotal(balancesDeUnPeriodo)/
longitud(balancesDeUnPeriodo);
}
return sumatoria;}
SOLUCION CORRECTA
function gananciaPromedio(balancesDeUnPeriodo) {
let sumatoria=0;
{
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.
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
^^^^^^^^^^^^^^^^
}
}
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.
}
function promedioGananciasPositivas(balancesDeUnPeriodo) {
return gananciaPositiva(balancesDeUnPeriodo) /
cantidadDeBalancesPositivos(balancesDeUnPeriodo);
}
¡Muy bien! Tu solución pasó todas las pruebas
function promedio(listaDeNumeros) {
return sumatoria(listaDeNumeros) / longitud(listaDeNumeros);
}
function sumatoria(listaDeNumeros) {
let sumatoria = 0;
for (let numero of listaDeNumeros) {
sumatoria = sumatoria + numero;
}
return sumatoria;
}
ganancias([
{ mes: "enero", ganancia: 40 },
{ mes: "febrero", ganancia: 12 },
{ mes: "marzo", ganancia: 8}
])
[40, 12, 8]
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:
function ganancias(balancesDeUnPeriodo) {
let ganancias = [ ];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias,balance.ganancia)
}
return ganancias; }
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
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.
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
}
^
function balancesPositivos(balancesDeUnPeriodo) {
let balances = [ ];
SOLUCION CORRECTA
function balancesPositivos(balancesDeUnPeriodo) {
let balances = [ ];
agregar(balances, balance);
}
}
return balances;
}
¡Muy bien! Tu solución pasó todas las pruebas
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.
BIBLIOTECA
function ganancias(balancesDeUnPeriodo) {
let ganancias = [ ];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia)
}
return ganancias;
}
function balancesPositivos(balancesDeUnPeriodo) {
let balances = [ ];
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;
}
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?
Detalles
Resultados de las pruebas:
function gananciasDeBalancesPositivos(balancesDeUnPeriodo){
return ganancias( balancesPositivos(balancesDeUnPeriodo));
}
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
let promedio = [ ]
for(let ganancias of gananciaPositivos){
promedio(gananciaPositivos)
}
return ganancias
}
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(......));
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:
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
maximaGanancia debe utilizar maximo
maximaGanancia no debe usar foreach
[ 0, -13, -19, -5 ] == 0
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.
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]
SOLUCION CORRECTA
function maximaGanancia(balancesDeUnPeriodo){
return maximo(ganancias(balancesDeUnPeriodo))
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.
minimaGananciaPositiva([
{ mes: "enero", ganancia: -40 },
{ mes: "febrero", ganancia: 42 },
{ mes: "marzo", ganancia: 8},
{ mes: "abril", ganancia: -5}
])
8
BIBLIOTECA
function ganancias(balancesDeUnPeriodo) {
let ganancias = [];
for (let balance of balancesDeUnPeriodo) {
agregar(ganancias, balance.ganancia)
}
return ganancias;
}
function balancesPositivos(balancesDeUnPeriodo) {
let balances = [];
agregar(balances, balance);
}
}
return balances;
}
function gananciasDeBalancesPositivos(balancesDeUnPeriodo)
{
return ganancias(balancesPositivos(balancesDeUnPeriodo));
}
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
function minimaGananciaPositiva(balancesPositivos ){
return minimo(ganancias(balancesPositivos));
}
function minimaGananciaPositiva(balancesDeUnPeriodo){
return minimo(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
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.
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"]
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));
}
}
function afortunados ()
function mesesAfortunados()
¡Ups! Tu solución no se puede ejecutar
Resultados:
solucion.js:7
function mesesAfortunados()
^^^^^^^^
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));
}
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.
Lecciones
1. Objetos y mensajes
3. Polimorfismo y encapsulamiento
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
6. Clases e Instancias
7. Herencia
8. Excepciones
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.
En este video te contamos qué son esos famosos objetos y cómo interactúan
entre sí.
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.
La consola es el recuadro que tenés a la derecha del texto, y sirve para hacer
pruebas rápidas.
Pepita
=> Pepita
Pepita
Norita
87
'hola mundo'
true
Pepita == Norita
¡Intentalo por tu propia cuenta! Ejecutá las siguientes pruebas en la consola:
Pepita == Norita
Norita == Pepita
Norita == Norita
"hola" == "chau"
CONSOLA
Pepita == Norita
=> false
Norita == Pepita
=> false
Norita == Norita
=> true
"hola" == "chau"
=> false
Pero esto no parece ser muy útil. ¿Qué cosas sabrá hacer una golondrina
como Pepita? ¿Sabrá, por ejemplo, cantar!?
Pepita.cantar!
CONSOLA
Pepita.cantar!
=> "pri pri pri"
Pepita.bailar!
Ejercicio 7: No entendí...
¡Buu, Pepita no sabía bailar!
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)
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
volar( )
volar.pepita( )
pepita volar( )
pepita.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:
CONSOLA
Pepita.energia
=> 100
Pepita.cantar!
=> "pri pri pri"
Pepita.comer_lombriz!
=> nil
Pepita.volar_en_circulos!
=> nil
Pepita.energia
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