Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capítulo 1: Fundamentos.
1. Primeros Programas.
1. Escribimos una línea (renglón) que diga program, seguido de una llave de
apertura: {
2. A continuación, los comandos: uno por línea
3. Y finalmente, una última llave que cierra la que abrimos anteriormente }
Respuesta:
program {
Mover(Norte)
Mover(Norte)
Mover(Norte)
}
Respuesta:
program {
Mover(Sur)
Mover(Este)
Mover(Este)
}
Los humanos, solemos pensar en función del resultado final, es decir, resaltamos
el objetivo del programa. Nos importa más qué hace, y no cómo. Esta manera denotacional
nos llevaría a decir que, simplemente, mueve el cabezal al noreste.
Por eso hay varias formas de resolver un mismo problema: podemos crear varios programas
que hagan lo mismo (el qué), pero que lo hagan de forma diferente (el cómo).
Respuesta:
program {
Mover(Este)
Mover(Norte)
Si bien nunca vamos a querer que nuestro programa se rompa, es algo que
definitivamente te va a pasar muchas veces. Pero no es motivo para frustrarse ni mucho
menos, te aseguramos que a todo el mundo le pasó alguna vez (bueno, también 2, 3, 100,
800 veces...).
Respuesta:
program{
Mover(Sur)
}
Además de moverse, el cabezal también puede poner bolitas en la celda actual. Para eso
contamos con la operación Poner, que le dice al cabezal que deposite una bolita del color
dado:
Respuesta:
program{
Poner(Rojo)
}
Respuesta:
program {
Poner(Rojo)
Poner(Rojo)
Poner(Azul)
Poner(Verde)
Poner(Rojo)
}
Como te habrás dado cuenta, estos tableros son un poco mágicos, podemos poner en una
celda tantas bolitas como queramos: 2, 4, 12, 50, 1000. ¡No hay ningún límite!
Esto es algo muy interesante que ocurre al programar: podemos trabajar con cantidades tan
grandes como queramos.
Respuesta:
program{
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Negro)
Poner(Negro)
Poner(Negro)
}
Respuesta:
program {
Mover(Sur)
Sacar(Rojo)
}
Respuesta:
program{
Sacar(Verde)
}
Respuesta:
program{
Sacar(Azul)
Sacar(Verde)
Sacar(Negro)
Sacar(Rojo)
}
El siguiente programa coloca una bolita roja en la posición inicial y una negra al este.
Respuesta:
program {
Poner(Rojo)
Mover(Este)
Poner(Negro)
}
Creá un programa que ponga dos bolitas en la posición inicial, y otras dos en la celda de al
lado hacia el Este. Todas las bolitas deben ser rojas.
Respuesta:
program{
Poner(Rojo)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Poner(Rojo)
}
Creá un programa que a partir de un tablero vacío con el cabezal en el origen, dibuje una
linea de cuatro celdas hacia el Este. Las bolitas deben ser rojas y debe poner una bolita por
celda.
Respuesta:
program{
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
}
Usando las herramientas que ya conocés, creá un programa que dibuje una escalera azul
como la que se ve en la imagen. El cabezal empieza en el origen (o sea, en el borde Sur-
Oeste) y debe quedar en el extremo inferior derecho de la escalera.
Respuesta:
program{
Poner(Azul)
Mover(Norte)
Poner(Azul)
Mover(Norte)
Poner(Azul)
Mover(Sur)
Mover(Este)
Poner(Azul)
Mover(Sur)
Poner(Azul)
Mover(Este)
Poner(Azul)
}
Ejercicio 5: Portugal.
Como no nos vamos a poner tan quisquillosos, te vamos a pedir una versión simplificada de
la bandera de Portugal.
Respuesta:
program{
Poner(Verde)
Mover(Norte)
Poner(Verde)
Mover(Este)
Poner(Rojo)
Mover(Sur)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Mover(Norte)
Poner(Rojo)
}
Respuesta:
program{
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Norte)
Mover(Norte)
Poner(Azul)
Mover(Oeste)
Poner(Azul)
Mover(Oeste)
Poner(Azul)
Mover(Sur)
Poner(Rojo)
Mover(Norte)
Mover(Oeste)
Poner(Azul)
Mover(Oeste)
Poner(Azul)
Mover(Sur)
Mover(Sur)
}
Respuesta:
program{
Sacar(Verde)
Mover(Este)
Sacar(Verde)
Mover(Este)
Sacar(Verde)
Mover(Norte)
Sacar(Verde)
Mover(Norte)
Sacar(Verde)
Mover(Oeste)
Sacar(Verde)
Mover(Oeste)
Sacar(Verde)
Mover(Sur)
Sacar(Verde)
Mover(Sur)
}
Pasemos a algo un poco más difícil entonces. Te vamos a dar un tablero de 2x2 (o sea, con
4 celdas) donde cada una de ellas tiene una bolita roja.
Tu tarea es crear un programa que reemplace todas las bolitas rojas por verdes.
Respuesta:
program{
Sacar(Rojo)
Poner(Verde)
Mover(Este)
Sacar(Rojo)
Poner(Verde)
Mover(Norte)
Sacar(Rojo)
Poner(Verde)
Mover(Oeste)
Sacar(Rojo)
Poner(Verde)
Mover(Sur)
}
3. Procedimientos.
Respuesta:
Respuesta:
Continuar
Respuesta:
Continuar
Como viste en el ejemplo del cuadrado, se puede empezar a diferenciar dos tipos de
comandos dentro de un programa:
los que vienen definidos por el lenguaje y nos sirven para expresar operaciones
básicas, como Mover, Poner y Sacar. A estos los llamaremos comandos primitivos,
o simplemente primitivas;
y los que definimos nosotros, que nos sirven para expresar tareas más complejas.
Como el nombre de esta lección sugiere, estos son los procedimientos.
Prestale atención a la sintaxis del ejemplo para ver bien cómo definimos un procedimiento
y cómo lo invocamos en un program.
Respuesta:
Respuesta:
program{
PonerNegroYRojo()
}
A esta altura ya sabemos que para programar siempre tenemos que tener en cuenta la
sintaxis y que para definir nuevos procedimientos también tenemos reglas:
Y si lo queremos utilizar, tenemos que invocarlo dentro del program escribiendo su nombre
tal cual y sin olvidar los paréntesis ( ) ¡Prestá atención a la sintaxis!
Respuesta:
procedure Poner3Verdes() {
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
program{
Poner3Verdes()
}
Respuesta:
program{
Poner3Verdes()
Mover(Este)
Poner3Verdes()
}
Respuesta:
program{
Poner3Rojas()
Poner3Rojas()
Poner3Rojas()
}
Respuesta:
procedure Poner9Rojas(){
Poner3Rojas()
Poner3Rojas()
Poner3Rojas()
}
program{
Poner9Rojas()
}
Respuesta:
procedure DibujarPuntaNegra(){
Poner(Negro)
}
program{
DibujarPuntaNegra()
Mover(Norte)
DibujarPuntaNegra()
Mover(Sur)
Mover(Este)
DibujarPuntaNegra()
}
Respuesta:
procedure DibujarDosPuntas() {
DibujarPuntaNegra()
Mover(Norte)
Mover(Norte)
Mover(Este)
DibujarPuntaNegra()
}
program{
DibujarDosPuntas()
}
Respuesta:
procedure RojoAlBorde() {
IrAlBorde(Norte)
IrAlBorde(Oeste)
Poner(Rojo)
}
program{
RojoAlBorde()
}
Respuesta:
procedure PonerGuirnalda(){
Poner3Verdes()
Poner3Rojas()
}
procedure DecorarTablero(){
IrAlBorde(Norte)
IrAlBorde(Oeste)
PonerGuirnalda()
IrAlBorde(Norte)
IrAlBorde(Este)
PonerGuirnalda()
}
program{
DecorarTablero()
}
Respuesta:
procedure Color(){
Poner(Rojo)
Poner(Verde)
Poner(Negro)
Poner(Azul)
}
procedure DibujarLineaColorida(){
Color()
Mover(Este)
Color()
Mover(Este)
Color()
Mover(Este)
Color()
IrAlBorde(Oeste)
}
program{
DibujarLineaColorida()
}
Respuesta:
procedure DibujarCuadradoColorido(){
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
IrAlBorde(Sur)
}
program{
DibujarCuadradoColorido()
}
4. Repetición Simple.
Ejercicio 1: MoverOeste10.
Respuesta:
procedure MoverOeste10(){
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
}
Respuesta:
Respuesta:
procedure MoverOeste5(){
repeat(5){
Mover(Oeste)
}
}
Respuesta:
procedure Poner3AlNoreste(){
Mover(Norte)
Mover(Este)
repeat(3){
Poner(Negro)
}
}
Definí el procedimiento PonerAzulLejos(), que coloque una bolita Azul 4 celdas hacia el
Este
Respuesta:
procedure PonerAzulLejos(){
repeat(4){
Mover(Este)
}
Poner(Azul)
}
Respuesta:
procedure DibujarLineaNegra6(){
repeat(6){
Poner(Negro)
Mover(Este)
}
}
Respuesta:
procedure LineaRoja4() {
repeat(4) {
Poner(Rojo)
Mover(Norte)
}
}
Respuesta:
procedure Diagonal4Azul(){
repeat(4){
Poner(Azul)
Mover(Norte)
Mover(Este)
}
}
Respuesta:
procedure Bolitas(){
repeat(21){
Poner(Azul)
}
}
procedure DiagonalPesada4Azul(){
repeat(4){
Bolitas()
Mover(Norte)
Mover(Este)
}
Respuesta:
procedure LineaNegra4Este(){
repeat(3){
Poner(Negro)
Mover(Este)
}
Poner(Negro)
}
Respuesta:
procedure CuadradoNegro4(){
repeat(3){
LineaNegra4Este()
repeat(3){
Mover(Oeste)
}
Mover(Norte)
}
LineaNegra4Este()
}
5. Parámetros.
Respuesta:
procedure DibujarLineaNegra3(){
repeat(2){
Poner(Negro)
Mover(Este)
}
Poner(Negro)
VolverAtras()
}
program{
DibujarLineaNegra3()
}
Respuesta:
procedure DibujarCuadradoNegroDeLado3(){
repeat(2){
DibujarLineaNegra3()
Mover(Norte)
}
DibujarLineaNegra3()
}
program{
DibujarCuadradoNegroDeLado3()
}
Respuesta:
procedure DibujarLineaVerde3(){
repeat(2){
Poner(Verde)
Mover(Este)
}
Poner(Verde)
VolverAtras()
}
program{
DibujarLineaVerde3()
}
Respuesta:
procedure DibujarLineaRoja3(){
repeat(2){
Poner(Rojo)
Mover(Este)
}
Poner(Rojo)
VolverAtras()
}
procedure DibujarLineaAzul3(){
repeat(2){
Poner(Azul)
Mover(Este)
}
Poner(Azul)
VolverAtras()
}
Respuesta:
Creá un programa que ponga tres bolitas verdes pasando como parámetro el color Verde.
Respuesta:
program{
Poner3(Verde)
}
Ejercicio 7: DibujarLinea3.
Definí el procedimiento DibujarLinea3 que reciba un color y dibuje una línea de ese color.
Despreocupate por los programs para invocarlo con cada uno de los colores, van por nuestra
parte.
Respuesta:
procedure DibujarLinea3(color){
repeat(2){
Poner(color)
Mover(Este)
}
Poner(color)
VolverAtras()
}
Ejercicio 8: DibujarCuadradoDeLado3.
Respuesta:
procedure DibujarCuadradoDeLado3(color){
repeat(2){
DibujarLinea3(color)
Mover(Norte)
}
DibujarLinea3(color)
}
Creá un program que invoque la nueva versión de DibujarLinea3 (no tenés que definirla,
sólo invocarla) y dibuje un cuadrado multicolor, pasando como parámetros el Color y la
dirección.
Respuesta:
program{
DibujarLinea3(Verde, Este)
Mover(Este)
DibujarLinea3(Rojo, Norte)
Mover(Norte)
DibujarLinea3(Negro, Oeste)
Mover(Oeste)
DibujarLinea3(Azul, Sur)
}
Creá un programa cualquiera que invoque DibujarLinea3, pero esta vez intentá invocarlo
con los argumentos invertidos.
Respuesta:
program{
DibujarLinea3(Norte, Sur)
¿Qué crees que va a pasar si a un procedimiento le pasamos menos argumentos de los que
necesita?.
Respuesta:
program{
DibujarLinea3(Verde)
}
Para terminar esta lección vamos a definir un procedimiento llamado Triada ¡que recibe tres
parámetros!
Triada recibe tres colores por parámetro y pone tres bolitas, una al lado de la otra hacia el
Este, en el mismo orden en que se reciben. El cabezal empieza en el origen y debe terminar
sobre la última bolita de la tríada.
Respuesta:
Respuesta:
procedure Diagonal4AzulVolviendo(){
Diagonal4Azul()
repeat(4){
Mover(Oeste)
Mover(Sur)
}
}
Respuesta:
procedure BandaDiagonal4() {
repeat(3) {
Diagonal4AzulVolviendo()
Mover(Norte)
}
IrAlBorde(Sur)
}
Respuesta:
Respuesta:
procedure DiaDeLaMemoria(){
PonerN(24, Azul)
Mover(Este)
PonerN(3, Verde)
Mover(Este)
PonerN(1976, Negro)
}
Definí el procedimiento Fecha(dia, mes, anio), que recibe los tres valores correspondientes,
y escribe la fecha que representan, de esta manera:
Respuesta:
Resuesta:
Definí un procedimiento DibujarReloj(radio) que ponga los números del reloj como se
indica arriba: alrededor del casillero actual. El tamaño del reloj se indica con el radio que
recibís como parámetro: mientras más grande es el radio, más alejados están los números
del centro.
Respuesta:
procedure DibujarReloj(radio){
MoverN(radio,Norte)
PonerN(12,Rojo)
MoverN(radio,Este)
MoverN(radio,Sur)
PonerN(3,Rojo)
MoverN(radio,Oeste)
MoverN(radio,Sur)
PonerN(6,Rojo)
MoverN(radio,Oeste)
MoverN(radio,Norte)
PonerN(9,Rojo)
MoverN(radio,Este)
}
Respuesta:
Definí un procedimiento GuardaDe5(), que haga una "guarda" de 5 azulejos (como las que
decoran las paredes). Cada azulejo está conformado por 1 bolita verde, 5 negras y 9 rojas.
Respuesta:
procedure GuardaDe5(){
repeat(4){
PonerN(9, Rojo)
PonerN(5, Negro)
PonerN(1, Verde)
Mover(Este)
}
PonerN(1, Verde)
PonerN(5, Negro)
PonerN(9, Rojo)
}
Definí un procedimiento GuardaEnL() que haga una guarda en L como muestra la figura,
pero dejando el cabezal en la posición inicial.
Respuestas:
repeat(num){
Mover(dir)
PonerAzulejo()
}
}
procedure GuardaEnL(){
PonerAzulejo()
MoverAzulejo(2, Este)
MoverN(2, Oeste)
MoverAzulejo(2, Norte)
MoverN(2, Sur)
}
7. Expresiones.
Con esta idea e invocando PonerN, creá un programa que ponga cinco bolitas negras, PERO
sin escribir el número 5.
Respuesta:
program{
PonerN(3+2, Negro){
}
}
Respuesta:
Contamos con la información de cuántos micros, autos y bicicletas asistieron y desde allí
podemos hacer un cálculo siguiendo estas reglas:
Respuesta:
Respuesta:
Respuesta:
procedure CaminarDesconfiado(pasos){
MoverN(pasos div 2, Este)
}
Queremos definir un procedimiento que nos sirva para poner una bolita al lado de donde se
encuentre el cabezal, dejándolo en la posición original.
Respuesta:
Respuesta:
Respuesta:
procedure Ele(direccion){
Linea(direccion, Azul, 3)
Linea(siguiente(direccion), Azul, 3)
}
Respuesta:
Respuesta:
procedure Flecha(direccion){
Mover(previo(direccion))
Poner(Rojo)
Mover(siguiente(direccion))
Mover(siguiente(direccion))
Poner(Rojo)
Mover(previo(direccion))
Mover(siguiente(direccion))
Mover(previo(direccion))
Mover(direccion)
Poner(Rojo)
Mover(opuesto(direccion))
}
na tarea que seguro tenemos que hacer es poner muchas bolitas, y para eso ya sabemos que
existe el procedimiento PonerN que construimos varios ejercicios atrás. El color de las
bolitas que tenemos que poner también lo sabemos: Rojo, pero... ¿cómo sabemos cuántas
poner?
Respuesta:
procedure CopiarVerdesEnRojas() {
PonerN(nroBolitas(Verde), Rojo)
}
Siguiendo con esto de contar las bolitas, te toca ahora definir un procedimiento que sirva
para sacar todas las bolitas de un color.
Definí SacarTodas(color), que recibe un color y saca todas las bolitas que hay de ese color
(no debe hacer nada con el resto de los colores).
Respuesta:
procedure SacarTodas(color){
SacarN(nroBolitas(color), color)
}
8. Alternativa Condicional.
Respuesta:
Respuesta:
Modificá el procedimiento que te dimos para que saque una bolita roja, sólo si hay alguna.
Respuesta:
procedure SacarRojoConMiedo() {
if(hayBolitas(Rojo)){
Sacar(Rojo)
}
}
Respuesta:
procedure CompletarCelda(){
if(hayBolitas(Negro)){
Poner(Rojo)
Poner(Azul)
Poner(Verde)
}
}
Respuesta:
program{
if(puedeMover(Este)){
Mover(Este)
}
}
Otra cosa que se puede hacer adentro de un if es comparar números, como seguramente
alguna vez hiciste en matemática.
Por suerte, esto se escribe en Gobstones igual que en la matemática tradicional, con
un < para el menor y un > para el mayor. Ejemplo: nroBolitas(Verde) > 5 nos indica si hay
más de 5 bolitas verdes.
Sabiendo esto, intentá crear un programa que ponga 1 bolita negra sólo si hay menos de 5
bolitas negras.
Respuesta:
program{
if(nroBolitas(Negro) < 5){
Poner(Negro)
}
}
Respuesta:
procedure AsegurarUnaBolitaVerde(){
if(not hayBolitas(Verde)){
Poner(Verde)
}
}
Respuesta:
Respuesta:
procedure PrenderOApagarLuz(){
if(hayBolitas(Negro)){
Sacar(Negro)
Poner(Verde)
} else {
Sacar(Verde)
Poner(Negro)
}
}
9. Funciones.
Tienes que leer por varios minutos e interpretar el código y tratar de entenderlo.
Respuesta:
Funciones en Gobstone,
Respuesta:
Respuesta:
procedure MoverSegunBolitas() {
if (nroBolitasTotal() > 10) {
Mover(Este)
} else {
Mover(Norte)
}
}
Ejercicio 4: todasExcepto.
Definí la función todasExcepto para que retorne la cantidad de bolitas que no sean del color
que se le pasa por parámetro.
Respuesta:
function todasExcepto(color){
return (nroBolitasTotal()-nroBolitas(color))
}
Respuesta:
function rojoEsDominante(){
return (nroBolitas(Rojo)>todasExcepto(Rojo))
}
Ejercicio 6: En libertad.
Existe el operador && que sirve justamente para eso: toma dos expresiones booleanas y
devuelve True solo si ambas son verdaderas. Si sabés algo de lógica, esto es lo que
comunmente se denomina conjunción y se lo suele representar con el símbolo ∧.
Definí la función esLibreCostados() que indique si el cabezal puede moverse tanto al Este
como al Oeste.
Respuesta:
function esLibreCostados(){
return(puedeMover(Este) && puedeMover(Oeste))
A diferencia del ejercicio anterior, lo que queremos saber es si alguna de ellas es verdadera,
por lo tanto hay que usar otro operador: la disyunción, que se escribe | | y retorna verdadero
si al menos alguna de las dos preguntas es verdadera.
Tanto && como | | pueden usarse varias veces sin la necesidad de usar paréntesis, siempre y
cuando tengan expresiones booleanas a ambos lados.
Respuesta:
function hayAlgunaBolita(){
return(hayBolitas(Verde) || hayBolitas(Azul) || hayBolitas(Rojo) ||
hayBolitas(Negro))
}
Con la ayuda de esa tablita, definí la función estoyEnUnBorde() que determine si el cabezal
está parado en algún borde.
Respuesta:
function estoyEnUnBorde(){
return(not puedeMover(Norte) || not puedeMover(Sur) || not
puedeMover(Este) || not puedeMover(Oeste))
}
Vamos a ver ahora funciones que hacen cosas antes de retornar un resultado. Para
ejemplificar esto, vamos a querer que definas una función que nos diga si hay una bolita de
un color específico, pero en la celda de al lado.
Definí la función hayBolitasAl(direccion, color) que informe si hay alguna bolita del color
especificado en la celda vecina hacia la dirección dada.
Respuesta:
function hayBolitasAl(direccion,color){
Mover(direccion)
return(hayBolitas(color))
}
Hagamos la prueba: vamos a probar la función hayBolitasAl del ejercicio anterior con casos
donde no pueda moverse el cabezal. Presioná Enviar y mirá el resultado.
Respuesta:
Presioná Enviar
Respuesta:
function hayBolitasLejosAl(direccion,color,distancia) {
MoverN(distancia,direccion)
return(hayBolitas(color))
}
Decimos que el cabezal "está rodeado" si hay bolitas de ese color en las cuatro direcciones:
Norte, Este, Sur y Oeste.
Respuesta:
function estoyRodeadoDe(color) {
return (hayBolitasAl(Norte, color) && hayBolitasAl(Este, color) &&
hayBolitasAl(Sur, color) && hayBolitasAl(Oeste, color))
}
Para cerrar, vamos a definir la función hayLimite(), que determina si hay algún tipo de
límite a la hora de mover el cabezal.
El límite puede ser por alguno de dos factores: porque estoy en un borde y entonces no me
puedo mover en alguna dirección, o porque estoy rodeado de bolitas rojas que me cortan
el paso. Si ocurre alguna de esas dos condiciones, quiere decir que hay un límite.
Respuesta:
function hayLimite(){
return (estoyEnUnBorde() || estoyRodeadoDe(Rojo))
}
Veamos si se va entendiendo: escribí ahora una función JavaScript mitad, que tome un
número y devuelva su mitad. Tené en cuenta que el operador de división en JavaScript es /.
Respuesta:
function mitad(numero){
return(1/2*numero)
}
Respuesta:
function anterior(numero){
return(numero - 1)
}
function triple(numero){
return(numero * 3)
}
function anteriorDelTriple(numero){
return(anterior(triple(numero)))
}
4 + 5
Math.round(4.5)
funcionMisteriosa(1, 2, 3) (ya la declaramos por vos y la podés usar)
Respuesta:
Math.round(4.4)
Math.round(4.6)
Math.max(4, 7)
Math.min(4, 7)
Respuesta:
Respuesta:
¡Ahora te toca a vos! Dani también dice que a alguien leGustaLeer, cuando la cantidad de
libros que recuerda haber leído es mayor a 20.
Respuesta:
function leGustaLeer(unNumero){
return(unNumero > 20)
}
Ejercicio 8: Booleanos.
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.
Respuesta:
Veamos si queda claro: escribí la función esFinDeSemana que tome un string que
represente el nombre de un día de la semana, y nos diga si es "sábado" o "domingo".
Respuesta:
function esFinDeSemana(dia){
return(dia === "sábado" || dia === "domingo")
}
Veamos si queda claro: escribí una función longitudNombreCompleto, que tome un nombre
y un apellido, y devuelva su longitud total, contando un espacio extra para separar a ambos.
Respuesta:
Escribí la función gritar. Te dejamos para que uses la función convertirEnMayuscula, que,
ehm... bueno... básicamente convierte en mayúsculas un string .
Respuesta:
function gritar(palabra){
return("¡" + convertirEnMayuscula(palabra) + "!")
}
Ninguna introducción al lenguaje JavaScript estaría completa sin mostrar al menos una
estructura de control que ya conocemos: la alternativa condicional.
Veamos si se entiende: escribí una función maximo, que funcione como Math.max (¡no vale
usarla!) y devuelva el máximo entre dos números. Por ejemplo, el máximo entre 4 y 5 es 5,
y el máximo entre 10 y 4, es 10.
Respuesta:
1 si el número es positivo.
0 si el número es cero.
-1 si el número es negativo.
Respuesta:
Respuesta:
function esNumeroDeLaSuerte(numero) {
return (numero)>0 && (numero)<100 && (numero!=15);
}
El jurado de un torneo nos pidió que desarrollemos una función medallaSegunPuesto que
devuelva la medalla que le corresponde a los primeros puestos, según la siguiente lógica:
Respuesta:
function medallaSegunPuesto(lugar){
if(lugar === 1){
return("oro")
} else if(lugar === 2) {
return("plata")
} else if(lugar === 3) {
return("bronce")
} else {
return("nada")
}
}
Además, existen operaciones que sirven para todos los tipos de datos, por ejemplo:
Respuesta:
Probar en la consola
Respuesta:
4 + 4 vale 8
Escribí una función cuantoCuesta que tome el número de pulgadas del monitor y la cantidad
de memoria, y calcule el costo estimado de nuestra computadora.
Respuesta:
Respuesta:
function meConviene(pulgada,memoria){
return (cuantoCuesta(pulgada,memoria) < 6000 && pulgada >= 32 && memoria >=
8);
}
Ejercicio 3: Triangulos.
¡Hora de hacer un poco de geometría! Queremos saber algunas cosas sobre un triángulo:
Respuesta:
Ejercicio 4: Cuadrados.
Respuesta:
function perimetroCuadrado(lado) {
return (lado * 4)
}
function areaCuadrado(lado) {
return (lado * lado)
}
Desarrollá una función estaAfinado, que reciba la frecuencia (un número) del la central, y
diga si dicha frecuencia es igual a 440Hz.
Respuesta:
function estaAfinado(frecuencia){
return (frecuencia === 440)
}
Ahora queremos saber si el la central del piano está cerca de estar afinado. Esto ocurre
cuando está entre 437Hz y 443Hz, pero NO es exactamente 440Hz.
Respuesta:
function estaCerca(frecuencia){
return (437 <= frecuencia && frecuencia <= 443 && frecuencia !== 440)
}
Ejercicio 7: Cartelitos.
Respuesta:
Respuesta:
Respuesta:
Escribí una función decisionConMoneda, que toma tres parámetros y devuelve el segundo
si el primero es "cara", o el tercero, si sale "ceca".
Respuesta:
Queremos saber el valor de las cartas de truco cuando jugamos al envido. Sabemos que:
Escribí una función valorEnvido, que tome un número de carta y devuelva su valor de
envido.
Respuesta:
function valorEnvido(carta){
if(carta >= 1 && carta <= 7)
{return carta}
if(carta >= 10 && carta <= 12)
{return 0}
}
Bueno, ehm, no, pará, primero queremos calcular cuántos puntos de envido suma un
jugador. Sabemos que:
Si las dos cartas son del mismo palo, el valor del envido es la suma de sus valores
de envido más 20.
De lo contrario, el valor del envido es el mayor valor de envido entre ellas.
Respuesta:
Cuando se juega al truco, los equipos oponentes alternativamente pueden subir la apuesta.
Por ejemplo, si un jugador canta truco, otro jugador puede cantarle retruco. Obviamente,
los puntos que están en juego son cada vez mayores:
Escribí la función valorCantoTruco, que tome el canto y devuelva cuántos puntos vale.
Respuesta:
function valorCantoTruco(canto){
if(canto === "truco"){
return(2)
}
if(canto === "retruco"){
return(3)
}
if(canto === "vale cuatro"){
return(4)
}
}
3. Variables y Procedimientos.
Ejercicio 1: ¿Y el tablero?.
Respuesta:
funcionMisteriosa(2, 1)
Respuesta:
Veamos si va quedando claro, escribí una function versosMartinFierro que imprima por
pantalla los primeros versos del Martín Fierro:
Respuesta:
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
}
Respuesta:
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?.
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!");
Respuesta:
imprimir("Tirando dados");
imprimir("La primera tirada dio " + tirarDado());
imprimir("La segunda tirada dio " + tirarDado());
imprimir("La tercera tirada dio " + tirarDado());
Ejercicio 6: Coerciones.
Veamos si queda claro, escribí una función elefantesEquilibristas, que tome un número de
elefantes y devuelva una rima de una conocida canción "3 elefantes se balanceaban".
Respuesta:
function elefantesEquilibristas(numero){
return(numero + " " + "elefantes se balanceaban")
}
Respuesta:
function perimetroCirculo(radio){
return(3.14159265358979 * 2 * radio)
}
function areaCirculo(radio) {
return(3.14159265358979 * radio * radio)
}
let pi = 3.14159265358979;
Cambiá los lugares donde aparece 3.14159265358979 por la variable pi en las funciones
que tenemos definidas.
Respuesta:
let pi = 3.14159265358979;
function perimetroCirculo(radio){
return(pi * 2 * radio)
}
function areaCirculo(radio) {
return(pi * radio * radio)
}
Ya que vas entendiendo cómo se asignan las variables, te traemos algo para pensar: ¿qué
pasa si intento usar una variable a la que nunca le asigné un valor?
Respuesta:
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.
Respuesta:
Respuesta:
function aumentarFortuna(){
pesosEnMiBilletera = pesosEnMiBilletera * 2
}
Vimos que una variable solo puede tener un valor, entonces cada vez que le asignamos uno
nuevo, perdemos el anterior.
Respuesta:
20
4. Lógica booleana.
Empecemos por algo sencillo, ¿te acordás del operador ! ? Se lo denomina negación, not o
complemento lógico y sirve para negar un valor booleano.
Definí el procedimiento usarCierre para que podamos abrir y cerrar el cierre de una
mochila.
Respuesta:
Respuesta:
function esMayorDeEdad(edad){
return(edad >= 18)
}
function esMenorDeEdad(edad){
return(!esMayorDeEdad(edad))
}
Definí una función esPeripatetico que tome la profesión de una persona, su nacionalidad y
la cantidad de kilómetros que camina por día. Alguien es peripatético cuando es un filósofo
griego y le gusta pasear (camina más de 2 kilómetros por día).
Respuesta:
Respuesta:
Probar en consola:
consumePocaEnergia(24, 5)
consumePocaEnergia(24, 0)
consumePocaEnergia(21, 7)
consumePocaEnergia(18, 1)
Respuesta:
Probar en la consola:
gano(true, 25)
gano(false, 30)
gano(false, 20)
gano(true, 31)
Es feriado, o
Es fin de semana, o
No estamos dentro del horario bancario.
Respuesta:
Ahora te toca a vos definir la función sonMediosHermanos. Recordá que los medios
hermanos pueden compartir madre o padre pero no ambos porque... ¡en ese caso serían
hermanos!
Respuesta:
Respuesta:
sonMediosHermanos(arcadio, aurelianoJose)
sonMediosHermanos(aurelianoSegundo, remedios)
sonMediosHermanos(aurelianoJose, remedios)
A diferencia del and, or y not, el xor no suele estar definido en los lenguajes. Sin embargo,
ahora que sabés cómo funciona, si alguna vez lo necesitás podés definirlo a mano.
Veamos si se entiende: definí la función genérica xor, que tome dos booleanos y devuelva
el valor de verdad correspondiente.
Respuesta:
Cuando una expresión matemática tiene varios operadores, sabemos que las
multiplicaciones y divisiones se efectuarán antes que las sumas y las restas:
5 * 3 + 8 / 4 - 3 = 14
Al igual que en matemática, cuando usamos operadores lógicos las expresiones se evalúan
en un orden determinado llamado precedencia.
Respuesta:
Escribí la función puedeJubilarse que recibe la edad y el sexo de una persona, además de los
años de aportes jubilatorios que posee.
El mínimo de edad para realizar el trámite para las mujeres es de 60 años, mientras que para
los hombres es 65. En ambos casos, se deben contar con al menos 30 años de aportes.
¡Intentá resolverlo en una única función! Después vamos a ver cómo quedaría si delegamos.
Respuesta:
Alcanzar la altura mínima de 1.5m (o 1.2m si está acompañada por una persona
adulta).
No tener ninguna afección cardíaca.
Definí la función de 3 parámetros puedeSubirse que recibe una altura de una persona en
metros, si está acompañada y si tiene alguna afección cardíaca.
Respuesta:
5. Listas.
Para representar a un conjunto de strings, colocamos todos esos strings que nos interesan,
entre corchetes ([ y ]) separados por comas. Fácil, ¿no?.
Respuesta:
seriesFavoritasDeAna
seriesFavoritasDeHector
["hola","mundo!"]
["hola","hola"]
Lo que acabamos de ver es cómo modelar fácilmente conjuntos de cosas. Mediante el uso
de[], en JavaScript contamos con una manera simple de agrupar esos elementos en listas.
¿Acaso hay una cantidad máxima de elementos? ¡No, no hay límite! Las listas pueden tener
cualquier cantidad de elementos.
Respuesta:
personas
Respuesta:
numerosDeLoteria
salioCara
Genial, ¡parece que una lista puede contener cualquier tipo de elemento! Podemos tener
listas de booleanos, de números, de strings, de listas...
Y no sólo eso, sino que además pueden contener cualquier cantidad de elementos: uno, dos,
quince, cientos.
¿Podremos entonces tener listas vacías, es decir, que no tengan elementos? ¡Por supuesto!
let unaListaVacia = []
Respuesta:
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.
Respuesta:
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.
Como vemos, agregar suma un elemento a la lista, lo cual hace que su tamaño aumente.
¿Pero en qué parte de la lista lo agrega? ¿Al principio? ¿Al final? ¿En el medio?.
Además existe un procedimiento remover, que sólo recibe la lista por parámetro. Investigá
en la consola qué hace.
Respuesta:
Probar en la consola
Ejercicio 7: Trasladar.
Declará un procedimiento trasladar, que tome dos listas, saque el último elemento de la
primera y lo agregue a la segunda.
Respuesta:
¿Y qué sucede si le pasás por parámetro a posicion un elemento que no tiene? ¡Averigualo
vos mismo!
Respuesta:
posicion(diasLaborales, "osvaldo")
Ejercicio 9: Contiene.
Escribí la función contiene que nos diga si una lista contiene un cierto elemento.
Si venís prestando atención a los ejemplos de consulta, habrás notado que las listas también
pueden tener elementos duplicados: [1, 2, 1], ["hola", "hola"], etc.
Por tanto, posicion en realidad devuelve la posición de la primera aparición del elemento
en la lista.
Respuesta:
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.
Respuesta:
lista[0]
Te recordamos qué hace la función: tiene que devolver la medalla que le corresponde a los
primeros puestos de una competencia.
Respuesta:
function medallaSegunPuesto(puesto){
if(puesto <= 3){
return(medalla[puesto])
} else {
return(medalla[0])
}
}
Vamos a conocer una manera de recorrer los elementos de una lista con un nuevo amigo: el
bucle for.
Respuesta:
function saludar(personas){
for(let persona1 of personas){
imprimir("hola" + " " + persona1);
}
}
6. Registros.
Respuesta:
estatuaDeLaLibertad
cristoRedentor
torreEiffel
tajMahal
coliseo
Respuesta:
Declaramos los planetas mercurio, marte y saturno como registros con la siguiente
información: nombre, temperaturaPromedio y si tieneAnillos. ¡Probalos en la consola!
Respuesta:
Respuesta:
function temperaturaDePlaneta(planeta){
return(planeta.nombre + " tiene una temperatura promedio de " +
planeta.temperaturaPromedio + " grados")
}
Respuesta:
Respuesta:
function esDelMilenioPasado(archivo){
return(anio(archivo.creacion) < 2000)
}
Creá una función masDificilDeCocinar, que recibe dos registros de postres por parámetros y
devuelve el que tiene más ingredientes de los dos.
Respuesta:
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 [ ].
Respuesta:
Probar en consola:
postresFavoritos
monumentosDeAmerica
Respuesta:
Averiguá qué devuelve el campo ingredientes del campo postre del registro menuInfantil.
¡Está un registro adentro del otro!
Respuesta:
Probar en consola
menuInfantil.postre.ingredientes
Respuesta:
function endulzarMenu(menu){
agregar(menu.postre.ingredientes, "azúcar")
return menu.postre
}
7. Recorridos.
¡Probala en la consola!
Respuesta:
Probar en la consola:
gananciaSemestre
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!
Respuesta:
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 3 }
])
Respuesta:
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
}
Lo que tenemos que hacer, entonces, es repetir la operación de acumular varias veces, una
por cada elemento de la lista. ¡Digamos hola (nuevamente) al for...of!
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.
Respuesta:
gananciaTotal([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
¡Ana tiene nuevos requirimientos! Ahora nos pidió lo siguiente: "Quiero saber cuántos
balances fueron positivos, es decir, aquellos en los que la ganancia fue mayor a cero".
Respuesta:
function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0
for(let balance of balancesDeUnPeriodo){
cantidad = cantidad + ((balance.ganancia) > 0)
}
return cantidad;
}
Respuesta:
function gananciaPromedio(gananciaTotal){
let sumatoria = 0
for(let balance of gananciaTotal){
sumatoria = (sumatoria + balance.ganancia)
}
return sumatoria / longitud (gananciaTotal)
}
Viendo que podemos hacer todo lo que nos pide, Ana quiere saber la ganancia promedio de
los balances positivos.
Respuesta:
function gananciaPositiva(balancesDeUnPeriodo){
let sumatoria = 0
for(let balance of balancesDeUnPeriodo){
if(balance.ganancia > 0){
sumatoria = sumatoria + (balance.ganancia)
}
}
return sumatoria
}
function promedioGananciasPositivas(balancesDeUnPeriodo){
return gananciaPositiva(balancesDeUnPeriodo) /
cantidadDeBalancesPositivos(balancesDeUnPeriodo)
}
Completá la función ganancias que toma una lista de balances y devuelve una lista que solo
posea solo las ganancias de cada uno.
Respuesta:
function ganancias(balancesDeUnPeriodo){
let ganancias = []
for(let balance of balancesDeUnPeriodo){
agregar(ganancias, balance.ganancia)
}
return ganancias
}
Con la programación se puede hacer cualquier cosa, o casi . Ya hicimos una función para
poder saber la cantidad de balances positivos (cantidadDeBalancesPositivos), ahora vamos
a ver cómo podemos hacer para saber cuáles son esos balances.
Completá la función balancesPositivos que toma los balances de un período y devuelve una
lista con aquellos cuya ganancia fue mayor a cero.
Respuesta:
function balancesPositivos(balancesDeUnPeriodo){
let balances = []
for(let balance of balancesDeUnPeriodo){
if(balance.ganancia > 0){
agregar(balances, balance)
}
}
return balances
}
Respuesta:
function gananciasDeBalancesPositivos(balancesDeUnPeriodo){
return ganancias(balancesPositivos(balancesDeUnPeriodo))
}
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo))
}
Vamos a conocer una nueva función, maximo, que nos permite conocer cuál es el mayor
valor en una lista de números.
Usando esta nueva función, definí la función maximaGanancia que nos diga cuál es la
ganancia más alta entre los balances de un período de tiempo.
Respuesta:
function maximaGanancia(balancesDeUnPeriodo){
return maximo(ganancias(balancesDeUnPeriodo))
}
Definí la función minimaGananciaPositiva que nos diga cuál es la ganancia más baja de
todos los balances positivos.
Respuesta:
function minimaGananciaPositiva(balancesDeUnPeriodo){
return minimo(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
meses, la cual dada una lista con registros devuelve una lista de meses;
afortunados, que filtra aquellos registros que tuvieron una ganancia mayor a $1000;
mesesAfortunados, devuelve aquellos meses que fueron afortunados.
Respuesta:
Veamos si se va entendiendo: escribí ahora una función JavaScript mitad, que tome un
número y devuelva su mitad. Tené en cuenta que el operador de división en JavaScript es /.
Respuesta:
function mitad(numero){
return(1/2*numero)
}
Respuesta:
function anterior(numero){
return(numero - 1)
}
function triple(numero){
return(numero * 3)
}
function anteriorDelTriple(numero){
return(anterior(triple(numero)))
}
4 + 5
Math.round(4.5)
funcionMisteriosa(1, 2, 3) (ya la declaramos por vos y la podés usar)
Respuesta:
Math.round(4.4)
Math.round(4.6)
Math.max(4, 7)
Math.min(4, 7)
Respuesta:
Respuesta:
¡Ahora te toca a vos! Dani también dice que a alguien leGustaLeer, cuando la cantidad de
libros que recuerda haber leído es mayor a 20.
Respuesta:
function leGustaLeer(unNumero){
return(unNumero > 20)
}
Ejercicio 8: Booleanos.
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.
Respuesta:
Veamos si queda claro: escribí la función esFinDeSemana que tome un string que
represente el nombre de un día de la semana, y nos diga si es "sábado" o "domingo".
Respuesta:
function esFinDeSemana(dia){
return(dia === "sábado" || dia === "domingo")
}
Veamos si queda claro: escribí una función longitudNombreCompleto, que tome un nombre
y un apellido, y devuelva su longitud total, contando un espacio extra para separar a ambos.
Respuesta:
Escribí la función gritar. Te dejamos para que uses la función convertirEnMayuscula, que,
ehm... bueno... básicamente convierte en mayúsculas un string .
Respuesta:
function gritar(palabra){
return("¡" + convertirEnMayuscula(palabra) + "!")
}
Ninguna introducción al lenguaje JavaScript estaría completa sin mostrar al menos una
estructura de control que ya conocemos: la alternativa condicional.
Veamos si se entiende: escribí una función maximo, que funcione como Math.max (¡no vale
usarla!) y devuelva el máximo entre dos números. Por ejemplo, el máximo entre 4 y 5 es 5,
y el máximo entre 10 y 4, es 10.
Respuesta:
1 si el número es positivo.
0 si el número es cero.
-1 si el número es negativo.
Respuesta:
Respuesta:
function esNumeroDeLaSuerte(numero) {
return (numero)>0 && (numero)<100 && (numero!=15);
}
El jurado de un torneo nos pidió que desarrollemos una función medallaSegunPuesto que
devuelva la medalla que le corresponde a los primeros puestos, según la siguiente lógica:
Respuesta:
function medallaSegunPuesto(lugar){
if(lugar === 1){
return("oro")
} else if(lugar === 2) {
return("plata")
} else if(lugar === 3) {
return("bronce")
} else {
return("nada")
}
}
Además, existen operaciones que sirven para todos los tipos de datos, por ejemplo:
Respuesta:
Probar en la consola
Respuesta:
4 + 4 vale 8
Escribí una función cuantoCuesta que tome el número de pulgadas del monitor y la cantidad
de memoria, y calcule el costo estimado de nuestra computadora.
Respuesta:
Respuesta:
function meConviene(pulgada,memoria){
return (cuantoCuesta(pulgada,memoria) < 6000 && pulgada >= 32 && memoria >=
8);
Ejercicio 3: Triangulos.
¡Hora de hacer un poco de geometría! Queremos saber algunas cosas sobre un triángulo:
Respuesta:
Ejercicio 4: Cuadrados.
Respuesta:
function perimetroCuadrado(lado) {
return (lado * 4)
}
function areaCuadrado(lado) {
return (lado * lado)
}
Desarrollá una función estaAfinado, que reciba la frecuencia (un número) del la central, y
diga si dicha frecuencia es igual a 440Hz.
Respuesta:
function estaAfinado(frecuencia){
return (frecuencia === 440)
Ahora queremos saber si el la central del piano está cerca de estar afinado. Esto ocurre
cuando está entre 437Hz y 443Hz, pero NO es exactamente 440Hz.
Respuesta:
function estaCerca(frecuencia){
return (437 <= frecuencia && frecuencia <= 443 && frecuencia !== 440)
}
Ejercicio 7: Cartelitos.
Respuesta:
Respuesta:
Respuesta:
Escribí una función decisionConMoneda, que toma tres parámetros y devuelve el segundo
si el primero es "cara", o el tercero, si sale "ceca".
Respuesta:
Queremos saber el valor de las cartas de truco cuando jugamos al envido. Sabemos que:
Escribí una función valorEnvido, que tome un número de carta y devuelva su valor de
envido.
Respuesta:
function valorEnvido(carta){
if(carta >= 1 && carta <= 7)
{return carta}
if(carta >= 10 && carta <= 12)
{return 0}
}
Bueno, ehm, no, pará, primero queremos calcular cuántos puntos de envido suma un
jugador. Sabemos que:
Si las dos cartas son del mismo palo, el valor del envido es la suma de sus valores
de envido más 20.
De lo contrario, el valor del envido es el mayor valor de envido entre ellas.
Respuesta:
Cuando se juega al truco, los equipos oponentes alternativamente pueden subir la apuesta.
Por ejemplo, si un jugador canta truco, otro jugador puede cantarle retruco. Obviamente,
los puntos que están en juego son cada vez mayores:
Escribí la función valorCantoTruco, que tome el canto y devuelva cuántos puntos vale.
Respuesta:
function valorCantoTruco(canto){
if(canto === "truco"){
return(2)
}
if(canto === "retruco"){
return(3)
}
if(canto === "vale cuatro"){
return(4)
}
}
3. Variables y Procedimientos.
Ejercicio 1: ¿Y el tablero?.
Respuesta:
funcionMisteriosa(2, 1)
Respuesta:
Veamos si va quedando claro, escribí una function versosMartinFierro que imprima por
pantalla los primeros versos del Martín Fierro:
Respuesta:
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
}
Respuesta:
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?.
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!");
Respuesta:
imprimir("Tirando dados");
imprimir("La primera tirada dio " + tirarDado());
imprimir("La segunda tirada dio " + tirarDado());
imprimir("La tercera tirada dio " + tirarDado());
Ejercicio 6: Coerciones.
Veamos si queda claro, escribí una función elefantesEquilibristas, que tome un número de
elefantes y devuelva una rima de una conocida canción "3 elefantes se balanceaban".
Respuesta:
function elefantesEquilibristas(numero){
return(numero + " " + "elefantes se balanceaban")
}
Respuesta:
function perimetroCirculo(radio){
return(3.14159265358979 * 2 * radio)
}
function areaCirculo(radio) {
return(3.14159265358979 * radio * radio)
}
let pi = 3.14159265358979;
Cambiá los lugares donde aparece 3.14159265358979 por la variable pi en las funciones
que tenemos definidas.
Respuesta:
let pi = 3.14159265358979;
function perimetroCirculo(radio){
return(pi * 2 * radio)
}
function areaCirculo(radio) {
return(pi * radio * radio)
}
Ya que vas entendiendo cómo se asignan las variables, te traemos algo para pensar: ¿qué
pasa si intento usar una variable a la que nunca le asigné un valor?
Respuesta:
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.
Respuesta:
Respuesta:
function aumentarFortuna(){
pesosEnMiBilletera = pesosEnMiBilletera * 2
}
Vimos que una variable solo puede tener un valor, entonces cada vez que le asignamos uno
nuevo, perdemos el anterior.
Respuesta:
20
4. Lógica booleana.
Empecemos por algo sencillo, ¿te acordás del operador ! ? Se lo denomina negación, not o
complemento lógico y sirve para negar un valor booleano.
Definí el procedimiento usarCierre para que podamos abrir y cerrar el cierre de una
mochila.
Respuesta:
Respuesta:
function esMayorDeEdad(edad){
return(edad >= 18)
}
function esMenorDeEdad(edad){
return(!esMayorDeEdad(edad))
}
Definí una función esPeripatetico que tome la profesión de una persona, su nacionalidad y
la cantidad de kilómetros que camina por día. Alguien es peripatético cuando es un filósofo
griego y le gusta pasear (camina más de 2 kilómetros por día).
Respuesta:
Respuesta:
Probar en consola:
consumePocaEnergia(24, 5)
consumePocaEnergia(24, 0)
consumePocaEnergia(21, 7)
consumePocaEnergia(18, 1)
Respuesta:
Probar en la consola:
gano(true, 25)
gano(false, 30)
gano(false, 20)
gano(true, 31)
Es feriado, o
Es fin de semana, o
No estamos dentro del horario bancario.
Respuesta:
Ahora te toca a vos definir la función sonMediosHermanos. Recordá que los medios
hermanos pueden compartir madre o padre pero no ambos porque... ¡en ese caso serían
hermanos!
Respuesta:
}
function tienenElMismoPadre(hijo1, hijo2){
let padre1 = padreDe(hijo1);
let padre2 = padreDe(hijo2);
return padre1 === padre2;
}
function sonMediosHermanos(hijo1, hijo2){
return (tienenLaMismaMadre(hijo1, hijo2) !== tienenElMismoPadre(hijo1,
hijo2));
}
Respuesta:
sonMediosHermanos(arcadio, aurelianoJose)
sonMediosHermanos(aurelianoSegundo, remedios)
sonMediosHermanos(aurelianoJose, remedios)
A diferencia del and, or y not, el xor no suele estar definido en los lenguajes. Sin embargo,
ahora que sabés cómo funciona, si alguna vez lo necesitás podés definirlo a mano.
Veamos si se entiende: definí la función genérica xor, que tome dos booleanos y devuelva
el valor de verdad correspondiente.
Respuesta:
Cuando una expresión matemática tiene varios operadores, sabemos que las
multiplicaciones y divisiones se efectuarán antes que las sumas y las restas:
5 * 3 + 8 / 4 - 3 = 14
Al igual que en matemática, cuando usamos operadores lógicos las expresiones se evalúan
en un orden determinado llamado precedencia.
Respuesta:
Escribí la función puedeJubilarse que recibe la edad y el sexo de una persona, además de los
años de aportes jubilatorios que posee.
El mínimo de edad para realizar el trámite para las mujeres es de 60 años, mientras que para
los hombres es 65. En ambos casos, se deben contar con al menos 30 años de aportes.
¡Intentá resolverlo en una única función! Después vamos a ver cómo quedaría si delegamos.
Respuesta:
Alcanzar la altura mínima de 1.5m (o 1.2m si está acompañada por una persona
adulta).
No tener ninguna afección cardíaca.
Definí la función de 3 parámetros puedeSubirse que recibe una altura de una persona en
metros, si está acompañada y si tiene alguna afección cardíaca.
Respuesta:
5. Listas.
Para representar a un conjunto de strings, colocamos todos esos strings que nos interesan,
entre corchetes ([ y ]) separados por comas. Fácil, ¿no?.
Respuesta:
seriesFavoritasDeAna
seriesFavoritasDeHector
["hola","mundo!"]
["hola","hola"]
Lo que acabamos de ver es cómo modelar fácilmente conjuntos de cosas. Mediante el uso
de[], en JavaScript contamos con una manera simple de agrupar esos elementos en listas.
¿Acaso hay una cantidad máxima de elementos? ¡No, no hay límite! Las listas pueden tener
cualquier cantidad de elementos.
Respuesta:
personas
Respuesta:
numerosDeLoteria
salioCara
Genial, ¡parece que una lista puede contener cualquier tipo de elemento! Podemos tener
listas de booleanos, de números, de strings, de listas...
Y no sólo eso, sino que además pueden contener cualquier cantidad de elementos: uno, dos,
quince, cientos.
¿Podremos entonces tener listas vacías, es decir, que no tengan elementos? ¡Por supuesto!
let unaListaVacia = []
Respuesta:
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.
Respuesta:
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.
Como vemos, agregar suma un elemento a la lista, lo cual hace que su tamaño aumente.
¿Pero en qué parte de la lista lo agrega? ¿Al principio? ¿Al final? ¿En el medio?.
Además existe un procedimiento remover, que sólo recibe la lista por parámetro. Investigá
en la consola qué hace.
Respuesta:
Probar en la consola
Ejercicio 7: Trasladar.
Declará un procedimiento trasladar, que tome dos listas, saque el último elemento de la
primera y lo agregue a la segunda.
Respuesta:
¿Y qué sucede si le pasás por parámetro a posicion un elemento que no tiene? ¡Averigualo
vos mismo!
Respuesta:
posicion(diasLaborales, "osvaldo")
Ejercicio 9: Contiene.
Escribí la función contiene que nos diga si una lista contiene un cierto elemento.
Si venís prestando atención a los ejemplos de consulta, habrás notado que las listas también
pueden tener elementos duplicados: [1, 2, 1], ["hola", "hola"], etc.
Por tanto, posicion en realidad devuelve la posición de la primera aparición del elemento
en la lista.
Respuesta:
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.
Respuesta:
lista[0]
Te recordamos qué hace la función: tiene que devolver la medalla que le corresponde a los
primeros puestos de una competencia.
Respuesta:
function medallaSegunPuesto(puesto){
if(puesto <= 3){
return(medalla[puesto])
} else {
return(medalla[0])
}
}
Vamos a conocer una manera de recorrer los elementos de una lista con un nuevo amigo: el
bucle for.
Respuesta:
function saludar(personas){
for(let persona1 of personas){
imprimir("hola" + " " + persona1);
}
}
6. Registros.
Respuesta:
estatuaDeLaLibertad
cristoRedentor
torreEiffel
tajMahal
coliseo
Respuesta:
Declaramos los planetas mercurio, marte y saturno como registros con la siguiente
información: nombre, temperaturaPromedio y si tieneAnillos. ¡Probalos en la consola!
Respuesta:
Respuesta:
function temperaturaDePlaneta(planeta){
return(planeta.nombre + " tiene una temperatura promedio de " +
planeta.temperaturaPromedio + " grados")
}
Respuesta:
Respuesta:
function esDelMilenioPasado(archivo){
return(anio(archivo.creacion) < 2000)
}
Creá una función masDificilDeCocinar, que recibe dos registros de postres por parámetros y
devuelve el que tiene más ingredientes de los dos.
Respuesta:
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 [ ].
Respuesta:
Probar en consola:
postresFavoritos
monumentosDeAmerica
Respuesta:
Averiguá qué devuelve el campo ingredientes del campo postre del registro menuInfantil.
¡Está un registro adentro del otro!
Respuesta:
Probar en consola
menuInfantil.postre.ingredientes
Respuesta:
function endulzarMenu(menu){
agregar(menu.postre.ingredientes, "azúcar")
return menu.postre
}
7. Recorridos.
¡Probala en la consola!
Respuesta:
Probar en la consola:
gananciaSemestre
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!
Respuesta:
gananciaTotal([
{ mes: "enero", ganancia: 2 },
{ mes: "febrero", ganancia: 3 }
])
Respuesta:
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
}
Lo que tenemos que hacer, entonces, es repetir la operación de acumular varias veces, una
por cada elemento de la lista. ¡Digamos hola (nuevamente) al for...of!
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.
Respuesta:
gananciaTotal([
{ mes: "marzo", ganancia: 8 },
{ mes: "agosto", ganancia: 10 }
])
¡Ana tiene nuevos requirimientos! Ahora nos pidió lo siguiente: "Quiero saber cuántos
balances fueron positivos, es decir, aquellos en los que la ganancia fue mayor a cero".
Respuesta:
function cantidadDeBalancesPositivos(balancesDeUnPeriodo){
let cantidad = 0
for(let balance of balancesDeUnPeriodo){
cantidad = cantidad + ((balance.ganancia) > 0)
}
return cantidad;
}
Respuesta:
function gananciaPromedio(gananciaTotal){
let sumatoria = 0
for(let balance of gananciaTotal){
sumatoria = (sumatoria + balance.ganancia)
}
return sumatoria / longitud (gananciaTotal)
}
Viendo que podemos hacer todo lo que nos pide, Ana quiere saber la ganancia promedio de
los balances positivos.
Respuesta:
function gananciaPositiva(balancesDeUnPeriodo){
let sumatoria = 0
for(let balance of balancesDeUnPeriodo){
if(balance.ganancia > 0){
sumatoria = sumatoria + (balance.ganancia)
}
}
return sumatoria
}
function promedioGananciasPositivas(balancesDeUnPeriodo){
return gananciaPositiva(balancesDeUnPeriodo) /
cantidadDeBalancesPositivos(balancesDeUnPeriodo)
}
Completá la función ganancias que toma una lista de balances y devuelve una lista que solo
posea solo las ganancias de cada uno.
Respuesta:
function ganancias(balancesDeUnPeriodo){
let ganancias = []
for(let balance of balancesDeUnPeriodo){
agregar(ganancias, balance.ganancia)
}
return ganancias
}
Con la programación se puede hacer cualquier cosa, o casi . Ya hicimos una función para
poder saber la cantidad de balances positivos (cantidadDeBalancesPositivos), ahora vamos
a ver cómo podemos hacer para saber cuáles son esos balances.
Completá la función balancesPositivos que toma los balances de un período y devuelve una
lista con aquellos cuya ganancia fue mayor a cero.
Respuesta:
function balancesPositivos(balancesDeUnPeriodo){
let balances = []
for(let balance of balancesDeUnPeriodo){
if(balance.ganancia > 0){
agregar(balances, balance)
}
}
return balances
}
Respuesta:
function gananciasDeBalancesPositivos(balancesDeUnPeriodo){
return ganancias(balancesPositivos(balancesDeUnPeriodo))
}
function promedioDeBalancesPositivos(balancesDeUnPeriodo){
return promedio(gananciasDeBalancesPositivos(balancesDeUnPeriodo))
}
Vamos a conocer una nueva función, maximo, que nos permite conocer cuál es el mayor
valor en una lista de números.
Usando esta nueva función, definí la función maximaGanancia que nos diga cuál es la
ganancia más alta entre los balances de un período de tiempo.
Respuesta:
function maximaGanancia(balancesDeUnPeriodo){
return maximo(ganancias(balancesDeUnPeriodo))
}
Definí la función minimaGananciaPositiva que nos diga cuál es la ganancia más baja de
todos los balances positivos.
Respuesta:
function minimaGananciaPositiva(balancesDeUnPeriodo){
return minimo(gananciasDeBalancesPositivos(balancesDeUnPeriodo));
}
meses, la cual dada una lista con registros devuelve una lista de meses;
afortunados, que filtra aquellos registros que tuvieron una ganancia mayor a $1000;
mesesAfortunados, devuelve aquellos meses que fueron afortunados.
Respuesta:
function meses(gananciasPeriodo){
let mes = []
for(let periodo of gananciasPeriodo){
agregar(mes, periodo.mes)
}
return mes
}
function afortunados(gananciasPeriodo){
let afortunados = []
for(let periodo of gananciasPeriodo){
if(periodo.ganancia > 1000){
agregar(afortunados, periodo);
}
}
return afortunados;
}
function mesesAfortunados(gananciasPeriodo){
return meses(afortunados(gananciasPeriodo));
}