Este tutorial adapta el contenido original del Día 6 para trabajarlo en clase. Las secciones 📝 Ejercicio original del curso provienen de los archivos del curso. Los retos 🟢🟡🟠🔴, el proyecto extra y el proyecto integrador son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.
Herramienta del día: el Mundo de Reeborg (se abre en otra pestaña) es un simulador que funciona en el navegador, sin instalar nada. Allí se escribe código Python para controlar un robot y se ve el resultado de inmediato. Es muy parecido a Karel el Robot, una herramienta clásica para aprender a programar.
Tabla de contenidos
- Antes de empezar
- Definir y llamar funciones
- Funciones + bucles: la carrera de obstáculos 1
- Sangría y bloques de código
- Bucles
while while+ condiciones del robot: obstáculos 2, 3 y 4- 🚀 Proyecto del día: Escapar del Laberinto
- 🌟 Proyecto extra: La Alcancía Digital
- 🏆 Proyecto integrador del Día 6: Caja Registradora de la Tienda Escolar
- 🤖 Programar con apoyo de IA
- 🛠️ Correcciones técnicas al material original
- 📋 Matriz de trazabilidad
- 📦 Evidencias de aprendizaje del Día 6
0. Antes de empezar
(Fuente: 043 - Day 6 Goals- what we will make by the end of the day.md, 051 - Why is this -so- Hard-! Can I really do this-.md)
Hoy aprenderemos a crear nuestras propias funciones, a entender la sangría como estructura del código y a usar un nuevo tipo de bucle, el while. Al final, programaremos un robot capaz de salir de un laberinto empezando desde cualquier posición.
El mensaje de cierre del curso: aprender algo nuevo duele, igual que caerse al agua una y otra vez al aprender windsurf. La dificultad no significa que vayas mal: significa que estás aprendiendo.
Prerequisito general: bucles
foryrange()(Día 5), condicionales ynot(Día 3).
1. Definir y llamar funciones
(Fuente: 044 - Defining and Calling Python Functions.md)
Prerequisito: uso de funciones incorporadas como
print(),len()eint().
🎯 Objetivo de aprendizaje
- Definir funciones propias con
def. - Distinguir entre definir una función (escribir la receta) y llamarla (cocinar con ella).
- Usar funciones para evitar código repetido y hacerlo más legible.
🧠 ¿Qué aprenderemos?
- Funciones incorporadas frente a funciones propias.
- Sintaxis
def nombre():. - Llamar una función y cómo "salta" la ejecución hacia ella.
📖 Explicación conceptual
Ya usamos muchas funciones: print(), len(), int(), range()… Las reconocemos porque son un nombre seguido de paréntesis. Ahora crearemos las nuestras.
Paso 1: definir (escribir la receta)
def mi_funcion():
print("Hola")
print("Adiós")defviene de define (definir).- Después va el nombre, los paréntesis
()y los dos puntos:. - Las líneas con sangría forman el cuerpo de la función.
Si ejecutas solo esto, no pasa nada: la receta está escrita, pero nadie la ha cocinado.
Paso 2: llamar (usar la receta)
mi_funcion()Cuando Python llega a esa línea, "salta" a la definición, ejecuta sus líneas en orden y luego regresa para seguir justo después de la llamada.
¿Por qué usar funciones? El curso lo explica con un robot que va a comprar leche. Si hay que darle 15 instrucciones cada día (salir, caminar dos cuadras, girar…), repetirlas todas es tedioso. Una función comprar_leche() agrupa esas instrucciones bajo un solo nombre.
🔎 Ejemplo explicado: girar a la derecha en Reeborg
El robot de Reeborg solo sabe move() (avanzar una casilla) y turn_left() (girar a la izquierda). No sabe girar a la derecha, pero se lo podemos enseñar:
def turn_right():
turn_left()
turn_left()
turn_left()
def turn_around():
turn_left()
turn_left()
move()
turn_right()
move()- Por qué funciona: tres giros de 90° a la izquierda equivalen a uno a la derecha.
- Ventajas que destaca el curso: menos líneas de código y, sobre todo, más legibilidad.
turn_right()dice lo que hace; tresturn_left()seguidos obligan a pensar. - Consejo: en Reeborg, el botón paso a paso (⏯) resalta cada línea mientras se ejecuta. Úsalo para ver cómo la ejecución "salta" dentro de la función y regresa.
⚠️ Errores frecuentes
1. Llamar la función antes de definirla
- Qué ocurre:
NameError: name 'saludar' is not defined. - Por qué ocurre: Python lee de arriba hacia abajo; cuando llega a la llamada, la función todavía no existe.
- Cómo solucionarlo: escribe las definiciones al inicio del archivo.
2. Olvidar los paréntesis al llamar
- Qué ocurre:
turn_rightsin()no ejecuta nada y no muestra ningún error. - Cómo solucionarlo: siempre
turn_right().
3. Sangría inconsistente dentro de la función → IndentationError, o que una línea quede por fuera de la función sin que te des cuenta.
📝 Ejercicio original del curso: turn_right() y el cuadrado
Enunciado:
- Crea la función
turn_right(). - Úsala para que el robot dibuje un pequeño cuadrado partiendo de (1, 1) y vuelva al inicio. Conceptos: definir y llamar funciones.
🔍 Antes de programar
- ¿Hacia dónde mira el robot al inicio?
- Recorre el cuadrado con el dedo: ¿qué giros necesitas y en qué orden?
- Predice antes de ejecutar: si el robot hace
move()tres veces, luegoturn_left()y otra vezmove()tres veces, ¿dónde termina? (Respuesta del curso: en (4, 4).)
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
En Python normal, crea una función mostrar_encabezado() que imprima el nombre de tu colegio entre dos líneas de =. Llámala dos veces.
🟡 Reto 2: Ampliación
En Reeborg, crea turn_around() y úsala para que el robot vaya a la casilla 3, dé la vuelta, regrese a la 1, dé la vuelta y termine en la 3.
🟠 Reto 3: Desafío
En Reeborg, dibuja un rectángulo de 3 × 2 casillas y define una función lado_largo() y otra lado_corto().
🔴 Reto 4: Pensamiento computacional
Escribe en español, como una "función" de pasos precisos, las instrucciones para que un robot prepare una aguapanela. Identifica qué pasos se repiten y agrúpalos en funciones (por ejemplo servir_taza()). ¿Qué instrucciones darías por obvias que un robot no entendería?
🧩 Comprueba lo aprendido: Tema 1
- Conceptual: ¿qué diferencia hay entre definir y llamar una función?
- Predicción: ¿qué imprime este código y en qué orden?
def a():
print("A")
print("inicio")
a()
a()
print("fin")- Depuración: este código produce
NameError. Corrígelo:
bienvenida()
def bienvenida():
print("Bienvenido")Evidencia: captura de Reeborg con el cuadrado dibujado y el código.
2. Funciones + bucles: la carrera de obstáculos 1
(Fuente: 045 - The Hurdles Loop Challenge.md)
Prerequisito: Tema 1,
forconrange()(Día 5).
🎯 Objetivo de aprendizaje
- Descomponer un problema repetitivo en una función.
- Combinar funciones con
forpara reducir el código al mínimo sin perder legibilidad.
📖 Explicación conceptual: tres versiones de la misma solución
En el mundo Hurdle 1 de Reeborg, el robot debe saltar 6 vallas para llegar a la meta. El curso muestra cómo mejora el código paso a paso:
| Versión | Técnica | Líneas aproximadas |
|---|---|---|
| 1 | Escribir cada instrucción una tras otra | ≈ 58 |
| 2 | Agrupar un salto en una función jump() y llamarla 6 veces |
≈ 21 |
| 3 | Llamar jump() dentro de un for con range(6) |
aún menos |
Estrategia de trabajo que enseña el curso: programar un solo salto, probarlo línea por línea y solo entonces pensar en repetirlo. Así, si algo falla, sabes exactamente dónde.
💡 El curso bromea con que "los programadores nacimos para ser perezosos". La idea de fondo es que si repites código, hay una forma mejor de escribirlo.
Atajo de editor: para aplicar sangría a varias líneas a la vez, selecciónalas y usa Ctrl + ] (Windows) o Cmd + ] (Mac). Para quitarla, Ctrl + [ o Cmd + [. (En Reeborg, y en la mayoría de editores, también funciona la tecla Tab con las líneas seleccionadas.)
📝 Ejercicio original del curso: Hurdle 1
Enunciado: en el mundo Hurdle 1, haz que el robot salte las 6 vallas y llegue a la meta con la menor cantidad de líneas posible, sin sacrificar la legibilidad.
🔍 Antes de programar
- ¿Qué secuencia exacta de movimientos es un salto? Escríbela en papel.
- Cuando termina un salto, ¿el robot queda en una situación equivalente a la del inicio? (El curso observa que (3, 1) "es casi lo mismo" que (1, 1).)
- ¿Cuántas veces se repite esa secuencia?
Pista de estructura: un salto (según el curso) es: avanzar → girar a la izquierda → avanzar → girar a la derecha → avanzar → girar a la derecha → avanzar → girar a la izquierda.
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Resuelve Hurdle 1 con for y range(). Luego con for y una lista: for valla in [1, 2, 3, 4, 5, 6]:. ¿Hay alguna diferencia?
🟡 Reto 2: Ampliación
En Python normal, crea imprimir_linea() y úsala en un for para dibujar un marco.
🟠 Reto 3: Desafío
Cuenta las líneas de tus tres versiones de Hurdle 1 y escribe un párrafo comparando la brevedad con la legibilidad. ¿Siempre es mejor tener menos líneas?
🔴 Reto 4: Pensamiento computacional
Si el robot tuviera que saltar 6 vallas pero cada tercera valla fuera doble (el doble de alta), ¿cómo lo resolverías con for, % (Día 3) y dos funciones? Escribe el algoritmo en pseudocódigo.
3. Sangría y bloques de código
(Fuente: 046 - Indentation in Python.md)
Prerequisito: bloques en
if(Día 3),for(Día 5) y funciones (Tema 1).
🎯 Objetivo de aprendizaje
- "Ver" los bloques de código a partir de la sangría.
- Seguir la recomendación oficial de sangría (PEP 8): 4 espacios.
📖 Explicación conceptual
Los bloques son como carpetas. El curso compara la sangría con las carpetas del explorador de archivos: todo lo que está "dentro" de la carpeta mi_funcion tiene sangría respecto a ella. Si un if está dentro de la función, sus líneas son una subcarpeta: dos niveles de sangría (8 espacios).
def mi_funcion(): # nivel 0
if cielo == "despejado": # nivel 1 → dentro de la función
print("azul") # nivel 2 → dentro del if
elif cielo == "lluvioso":
print("gris")
print("fin de la función") # nivel 1 → dentro de la función, fuera del if
print("Hola") # nivel 0 → fuera de todo¿Espacios o tabulaciones? Es una discusión eterna entre programadores. El curso incluso muestra una escena de la serie Silicon Valley sobre el tema. La guía oficial de estilo, PEP 8 (se abre en otra pestaña), es clara:
- Usa espacios, 4 por cada nivel.
- No mezcles tabulaciones y espacios. En Python 3, mezclarlos de forma inconsistente produce un error.
- La mayoría de editores se pueden configurar para que la tecla Tab inserte 4 espacios automáticamente.
💡 Pensamiento crítico: el curso menciona una encuesta de Stack Overflow (2017) en la que quienes usaban espacios reportaban salarios más altos. Eso es una correlación, no una causa: usar espacios no sube el sueldo. ¿Qué otros factores podrían explicar ese resultado?
⚠️ Errores frecuentes
| Error | Causa típica |
|---|---|
IndentationError: expected an indented block |
El bloque después de : quedó sin sangría |
IndentationError: unexpected indent |
Hay sangría donde no se abrió ningún bloque |
TabError: inconsistent use of tabs and spaces in indentation |
Mezcla de tabulaciones y espacios |
| Sin error, pero con un resultado incorrecto | Una línea quedó en el nivel equivocado (dentro o fuera de un bloque) |
📝 Ejercicio original del curso: cuestionario de sangría
La lección remite a un cuestionario sobre sangría. Su contenido no está incluido entre los archivos suministrados.
🧩 Comprueba lo aprendido: Tema 3 (actividad equivalente, creada para esta adaptación)
- Análisis: marca con colores los bloques del ejemplo anterior (función,
if,elif). - Predicción: si
cielo = "nublado"y se llama la función, ¿qué se imprime? - Modificación: mueve
print("fin de la función")un nivel hacia adentro. ¿Cuándo se imprime ahora? - Configuración: revisa en tu editor (PyCharm, VS Code o Thonny) cómo hacer que Tab inserte 4 espacios.
4. Bucles while
(Fuente: 047 - While Loops.md)
Prerequisito:
for(Día 5), condiciones ynot(Día 3).
🎯 Objetivo de aprendizaje
- Escribir bucles
whileque se repiten mientras una condición sea verdadera. - Elegir entre
forywhilesegún el problema. - Reconocer y evitar los bucles infinitos.
📖 Explicación conceptual
Un while repite su bloque mientras la condición sea True. Antes de cada vuelta vuelve a revisar la condición:
while condicion:
# hacer algo
# (algo aquí dentro debe hacer que, tarde o temprano, la condición sea False)Ejemplo del curso: un robot de juguete que avanza mientras está conectado a la corriente.
Hurdle 1 con while:
numero_de_vallas = 6
while numero_de_vallas > 0:
jump()
numero_de_vallas -= 1
print(numero_de_vallas)| Vuelta | numero_de_vallas antes |
¿> 0? |
Después de -= 1 |
|---|---|---|---|
| 1 | 6 | ✅ | 5 |
| … | … | … | … |
| 6 | 1 | ✅ | 0 |
| — | 0 | ❌ → sale del bucle | — |
¿for o while? (criterio del curso)
Usa for cuando… |
Usa while cuando… |
|---|---|
| Recorres cada elemento de una lista o un rango | No sabes cuántas repeticiones harán falta |
| Sabes de antemano cuántas vueltas habrá | Repites hasta que ocurra algo (llegar a la meta, que el usuario escriba "salir") |
Bucles infinitos. Si la condición nunca se vuelve False (por ejemplo while 5 > 3:), el programa no termina nunca. Todos los programadores crean alguna vez un bucle infinito. Detén el programa (en PyCharm con el botón Stop; en la terminal con Ctrl + C) y revisa la condición. Consejo del curso: imprime la condición dentro del bucle para ver por qué nunca cambia.
🔎 Ejemplo explicado (Python normal, ampliación de esta adaptación)
clave_correcta = "python123"
intento = input("Escribe la clave: ")
while intento != clave_correcta:
print("Clave incorrecta")
intento = input("Escribe la clave: ")
print("¡Acceso concedido!")- Por qué
while: no sabemos cuántos intentos necesitará el usuario. - Qué evita el bucle infinito: en cada vuelta se pide un nuevo
intento. Si esa línea faltara, el programa repetiría "Clave incorrecta" para siempre.
⚠️ Errores frecuentes
- Olvidar actualizar la variable de la condición (
numero_de_vallas -= 1) → bucle infinito. - Usar
ifpensando que repite: unifse evalúa una sola vez; elwhilese repite. - Condición invertida:
while intento == clave_correctanunca entra al bucle si la primera clave es incorrecta, o nunca sale si es correcta.
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Con while, imprime un conteo regresivo del 10 al 1. Compáralo con la versión con for del Día 5.
🟡 Reto 2: Ampliación
Pide números al usuario y súmalos hasta que escriba 0. Muestra el total.
🟠 Reto 3: Desafío
¿Cuántas veces hay que duplicar $1 000 para superar $1 000 000? Resuélvelo con while y un contador.
🔴 Reto 4: Pensamiento computacional
Tienes un bucle infinito en este código. Explica por qué ocurre sin ejecutarlo y corrígelo de dos formas distintas:
n = 1
while n != 10:
n += 25. while + condiciones del robot: obstáculos 2, 3 y 4
(Fuentes: 047 - While Loops.md (Hurdle 2), 048 - Hurdles Challenge using While Loops.md, 049 - Jumping over Hurdles with Variable Heights.md)
Prerequisito: Tema 4.
📖 Condiciones de Reeborg
En la pestaña Conditions del teclado de Reeborg hay funciones que devuelven True o False:
| Condición | Pregunta |
|---|---|
at_goal() |
¿Estoy en la meta? |
front_is_clear() |
¿El frente está libre? |
wall_in_front() |
¿Hay una pared al frente? |
right_is_clear() |
¿La derecha está libre? |
wall_on_right() |
¿Hay una pared a la derecha? |
Todas pueden negarse con not: not at_goal().
🛠️ Nota técnica: en la transcripción las condiciones se dictan sin paréntesis ("while not at_goal"). En el código deben llevar paréntesis:
while not at_goal():. Sin paréntesis,at_goales la función en sí y no su resultado. Python la considera "verdadera", así quenot at_goalsiempre esFalsey el bucle nunca se ejecuta.
📝 Ejercicio original del curso: Hurdle 2 (meta en posición aleatoria)
Enunciado: la bandera aparece en una posición aleatoria. El robot debe saltar vallas hasta llegar a ella.
Conceptos: while, not, at_goal().
Idea del curso: "mientras no esté en la meta, salta". El curso prefiere while not at_goal(): a compararlo con != True, porque se lee casi como una frase en inglés.
📝 Ejercicio original del curso: Hurdle 3 (paredes en posiciones aleatorias)
Enunciado: ahora las paredes aparecen en posiciones y cantidades aleatorias. El robot debe seguir la línea punteada (no vale "rodearlo todo por arriba").
🔍 Antes de programar
- ¿Qué debe hacer el robot si hay una pared al frente? ¿Y si no la hay?
- Trampa que señala el curso: la función
jump()de Hurdle 1 empieza conmove(). Si hay una pared justo al frente, ¡el robot choca! ¿Cómo debes modificarjump()?
📝 Ejercicio original del curso: Hurdle 4 (vallas de altura variable)
Enunciado: posición, cantidad y altura de las vallas son aleatorias. El robot debe subir lo necesario, cruzar y bajar hasta el suelo. Meta del curso: entre 20 y 24 líneas de código.
🔍 Antes de programar
- Al subir junto a una valla, ¿qué condición te dice que todavía estás junto a la pared? (
wall_on_right()) - Al bajar, ¿qué condición te dice que todavía no has llegado al suelo? (
front_is_clear()) - ¿Cuántos
whilenecesita la nueva funciónjump()? ¿Pueden estar dentro de una función que a su vez se llama dentro de otrowhile?
Estructura de la solución del curso (sin código completo): jump() gira a la izquierda → mientras haya pared a la derecha, avanza → gira a la derecha, avanza, gira a la derecha → mientras el frente esté libre, avanza → gira a la izquierda.
Lección de depuración del curso: al ejecutar su solución apareció un
SyntaxErrorporque faltaban unos dos puntos. Prueba tu código después de cada cambio pequeño, así el error es fácil de ubicar.
Retos adicionales (creados para esta adaptación)
🟢 Reto 1
Resuelve Hurdle 2 con un contador y con at_goal(). ¿Cuál funciona sin importar dónde esté la meta?
🟡 Reto 2
Haz que Hurdle 3 funcione aunque el robot empiece mirando hacia otro lado. (Pista: un while inicial.)
🟠 Reto 3
Cuenta cuántas vallas saltó el robot en Hurdle 3 o 4 y muéstralo al final con print().
🔴 Reto 4
Diseña en papel un mundo de obstáculos que haga fallar tu solución de Hurdle 4. ¿Qué supuesto de tu algoritmo se rompe?
6. 🚀 Proyecto del día: Escapar del Laberinto
(Fuente: 050 - Final Project- Escaping the Maze.md, proyecto oficial del curso original)
Problema
En el mundo Maze de Reeborg, el robot aparece en una posición y dirección aleatorias. Debe llegar a la meta sin importar dónde empiece.
Contexto: el algoritmo de la mano derecha
La información del mundo (World Info) da la clave: si en un laberinto sigues siempre la pared de tu derecha, terminas encontrando la salida. No es un camino directo, es una estrategia, es decir, un algoritmo. Tiene una jerarquía de decisiones:
- Si puedes girar a la derecha, gira y avanza.
- Si no, y el frente está libre, avanza.
- Si no puedes ni lo uno ni lo otro, gira a la izquierda.
Requisitos funcionales
- El robot llega a la meta desde cualquier posición inicial.
- El código usa
while,if/elif/else,turn_right()y las condiciones de Reeborg.
🔍 Antes de programar
- ¿Qué estructura corresponde a la jerarquía "derecha → frente → izquierda"? (Día 3:
if/elif/else.) - ¿Qué condición de
whilehace que el robot siga hasta la meta? - Predice: si solo escribes el
ifde la derecha, sinelifnielse, ¿qué pasa cuando la derecha está bloqueada? (El curso lo prueba: el robot se queda atascado en un bucle infinito.)
Construcción paso a paso
Versión 1: turn_right() + while not at_goal(): con solo el caso de la derecha. Pruébalo y observa el fallo.
Versión 2: agrega elif para el frente.
Versión 3: agrega else para girar a la izquierda. Pruébalo muchas veces con posiciones aleatorias.
🧪 Prueba y depuración: el caso extremo (nivel avanzado)
El curso muestra un caso extremo. Si el robot empieza en ciertas posiciones sin pared a su derecha (por ejemplo, en un espacio abierto de 2 × 2), la regla "si la derecha está libre, gira y avanza" lo hace dar vueltas en círculo para siempre. Una pista: el contador de pasos de Reeborg supera los 1000.
- Diagnóstico del curso: el algoritmo de la mano derecha supone que el robot ya tiene una pared a su derecha.
- Idea de solución del curso: antes del bucle principal, avanzar mientras el frente esté libre hasta encontrar una pared, y luego girar a la izquierda para que esa pared quede a la derecha.
- El curso ofrece tres "mundos problema" descargables para verificar la solución. Esos archivos no están incluidos entre los materiales suministrados.
El curso recomienda a los principiantes marcar este reto y volver a él después del Día 15. No te frustres si hoy no sale: es depuración de nivel intermedio.
Pruebas
- Ejecuta el laberinto al menos 10 veces, porque la posición inicial cambia en cada ejecución.
- Registra en una tabla: el número de pasos y si el robot llegó o no.
- Si alguna vez supera los 1000 pasos, anota la posición y la dirección iniciales: ese es tu caso de prueba problemático.
⭐ Extensión del proyecto
- Implementa el algoritmo de la mano izquierda. ¿Funciona igual?
- Explica con un dibujo por qué el algoritmo de la mano derecha no funcionaría en un laberinto con "islas" (paredes que no están conectadas con el borde).
7. 🌟 Proyecto extra: La Alcancía Digital
Situación
Un estudiante quiere ahorrar para la excursión de fin de año. Deposita dinero semana a semana y quiere saber cuántas semanas tarda en alcanzar la meta.
Requisitos
- Una función
mostrar_bienvenida()que imprima el título del programa. - Pedir la meta de ahorro.
- Mientras el ahorro sea menor que la meta: pedir el depósito de la semana, acumularlo, contar la semana y mostrar cuánto falta.
- Rechazar los depósitos negativos o iguales a cero con un mensaje. Decide: ¿esa semana se cuenta o no?
- Al terminar, mostrar el total ahorrado, las semanas y el excedente, si lo hay.
Casos de prueba
| Meta | Depósitos | Semanas | Excedente |
|---|---|---|---|
| 100 000 | 30 000, 30 000, 50 000 | 3 | 10 000 |
| 50 000 | -5 000, 50 000 | 1 (si el depósito inválido no cuenta) | 0 |
⭐ Extensión
Agrega la opción de escribir "retiro" para sacar dinero de la alcancía.
8. 🏆 Proyecto integrador del Día 6: Caja Registradora de la Tienda Escolar
Proyecto integrador creado para esta adaptación. Integra listas (Día 4),
for(Día 5),while, funciones sin parámetros, condicionales y f-strings.
Situación problema
La tienda escolar anota los pedidos a mano y los cálculos en el descanso generan filas largas. Vas a programar una caja registradora de consola.
Pregunta orientadora
¿Cómo organizar un programa que se repite hasta que el usuario decida terminar, de forma que sea fácil de leer y de ampliar?
Requerimientos
- Dos listas paralelas:
productosyprecios, con al menos 5 productos. - Una función
mostrar_menu()que recorra las listas confore imprima cada producto con su número y su precio. - Un bucle
whileque pida el número del producto hasta que el cajero escribafin. - Validar que el número del producto exista. Si no, mostrar un mensaje sin bloquear el programa.
- Acumular el total y guardar en una lista los productos vendidos.
- Al terminar, mostrar un recibo: cada producto vendido, el total y el valor del descuento si el total supera los $10 000 (5 %).
- Una función
mostrar_despedida().
Etapas
- Listas y
mostrar_menu(). - Bucle de venta con la opción
fin. - Validación de la entrada.
- Recibo y descuento.
Casos de prueba
| Entradas del cajero | Resultado esperado |
|---|---|
1, 1, fin |
Dos veces el producto 1 y su total |
9 (si solo hay 5 productos) |
"Producto no existe" y el programa continúa |
fin al inicio |
Recibo vacío con total $0 |
Criterios técnicos
- Sin bucles infinitos ni
IndexError. - El código está organizado con funciones y la sangría es correcta y consistente (4 espacios).
9. 🤖 Programar con apoyo de IA
Reeborg es un excelente banco de pruebas para evaluar respuestas de IA, porque los resultados se ven: el robot llega a la meta o no llega.
Actividad: pide a una IA una solución para el laberinto de Reeborg. Luego:
- Ejecútala al menos 10 veces, porque la posición inicial es aleatoria.
- Verifica si contempla el caso extremo del espacio abierto (más de 1000 pasos).
- Verifica si escribió las condiciones con paréntesis:
at_goal(). - Compara su algoritmo con el de la mano derecha: ¿es el mismo? ¿Por qué funciona o por qué falla?
10. 🛠️ Correcciones técnicas al material original
| Archivo | Afirmación en la transcripción | Observación | Tratamiento |
|---|---|---|---|
047, 048, 050 |
"while not at_goal" (dictado sin paréntesis) | Las condiciones de Reeborg son funciones: at_goal(). Sin (), not at_goal siempre es False |
Nota técnica en el Tema 5 |
044 |
Se nombra la función "turn-around()" | Un guion no es válido en un nombre de función; debe ser turn_around() |
Se usa guion bajo |
046 |
"En Python 3 no puedes mezclar tabuladores y espacios en el mismo archivo" | Más preciso: la mezcla inconsistente en la sangría produce TabError. PEP 8 recomienda usar solo espacios |
Tabla de errores del Tema 3 |
046 |
Encuesta de salarios: espacios frente a tabulaciones | Es una correlación, no una causa | Nota de pensamiento crítico en el Tema 3 |
050 |
Mundos problema descargables | No están incluidos entre los archivos suministrados | Se indica en el proyecto |
11. 📋 Matriz de trazabilidad
| Contenido original | Archivo de origen | Concepto desarrollado | Ejercicio original | Reto adicional | Proyecto relacionado |
|---|---|---|---|---|---|
| Objetivos: robot y laberinto | 043 |
Sección 0 | — | — | Sección 6 |
def, llamar funciones, Reeborg, turn_right, turn_around |
044 |
Tema 1 | turn_right() y el cuadrado |
Retos 1–4 del Tema 1 | Proyectos 6, 7 y 8 |
Hurdle 1: función + for |
045 |
Tema 2 | Hurdle 1 | Retos 1–4 del Tema 2 | Proyecto 6 |
| Sangría, espacios frente a tabulaciones, PEP 8 | 046 |
Tema 3 | Cuestionario (mencionado, no suministrado) | Actividad equivalente del Tema 3 | Todos |
while, for frente a while, bucle infinito, Hurdle 2 |
047 |
Temas 4 y 5 | Hurdle 2 | Retos 1–4 del Tema 4 | Proyectos 7 y 8 |
| Hurdle 3 | 048 |
Tema 5 | Hurdle 3 | Retos 2–3 del Tema 5 | Proyecto 6 |
| Hurdle 4 | 049 |
Tema 5 | Hurdle 4 | Reto 4 del Tema 5 | Proyecto 6 |
| Laberinto, mano derecha, caso extremo | 050 |
Integración | Proyecto oficial (con depuración avanzada) | Extensiones: mano izquierda, islas | Sección 6 |
| Motivación: la dificultad es aprendizaje | 051 |
Sección 0 | — | — | — |
| (No existe en el curso original) | — | — | — | Alcancía Digital | Sección 7 |
| (No existe en el curso original) | — | — | — | Caja Registradora | Sección 8 |
12. 📦 Evidencias de aprendizaje del Día 6
- Capturas de Reeborg: cuadrado, Hurdle 1 a 4 y Laberinto, cada una con su código.
- Tabla de 10 ejecuciones del laberinto (pasos y resultado).
- Comparación escrita de las 3 versiones de Hurdle 1 (brevedad frente a legibilidad).
- Uno de los proyectos adicionales funcionando.
- Cuaderno de errores:
NameErrorpor llamar una función antes de definirla,TabError, bucle infinito (cómo detectarlo y detenerlo) y condición sin paréntesis.