Vous êtes sur la page 1sur 13

Diseño de Algoritmos y Estructuras de Datos

Marzo 2018

Introducción

Esta guía está pensada como una introducción a la programación para estudiantes que no tienen
ninguna experiencia previa en programación. En las primeras clases se trabajará con U NIVERSO 10×10.
Este Universo está inspirado en el lenguaje de programación Gobstones [2] desarrollado por un equipo
liderado por Pablo (a) Fidel Martínez López, Profesor de la Universidad Nacional de Quilmes, con el objeto
de introducir a los estudiantes a la práctica de la programación. Los problemas de la guía y buena parte
del material teórico están tomados en su mayoría con pequeñas adaptaciones, del curso de Introducción
a la Programación de la Universidad Nacional de Quilmes [1]. En la segunda parte se verán algunas
estructuras básicas de almacenamiento de la información, así como algoritmos para crearlas y algoritmos
para consultarlas.

Calendario académico

El calendario de este cuatrimestre consta de 16 semanas cada una con dos clases. Se pierden cuatro
por los feriados del jueves 29/3 y lunes 2/4, 30/4 y 9/7, y dos que se invierten en los parciales y las
posteriores al segundo parcial que son para recuperación de los que no promocionaron. Todas las demás
se dedican a clases teórico-prácticas. Las instancias de evaluación que aparecen marcadas con negrita.

1
Diseño de Algoritmos y Estructuras de Datos (2221)

clase día temas Un


01 L 26/03 Presentación. Intro al universo 10x10. Programas. U1
02 J 29/03 Feriado. –
03 L 02/04 Más feriado. –
04 J 05/04 Programas y contratos. Procedimientos y Parámetros. U2
05 L 09/04 Repetición. U3
06 J 12/04 Repetición indexada. U3
07 L 16/04 Alternativa condicional. U4
08 J 19/04 Funciones. Primera entrega. U4
09 L 23/04 Repetición condicional. U5
10 J 26/04 Recorridos. U5
11 L 30/04 Feriado –
12 J 03/05 Recorridos y variables. U6
13 L 07/05 Listas U7
14 J 10/05 Listas, vectores y matrices. U7
15 L 14/05 Repaso. Rep.
16 J 17/05 Primer parcial. Ev.
17 L 21/05 Registros. U8
18 J 24/05 Registros. Devolución primer parcial. U8
19 L 28/05 Almacenamiento y búsqueda en pilas y colas. U9
20 J 31/06 Almacenamiento y búsqueda en pilas y colas. U9
21 L 04/06 Diccionarios y conjuntos. U10
22 J 07/06 Búsqueda de patrones en listas. Segunda entrega. U10
23 L 11/06 Búsqueda de patrones en listas de listas. U10
24 J 14/06 Algoritmos de ordenamiento. U11
25 L 18/06 Algoritmos de ordenamiento y búsqueda. U11
26 J 21/06 Algoritmos de ordenamiento y búsqueda. U11
27 L 25/06 Repaso general. Rep.
28 J 28/06 Segundo parcial. Ev.
29 L 02/07 Repaso para recuperatorios y final. Rep.
30 J 05/07 Recuperatorio Ev.
31 L 09/07 Feriado. –
32 J 12/07 Devolución recuperatorios. Clase de preparación de final. PF.

Página 2 1er cuatrimestre 2018


Diseño de Algoritmos y Estructuras de Datos (2221)

1. Instalar el Python
Para que instalar el Python y que pueda editarse y ejecutarse desde el Notepad++ como el las máqui-
nas del labo hay que seguir una serie de pasos.
Paso 1. Vayan a la página del Python https://www.python.org/downloads/windows/ (esta página con-
tiene links a todas las últimas versiones de Python para Windows) y descárguense la última versión estable.
Recomiendo la 3,5,4 del 2017-08-08. Vayan al link Download Windows x86 executable installer
Paso 2. Vayan a la página del Notepad++ https://notepad-plus-plus.org/download/v7.5.6.html y
descárguense la última versión estable. Recomiendo bajarse la de 32 bits que seguro va a funcionar. El
primer link debajo de la palabra DOWNLOAD en botón verde.
Paso 3. Vayan a:
https://sourceforge.net/projects/npp-plugins/files/NppExec/NppExec%20Plugin%20v0.5.3/ y bá-
jense el plugin NppExec_053_dll_Unicode.zip
Paso 4. Instalen el Python. En general si le dan OK a todas las opciones de instalación quedará instalado
en la carpeta C:\Python35 aunque las nuevas versiones de instaladores lo ubican en:
C:\Users\SuNommbreDeUsuario\AppData\Local\Programs\Python\Python35-32. Esta dirección es clave
para el Paso 9. de la instalación.
Paso 5. Instalen el Notepad++.
Paso 6. Descompriman el NppExec_053_dll_Unicode.zip y copien el contenido en la carpeta
Notepad++/plugins.
Paso 7. Hecho esto, dependiendo de las versiones de soft instaladas, posiblemente al ejecutar el Note-
pad++ el NppExec ya haya quedado instalado. Eso lo sabrán yendo al menú desplegable Plugins, si al
desplegarlo aparece una línea con el NppExec, es que ya quedó instalado. En caso contrario tienen que ir
al menu Plugins>Plugin Manager>Show Plugin Manager para instalarlo. En ese caso les abre una venta-
na con una cantidad de plugins para instalar, buscan el NppExec marcan el cuadradito que aparece a su
izquierda y luego el botón de instalar en la esquina inferior derecha de la ventana.
Paso 8. Una vez instalado el NppExec, va a ocupar un renglón en el menú de Plugins. Seleccionen ese
menú Plugins>NppExec y tilden las opciones:
Save all files on execute
Follow \$(CURRENT_DIRECTORY)
Paso 9. Vuelvan a arrancar el Notepad++ y presionando F6 les va a aparecer una ventana Execute. En
esa ventana escriban c:\python34\python.exe "\$(FULL_CURRENT_PATH)" Aquí depende de la carpeta
en que hayan instalado el Python en su máquina. Para que no tengan que escribir esto cada vez que
ejecutan presionen el botón «save» y graben esa orden con un nombre (sugerencia Python3).
Paso 10. Para que el Notepad++ reconozca la sintaxis y la coloree tienen que grabar a los archivos con
extensión .py Al poner Guardar como en Notepad++ les aparece una ventana. Abajo de la línea para poner
el nombre aparece otra línea con el nombre de Tipo y un menú desplegable con todas las extensiones,
ahí elijan la que es .py
Paso 11. Una vez completados estos pasos un programa escrito en Python puede ejecutarse mediante F6
y dando OK a la ventana que se abre.
Si se trabaran en alguna parte del proceso de instalación del Notepad++ pueden usar como editor al-
ternativo el Sublime Text http://www.sublimetext.com/. Pueden instalarlo después de instalar el Python.
Idealmente el procesador de texto reconocerá automaticamente el Python y con la combinación de teclas
Control b pueden ejecutar un programa.

1er cuatrimestre 2018 Página 3


Diseño de Algoritmos y Estructuras de Datos (2221)

Unidad 1. Programas y contratos

¿Qué es programar?

Comunicar cómo se resuelve un problema de forma metódica.

Problema: hacer algo con ciertas condiciones iniciales

Comunicado: programa con las instrucciones para hacer ese algo. Se puede escribir en
algun lenguaje, por ejemplo castellano.

Metódico: el programa siempre se ejecuta de la misma forma y no tiene ambigüedades.

Receptores del programa:

Ejecutor/es: aquel que obedece el programa sin discusión.

Revisor/es: deben comprender el programa y pueden modificarlo.

Es importante que el programa sea entendible

¿Qué es programar computadoras?

Comunicar cómo se resuelve un problema en una computadora.


Receptores del programa:

Computadora:que ejecuta lo que dice el programa.

Programadores: que leen el programa y pueden modificarlo.

Necesitamos un lenguaje de programación

Que describe ideas ejecutables por una computadora.

Que sea sencillo de leer por humanos.

El lenguaje no hace al virtuoso

Se puede escribir mal en cualquier lenguaje.

Se puede ganar un nobel en cualquier lenguaje.

La computadora siempre entiende; el programador no

¿Qué compone a un lenguaje de programación?

Elementos a respetar

Símbolos o letras (, 2, &, ϕ, @, ≤).

Palabras (Rojo, qwfwq, True).

Página 4 1er cuatrimestre 2018


Diseño de Algoritmos y Estructuras de Datos (2221)

Reglas de sintaxis

Voy a la facultad por la tarde.

facultad tarde a por voy la la.

Semántica

Me río en el baño.

Me baño en el río.

¿Qué es el U NIVERSO 10×10?

Es un universo que modela una computadora.

Tiene estados que consisten en una combinación de un Tablero, Bolitas, y un Cabezal.

Un programa describe cómo transformar un estado inicial en un estado final.

¿Cómo es un programa en el U NIVERSO 10×10?

Comienza con una instrucción Inicio() y termina con una instrucción Fin(s) En el medio
pueden escribirse instrucciones como Poner('R'), Mover('S') y Sacar('R')

Propósito, estado, efecto, precondición y contratos

Efecto: conjunto de cambios que produce la ejecución de un programa sobre el universo


inicial.

Propósito: especifica el QUÉ hace un programa (su EFECTO sobre el universo incial). El
propósito no especifica CÓMO lo debe hacer el programa.

Estado: es cómo se encuentra el universo en algún momento dado. Antes de ejecutarse un


programa estamos ante el estado incial.

Precondición: propiedad sobre el universo inicial que el usuario debe garantizar antes de
ejecutar.

Contrato: acuerdo que firman usuario y programa. Si el usuario cumple la precondición el


programa cumple el propósito.

Problema 1. Escriban un programa que ponga una bolita verde en la celda actual. Ejecuten el pro-
grama, indicando si el efecto es el esperado.
Problema 2. Escriban un programa que ponga una bolita de cada color en la celda actual. Ejecuten el
programa, indicando si el efecto es el esperado. ¿Se le ocurre otro programa que resuelva el mismo
problema?
Problema 3. Ejecuten los dos programas siguientes, anotando el efecto final obtenido. ¿Notan alguna
diferencia? Expliquen su respuesta.

1er cuatrimestre 2018 Página 5


Diseño de Algoritmos y Estructuras de Datos (2221)

Inicio() Inicio()
Poner('R') Sacar('R')
Sacar('R') Poner('R')
Fin() Fin()
Problema 4. Ejecuten los dos programas siguientes, anotando el efecto final obtenido. ¿Notan alguna
diferencia? ¿Se les ocurre algún tablero en el que podrían diferir los efectos finales? Defiendan su
punto de vista con argumentos y ejemplos.
Inicio() Inicio()
Poner('R') #¾Sabías que un programa puede estar vacío?
Sacar('R') # O que puede tener comentarios que no se ejecuten
Fin() Fin()
Problema 5. Escriban un programa que ponga una bolita de color azul en la celda lindante al sur de
la actual, dejando el cabezal en la celda inicial. Indiquen el resultado obtenido.

Problema 6. Los siguientes programas resuelven incorrectamente el problema anterior. ¿Por qué?
Comparen estos programas con su solución del problema anterior.
Inicio() Inicio()
Mover('S') Poner('A')
Poner('A') Mover('E')
Fin() Mover('O')
Fin()
Problema 7. Hagan corresponder las siguientes oraciones que describen propósitos (efectos) con
sus respectivos programas.

Pone dos bolitas azules y una verde; el cabezal queda en la misma posición.
Mueve el cabezal hacia el este.
Saca una bolita azul de la celda al este, sin mover el cabezal.
Pone un cuadrado 2 × 2 bolitas azules sin mover el cabezal.
Saca una bolita azul de la celda al este, dejando el cabezal ahí.

Inicio() Inicio() Inicio() Inicio()


Poner('A') Mover('E') Mover('E') Poner('A')
Poner('A') Fin() Sacar('A') Poner('V')
Poner('V') Fin() Poner('A')
Fin() Fin()

Inicio() Inicio() Inicio()


Mover('E') Poner('A') Mover('S')
Sacar('A') Mover('S') Poner('A')
Mover('O') Poner('A') Mover('E')
Fin() Mover('E') Poner('A')
Poner('A') Mover('N')
Mover('N') Poner('A')
Poner('A') Mover('O')
Mover('O') Poner('A')
Fin() Fin()
¿Es correcto indicar las operaciones internas del programa y el orden en que se ejecutan a la hora
de describir el propósito de un programa? Defiendan su punto de vista con argumentos y ejemplos.
Discutanlo con compañeros.

Página 6 1er cuatrimestre 2018


Diseño de Algoritmos y Estructuras de Datos (2221)

Problema 8. Indiquen por qué las siguientes oraciones nunca podrían identificar correctamente el
propósito de un programa.

Pone una bolita verde primero y después una roja.


Primero mueve el cabezal al sur y después lo mueve al este.
Se mueve 4 veces al este, pone una bolita roja, y después recorre el tablero buscando una bolita
azul. Si la encuentra, limpia el tablero y pone una bolita azul en la posición en la que este el
cabezal luego de limpiar. Si no la encuentra, llena el tablero de bolitas rojas, salvo por la primer
bolita roja que ya se había puesto.

Problema 9. Escriban el efecto de cada uno de los siguiente programas; recuerden especificar todos
los cambios, incluyendo la posición final del cabezal. Luego, comparen su solución con la de al
menos tres compañeros y, en caso de haber grandes discrepancias, consulten con el docente.
Inicio() Inicio() Inicio()
Sacar('A') Mover('E') Poner('R')
Sacar('V') Mover('E') Sacar('A')
Poner('R') Poner('N') Sacar('V')
Fin() Fin() Fin()
Problema 10. Escriban un programa que primero ponga una bolita verde y luego la saque. ¿Cuál es
el efecto de este programa? ¿Se podría simplificar?

Problema 11. Escriban tres programas con tres, cinco y siete comandos respectivamente cuyo efecto
sea poner una bolita roja en la celda lindante al este dejando, al finalizar, el cabezal en la celda
inicial. Ejecuten cada uno de sus programas en un tablero apropiado. ¿Es posible darse cuenta cuál
programa se ejecuta viendo únicamente los efectos en el tablero?

Problema 12. Hagan corresponder las siguientes oraciones que describen precondiciones con sus
respectivos programas.

El cabezal no está en la columna del extremo este del tablero.


Hay al menos una bolita azul en la celda actual.
No tiene precondición.
La celda actual tiene una bolita azul y la celda al oeste tiene una bolita roja.
Hay una bolita de cada color en la celda actual.

Inicio() Inicio() Inicio() Inicio()


Sacar('A') Mover('E') Sacar('A') Sacar('R')
Fin() Fin() Mover('O') Sacar('V')
Sacar('R') Sacar('N')
Fin() Sacar('A')
Fin()
Inicio()
Poner('A')
Fin()
Problema 13. Indiquen por qué las siguientes oraciones nunca podrían identficar correctamente la
precondición de un programa.

Pone dos bolitas azules.


Mueve el cabezal al extremo este.
No ejecuta más de cuatro instrucciones.

1er cuatrimestre 2018 Página 7


Diseño de Algoritmos y Estructuras de Datos (2221)

Demora a lo sumo 5 segundos en ejecutar.


Hace ¡BUM! siempre que haya cuatro bolitas.
Borra el tablero si en la celda actual hay bolitas rojas.

Problema 14. Escriban programas que produzcan ¡BUM! cuando:

El cabezal se encuentra en alguna celda de la columna más al este del tablero.


El cabezal se encuentra en cualquier extremo del tablero.
Hay menos de tres bolitas rojas en la celda actual.

Página 8 1er cuatrimestre 2018


Diseño de Algoritmos y Estructuras de Datos (2221)

Unidad 2. Procedimientos y parámetros

Procedimientos

Economiza código evitando código repetido.

Reduce el trabajo.

Permite encontrar errores y hacer modificaciones en un solo lugar.

Un buen nombre de ese procedimiento permite ganar expresividad.

Permite aumentar la abstracción y mejorar la legibilidad.

Problema 1. Discutan con compañeros cuáles serían las precondiciones razonables para procedi-
mientos que:

Ponga 1000 bolitas azules en la celda actual.


Ponga una bolita roja en la celda lindante al este y saque una bolita azul de la celda lindante al
oeste.
Saque a lo sumo tres bolitas verdes de la celda actual; si hay menos bolitas, saca las que
hubiera.
Ponga una bolita amarilla en cada celda del tablero.
Saque una bolita roja de cada celda del tablero que contenga una bolita azul.
Saque todas las bolitas rojas del tablero.
Ponga un rectángulo de 5 filas y 7 columnas centrado en la celda actual.

Importante: no hay que escribir ningún programa, simplemente basta con discutir cuál es la precon-
dición que esperarían de semejante programa.

Problema 2. hagan corresponder las siguientes oraciones que describen propósitos con sus respec-
tivos procedimientos.

Pone una linea azul de longitud 3 hacia el este; el cabezal queda a tres celdas hacia el este de
la celda actual.
Pone una bolita azul y mueve el cabezal a la celda lindante al este.
Reemplaza dos bolitas rojas por dos bolitas azules, dejando el cabezal en la misma posición.

def ReemplazarRojoPorAzul(): def PonerAzulYMoverEste():


Sacar('R') Poner('A')
Poner('A') Mover('E')
Sacar('R')
Poner('A')
def PonerLineaAzul3(): def ReemplazarRojoPorAzul():
PonerAzulYMoverEste() Sacar('R')
PonerAzulYMoverEste() Sacar('R')
PonerAzulYMoverEste() Poner('A')
Poner('A')

1er cuatrimestre 2018 Página 9


Diseño de Algoritmos y Estructuras de Datos (2221)

Problema 3. Tómense a lo sumo 3 minutos (cronometrados) para entender qué hace el siguiente
procedimiento sin ejecutarlo. Cuando se acabe el tiempo, escriban un texto describiendo en caste-
llano describiendo lo que crean que hace el procedimiento.

def EntenderEn3Min(): Mover('O') Poner('A') Mover('E') Mover('E')


Poner('A') Mover('N') Mover('O') Poner('A') Poner('A')
Mover('E') Poner('A') Mover('O') Mover('O') Mover('E')
Poner('A') Mover('E') Mover('N') Mover('O') Poner('A')
Mover('E') Poner('A') Poner('A') Mover('N') Mover('O')
Poner('A') Mover('E') Mover('E') Mover('N') Mover('O')
Mover('O') Poner('A') Poner('A') Poner('A') Mover('N')
Mover('O') Mover('O') Mover('E') Mover('E') Poner('A')
Mover('N') Mover('O') Poner('A') Poner('A') Mover('E')
Poner('A') Mover('N') Mover('O') Mover('E') Poner('A')
Mover('E') Mover('N') Mover('O') Poner('A') Mover('E')
Poner('A') Poner('A') Mover('N') Mover('O') Poner('A')
Mover('E') Mover('E') Poner('A') Mover('O') Mover('O')
Poner('A') Poner('A') Mover('E') Mover('N') Mover('O')
Mover('O') Mover('E') Poner('A') Poner('A') Mover('N')

Problema 4. Tómense a lo sumo 3 minutos (cronometrados) para entender qué hace el siguiente
procedimiento sin ejecutarlo. Cuando se acabe el tiempo, escriban un texto describiendo en caste-
llano describiendo lo que crean que hace el procedimiento.

def EntenderEn3MinBis(): def PonerCuadradoAzul3(): def PonerLineaAzul3():


PonerCuadradoAzul3() # Pone un cuadrado azul de # Pone una linea azul
Mover('N') # 3 por 3 hacia el noreste, # de longitud 3 hacia el
PonerCuadradoAzul3() # dejando el cabezal en la # este, dejando el cabezal
Mover('N') # columna actual y la celda # en la celda actual
PonerCuadradoAzul3() # al norte del rectángulo. Poner('A')
PonerLineaAzul3() Mover('E')
Mover('N') Poner('A')
PonerLineaAzul3() Mover('E')
Mover('N') Poner('A')
PonerLineaAzul3() Mover('O')
Mover('N') Mover('O')

Parámetros y argumentos

Parámetro: nombre que varía dentro del procedimiento y que figura en el encabezado
del mismo.
Argumento: valor fijo con que se invoca al procedimiento. Toma en el encabezado del
procedimiento, en el momento en que este es invocado, el lugar del parámetro.

Para un mismo parámetro puede haber muchos argumentos distintos.


El alcance de un parámetro es el procedimiento en el que se define. Sólo puede ser utilizado
dentro del bloque de instrucciones que definen el procedimiento. No puede ser utilizado
en ningún otro punto del programa. Los nombres de los parámetros pueden repetirse en
distintos procedimientos pero eso de por sí no hace que se asocien al mismo valor.

Página 10 1er cuatrimestre 2018


Diseño de Algoritmos y Estructuras de Datos (2221)

Problema 5. Hagan corresponder las siguientes oraciones que describen propósitos y precondicio-
nes con sus respectivos procedimientos. Nota: puede ser necesario corresponder más de una ora-
ción con cada procedimiento, en ese caso, ambas oraciones deben ser ciertas.

Hay al menos dos bolitas de color c en la celda al este.


Pone dos bolitas de color c en la celda actual.
Reemplaza dos bolitas de color r con dos bolitas de color c en la celda lindante al este.
Saca dos bolitas de color c de la celda actual.
Hay al menos dos bolitas de color r en la celda actual.
Reemplaza dos bolitas de color c con dos bolitas de color r en la celda actual.
El cabezal no se encuentra en el extremo este del tablero.

def A(c): def B(c): def C(c, r): def D(c, r):
Sacar(c) Poner(c) A(c) C(c, r)
Sacar(c) Poner(c) B(r) Mover('E')
C(r,c)
¿Qué relacién hay entre los parámetros de distintos procedimientos que tienen el mismo identificador
(nombre)?

Problema 6. Corrijan el siguiente código que tiene errores en cuanto al alcance de los parámetros.
def PonerCuadradito2(c): def PonerLinea2()
# Pone un cuadrado de 2 por 2 de color c. # Poner una linea de tamaño 2 de color c.
# El cabezal queda en la posición actual # El cabezal queda en la posición actual
PonerLinea2() Poner(c)
Mover('N') Mover('E')
PonerLinea2() Poner(c)
Mover('S') Mover('O')
Problema 7. Indiquen cuáles de las siguientes tiras de símbolos son expresiones del U NIVERSO 10 X 10
(es decir, denotan un valor). Además, para aquellas que sean expresiones, indicar si son literales o
no y cuál es su tipo (i.e., si denota un número, una dirección o un color). Justifiquen.

a) 7 g) 0 V 0
b) 1 + 6 h) 0 R0 + 0 A0
c) + i) Mover(’S’)
d) −1 + 6 j) CantidadDeBolitas(’R’)
e) 7/ / 5 k)  + 5 con  parametro.
f) 7 %5 l) Poner(c) con c parámentro

Problema 8. Detecten el error que tiene el siguiente programa. Justifiquen.


def A(c): Inicio()
Poner(c) A(9)
Fin()
Discutan por qué es importante documentar la naturaleza (tipo) de un parámetro junto con el propó-
sito y la precondición.

Problema 9. Agrupen las siguientes expresiones de forma tal que las expresiones que denotan el
mismo valor pertenezcan al mismo grupo, suponiendo que se evaluán en el tablero de la Figura 1
(a). ¿Cómo habría que agruparlas si el tablero fuera el de la Figura 1 (b) y (c)?

1er cuatrimestre 2018 Página 11


Diseño de Algoritmos y Estructuras de Datos (2221)

'V' CantidadDeBolitas('R') puedeMover('S')


3 CantidadDeBolitas('R') %
4 'R'
'S'
CantidadDeBolitas('R')
3 // 4 CantidadDeBolitas('V')

|******|******| |******|******| |******|******|


| 0 0| 0 0| | 0 0| 0 0| | 0 0|> 0 0|
| 0 0| 0 1| | 0 0| 0 1| | 0 0|> 0 1|
|******|******| |******|******| |******|******|
|> 0 3| 4 4| | 0 3|> 4 4| | 0 3| 4 4|
|> 3 0| 4 0| | 3 0|> 4 0| | 3 0| 4 0|
|******|******| |******|******| |******|******|

Figura 1 (a) Figura 1 (b) Figura 1 (c)


Observen que expresiones diferentes pueden denotar el mismo valor, y que una expresión puede
denotar distintos valores en distintos universos.

Problema 10. Escriban expresiones que denoten:

a) La cantidad de bolitas total (de los 4 colores) en la celda actual.


b) El doble de la cantidad de bolitas rojas en la celda actual.

Problema 11. Indiquen cuáles de las siguientes invocaciones están bien escritas en U NIVERSO 10 X 10,
teniendo en cuenta que Pepe(c,d,n) es un procedimiento que recibe un color c, una dirección d y
un número n. Justifiquen.

Pepe('R', 'S', 5) Poner(Poner('R'))


Poner(Poner) Pepe(Poner('R'), Mover('S'), 4)
Poner(Mover('S'), 'R') Pepe(Poner('R'), 'S', CantidadDeBolitas('R'))

Valores, Tipos, Expresiones, Literales

Valores: colores, direcciones, números.


Tipos: las distintas categorias en las que se clasifican los valores.
Expresión: cadena de símbolos (i.e., palabras) que denota un valor.
Expresiones literales (o atómicas): denotan directamente un valor
• Colores: 'A', 'N', 'R', 'V'
• Direcciones: 'S', 'O', 'N', 'E'
• Números (enteros): ..., −3, −2, −1, 0, 1, 2, 3, ...
Expresiones no literales: denotan valores indirectamente
• identi?cadores: e.g. parámetros
• operaciones: 1 + 2, 7 − 8, minColor(), maxColor(), CantidadDeBolitas(Azul), etc.
Evaluar: determinar qué valor denota una expresión Cualquier expresión se puede en
lugar de un literal

Página 12 1er cuatrimestre 2018


Diseño de Algoritmos y Estructuras de Datos (2221)

Problema 12. Escriban un procedimiento PonerCasiCien usando Repetir que ponga 99 bolitas verdes
en la celda actual.

Problema 13. Escriban el procedimiento PonerTantasVerdesComoRojas que deposita, en la celda ac-


tual, tantas bolitas verdes como bolitas rojas hay en la misma. Pueden usar el procedimento del
Universo10x10 CantidadDeBolitas(c) que indica la cantidad de bolitas de color c que hay en la
celda actual.

Problema 14. Usando como base el procedimiento anterior, escriban un procedimiento PonerTantasXComoY
(c1,c2) que, dados dos colores c1 y c2, ponga en la celda actual tantas bolitas de color c1 como bo-
litas de color c2 haya en la celda actual. ¿Cómo se debería invocar PonerTantasXComoY para resolver
el ejercicio anterior?

Problema 15. Escriban un procedimiento PonerN(n, c) que tenga como parámetros una cantidad n y
un color c cuyo propósito sea colocar n bolitas de color c en la celda actual.

a) ¿Qué ocurre cuando se invoca PonerN(0, 'V')?


b) ¿Y si invocamos PonerN(-4,'V')?
c) ¿Cuál sería, entonces, la precondición de PonerN?

Problema 16. Resuelvan el Problema 14. utilizando PonerN en conjunto con el procedimiento CantidadDeBolitas.
¿Cuál es la ventaja de utilizar PonerN?

Problema 17. Escriban el procedimiento SacarN(n,c).

a) ¿Qué propósito tiene el procedimiento?


b) Suponiendo que no hay bolitas en la celda actual ¿Qué ocurre cuando se invoca SacarN(0,
'V')?
c) ¿Y si invocamos SacarN(-2, 'R')?
d) ¿Cuál sería, entonces, la precondición de SacarN?

Problema 18. Utilizando SacarN, escriban el procedimiento SacarTodas(c) que, dado un color c, sa-
que todas las bolitas de color c de la celda actual. ¿Este procedimiento funciona siempre?

Problema 19. Utilizando SacarTodas, escribir el procedimiento LimpiarCelda que saque todas las bo-
litas de la celda actual. ¿Este procedimiento funciona siempre?

Problema 20. Escriban un programa que coloque una bolita roja en cada celda. ¿Cuál es la menor
cantidad de líneas con las que se puede resolver el problema?

Referencias
[1] Universidad Nacional de Quilmes. Introducción a la programación.

[2] Pablo E. Martínez López. Bases Conceptuales de la Programación. 2014.

1er cuatrimestre 2018 Página 13