Apuntes Todo Parte 2 Ejercicio Let of
Apuntes Todo Parte 2 Ejercicio Let of
Apuntes Todo Parte 2 Ejercicio Let of
function promedio(listaDeNumeros) {
return sumatoria(listaDeNumeros) / longitud(listaDeNumeros);
}
function sumatoria(listaDeNumeros) {
let sumatoria = 0;
for (let numero of listaDeNumeros) {
sumatoria = sumatoria + numero;
}
return sumatoria;
}
Solución dada;
let sumatoria = 0;
if (balance.ganancia >0 ) {
return sumatoria
}
function promedioGananciasPositivas (balancesDeUnPeriodo){
return gananciaPositiva(balancesDeUnPeriodo)/
cantidadDeBalancesPositivos(balancesDeUnPeriodo);
}
Por suerte existe una herramienta que va a simplificar nuestra tarea de ahora
en adelante: las variables.
let pi = 3.14159265358979;
function perimetroCirculo(radio){
return ( (2 * pi) * radio);
}
function areaCirculo(radio){
return (pi * radio * radio);
}
¡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:
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:
let cargaMaximaEnKilogramos=300
2
function ascensorSobrecargado(personas){
3
return pesoPromedioPersonaEnKilogramos * personas >=cargaMaximaEnKilogramos ;
4
}
Enviar
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;
}
¿Y esto para qué sirve? Por ejemplo, para modelar casos de alternancia como
prender y apagar una luz :
function apretarInterruptor() {
lamparaPrendida = !lamparaPrendida;
}
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 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.
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!
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.
Oli está diseñando una página web y se está centrando en el contraste de sus
componentes. Para lograrlo, nos pidió que definamos la
función tieneContraste que recibe como argumentos el color de la letra y el
color del fondo de la página y retorna si la página tiene contraste.
esTonoClaro('rojo')
false
esTonoClaro('blanco')
true
¡Ahora te toca a vos! Definí la función tieneContraste. Para que la página tenga contraste
tiene que tener el fondo claro y la letra no o bien tener la letra clara y el fondo no.
function tieneContraste(letra,fondo){
return (!esTonoClaro(letra) && esTonoClaro(fondo)) || (esTonoClaro(letra)
&& !esTonoClaro(fondo)) ;
}
Ahora cambiemos las proposiciones la letra tiene tono claro y el fondo tiene tono
claro por proposiciones genéricas A y B. Además, representemos la operación
que realiza tiene contraste 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.
Veamos si se entiende: definí la función genérica xor, que tome dos booleanos y retorne
el valor de verdad correspondiente.
function xor(A,B){
return A!==B ;
}
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
¡Intentá resolverlo en una única función! Después vamos a ver cómo quedaría si
delegamos.
function sePuedeConcentrar(bebida,temp,prog){
return (bebida==="mate" && temp===80 && prog)||(bebida==="té"&&
temp>=95 && prog) ;
}
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
¡Intentá resolverlo en una única función! Después vamos a ver cómo quedaría si
delegamos.
function sePuedeConcentrar(bebida,temp,prog){
return (bebida==="mate" && temp===80 && prog)||(bebida==="té"&&
temp>=95 && prog) ;
}
function puedeSubirse(altura,compa,afección){
return (altura===1.5 || altura===1.20 && compa) && (!afección) ;
}
Supongamos que queremos representar al conjunto de nuestras series
favoritas. ¿Cómo podríamos hacerlo?
seriesFavoritasDeAna
seriesFavoritasDeHector
["hola","mundo!"]
["hola","hola"]
¿Acaso hay una cantidad máxima de elementos? ¡No, no hay límite! Las listas
pueden tener cualquier cantidad de elementos.
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?
numerosDeLoteria
salioCara
[[1, 2, 3], [4, 5, 6]]
let unaListaVacia = []
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.
longitud([])
longitud(numerosDeLoteria)
longitud([4, 3])
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:
function trasladar(unaLista,otraLista,numero){
remover(unaLista,numero) || agregar(otraLista,numero);
}
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:
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")
contiene([1, 6, 7, 6], 7)
true
contiene([1, 6, 7, 6], 6)
true
contiene([], 7)
false
contiene([8, 5], 7)
false
function contiene(unaLista,elemento) {
return posicion(unaLista,elemento) !==-1
}
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.
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.
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"
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í:
function saludar(personas) {
}}
PRIMEROS REGISTROS
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
Por ejemplo, podríamos almacenar un libro de modo que cada campo del
registro fuese alguna característica: su título, su autor, su fecha de
publicación, y más.
tajMahal
{ nombre: "Taj Mahal", locacion: "Agra, India", anioDeConstruccion: 1653 }
tajMahal.locacion
"Agra, India"
tajMahal.anioDeConstruccion
1653
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"
function temperaturaDePlaneta(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")
function moverArchivo(registro,nuevaRuta) {
registro.ruta = nuevaRuta ;
function esDelMilenioPasado(archivo){
return anio(archivo.creacion)<2000
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:
masDificilDeCocinar(flanCasero, cheesecake)
{ ingredientes: ["huevos", "leche", "azúcar", "vainilla"], tiempoDeCoccion: 50 }
if (longitud(postre1.ingredientes)>longitud(postre2.ingredientes)){return
postre1 } else {
return postre2;
}}
¡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 [].
function agregarAPostresRapidos(lista,postre)
if (postre.tiempoDeCoccion<=60)
agregar(lista,postre);
¿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 }
};
agregar(menu.postre.ingredientes, "azucar") ;
"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?".
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!
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([])
function gananciaTotal0(balancesDeUnPeriodo) {
let sumatoria = 0;
return sumatoria;
}
function gananciaTotal1(balancesDeUnPeriodo) {
let sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
return sumatoria;
}
¿Y si tuviera 2 elementos?
function gananciaTotal2(balancesDeUnPeriodo) {
let sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[1].ganancia;
return sumatoria;
}
¿Y si tuviera 3 elementos?
function gananciaTotal3(balancesDeUnPeriodo) {
let sumatoria = 0;
sumatoria = sumatoria + balancesDeUnPeriodo[0].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[1].ganancia;
sumatoria = sumatoria + balancesDeUnPeriodo[2].ganancia;
return sumatoria;
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;
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.
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 }
])
return cantidad;
}
Pasemos al siguiente requerimiento de Ana. Ya podemos calcular una
sumatoria de ganancias y también crear contadores, ahora vamos a calcular
promedios.
gananciaPromedio([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
9
function gananciaPromedio(balances){
return gananciaTotal(balances)/ longitud(balances)}
Viendo que podemos hacer todo lo que nos pide, Ana quiere saber la
ganancia promedio de los balances positivos.
Completá la función ganancias que toma una lista de balances y devuelve una lista que
solo posea solo las ganancias de cada uno.
ganancias([
{ mes: "enero", ganancia: 40 },
{ mes: "febrero", ganancia: 12 },
{ mes: "marzo", ganancia: 8}
])
[40, 12, 8]
function ganancias(balancesDeUnPeriodo) {
let gananciasLista = [];
for (let balance of balancesDeUnPeriodo) {
agregar (gananciasLista,balance.ganancia)
}
return gananciasLista
}
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?
return gananciasListas; }
Completá la función ganancias que toma una lista de balances y devuelve una lista que
solo posea solo las ganancias de cada uno.
ganancias([
{ mes: "enero", ganancia: 40 },
{ mes: "febrero", ganancia: 12 },
{ mes: "marzo", ganancia: 8}
])
[40, 12, 8]
function ganancias(balancesDeUnPeriodo) {
let gananciasLista = [];
for (let balance of balancesDeUnPeriodo) {
agregar (gananciasLista,balance.ganancia)
}
return gananciasLista
}
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));
}
maximaGanancia([
{ mes: "enero", ganancia: 87 },
{ mes: "febrero", ganancia: 12 },
{ mes: "marzo", ganancia: 8}
])
87
function maximaGanancia(balancesDeUnPeriodo)
{return maximo(ganancias(balancesDeUnPeriodo)) ;
}
minimaGananciaPositiva([
{ mes: "enero", ganancia: -40 },
{ mes: "febrero", ganancia: 42 },
{ mes: "marzo", ganancia: 8},
{ mes: "abril", ganancia: -5}
])
8
meses, la cual dada una lista con registros devuelve una lista de meses ;
afortunados, que filtra aquellos registros que tuvieron una ganancia
mayor a $1000 ;
mesesAfortunados, devuelve aquellos meses que fueron afortunados.
meses([
{ mes: "enero", ganancia: 870 },
{ mes: "febrero", ganancia: 1000 },
{ mes: "marzo", ganancia: 1020 },
{ mes: "abril", ganancia: 2300 },
{ mes: "mayo", ganancia: -10 }
])
["enero", "febrero", "marzo", "abril", "mayo"]
afortunados([
{ mes: "enero", ganancia: 870 },
{ mes: "febrero", ganancia: 1000 },
{ mes: "marzo", ganancia: 1020 },
{ mes: "abril", ganancia: 2300 },
{ mes: "mayo", ganancia: -10 }
])
[ { mes: "marzo", ganancia: 1020 }, { mes: "abril", ganancia: 2300 }]
mesesAfortunados([
{ mes: "enero", ganancia: 870 },
{ mes: "febrero", ganancia: 1000 },
{ mes: "marzo", ganancia: 1020 },
{ mes: "abril", ganancia: 2300 },
{ mes: "mayo", ganancia: -10 }
])
["marzo", "abril"]
function meses(balancesDeUnPeriodo) {
agregar(meses, balance.mes);
return meses;
function afortunados(balancesDeUnPeriodo){
if (balance.ganancia >1000){agregar(mesesAfortunados,balance)}
return mesesAfortunados;
function mesesAfortunados(balancesDeUnPeriodo){
return meses(afortunados(balancesDeUnPeriodo))
}