Está en la página 1de 312
Las bases conceptuales de la Programacion Una nueva forma de aprender a programar Pablo E. Martinez Lopez 225 Las bases conceptuales dela Programacién Martinez Lépez repeat (10) { Poner(Rojo) } El comando repeat. describe de manera coneisa la repeticién simple de otto co- mando una cierta cantidad de veces. La definicién es la siguiente. Detinicién 3.1.5. Un comando de repeticién simple permite que una accién se Nevada a cabo un cierto nimero de veces, siendo la canlidad a repetir indicada por un niimero. El comando repeat: que permite la repeticién simple tiene la siguiente forma: repeat () siendo una expresién que describe una cantidad, y < bloque un bloque cualquiera que se repetira. El efecto de un comando de repeticién simple es que la accién descrita por el bloque se repetira tantas veces como fuera indicado por el numero dado. Si el nlimero fuera negativo 0 cero, el comando de repeticion simple no realiza ninguna accién. Por ejemplo, el siguiente comando no tiene ningtin efecto: repeat (-10) { Poner(Rojo) + puesto que no se puede repetir una cantidad negativa de veces eer El verdadero poder de la repeticién viene de su combinacién con AY parametros. Por ejemplo, se puede definir un procedimiento que coloque un cantidad distinta de bolitas de color Rojo en la celda actual cada vez que se lo usa, a través del siguiente procedimiento parametrizado: procedure PonertiRojas(cantidad) c PROPOSITO: * coloca en la celda actual 1a cantidad de bolitas rojas indicada (y ninguna si cantidad<-0) PRECONDICION: ninguna Ces una operacién total) « repeat (cantidad) { Poner(Rojo) } y Entonces, el comando Ponertinojas(3) pondra 3 bolitas en la celda actual, y el ‘comando PonerRojas(10) pondra 10 bolitas. Como se puede observar, utilizan- do este comando no es necesario copiar una y otra vez un comando en secuen- COservar que cietos datos 12 para repeti varias veces, y ademas podemos controlar la cantidad con un son direcamonte dados como Parametro. paramet, indicando incluso €l nome que debe usarse para los mismos. Por exempo, I erunciado “que deposits anc boitas” quiere decir que fl" procediiento tendra un parame de nombre cane que Indioue la canidad en forma de rumero. Lo mismo con otros pardmeiros. [ENE > Feto'c!0 9.1.8. Escritir os procedimientos que se describen Las bases conceptuales de la Programacion Martinez Lépez Realizar los procedimientos solicitados en el ejercicio 3.1.3. Utilzar el primero de ellos para colocar 17 bolitas azules y 42 bolitas negras en la ccelda actual. {Cual es la precondicion del programa? J. Ponern que deposite cant bolitas de color color en la celda actual, supo- niando que cent: es un ntimero positive. ¢ Cudl es su precondicion? 2, Mover que se mueva cant. celdas en la dreccién air desde la celda actual, ‘suponiendo que cant es un ndmero positivo. z Cual es su precondicién? 3. SacarN que quite cant bolitas de color color de la celda actual, syponiendo que cant es un numero positivo. ¢ Cual es su precondicién? jentos Poneril, Foverl y Sacant! son excelentes candidatos Actividad de eee Realice los ejercicios 3.1.4y 3.1.5 y pruébelos adecuadamente. No olvi- de escribir el propdsito y las precondiciones de los procedimientos invo- lucrados. Ejercicio 3.1.4. Escribir un procedimiento DibujarLineaVerticaloja que da- da una cantidad cant, dibuje una linea vertical de bolitas rojas desde la celda actual hacia el norte, y retorne e! cabezal ala posicion inicial ‘Ayuda: es necesario utilizar una repeticién para dibujar y otra diferente para volver a fa posicién nical. Ejercicio 3.1.5. Escribir un procedimiento DibujarcuadradoSo1ides que dada una cantidad cant, dibuje un cuadrado sélido rojo de cant bolitas de lado (0 sea, 1no solo el perimetro, sino toda la superficie de! cuadrado) hacia el norte y el este, y retorne el cabezal a la posicion inicial. ‘Ayuda: utilizar el procedimiento del ejercicio anterior para dibujar cada una de las barras verticales del cuadrado meaiante una repeticic 61 para volver. Qa ‘Ai parametrizar drecciones o colores expresamos 4 procedimientos sim- ples en uno parametrizado. Sin embargo, al paramelrizar cantidades es- tamos expresando una cantidad infnita de procedimientos simples con uno solo. Reflexione sobre la necesidad de la repeticién para conseguir ‘esto, y sobre las limitaciones que impondria el lenguaje de programa- clon sino contasemos con la misma, Cuando decimos que al aprender ‘a programar debemos concentramos en ideas importantes nos estamos refiriendo exactamente a este tipo de imprescindibilidad. Repeticién indexada La repeticién, en combinacién con los parémetros, es una forma poderosa de ‘aumentar la expresividad del lenguaje, y ser capaces de escribir pocas lineas de ccédigo para lograr muchas variaciones. Sin embargo, hay variaciones que la for- ‘ma simple de la repeticion no permite. Por ejemplo, si en lugar de un rectangulo sélido camo en el ejercicio 3.1.5, quisiéramos dibujar un triéngulo sélido como el del grafico G.3.8, dibujando cada una de las barras verticales, no seria posible hacerlo con repeticidn simple, ;pues la longitud de cada barra vertical es dife- rente! Esta claro que precisamos alguna forma mas poderosa de la repeticion, Las bases conceptuales de la Programacién Martinez Lépez Resultados Sela na tae mtn Fea | G.3.6. Tridngulo rectangulo a dibujar por barras verticales ‘que nos permita utilizar un valor diferente cada vez que se repite el comando indicado. La repelicién indexada es una forma de repeticion que considera una secuen- cia de valores, y repite un cierto comando una vez por cada elemento de ella, Esta secuencia puede determinarse a partir de un rango de valores (especifica- do a través de dos valores, un valor inicial y un valor final) y comprende todos los valores que se encuentren entre el inicial y el final del rango, incluidos ellos. Por ejemplo, el rango [1.10] determina la secuencia que contiene los valores 1 23456788 10; en cambio el rango [12. .17) determina la secuencia que contiene los valores 12 13 14 15 16 17. Detinicién 3.1.6. Un rango de valores es una secuencia de valores orecientes comprendidas entre un valor inicial y un valor final, incluyendo a estos dos. La forma de escribir un rango es [. . < finRango: donde < inioioRango> establece el valor inicial y < finRango> establece el valor final. Mediante el uso de rangos y utiizando el comando foreach, podemos hacer ahora una repeticién indexada. Por ejemplo, para dibujar triéngulos sélidos como el visto antes usariamos el siguiente comando foreach cant in [1.5] < DibujarLineaVerticalioja(cant) Mover (Este) y Observar que esta forma de repeticién indica un secuencia de valores mediante tun rango, y ademas un nombre (cant. en el ejemplo), que en cada repeticién tomaré el valor del elemento de la seouencia para el que se esta repitiendo en ese momento. A este nombre se lo conoce con el nombre de indice y de ahi la forma de denominar a este comando. El indice nombraré cada uno de los valores de la Las bases conceptuales de la Programacion Martinez Lépez secuencia en cada repeticién; 0 sea, en la primera repeticién cant, nombraré al 1, en la segunda repeticién cant nombrard al 2, ete.; por eso el comando se llama foreach Asi el codigo anterior sea equivalante a haber escrito — En ngles, for each eigen pare DibujartaineaVerticalRoja(t) polices persia ico) Wover(Este) se podria leer como "para cada DibujarLineaVerticalfoja(2) uno de jos cant que estan en ot tees fae [51 tele comarda DibujarLineaVerticalneja(3) Mover (Este) DibujarLineaVerticalnoja(4) Mover (Este) DibujarLineaVerticalnoja(s) Mover (Este) puesto que la secuencia dada por el rango [1.6] esta compuesta por los valores 123465, Definicién 3.1.7. E/ comando de repeticién indexada permite repetir una accién un cierto numero de veces, siendo esta cantidad indicada por un indice que varia dentro de una cierta secuencia de valores. El comando foreach que permite la repeticion indexada tiene la siguiente forma: foreach in siendo un identificador con miniscula que nombra al indice de la repeticion, < rango> el rango de valores que describe a la secuencia sobre la ‘que variard dicho indice, y < bloque> un bloque cualquiera que se repetira. El efecto de un comando de repeticién indexada es que la accién descrita por el bloque < bloque™ se repetira tantas veces como valores haya en la secuencia, y de tal manera que en cada repeticion el indice representara a un valor diferente. El nombre de un indice puede ullizarse en cualquier lugar donde se habria ulil- zado el valor que el mismo describe; por esta razén, el uso de un indice es una fexpresién que sirve para deseribir un valor que varia de una forma ija durante las repeticiones. El comando de repeticién simple puede obtenerse como una forma simplif- cada del comando de repeticion indexada, simplemente haciendo que el bloque ignore el valor del indice. Asi, en lugar de escribir repeat(10) { Poner(Rojo) } podria haberse escrito forach 1 im [1..10] { Poner(Rojo) + ya.que el bloque no utiliza para nada el indice 1. También podtfa haberse escrito foreach 1 im [17..26] { Poner(Rojo) } pues la secuencia dada por este otro rango, aungue tiene diferentes valores, tiene la misma cantidad de elementos que el anterior. Por qué entonces har falta tener ambas formas de repeticion? La cuestion es la simplicidad conceptual, y asociado a esto, la gradualidad didactica. E| concepto de repeticion no tiene asociado necesariamente un indice, y existen muchas formas de poner 10 bolitas utilizando re- peticion indexada. Reflexionar sobre la importancia de la claridad y la ‘simplicidad de los conceptos impartidos en un curso inicial. Las bases conceptuales de la Programacién Martinez Lépez (2). Tablero a produc como resultado. (by. Tablero a producir como variants. G.3.7. Tabletos a producir en el ejercicio 3.1.6 Una caracteristica particular de los rangos es que siempre determinan se- ‘cuencias crecientes; 0 sea, el valor inicial debe ser menor o igual que el valor [MRIS > in. paca que la secuencia tenga elementos, y elincremento por el momento es Yetemes en el proxmo capit- siempre 1. Si el valor inicial es mayor que el final, la secuencia es vacia y el lo como permit varasones co- comando de repelicion no realiza ninguna accién. Por ejemplo, el siguiente co- mo rctementos dferetes de 1, peando mo bene ningun elect. ranges docrecentes. mando no 9 foreach i in 10.11 { DibujarLineaVerticalRoja(i) > puesto que el rango 10. .1 describe a la secuencia vacia (no tiene elementos), ya que el valor inicial, 10, es mayor que el valor final, 1 configuracién de bolitas del grafico G.3.7a. ‘Ayuda: observe que cada fila del dibujo puede ser generada usando Una instancia particular del procedimiento Progresion, utlizando los ar- ‘gumentos adecuados, Realizar el ejercicio 3.1.6. Utiizarlo para obtener en el tablero final la Ejercicio 3.1.6. Escrbir un procedimiento Progresion que dados un niimero n yuna direccién aix, coloque { bolita roja en la celda actual, 2 bolitas rojas en la celda lindante en la direccién aix, 3 en la siguiente, etc. repiliendo esto n veces ¥ dejando el cabezal en la celda siguiente a la titima ocupada. Serene {Qué tendria que cambiarse en el procedimiento Frogresion de la acti- EAI Vidad anterior para obtener la configuracién del gratico G.3.7b sin cam- biar el programa principal? Los rangos de una repeticién indexada no se limitan a ntimeros. También pueden ser colores, direcciones 0 booleanos. El orden de las direcciones es en el senti- do de las agujas del reloj, comenzando por el Norte, el orden de los colores es alfabético, y el de los booleanos es primero falso y luego verdadero. El orden en Las bases conceptuales de la Programacion Martinez Lépez cada caso es importante para saber qué rango corresponde a cada par de valo- res. Por ejemplo, el procedimiento para dibujar un cuadrado negro de 3 caldas de lado puede escribirse de la siguiente manera: procedure DibujarCuadradoliegro3() c PROPOSITO: + dibuja un cuadrado Negro de lado 3 PRECONDICTON: * hay 2 celdas al Norte y 2 al Este de la celda actual OBSERVACTON: * utiliza una repeticién indexada sobre direcciones Y { -- ORSERVAR que son direcciones! foreach dir in [Norte. .deste] { DibujarLineallegradacia(diz) } } Observar que la repeticién utiliza las direociones como indice, y que por el orden de las mismas, utiliza las 4 direcciones. El significado de esta repeticion indexada es exactamente el mismo que si hubiéramos escrito DibujarLineallegra2acia(torte) Dibujarl-ineaMegra2Hacia(Este) DibujarLinealiegra2Hacia(Sur) DibujarLineallegra2Hacia (Oeste) puesto que el rango [orte, .deste] es la secuencia Norte Sur Este Oeste. Con la repelicién indexada puede realizarse un procedimiento para dibujar cuadrados de cualquier longitud. Esta sera la forma final que daremos a este procedimiento, generalizando todo lo que es posible generalizar (el tamaino, el color y la direccién en las lineas), y utiizando los recursos adecuados para no repetir cédigo innecesariamente. Realizar el ejercicio 3.1.7 y utilizar el procedimiento definido para dibujar varios cuadrados de distintos tamafios y colores. Ejercicio 3.1.7. Escribir un procedimiento Dibujarcuadrado que dibuje cuadra- dos de color color y de n celdas de lado. Confirmar que el lado del cuadrado tenga exactamente n celdas, y no mas 0 menos (lener en cuenta que las lineas tienen anche 1, y e! ancho de /a linea que se superpone también cuenta para el total). Utiizar la menor cantidad de procedimientos posible. 3.1.3. Ejercitacién En esta subseccion revisamos algunos de los ejercicios de practica del capitulo anterior, con el fin de incorporar las nociones de pardmetros y repeticién Reealice los ejercicios enunciados en esta subseccién. Recuerde utilizar todas las buenas praclicas que venimos estudiando (adecuada sepa- racion en sublareas, eleccion de buenos nombres de procedimientos y parametros, indentacién de codigo, reutlizacion de cédigo ya realizado, elcdtera). Las bases conceptuales de la Programacién Martinez Lépez Ejerciclo 3.1.8. Rehacer el sjercicio 2.4.1 usando repeticién. Rehacer el ejer- EES > icio. 2.4.2 usando repeticiin. Generalizarlos a un procedimiento PonerNDeCada Reouerde que generazar un que tome la cantidad como pardmetro. procedmierio es cambiar algun 5 : Gato tio. del mismo. por un ¢Reutiliz6 el procedimianto PonerUnabeGadaColor al escribir los demas? Si no lo pardmeto, de forma tal que con hizo, jvuelva a revisar el ejercicio y hagalo! {in eddige ens enon al arta. riot, ahora se expresan muchos [i mas procedimietes. ar {Puede observar cémo el uso de repeticién y parametros simpilica ol codigo producido, al tiempo que lo hace mas generalizable? Reflexione sobre la importancia de contar con adecuadas herramientas abstractas de programacién, tales como los procedimientos, los pardmetros y las estructuras de control como la repelician. Ejercicio 3.1.9. Rehacer el ejercicio 2.4.4, pero generalizando el color y la direc- ion. Usar el resultado para rehacer el ejercicio 2.4.5 generalizando el color, y usando una repeticion sobre direcciones. Ejercicio 3.1.10. Rehacer los procedimientos del ejercicio 24.9 generalizando ef color con el cual se dibuja la letra E. Rehacer el ejercicio 2.4.10 para que reutiice el proceaimiento anterior y una repetician sobre colores. Como habré podido comprobar mediante estos ejercicios, la combinacién de re- peticidn y pardmetros es extremadamente poderosa. Ademas, ambos juegan un rol fundamental al permit la generalizacién de muchas de las nociones que se utilizan al escribir procedimientos. Sin embargo, éstas no son las nicas herra- mientas que brindan expresividad y poder a la programacién. En la seccién que sigue veremos otto conjunto de herramientas poderosas. 3.2. Expresiones y funciones En esta seccién veremos cémo definit en GoBSTONES expresiones complejas, resultantes de combinar olras expresiones. Es algo similiar a lo hecho con co- mandos a través de procedimientos definidos por el usuario, es decir, agrupare- mos y nombraremos expresiones, solo que con una nueva herramienta conocida ‘como funciones. 3.2.1. Expresiones compuestas y tipos Las expresiones compuestas son algo familiar cuando hablamos de némeros. sabemnos que 2+3 esta formado por tres partes: dos descripciones de niime- ros y un simbolo que denota la operacién de sumar ambos nimeros. En cual- quier lenguaje de programacion habré diversas formas de armar expresiones compuestas que vendrain dadas por reglas de formacion. Para poder introducir las reglas de formacién de expresiones compuestas en GoBsTONES vamos a comenzar por profundizar en la idea de tipo presentada en la subseccién 2.1.4. En su forma mas simple, un tipo puede entenderse como Ja descripcidn de un conjunto de valores especiticos, con propiedades comunes. En GOBSTONES existen cuatto lipos elementales: los colores, las direcciones, los HES > bo oleanos y los niimeros. Se definran en esta unidad La nocién de tipo es utilizada, entre otras cosas, para ideniificar usos errneos de un valor, 0 sea, cules combinaciones de expresiones estan permitidas al ar- mar una expresién compuesta, 0 qué comandos pueden armarse con seguridad para describir acciones. Por ejemplo, la operacién Poner espera que SU argu: mento sea un color. Si poner recibe un valor de otro tipo, provocara la autodes- truccién del cabezal. La operacién Poner no se considera valida a menos que su argumento sea un valor de tipo color. ases conceptuales dela Programacion Martinez Lépez Definicién 3.2.1. Un tipo es la deseripcién de un conjunto de valores con clertas Propiedades comunes. Se utlizan, entre otras cosas, para distinguir entre usos permitides y enrGneos de una expresién Realice el ejercicio 3.2.1. Si puede, pruébelo en diferentes herramientas ‘que implementen GoasTones. Ejercicio 3.2.1. Escribir un programa que ineluya el! comando Pener(17) y.com- probar e! error obtenido. ‘Al presentar la operacion Poner se establecé que es una operacién total, y ahora resulta que existen formas invalidas de la misma. {Como debe entenderse este hecho? Lo que sucede es que los errores producidos por utilizar valores de tipo distinto al esperado (\lamados errores de tipo) pueden ser controlados antes de la ejecucién del programa. De este control se suele decir que “impone el uso de tipos”, pues en el caso de que un programa contenga combinaciones erroneas de tipos en las expresiones es rechazado sin ejecutarlo. Entonces Poner(17) no deberia ser ejecutado: puesto que esto puede ser detectado automaticamente por un chequeo basado en sistemas de tipos, se elige no incluir errores de tipo en la nocidn de error de ejecucién, y consecuentemente, se elige no incluir este caso en la precondicién. ence En GOBSTONES se permite invocar definiciones que esperan expresio- LY nes de un determinado tipo can expresiones de cualquier otro tipo, inolu- 80 cuando su uso es incarrecto. No obstante, si esto sucede el programa fallaré al ser ejecutado. Sin embargo, al iqual que otros lenguajes mas avanzados, GOBSTONES permite la verificacién de ciertas restricciones pata los tipos de datos, chequeando de alguna forma en qué casos su Uso és cortecto. Sin embargo, esta caracteristica es opcional, y puede no estar disponible en todas las versiones de la herramienta, Por ejemplo, se dird globalmente que Poner espera un argumento de tipo color para indicar que su uso no es valido si recibe un valor de otro tipo. enueey En la herramienta PYGoBsTones existe una opcion en la que se verifica, sin correr el programa, que nuestro oddigo no contiene errores de tipos, y de esa manera asegurar el programa no tendra errores de este estilo. Puede resultar interesante probarla y explorar las ventajas de ulilizarla La idea de tipos también se aplica a las expresiones. Por ejemplo, la suma solo es posible realizarla entre niimeros. {Qué sucede si se intenta armar una suma utiizando un color? Consideremos, por ejemplo, la expresién Verde+1. La misma no describe a ningtin valor. Si se intenta determinar qué valor representa esta expresion, tambien se obtendra un error de tipo. Ejercicio 3.2.2. Escribir un programa que incluya la expresién Verde+1 y com- probar e! error obtenido. Las bases conceptuales de la Programacién Martinez Lépez eo sumandos sean descripciones de ntimeros, y solo en ese caso describe .un numero y se considera valida, Esto describe asi que la suma espe 1a dos argumentos de tipo numérico para producir un nimero. Al igual ‘que como con Poner, la suma se considera una operacién total. De esta manera, diremos que la suma es una operacién total sobre niimeros, A La suma es también una forma de operacién que requiere que sus dos 2) Pee ears Recuerda la expresin RojotNerte que mencionamos al hablar de ti- os en el capitulo anterior? Puesto que la suma es una operacion sobre numeros, esta expresién, de ser ejecutada, producira un error. {Qué le parece la idea de contar con una herramienta que verifique que esta forma de errares no suceda en el programa? La idea de tipos se aplica también a los parametros de un procedimianto. Por ejemplo, en el procedimiento DibujarLinea#acia, el parémetro dir es utilizado ‘como argumento del comando Mover, y por lo tanto se espera que sea una di reccién. Si se invocase al procedimiento con un valor diferente de una direcci6n, dicho programa seria etréneo. Pata indicar esto, se dira que dir es de tipo ditec- cién, y que Mover solamente espera valores de tipo direccién, De esta manera, la invocacién Dibujarlinea2Hacia(Ro jo) es facilmente identificable como un error, ules Rojo no es de tipo direccién, sino de tipo color. eeu En el caso de mas de un pardmetro en el mismo procedimien- TAY to, cada uno tendré un tipo especifice, y al invocar dicho pro- cedimiento, deberén suministrarse argumentos de los tipos correc- tos, en el orden establecido. Por ejemplo, en el procedimiento DibujarLineaHacia, el primer parémetro, colorDeLinea, es de t- po color, y el segundo parémetro, dirDelinea, es de tipo direc- cién. Entonces, DibujarlinestHacia(Verds, Norte) es una invo- ‘cacién correcta del procedimiento, mientras que las inovacaciones DibujarLineabellacia(Norte, Verde) y DibujarLineaiacia(Verde) no lo son. La comespondencia entre el tipo de un pardmetro y el de un argumento es basica, y solo se la consignard en el contrato del procedimiento en cuestién establecien do el tipo que se espera que tenga cada parametra, A través del uso de tipos se pueden visualizar répidamente los usos correc- tos 0 erroneos de los diferentes elementos de un lenguaje de programacion, y muchos lenguajes hacen uso de esta caracteristica. En este libro usaremos la terminologia de tipos para guiar la comprension sobre las operaciones que ire- mas introduciendo, 3.2.2. Operaciones predefinidas para construir expresiones Las expresiones compuestas se obtienen a través de un conjunto de expresio- nes predefinidas, combindndolas de maneras adecuadas. Las formas adecuadas quedan determinadas por el tipo de los argumentos y resultados, Asi, para co- nocer el conjunto de operaciones predefinidas se puede seguir una clasificacion de acuerdo con estos tipos. Para conocer un lenguaje de manera completa es Las bases conceptuales de la Programacion Martinez Lépez nlm q=ndivm Lm entonces r=nmodm rq m=qn+r G.8.8. Descripcién grafica del resultado de las operaciones div y mod para ntime- ros ny importante conocer cuales son las operaciones predefinidas de cada tipo. A con- tinuacion presentamos todas las operaciones predefinidas para cada uno de los cuatro tipos basicos de Goss Tones, y damos ejemplos de su utiizacion. Operaciones sobre nimeros Elltipo de los németos trae las operaciones aritméticas usuales: = lasuma, + = laresta, ~ a multtplicacién, + la divisién entora, aiv «= el resto de la divisién entera, nod = la exponenciaci Todas estas operaciones se usan infjas. En el caso de la division entera y el resto, el comportamiento esperado es que sin div m=qyn aod m=r, entonces n= a*n + r, ¥ x es positive y menor estricto que a (en otras palabras, q es el resultado entero de dividirn porn, y x es el resto de esa division, como se muestra en el grafico G.3.8). Estas dos operaciones son ules para dividir cuando no se tienen nameros decimales. Con ellas se pueden definir una cantidad importante de aplicaciones interesantes. Realice los siguientes ejerccios. En ellos se busca ejercitar el uso de A expresiones numeéricas. < Ejereiclo 3.2.3. Escribir una expresién sobre miimeros que represente la suma_\Atencion! No se pido ol res de cuatro veces diez, mas dos. Escribir una expresion sobre niimeros que re- % de esta operacin, sino una presente la suma de cuairo veces el nimero resultante de sumar diez mas dos, S22"csien ae a presente. © Qué diferencias se pueden observar en las expresiones? <¥ en los resultados? {a x! sjewsco ct nimero 42. si bien ese es el resultado de la Ejercicio 3.2.4. Escribir un procedimiento Respuestaverde que ponga tantas expresén a escibi cuanda se olitas verdes como la suma de cuatro veces diez, mas dos, pero sin hacer la eval. cuenta a mano. Ayuda: reutilizar el procedimiento PonerN del ejercicio 3.1.3, parte 1 y alguna de las expresiones del ejercicio anterior. Ejercicio 3.2.5. Escribir un procedimiento PonerDebleRo jas que ponga el doble de bolitas rojas de lo que dice el pardmetro. ‘Ayuda: reutilizar el procedimiento Ponert del ejercicio 3.1.8, parte 1, ycombinar- lo con alguna expresidn adecuada que involucre al parametro, Las bases conceptuales de la Programacién Martinez Lépez Pablo E. “Fidel” Martinez Lopez Pablo E. “Fidel” Martinez Lopez se recibié de Doctor en Ciencias de la Compu: tacion en la UBA en noviembre 2005, y antes de eso de Magister en Ciencias de la Computacion en la Universidad de la Republica, Uruguay y de Licenciado fen Informatica en la UNLP y la ESLAl, Ejerce la docencia universitaria desde 1990, y desde 2007 es Profesor Asociado con Dedicacién Exclusiva en la Uni- versidad Nacional de Quilmes, habienco trabajado camo docente en UNLP, UBA, UNR, UNRC y UNLM. Posee Ia categoria 2 en el programa de incentivos a la investigacién del gobierno nacional. Sus éreas de interés cientifico son los Len- uajes de Programacicn, especialmente Programacion Funcional, Estructuras de Datos, la produccién automatica de programas, la Teoria de la Computacion y los Lenguajes Formales y Autématas, y recientemente la didactica de la ensefianza de Programacién. Ha participado en diversos proyectos de investigacién des- de 1993, habiendo dirigido incluso un proyecto de cooperacién internacional en 2008, y varios proyectos de extensién y transferencia desde 2007. Es autor de ‘numerasos atticulos cientificos nacionales ¢ internacionales, de un capitulo de 0, ¥ Coautor del libro “Introduccién a la Programacién para la carrera de Li- cenciatura en Artes y Tecnologias’ de la UNQ, que es precursor del presente libro. Ha formado recursos humanos en investigacién en diversos niveles, y ha paarticipado en tareas de gestién universitaria y transferencia de conocimientos, desempefidndose al momento de esta publicacion como Director de Carrera de la Tecnicatura Universitaria en Programacién Informatica de! Departamento de Ciencia y Tecnologia de la Universidad Nacional de Quilmes (UNQ) y Director de la Unidad de Vinculacién Tecnolégica UTICs (Unidad de Tecnologias de la Informacién y la Comunicacién) dependiente de la Diteccién de Vinculacién Tec- nolégica de la misma Universidad. En ambos cargos se desempefia desde el 2do semestte de 2007. En relacién a la tematica de este libro, dict6 la mate- ria Introduccion a fa Programacién de la carrera Tecnicatura en Programacién Informatica de la Universidad Nacional de Quilmes entre 2008 y 2010, desarro- llando junto al Dr. Eduardo Bonelli la propuesta didactica aqui presentada y las herramientas asociadas. Posteriormente dirigié los grupos docentes que conti- rnuaron con el desarrollo de la propuesta y las herramientas y estuvo a cargo de varias capacitaciones a docentes con esta propuesta. Las bases conceptuales de la Programacién Martinez Lépez Resultados Seine nvnstoons [Gatsiones —] G39. Resultado de ejecutar HostrarNunero(s4) Ejercicio 3.2.6. Esonbir un procedimiento Vostrar Numero que toma un paréme- tro de tipo nimero, y asumiendo que el mismo es menor que 100, io muestra en el tablero en dos celdas contiguas utilizando bolas negras. Para mostrar el niimero, la celda de la derecha debe contenar tantas bolitas negras como unida- des estén representadas por el ntimero, y la de la izquierda debe contener tantas bolitas negras como decenas estén representadas por el numero. Por ejemplo, en el grafico G.3.9 puede observarse el resultado de ejecular Yostraxttunero(34). ‘Ayuda: para obtener el numero de unidades de un niimero se puede utilizar la , y la forma de la operacién kt es &k < cond: >. El valor de minBiool () @s False, y el de naxBoo0 es True, Eluso de expresiones booleanas y el significado de los conectivos légicos se explica y ejercita en la seccién 3.2.3, al trabajar con alternativas. Operaciones que combinan varios tipos Hay operaciones que trabajan sobre todos los tipos basicos. Las mas comunes de estas son las operaciones relacionales, que permiten realizar compataciones entre dos elementos de mismo tipo (0 sea, son operaciones que si reciben ar- gumentos de distinto tipo resultan invalidas), y cuyo resultado es un booleano, ‘Ademas hay operaciones que permiten moverse dentro del orden establecido de ‘cada tipo. Estas operaciones son: * las comparaciones por igualdad: + es igual a, « es diferente de, /~ 1 las comparaciones de orden: ‘es menor que, < ‘es menor 0 igual que, <= ‘es mayor que, > # es mayor o igual que, 1 la operaciones de movimiento en el orden: « cdleulo del siguiente, siguiente. « cdlculo del previo, previo = operaciones especiales solo para algunos tipos: + célculo del opuesto, opuesto 6 ~ (unario) Todas, salvo siguiente, previo y opuesto, se usan de manera infija. Las ope- raciones de orden siguen una secuencia establecida para cada tipo. El orden de los némeros es el tradicional, midiendo la cantidad que representa. El orden de las direceiones es en el sentido de las aguias del reloj, comenzando por el Norte, ‘el orden de los colores es alfabético, y el de los booleanos es primero falso y luego verdadero. La operacion siguiente () devuelve el elemen- to siguiente en el orden de los elementos del tipo del valor de < expresion: volviendo al minimo en caso de que el elemento sea el maximo. Por ejemplo, siguiente(2) es 3, siguiente(liorte) es Este, y siguiente (este) es Norte. La operacién previo (< expresion>) es la operacion inversa, devolviendo el valor anterior en el orden, y volviendo al maximo en caso de que se trate del minimo. Entonces, previo(3) es 2, previo(este) es Sur, y previo(lorte) es Oeste. La operacién opuesto funciona sobre direcciones o niimeros. Se utiliza como opuesto(< expresion) 0 ~< expresion >. En el caso de las direcciones trans- forma torte en Sur, Este en Oeste, y viceversa. Por ejemplo, el valor de la ex: presién opuesto (Sur) es Norte y el valor de -Este es Geste. En el caso de los iniimeros, sila expresién vale n, calcula el valor de —n Ejemplos de uso de estas expresiones son la comparacién de que un cierto valor numérico pasado como parametro es menor que un niimero fio (e.g. mum <8), que dos colores pasados como parémetros son iguales (2.9. colert == Las bases conceptuales de la Programacion Martinez Lépez G.3.10. Resultado de ejecutar Arribakbajo(Norte) color2) y que la direccién siguiente de una direccién pasada como parametro no es la Uilima posible (e.g. siguiente(air) /= naxbir0) Realice los ejercicios que se enuncian a continuacién. Los mismos ejem- EAM oliican el uso de operaciones que combinan varios tipos. Ejercicio 3.2.8. Escribir una expresién que determine si dos parémetros de ti po direccién, llamados por ejemplo éireccionDriginal y direccionNueva, Son diferentes, Ejerciclo 3.2.9. Escribir una expresién que determine si un numero esta entre 0 100. Para ello, combinar dos expresiones relacionales mediante una conjuncion bbooleana, Ejercicio 3.2.10. Escrbir un procedimiento arribaabajo que tome un pardime- tro de tipo Direceién, y ponga una bolita roja en la celda contigua a la inicial en Ja direccién indicada, y una bolita verde en la celda contigua aa inicial, pero en la direccion opuesta a la indicada. Por ejemplo, el resultado de llamar al procedi- miento txritadbajo(Horte) deberla ser como el mastrado en el grafico G.3.10. Observar que la celda actual al terminar debe ser la misma que la celda inicial. Ayuda: {Como expresar el opuesto de una direccién dada por un parémetro? Pensar en las operaciones recién presentadas. Sugerencia: Definir un procedimiento auxiliar con la parametrizacién adecuada para poner una bolita de algin color en alguna celda contigua. Este procedimien- to deberia invocarse dos veces con diferentes argumentos. Operaciones sobre el tablero Finalmente, asi como el cabezal posee un dispositivo para poner y sacar bolitas, y para moverse, posee también sensores que le permiten saber si hay ono bolitas de cierto color en la celda actual, curntas hay, y si puede o no moverse de manera segura sin caerse del borde del tablero. Todas estas formas se expresan a través de expresiones. Las expresiones que tienen que ver can la operatoria del cabezal, yssirven para determinar ciertos valores asociados a la celda actual son: Las bases conceptuales de la Programacién Martinez Lépez = hayBolitas() que dado un color, representa a un booleano que indica si en la celda actual hay o no bolitas de ese color; » puedeliover() que dada una direccién, representa a un boo- eano que indica si el cabezal se puede mover en la direccion indicada sin rovocar su autodestruccién; 1 nroBolitas() que dado un color, representa al niimero de bolitas, de ese color que hay en la celda actual. Por ejemplo, hayBolitas (Rojo) puede ser True 0 False, dependiendo del es- tado de la celda actual: si en la celda hay alguna bolita de color Rojo, enton- ces esla expresion valdré True; si por el contrario, no hay ninguna, esta expre- sion valdrd False. SinayBolitas (Rojo) vale False, entonces nroBolitas (Rojo) valdré 0, y si mreBolitas (Rojo) es distinto de 0, entonces hayBolitas(Rojo) valdrd true, De manera similar a hayBolitas, puedelover (Sur) valdrd True Si el ‘cabezal no se encuentra en la fila de mas abajo, y Faise si se encuentra en dicha fila, y de manera andloga para las restantes direcciones. Ejercitaremos el uso de estas expresiones luego de ver una herramienta nueva para armar comandos complejos. Esto completa el repertotio de expresiones de GoBsTONES, con las cuales se pueden realizar una Serie importante de programas. Realice el ejercicio 3.2.11. (Todavia no tenemos suficientes herramientas para poder aprovechar este ejercicio. Su ulilidad se vera en el siguiente apartado,) Elercicto 3.2.11. Utilizando algunas de las expresiones recién presentadas, es- cribir una expresién que determine sila cantidad de bolitas en la celda actual es ‘menor o igual que un nimero determinado (e.g. 9). Recordar que una expresién para comparar por menor o igual se escribe, por ejemplo, 16 <= 20, y que hay tuna expresién para comprobar el ntimero de bolitas de una celda. ete ae cucu) Realice los ejercicios 3.2.12 y 3.2.13 y ulilicelos para quitar todas las bolitas rojas y negras de la celda actual, y la totalidad de las bolitas de la celda lindante al Norte. Ejercicio 3.2.12. Escribir un procedimiento SacarTodastasDeColor que, dado un parémetto cer, elimina todas las bolitas del color indicado de la celda ac- tual. Para realizario, considere utilizar el procedimiento SacarX del ejercicio 3.1.3, parte 8, y combinarlo con alguna de las expresiones recién presentadas. Ejercicio 3.2.13. Escribir un procedimiento Vaciarce1da que elimine todas las bolitas de fa celda actual. Para realizarto, considere utilizar el procedimiento an- terior, y una repeticién indexada que recotra todos los colores, Leer con A Los procedimientos SacarTodasLasDeColor y VaciarGelda son excelen- EY tes candidatos pata ser colocados en la Biblioteca. ases conceptuales dela Programacion Martinez Lépez Ree oars Ld a Realice los ejercicios 3.2.14 y 3.2.15 y coléquelos en su Biblioteca. Ejercicio 3.2.14. Definir una funcién esCeldaVacia que retorne un booleana in- dicando sila celda actual no contiene bolitas de ningun color. ‘Ayuda: considere utilizar la combinacién de 4 expresiones basicas sobre el tablero con las operaciones booleanas adecuadas. Ejerciclo 3.2.15. Definir una funcién esCeldavacianl que dada una direccién, retorne un booleano indicando si la celda en esa direccién no contiene bolitas de ningtin color. La precondicién de esta funcion es que existe una celda en la direccion dada, Sugerencla: reutllice adecuadamente la funcién del efercicio anterior. 3.2.3. Alternativas condicionales Los booleanos pueden utilizarse para distinguir entre diferentes alternativas al momenta de describir comandos para el cabezal. Para ello es necesario un ¢o- mando qua, con base en un booleano, decida entre otros dos commandos para saber cual de ellos debe ejecutarse. Imaginemos que representamos una flor mediante una bolita roja, y fertiizante mediante una bolita negra, y que, si en la celda actual ya hay una flor, entonces le coloquemos fettilizante, y si no hay, entonces plantemos una nueva flor. Ninguna de las hertamientas vistas hasta el momento permite describir esta situacion. Entonces presentamos un nuevo comando, llamado if-then-else: if (hayBolitas(Rojo)) { Poner(Wegro) } else { Poner(Rojo) + Verdadero si hay flor en la celda actual Solo agrega fertilizante Pone una flor, pues no hay ninguna on simples que representen mejor el dominio del problema? (Por ejemplo, con el procedimiento PonerFor(), etc.? ,Qué sucedera con la condi- ci6n? iNo podemos utilizar un procedimiento alll para darle sentido a la misma! Es claro que hace falta una forma nueva de nombrar expresio- nes, la cual se verd en el préximo apartado. © {Puede mejorar el programa anterior a través del uso de procedimientos En inglés, if-then-else significa si-entonces-sino, y es la idea de estructura alternativa con base en una condicién. Por ejemplo, en este caso, el comanda se leeria *si hay una bolita roja (flor) en la celda actual, entonces poner una bolita negra (lertiizante), y sino hay flores, poner una bolita roja (nueva flor). La forma general del comando if-then-else esta dada por la siguiente defi- niin: Definicién 3.2.2. E/ comando de alternativa condicional (o simplemente condi- ional) it-then-else tiene la siguiente forma: Af () else < otroBloque> Las bases conceptuales de la Programacién Martinez Lépez siendo una expresién que describe un valor de verdad (booleano), y donde los bloques y < atroBloque> son bloques de cédiga cua- esquiiera (que normalmente son diferentes, aunque podrian ser iguales). Al bio- que < unBloque> se lo denomina rama verdadera (0 rama del then) y al bloque < otroBloque> se lo denomina rama falsa (o rama del ese). El comando i1~then-else describe la decision de realizar la accién descrita por elbloque , en caso que la condicion sea True, 0 de realizar la accion deserita por < olroBloque> en caso que la condicién sea False. Observar que los paréntesis son necesarios siempre alrededor de la condici6 reflexione sobre la importancia de reuilizar cédigo definido con anterio- Realice el ejercicio 3.2.16. Considere la cantidad de trabajo necesario, y ridad (segtn se sugiere en dicho ejercicio). D> Elerciclo 3.2.16. Supongamos que una celda representa un digito de un indica Undigioesun nimeroentiey dor de kilometraje, para lo cual utiliza bolitas negras. Escribir un procedimiento ® InerenentarDigCuentaiie(), que incremente an uno el kilometraje inaicado por ese digito (y solo ese). Tener en cuenta que el indicador, al llegar al limite de 9 debe volver a 0, pues es un digito. Considerar el uso de una altemativa pa- ra detectar las dos situaciones posibles (cuales son?), y la reutilizacion de la condicién del ejercicio 3.2.11 y del procedimiento del ejercicio 3.2.12. Una variante util del comando if-then-else @6 cuando no existe una accién alternativa para la rama del else. En ese caso, la alternativa se transforma real- mente en un comando condicional (0 sea, un comando que solo se ejecuta si se ‘cumple cierta condicién). Esto es extremmadamente ttl para evitar que una opera- cién parcial provoque la autodestruccién dal cabezal. Para ello, basta con ulilizar ‘como condicién del if-then-else una expresion < condicion> que valga True ‘cuando la precondicién de la operacién dada en la rama del thon sea valida, Por ‘ejemplo, si se quiere sacar una bolita, puede pregunlarse primero si la misma existe, de la siguiente manera: if (hayBolitas(Rojo)) { Sacar(Rojo) } Notar que la precondicién de Sacar(Rojo) es que haya bolitas rojas, y la condi cién del 1f-then es una expresion que vale True siempre que haya bolitas rojas; 0 sea, la condicién del 1f-then garantiza la precondicién de la rama del then De esta manera, la operacién dada por la alternativa condicional es total incluso aunque el cuerpo de la misma es parcial, pues el comando Sacar solamente se invocaré cuando haya una bolita roja en la celda actual; en caso de que no haya ninguna bolita roja, este comando compuesto no tendra ningun efecto, Eerciclo 3.2.17. Escribir un procedimiento QuitarHastal'res®lores que, SupO- niendo que en la celda actual hay entre cero y tres flores representadas cada una por una bolita roja (pero no se sabe cuantas exactamente), las elimine de la celda, El proceaimiento debe describir una operacidn total. Utiizar nombres adecuados para la subtarea de quilar una flor (pero no puede hacerse atin con la condicion). Ayuda: utilizar fa variante de alternativa dada por el comando i-then. Volveremos sobre la alternativa condicional para profundizarla en la seccién si guiente y para ver varios casos de usos inadecuados en el capitulo siguiente. 3.2.4. Funciones simples Imaginemos ahora que un grupo de bolitas de varios colores representa a algtin elemento de un juego, y que queremos representar su sombra en la celda vecina ases conceptuales dela Programacion Martinez Lépez al Este. Vamos a representar la sombra por una cantidad de boltas negras igual a la cantidad total de bolitas del elemento. Queremos, entonces, escribir un proce- dimiento WacerSombraBasica que dibuja una sombra en la celda lindante al Este de la actual. Supondremos que contamos con un procedimiento DibujarSonbra que, dado un pardmetro numérico valorInteneidad, coloca esa cantidad de bo- litas negras en la celda al Este, volviendo a la celda original antes de terminar. Camo seria el procedimiento pedido? Claramente, precisamos una expresion que calcule el nUmero total de bolitas en la celda actual, y lo pase como argu- mento al procedimiento Dibujarsombra, procedure HacerSombraBasica() {= PROPOSITO: + pone una sombra del elemento representado en la celda actual, en la celda lindante al Este PRECONDICION: * que haya una celda al Este { DibujarSonbra(nroBolitas(Azul) + nroBolitas (Negro) + nroBolitas(Rojo) + nroBolitas(Verde)) } Sin embargo, la expresidn que utilizamos, que suma los 4 usos de la funcién primitiva nroBolitas, es demasiado larga: podria decirse que es “operacional” en el sentido que no abstrae el concepto de contar el total de boiitas, sino que lo descompone en operaciones més elementales que deben combinarse ‘Asi como un procedimiento es una forma de dar nombre a un grupo de co- mandos, existe un mecanismo para darle nombre a un grupo de expresiones, abstrayendo su comportamiento. Tal mecanismo es conocido con el nombre de funcién. Una funcién simple es basicamente otra forma de nombrar a una expre- sién compuesta, Definicién 3.2.3, Una funcién simple es una forma de asignar un nombre a una expresi6n. La forma de definir una funcién simple en GOBSTONES es function ( { } ‘siendo < funName > un identificador que comienza con mindscula y < expresion >, una expresién de cualquier tipo basico. return () La operacién de return de la declaracién de una funcién indica la expresién que la misma representa, Las funciones se pueden invocar de manera similar a un procedimiento LY con la diferencia de que, como representan a un valor, deben utilizar- ‘se como cualquier expresidn (y no coma un comando). Por ejemplo, un llamado de funcién puede ser usado como argumento, o cambinado en expresiones complejas, etc., pero nunca secuenciada 0 como parte ais- lada en un bloque. Definicién 3.2.4. Una funcién simple puede ser usada como una expresion. La forma de invocaria es escribir su nombre seguida por paréntesis, de la siguiente ‘manera () Las bases conceptuales de la Programacién Martinez Lépez donde < funcName> es el nombre de alguna funcién dectarada en el programa. En el ejemplo visto antes, podriamos definir una funcién simple para calcular el numero total de bolitas de la celda actual de la siguiente manera. function nroBolitasTotal () {- PropdsiTO: = calcula el total de bolitas de 1a celda actual PRECONDICTON + ninguna, es una operacién total t return ( nroRolitas(kzul) + nroBolitas (Negro) + nroPolitas(Rejo) + nroBolitas (Verde) ) > Alutiizar esta funcién, el valor representado por su invocacién es el numero total de bolitas de todos los colores en la celda actual. El procedimiento para hacer la sombra podria mocificarse para aprovechar esta funcién de la siguiente manera procedure HacerSenbra() {- PRopdsrTo: + iluatrar el uso de funciones x pone una sombra del elemento representado en la celda actual, en 1a celda Llindante al Este PRECONDICTON: + que haya una celda al Este ‘oBSEAVACION: + esta es una manera adecuada de abstraer este problema £ DibujarSonbra(nroBolitasTotal ()) -— usa una funeién para caleular el nllaero de bolitas de la celda actual y llama a DibujarSombra tal nlnero como argumento > Ejerciclo 3.2.18, Escribir el procedimiento DibujarSonbra que recibe un paréme- tro valorintensidad y coloca una sombra de la intensidad dada por el parémetro en fa celda lindante al Este, retornando luego a la celda original. EES > as funciones simples permiten abstraer la implementacion efectiva de ciertas En este caso, llevar mas cer ideas expresadas mediante expresiones compuestas. Quizas las expresiones cade las ideas de prosramacor que resulten més util abstraer de esta manera sean las determinadas por con- Steves de nombrar adecuada: i diciones complejas expresadas mediante la combinacién de varias expresiones mont oe elementos booleanas simples mediante conectivos logicos. Condiciones booleanas més complejas A partir de los valores de verdad basicos pueden construirse condiciones com- plejas a través del uso de conectivos J6gicos. Los conectivos Idgicos son ope- Taciones entre booleanos. Los mas comunes, y que pueden ser representados directamente en GOBSTONES, son la negacién, la conjuncion y la disyuncion. Detinicién 3.2.5. Un conectivo ldgico es una operacién entre booleanes. Los conectives mas comunes son la negacién, la conjuneién y la disyuneién. Las bases conceptuales de la Programacion Martinez Lépez ae La negacién es un conectivo légico que toma un booleano y devuelve TAY otto booleano. Transforma True en False y viceversa. La manera de ‘escribir fa negacién de una expresidn booleana es con la operacidn not. En resumen, not True es igual a False, y not False es igual a True. Definicién 3.2.6. La negacién es un conectivo légico unario. Su forma general es not < expBooleana> donde < expBooleana- es cualquier expresién cuyo resultado sea true 0 False. Con esta operacién, por ejemplo, podria escribirse una condicién que veritique si en la celda actual no hay bolitas rojas como: not hayBolitas (Rojo). Esta expresion valdra True cuando el numero de bolitas rojas en la celda actual sea 6, y False en caso contrario, extactamente lo opuesto a hayBol.itas (Rojo). Elerciclo 3.2.19. Escribir una funcién noHayMarcianos() que retorne verdadero sien a celda actual no hay ningun marciano, y falso en caso de que haya algun. Un marciano se representa mediante una botita de color kzul. Ejercicio 3.2.20. Escribirun ejercicio celdaVacia() que retoma verdadero sien la celda actual no hay ninguna balita de ningtin color, y falso en caso de que haya alguna. Para realizarlo, reutilizar la funcién nroBolitasTotal, y combinarla con un operador de iqualdad y el conectivo légico de negacién, Otro conectivo légico importante es la conjuncién, que toma dos valo- TY res ce verdad y retorna un tercero. La conjuncion de dos proposiciones, ‘expresada mediante la operacion infija 22, sera verdadera cuando am- bas lo sean, y falsa en olro caso. Es la manera de represeniar el 'y' del lenguaje natural. Definicién 3.2.7. Laconjuncién es un conectivo logico binario. Su forma general es < expBooleanay > bx < expBooleanas > donde < expBooleana, > y < expBooleana, > son expresiones cuyo resultado es ‘True 0 False. La expresién True at True tendra como resultado True, y las expresiones True hk False, False && True y False &# False tendran como resultado Faise. De esta manera se pueden construir condiciones complejas, como preguntar si en fa celda actual hay bolitas rojas y verdes al mismo tiempo: hayBo1 itas(Rojo) hayBol itas (Verde) Ejercicio 3.2.21. Escribir una funcidn nayFlores () que retorne verdadero si en la celda actual hay alguna flor, y falso en caso de que no haya ninguna. Una flor se representa mediante una bolita de color Rojo y una de color Verde. La condicién de que haya flores puede verificarse, por tanto, verficando que haya bolitas de ambos colores en la celda. ;Observar que no se pide verificar que fa cantidad de bolitas verdes y rojas coincida, sino solo que haya de ambas! ¥ también que no molesta que haya bolitas de otros colores. Las bases conceptuales de la Programacién Martinez Lépez Las bases conceptuales dela Programacién Martinez Lépez Ejerciclo 3.2.22. Escribir una funcién toressinMareianes() que retorne ver- dadero si en la celda actual hay alguna flor, pero no hay ningin marciano. Con- sidere reutilzar las funciones de los efercicios anteriores, combinadas mediante algiin conectivo adecuado, Ejerciclo 3.2.23. Escribir una funcién hayexactamenteUnaF lor () que retorna ver- dadero si en la celda actual hay exactamente una flor (representada igual que en el ejercicio 3.2.21). Tener en cuenta que no puede haber més de una bolita ro- Jay una verde en la celda. {C6mo se puede expresar esta condicién utiizando conjunciones y operaciones relacionales? era primitiva es la disyuncién. La disyuncién toma dos valores de ver- dad y retorna otro. La disyuncion es verdadera cuando al menos uno de los argumentos es verdadero, siendo falsa solo si ambos son falsos. Para denotarla se utiliza la operacion infia [| Al El tercer conectivo légico que se puede escribir en GOBSTONES de ma- Be Detinicién 3.2.8. La disyuncién es un conectivo légico binario. Su forma general es < expBooleana, > || -xpBooleana, > son expresiones cuya resultado es Las expresiones True || True, True || False y False || True tendrén como resultado True, y la expresién False || False tendré como resultado False Con la disyuncion se puede pregunta si en la celda actual hay bolitas azules © hay bolitas negras (puede faltar cualquiera de las dos): hayBolitas(azul) || hayBolitas (Negro) 4C6mo construir una condicion que verifique si hay alguna bolita en la celda actual? Considere el ejercicio 3.2.24. Ejercielo 3.2.24, Escrbir una funcién hayBol itas que retorne verdadero si hay alguna bolita en la celda actual (no importa su color). Considerar la ullizacién de una combinacién mas complicada de hayBolitas y 11, ¥ que involucre a los 4 colores. ; Puede expresar la condicién de alguna otra forma? Ejerciclo 3.2.25. Escribir un procedimiento PintaxCeldatarron que pinte una celda de color marrén (agregando boltas de los cuatro colores en la celda actual) solo si no hay bolitas de ningtin color. Considerar la utlizacion de la funcion del ejercicio anterior y una allernativa condicional. el xionar Esta forma de expresiones complicadas puede ser extremadamente en- ‘gorrosa si tuviéramos que usarlas directamente. ¢Entiende la importan- cia de la habilidad de nombrar sus ideas? Este proceso, al que deno- minamos abstraccion es stimamente importante en toda actividad de programacién. ases conceptuales dela Programacion Martinez Lépez n Atenc mero, luego la conjuncién, y finalmente la disyuncién. Esto se denomina Al ‘Al combinar diferentes conectivos Idgicos, la negacién se resuelve pri- B precedencia de los operadores légicos. Definicion 3.2.8. La precedencia de un operador es la prioridad que tiene el mismo en una expresién combinada para ser result. La negacién tiene més precedencia que la conjuncién, y la conjuncién mas prece- dencia que la disyuncion. En caso de precisar alterar este orden, deben utiizarse paréntesis. Entonces, la expresion not hayPasto() && not hayNarciano() || haySangre() significa lo mismo que (Qnot hayPasto()) &k (not hayHaciano())) I] haySangre() Para obtener otros resultados, deben utilizarse paréntesis de manera obligatoria, Como ser not (hayPasto() kk (not (hayMarciano() || haySangre())) ) Considerar que las funciones hayPasto(), hayMarciano() y haySangea() veri fican la existencia de cada uno de estos elementos, representados respectiva- mente mediante bolitas verdes, azules y rojas. Ejercicio 3.2.26. Escribir nayPasto(), hayMarciano() y haySangre(). {Cudl seré el valor de verdad de las distintas condiciones compuestas dadas antes? Para determinarlo, escriba una tabla que consigne las dife- rentes posibilidades de una celda para contener bolitas (por ejemplo, si contiene bolitas verdes pero no azules ni rojas, si contiene bolitas verdes y azules pero no rojas, etc., ¢ indicar en cada caso el valor booleano de las expresiones.) {Qué diferencia se observa entre ambas condiciones (con diferentes precedencias)? Ejercicio 3.2.27. Escribir un procedimiento Plantar¥Fertilizar que, reutilizan- do la idea del ejemplo al comienzo del subseccion 3.2.3, plante una flor sino hay hinguna, y fertice las flores que haya (ya sea que fueron recién colocadas 0 ya existian). Nombre adecuadamente sus subtareas utlizando procedimientos y funciones auxiliares de manera conveniente. Ejercicio 3.2.28. Aevisar ef sjercicio 3.2.16 para abstraer de manera adecuada Ja condicion utilizada, dandole un nombre representativo a la misma mediante una funcién (por ejemplo, sevakExceder () 3.3. Funciones avanzadas En el apartado anterior aprendimos como escribir y utilizar funciones simples (detinicién 2.2.21), y trabajamos con ellas, aprendiendo cémo valernos adecua- damente para abstraer nuestras ideas. En este apartado vamos a extender nues- tra concepcion sobre las funciones, exhibiendo su uso junto con otros conceptos avanzados de programacién Las bases conceptuales de la Programacién Martinez Lépez

También podría gustarte