Computadoras y Programación · ENES Juriquilla · UNAM
Extra del curso · Banco de retos
terminal — curso
$ elegir_retoReto 6 · Química · ★★$

Banco de retos.

Multidisciplinarios: un problema, tres resultados esperados y el algoritmo lo diseñas tú.
Por
Walter Rosales
Cómo funciona el banco

Problema, meta y tres resultados.

Reto 7
1Programa en C
2Física
3★★
412 min
5Problema · qué lograr · resultado esperado
6Solución → slide siguiente
1Tipoejecutar, depurar, programar en C, pseudocódigo o diagrama
2Áreade qué mundo viene el problema
3Dificultad★ ejecuta o depura código · ★★ y ★★★ lo escribes tú desde cero
4Tiempoel sugerido, no el que vas a tardar
5Problema · qué lograr · resultado esperadosin fórmulas: el cálculo lo deduces tú
6Soluciónen la slide siguiente: no la mires antes
Mapa del banco

Catorce retos, tres niveles.

★
1
Vida diaria
Ejecuta y predice
2
Salud
Encuentra el error
3
Ciencias sociales
Encuentra el error
4
Lenguaje y arte
Sin computadora
★★
5
Música
Programa en C
6
Química
Programa en C
7
Física
Programa en C
8
Geografía
Diagrama de flujo
9
Cocina
Diagrama de flujo
★★★
10
Deportes
Programa en C
11
Finanzas
Pseudocódigo
12
Servicios del hogar
Diagrama de flujo
13
Lenguaje y texto
Pseudocódigo
14
Tu mundo
Creativo · abierto
Reto 1
Ejecuta y prediceVida diaria★5 min

Cópialo, compílalo y predice.

propina.c
#include <stdio.h>
 
int main(void)
{
int cuenta;
scanf("%d", &cuenta);
 
float propina = cuenta * (15 / 100);
 
printf("Propina: %.2f\n", propina);
return 0;
}
1
Copia el programaen un archivo propina.c
2
Compílalogcc -Wall -Wextra propina.c
3
Predice y luego ejecutacon tres cuentas: 250, 100 y 80
predice 1
$ ./a.out 250 ?
predice 2
$ ./a.out 100 ?
predice 3
$ ./a.out 80 ?
Respuesta · Reto 1
Ejecuta y prediceVida diaria★5 min

Siempre 0.00. El mesero opina distinto.

propina.c
#include <stdio.h>
 
int main(void)
{
int cuenta;
scanf("%d", &cuenta);
 
float propina = cuenta * 15 / 100.0;
 
printf("Propina: %.2f\n", propina);
return 0;
}
15 / 100 son dos enteros: vale 0. Y todo lo que se multiplica por 0 es 0.
tal cual: cuenta * (15 / 100)
$ echo "250" | ./a.out Propina: 0.00 $ echo "100" | ./a.out Propina: 0.00 $ echo "80" | ./a.out Propina: 0.00
arreglado: cuenta * 15 / 100.0
$ echo "250" | ./a.out Propina: 37.50 $ echo "100" | ./a.out Propina: 15.00 $ echo "80" | ./a.out Propina: 12.00
Reto 2
Encuentra el errorSalud★6 min

gcc se queja. ¿Cuál es la línea culpable?

imc.c
1#include <stdio.h>
2 
3int main(void)
4{
5 float peso, estatura;
6 scanf("%f %f", &peso, &estatura);
7 
8 float imc = peso / (estatura * estatura)
9 
10 printf("IMC = %.1f\n", imc);
11 return 0;
12}
gcc
$ gcc -Wall -Wextra imc.c imc.c: In function 'main': imc.c:10:5: error: expected ',' or ';' before 'printf' 10 | printf("IMC = %.1f\n", imc); | ^~~~~~
esperado · caso 1
$ ./a.out 70 1.75 IMC = 22.9
esperado · caso 2
$ ./a.out 55 1.6 IMC = 21.5
esperado · caso 3
$ ./a.out 100 1.8 IMC = 30.9
Respuesta · Reto 2
Encuentra el errorSalud★6 min

El error estaba una línea antes.

imc.c
1#include <stdio.h>
2 
3int main(void)
4{
5 float peso, estatura;
6 scanf("%f %f", &peso, &estatura);
7 
8 float imc = peso / (estatura * estatura);
9 
10 printf("IMC = %.1f\n", imc);
11 return 0;
12}
gcc -Wall -Wextra imc.c
$ echo "70 1.75" | ./a.out IMC = 22.9 $ echo "55 1.6" | ./a.out IMC = 21.5 $ echo "100 1.8" | ./a.out IMC = 30.9
gcc reporta la línea 10, pero el punto y coma falta al final de la 8. El compilador se da cuenta cuando ya es tarde.
Reto 3
Encuentra el errorCiencias sociales★8 min

Compila sin un solo aviso. Y aun así, se equivoca.

encuesta.c
#include <stdio.h>
 
int main(void)
{
float h1, h2, h3;
scanf("%f %f %f", &h1, &h2, &h3);
 
float promedio = h1 + h2 + h3 / 3;
 
printf("Promedio de sueno: %.1f h\n", promedio);
return 0;
}
lo que imprime con 5 7 9
$ gcc -Wall -Wextra encuesta.c && ./a.out 5 7 9 Promedio de sueno: 15.0 h
Tres personas durmieron 5, 7 y 9 horas. ¿Por qué sale 15?
esperado · caso 1
$ ./a.out 5 7 9 Promedio de sueno: 7.0 h
esperado · caso 2
$ ./a.out 8 8 8 Promedio de sueno: 8.0 h
esperado · caso 3
$ ./a.out 4 5 9 Promedio de sueno: 6.0 h
Respuesta · Reto 3
Encuentra el errorCiencias sociales★8 min

Faltaban los paréntesis.

encuesta.c
#include <stdio.h>
 
int main(void)
{
float h1, h2, h3;
scanf("%f %f %f", &h1, &h2, &h3);
 
float promedio = (h1 + h2 + h3) / 3;
 
printf("Promedio de sueno: %.1f h\n", promedio);
return 0;
}
gcc -Wall -Wextra encuesta.c
$ echo "5 7 9" | ./a.out Promedio de sueno: 7.0 h $ echo "8 8 8" | ./a.out Promedio de sueno: 8.0 h $ echo "4 5 9" | ./a.out Promedio de sueno: 6.0 h
1
h3 / 3 se calcula primero9 / 3 = 3
2
Después se suma5 + 7 + 3 = 15
3
Con paréntesis(5 + 7 + 9) / 3 = 7
Reto 4
Sin computadoraLenguaje y arte★10 min

Dibújalo sin mirar.

A · mira la figura
solo palabras
B · dibuja sin ver
1
Parejas.A ve la figura. B no.
2
A dicta instrucciones precisas.Prohibido decir qué es o señalar.
3
B dibuja.Comparan y cambian de rol.
Respuesta · Reto 4
Sin computadoraLenguaje y arte★10 min

Precisión: eso es un algoritmo.

Ambigua
Un cuadrado grande y, arriba, un triángulo.
Precisa
1. Cuadrado de 6 cm, con la base en la mitad de abajo de la hoja.
2. Sobre el lado de arriba, un triángulo con la punta 3 cm más arriba.
3. Círculo de 1 cm de radio, en el centro del cuadrado.
3 cm6 cm
Pasos ordenados, sin ambigüedad, que terminan.
Reto 5
Programa en CMúsica★★10 min

Cuatro pulsos por compás: ¿cuántos compases?

Problema
Una canción trae pulsos sueltos y cada compás se llena con 4.
Qué debes lograr
Lee el total de pulsos. Muestra cuántos compases completos hay y cuántos pulsos sobran.
Entregable
Programa en C
desde cero · solo variables, scanf, printf, / y %
caso 1 · típico
$ ./a.out 10 2 compases y 2 pulsos
caso 2 · exactos
$ ./a.out 16 4 compases y 0 pulsos
caso 3 · < 1 compás
$ ./a.out 3 0 compases y 3 pulsos
Respuesta · Reto 5
Programa en CMúsica★★10 min

/ cuenta los compases, % cuenta lo que sobra.

compases.c
#include <stdio.h>
 
int main(void)
{
int pulsos;
scanf("%d", &pulsos);
 
int compases = pulsos / 4;
int sobran = pulsos % 4;
 
printf("%d compases y %d pulsos\n", compases, sobran);
return 0;
}
gcc -Wall -Wextra compases.c
$ echo "10" | ./a.out 2 compases y 2 pulsos $ echo "16" | ./a.out 4 compases y 0 pulsos $ echo "3" | ./a.out 0 compases y 3 pulsos
10 / 4 = 2 compases · 10 % 4 = 2 pulsos sueltos. Con 16, el residuo es 0.
Reto 6
Programa en CQuímica★★12 min

11.7 g de sal en 0.5 L: ¿qué tan concentrada?

Problema
En el laboratorio disuelves sal en agua y quieres su molaridad: cuántos moles de sal hay en cada litro. La masa molar te dice cuántos gramos pesa un mol.
Qué debes lograr
Lee la masa (g), la masa molar (g/mol) y los litros. Muestra la molaridad con 2 decimales.
Entregable
Programa en C
desde cero · variables con decimales, scanf y printf
caso 1 · típico
$ ./a.out 11.7 58.5 0.5 Molaridad = 0.40 M
caso 2 · 1 mol en 1 L
$ ./a.out 36.5 36.5 1 Molaridad = 1.00 M
caso 3 · muy diluida
$ ./a.out 5.85 58.5 2 Molaridad = 0.05 M
Respuesta · Reto 6
Programa en CQuímica★★12 min

Moles entre litros: dos divisiones.

molaridad.c
#include <stdio.h>
 
int main(void)
{
double masa, masaMolar, litros;
scanf("%lf %lf %lf", &masa, &masaMolar, &litros);
 
double moles = masa / masaMolar;
double molaridad = moles / litros;
 
printf("Molaridad = %.2f M\n", molaridad);
return 0;
}
gcc -Wall -Wextra molaridad.c
$ echo "11.7 58.5 0.5" | ./a.out Molaridad = 0.40 M $ echo "36.5 36.5 1" | ./a.out Molaridad = 1.00 M $ echo "5.85 58.5 2" | ./a.out Molaridad = 0.05 M
moles = 11.7 / 58.5 = 0.2 · molaridad = 0.2 / 0.5 = 0.40 M
Reto 7
Programa en CFísica★★12 min

Una piedra de m kg cae durante t s.

Problema
Sueltas una piedra desde un puente y cuentas cuánto tarda en llegar al agua.
Qué debes lograr
Lee t (s) y luego m (kg). Usa 9.8 m/s² como gravedad. Muestra la altura de la caída y la energía cinética con la que llega, con 1 decimal.
Entregable
Programa en C
desde cero · variables con decimales, scanf y printf
caso 1 · típico
$ ./a.out 3 2 h = 44.1 m Ec = 864.4 J
caso 2 · otra masa
$ ./a.out 1 10 h = 4.9 m Ec = 480.2 J
caso 3 · límite: t = 0
$ ./a.out 0 5 h = 0.0 m Ec = 0.0 J
Respuesta · Reto 7
Programa en CFísica★★12 min

Dos fórmulas, cero magia.

caida.c
#include <stdio.h>
 
int main(void)
{
float t, m;
scanf("%f %f", &t, &m);
 
float g = 9.8f;
float h = 0.5f * g * t * t;
float v = g * t;
float ec = 0.5f * m * v * v;
 
printf("h = %.1f m\n", h);
printf("Ec = %.1f J\n", ec);
return 0;
}
gcc -Wall -Wextra caida.c
$ echo "3 2" | ./a.out h = 44.1 m Ec = 864.4 J $ echo "1 10" | ./a.out h = 4.9 m Ec = 480.2 J $ echo "0 5" | ./a.out h = 0.0 m Ec = 0.0 J
En C, 1 / 2 vale 0: por eso 0.5f, no ½.
Reto 8
Diagrama de flujoGeografía★★10 min

¿Hemisferio norte o sur?

Problema
Un GPS recibe la latitud del lugar donde estás: positiva al norte del ecuador, negativa al sur.
Qué debes lograr
Lee la latitud (en grados). Decide si estás en el hemisferio norte, en el sur o justo en el ecuador.
Entregable
Diagrama de flujo
óvalo · paralelogramo · rectángulo · rombo
caso 1 · Querétaro
entrada: 20.6 salida: Hemisferio norte
caso 2 · Ushuaia
entrada: -54.8 salida: Hemisferio sur
caso 3 · el ecuador
entrada: 0 salida: En el ecuador
Respuesta · Reto 8
Diagrama de flujoGeografía★★10 min

Dos rombos encadenados, tres finales.

Inicio
LEER latitud
¿latitud > 0?
no
¿latitud < 0?
no
En el ecuador
sí
Hemisferio norte
sí
Hemisferio sur
Fin
20.6 → Hemisferio norte  ·  -54.8 → Hemisferio sur  ·  0 → En el ecuador
Verificado con un programa equivalente en C (gcc -Wall -Wextra -std=c11) y con un espejo en Python: coinciden en los 3 casos.
Reto 9
Diagrama de flujoCocina★★12 min

Receta para 4. Vienen 10.

Problema
250 g de harina alcanzan para 4 personas y la receta crece en proporción, pero llegaron 10 invitados.
Qué debes lograr
Lee cuántas personas son y calcula la harina. Si pasa de 1000 g (1000 exactos aún caben), avisa «Usa dos tazones»; si no, muestra los gramos.
Entregable
Diagrama de flujo
óvalo · paralelogramo · rectángulo · rombo
caso 1 · vienen 10
entrada: 10 salida: 625 g
caso 2 · se pasa
entrada: 20 salida: Usa dos tazones
caso 3 · receta base
entrada: 4 salida: 250 g
Respuesta · Reto 9
Diagrama de flujoCocina★★12 min

Un rombo, dos caminos.

Inicio
LEER personas
harina ← 250 × personas ÷ 4
¿harina > 1000?
no
harina, " g"
sí
Usa dos tazones
Fin
10 → 625 g  ·  20 → Usa dos tazones  ·  4 → 250 g
Verificado con un programa equivalente en C (gcc -Wall -Wextra -std=c11) y con un espejo en Python: coinciden en los 3 casos.
Reto 10
Programa en CDeportes★★★15 min

¿A qué ritmo corre?

Problema
Terminas una carrera y quieres saber cuánto tardaste por cada kilómetro.
Qué debes lograr
Lee km, minutos y segundos totales. Muestra el ritmo como minutos y segundos por km.
Entregable
Programa en C
desde cero · sin if ni for: solo / y %
caso 1 · 10 km
$ ./a.out 10 52 0 Ritmo: 5 min 12 s por km
caso 2 · con segundos
$ ./a.out 5 22 30 Ritmo: 4 min 30 s por km
caso 3 · < 1 min
$ ./a.out 1 0 59 Ritmo: 0 min 59 s por km
Respuesta · Reto 10
Programa en CDeportes★★★15 min

Segundos por kilómetro, y luego a min : s.

ritmo.c
#include <stdio.h>
 
int main(void)
{
int km, min, seg;
scanf("%d %d %d", &km, &min, &seg);
 
int total = min * 60 + seg;
int ritmo = total / km;
 
printf("Ritmo: %d min %d s por km\n", ritmo / 60, ritmo % 60);
return 0;
}
gcc -Wall -Wextra ritmo.c
$ echo "10 52 0" | ./a.out Ritmo: 5 min 12 s por km $ echo "5 22 30" | ./a.out Ritmo: 4 min 30 s por km $ echo "1 0 59" | ./a.out Ritmo: 0 min 59 s por km
52 min = 3120 s · 3120 / 10 = 312 s por km
312 / 60 = 5 min · 312 % 60 = 12 s
Reto 11
PseudocódigoFinanzas★★★20 min

Ahorras cada mes. El banco también suma.

Problema
Depositas una cantidad fija cada mes y el banco paga interés sobre todo lo acumulado.
Qué debes lograr
Lee depósito, tasa mensual (%) y meses. Cada mes: primero depositas y luego el banco suma, sobre todo lo que ya tienes, ese porcentaje de interés. Muestra el saldo final con 2 decimales.
Entregable
Pseudocódigo
con ciclo y acumulador · desde cero
caso 1 · 3 meses
entrada: 100 10 3 salida: Saldo final: 364.10
caso 2 · otra tasa
entrada: 500 2 6 salida: Saldo final: 3217.14
caso 3 · límite: 0 meses
entrada: 800 4 0 salida: Saldo final: 0.00
Respuesta · Reto 11
PseudocódigoFinanzas★★★20 min

El saldo se acumula mes a mes.

LEER deposito, tasa, meses saldo ← 0 PARA mes DESDE 1 HASTA meses HACER saldo ← saldo + deposito saldo ← saldo + saldo * tasa / 100 FIN PARA ESCRIBIR "Saldo final: ", saldo
Verificado con un programa equivalente en C (gcc -Wall -Wextra -std=c11) y con un espejo en Python: coinciden en los 3 casos.
Traza del caso 1 (100, 10 %, 3 meses)
mestras depositartras interés
00.000.00
1100.00110.00
2210.00231.00
3331.00364.10
las tres pruebas (C equivalente)
$ echo "100 10 3" | ./a.out Saldo final: 364.10 $ echo "500 2 6" | ./a.out Saldo final: 3217.14 $ echo "800 4 0" | ./a.out Saldo final: 0.00
Reto 12
Diagrama de flujoServicios del hogar★★★20 min

El agua cuesta más mientras más gastas.

Problema
El recibo cobra por tramos: los primeros 10 m³ cuestan $5 cada uno, del 11 al 20 cuestan $8 cada uno y del 21 en adelante, $12 cada uno.
Qué debes lograr
Lee los m³ consumidos (enteros). Calcula el pago total y muéstralo. Cada tramo cobra solo los m³ que caen dentro de él.
Entregable
Diagrama de flujo
dos decisiones encadenadas, tres caminos
caso 1 · primer tramo
entrada: 8 salida: Pago: $40
caso 2 · segundo tramo
entrada: 15 salida: Pago: $90
caso 3 · tercer tramo
entrada: 27 salida: Pago: $214
Respuesta · Reto 12
Diagrama de flujoServicios del hogar★★★20 min

Dos rombos, tres caminos, un solo Fin.

Inicio
LEER m³
¿m³ ≤ 10?
no
¿m³ ≤ 20?
no
pago ← 130 +
(m³ − 20) × 12
sí
pago ← m³ × 5
sí
pago ← 50 +
(m³ − 10) × 8
ESCRIBIR pago
Fin
8 m³ → Pago: $40  ·  15 m³ → Pago: $90  ·  27 m³ → Pago: $214
Verificado con un programa equivalente en C (gcc -Wall -Wextra -std=c11) y con un espejo en Python: coinciden en los 3 casos.
Reto 13
PseudocódigoLenguaje y texto★★★20 min

Cada letra, k lugares más allá.

textoABCDEFGHIJKLMNOPQRSTUVWXYZ
clave 3DEFGHIJKLMNOPQRSTUVWXYZABC
Problema
Un mensaje secreto: cada letra se corre k lugares en el abecedario.
Qué debes lograr
Lee un mensaje en MAYÚSCULAS y la clave k; tras la Z vuelves a la A. Muestra el mensaje cifrado. Ayudas: posicion(letra) va de 0 (A) a 25 (Z), letra(n) y longitud(texto).
Entregable
Pseudocódigo
con ciclo sobre las letras · desde cero
caso 1 · típico
entrada: HOLA 3 salida: KROD
caso 2 · trampa: la Z
entrada: XYZ 3 salida: ABC
caso 3 · clave 26
entrada: ABC 26 salida: ABC
Respuesta · Reto 13
PseudocódigoLenguaje y texto★★★20 min

El MOD 26 es la vuelta al abecedario.

LEER mensaje, clave resultado ← "" PARA i DESDE 0 HASTA longitud(mensaje) - 1 HACER pos ← posicion(mensaje[i]) nueva ← (pos + clave) MOD 26 resultado ← resultado + letra(nueva) FIN PARA ESCRIBIR resultado
A = 0 · B = 1 · … · Z = 25. posicion(letra) da el número; letra(n) devuelve la letra.
Verificado con un programa equivalente en C (gcc -Wall -Wextra -std=c11) y con un espejo en Python: coinciden en los 3 casos.
letrapospos + 3MOD 26nueva
X23260A
Y24271B
Z25282C
las tres pruebas (C equivalente)
$ echo "HOLA 3" | ./a.out KROD $ echo "XYZ 3" | ./a.out ABC $ echo "ABC 26" | ./a.out ABC
Z es 25, y 25 + 3 = 28. 28 MOD 26 = 2: la C. Por eso XYZ → ABC.
Reto 14
Creativo · abiertoTu mundo★★★25 min

Diseña tu algoritmo.

Proceso A
Preparar un café
Proceso B
¿Llevo paraguas?
Proceso C
Repartir la cuenta entre amigos
1
Pseudocódigo y diagrama de flujolos dos, y que coincidan
2
Al menos una decisiónun rombo, un SI
3
Tres pruebasentrada → salida, con un caso límite
4
Otro equipo lo ejecutasin hacerte ni una pregunta
O inventa un proceso propio.
Respuesta · Reto 14
Creativo · abiertoTu mundo★★★25 min

Un buen algoritmo se explica solo.

Ejemplo: ¿llevo paraguas? (lluvia = probabilidad en %)
Inicio
LEER lluvia
¿lluvia ≥ 40?
no
Sal ligero
sí
Lleva paraguas
Fin
LEER lluvia SI lluvia >= 40 ENTONCES ESCRIBIR "Lleva paraguas" SINO ESCRIBIR "Sal ligero" FIN SI
Verificado con un programa equivalente en C (gcc -Wall -Wextra -std=c11) y con un espejo en Python: coinciden en los 3 casos.
tres pruebas (C equivalente)
$ lluvia = 70 Lleva paraguas $ lluvia = 40 Lleva paraguas $ lluvia = 10 Sal ligero
En clase · opcional

Giren la ruleta.

Física
Química
Salud
Dinero
Música
Lenguaje
Geografía
Cocina
?
1
Equipos de 3 o 4Una computadora por equipo. Todos opinan.
2
Giren la ruletaEl área manda: elijan un reto de ese mundo.
3
Puntos por estrella★ = 1 · ★★ = 2 · ★★★ = 3. +1 si compila sin avisos.
En clase · opcional

Tres comodines. Cada uno cuesta un punto.

Pista del profe
−1 punto
Una pista. Una sola. Con cara de misterio.
Pregunta al grupo
−1 punto
Cualquier otro equipo puede opinar. Nadie jura nada.
Pregunta a un chatbot
−1 punto
Responde con total aplomo. Tú tienes un compilador.
Gana el equipo que más puntos junte, y su premio es inventar el siguiente reto.
Gracias
Walter Rosales
CEO & Co-Founder iGalenus
walter.rosales@igalenus.com
Instagram @walterr_rosales
https://walter-rosales.com