Selection and iteration · Selección e iteración
| English | Español |
|---|---|
| selection/sɪˈlekʃn/ | selección |
| iteration/ˌɪtəˈreɪʃn/ | iteración |
| trace table/treɪs ˈteɪbl/ | tabla de trazado |
| nested/ˈnestɪd/ | anidado |
| logic error/ˈlɒdʒɪk ˈerə/ | error lógico |
| count-controlled loop/kaʊnt kənˈtrəʊld luːp/ | bucle controlado por conteo |
| array/əˈreɪ/ | array |
| pre-condition loop/priː kənˈdɪʃn luːp/ | bucle con precondición |
| post-condition loop/pəʊst kənˈdɪʃn luːp/ | bucle con poscondición |
| dry run/draɪ rʌn/ | ejecución manual |
One line too many
- In 2014 Apple shipped a security update because of a single repeated line. Deep inside the code that checked a website's certificate,
goto fail;appeared twice in a row. - The second copy sat outside its
IF, so it ran every time, and the check below it never did. For months, any attacker could pretend to be any website. - Selection and iteration are the constructs that decide what runs and how often. Get one line of them wrong and the program still runs, just wrongly.
- This lesson is IF, CASE and the three loops, and the trace table that catches the mistake before the exam does.
Una línea de más
- En 2014, Apple envió una actualización de seguridad debido a una única línea repetida. Profundamente dentro del código que verificaba el certificado de un sitio web,
goto fail;aparecía dos veces seguidas. - La segunda copia se encontraba fuera de su
IF, por lo que se ejecutaba en cada ocasión, y la comprobación situada debajo nunca lo hacía. Durante meses, cualquier atacante podría fingir ser cualquier sitio web. - Las estructuras de selección e iteración son los constructos que deciden qué se ejecuta y con qué frecuencia. Si te equivocas en una sola línea de ellas, el programa sigue ejecutándose, pero incorrectamente.
- Esta lección trata sobre IF, CASE y los tres bucles, así como sobre la tabla de trazado que detecta el error antes de que lo haga el examen.
Selection
IF age >= 18 THEN … ELSE … ENDIF
- The
ELSEis optional, theENDIFis not. EveryIFmust be closed. - A condition is any Boolean expression: a comparison, or comparisons joined by
AND,ORandNOT.
An IF … ELSE tests once, then runs exactly one branch
Selección
IF age >= 18 THEN … ELSE … ENDIF
- El
ELSEes opcional, elENDIFno lo es. CadaIFdebe cerrarse. - Una condición es cualquier expresión booleana: una comparación, o comparaciones unidas por
AND,ORyNOT.

Un IF … ELSE se evalúa una vez y luego ejecuta exactamente una rama
Nested IFs and boundaries
- A nested 嵌套 IF is an IF inside a branch of another IF, and each one needs its own
ENDIF. - Boundaries are where marks are lost. "A mark of 50 or more passes" is
Mark >= 50, notMark > 50. - A wrong comparison is a logic error 逻辑错误: the program runs and gives the wrong answer for some inputs. A trace with the boundary value, 50 itself, is how you find it.
IF anidados y límites
- Un anidado嵌套 IF es un IF dentro de una rama de otro IF, y cada uno necesita su propio
ENDIF. - Los límites son donde se pierden las marcas. "Una nota de 50 o más aprueba" es
Mark >= 50, noMark > 50. - Una comparación errónea es un error lógico 逻辑错误: el programa se ejecuta y da la respuesta incorrecta para algunas entradas. Un trazado con el valor límite, 50 mismo, es cómo se encuentra.
"A mark of 50 or more passes" is written as IF Mark ____ 50 THEN. · "Una nota de 50 o más es aprobatoria" se escribe como IF Mark ____ 50 THEN.
"Or more" includes 50 itself, so the comparison is greater than or equal. > would fail a student on exactly 50. · "O más" incluye el propio 50, por lo que la comparación es mayor o igual. > fallaría a un estudiante que tenga exactamente 50.
CASE
CASE OF Grade … ENDCASEtests one value against several options and is cleaner than a chain of nested IFs.- A guard can be a single value
"A":, a list1, 2, 3:, or a range1 TO 5:. The last branch for "anything else" isOTHERWISE, never a condition such as> 200. - Guards are tested in order. With
1 TO 50:followed by40 TO 60:, a value of 45 takes the first branch, so an assignment in the second may never run. If the earlier branches cover every possible value,OTHERWISEis never performed either.
A CASE runs the first branch whose guard matches the value
CASE
CASE OF Grade … ENDCASEcomprueba un único valor contra varias opciones y es más limpio que una cadena de IF anidados.- Un guardián puede ser un valor único
"A":, una lista1, 2, 3:, o un rango1 TO 5:. La última rama para "cualquier otra cosa" esOTHERWISE, nunca una condición como> 200. - Los guardianes se prueban en orden. Con
1 TO 50:seguido de40 TO 60:, un valor de 45 tomará la primera rama, por lo que una asignación en la segunda puede que nunca se ejecute. Si las ramas anteriores cubren todos los valores posibles,OTHERWISEtampoco se realizará.

Un CASE ejecuta la primera rama cuyo guardián coincida con el valor
A CASE statement is cleaner than nested IFs when you are: · Una instrucción CASE es más limpia que los IF anidados cuando estás:
CASE matches one value against many possibilities; deep nested IFs become hard to read. · CASE coincide con un valor contra muchas posibilidades; los IF anidados profundos se vuelven difíciles de leer.
Which of these are valid guards in a Cambridge CASE statement? Select all · todos that apply. · ¿Cuáles de estos son guardas válidos en una instrucción CASE de Cambridge? Selecciona todos los que correspondan.
A single value, a value list, a range and OTHERWISE. A comparison such as > 200 is not a guard; anything not covered goes to OTHERWISE. · Un valor único, una lista de valores, un rango y OTHERWISE. Una comparación como > 200 no es una guardia; todo lo que no esté cubierto se dirige a OTHERWISE.
Worked example: rewrite a CASE without a CASE
CASE OF MySwitchwith1: ThisChar ← 'a',2: ThisChar ← 'y',3: ThisChar ← '7',OTHERWISE: ThisChar ← '*'.- Each value becomes one branch of a chain of IFs, and
OTHERWISEbecomes the finalELSE.
- Three IFs, three ENDIFs. Going the other way, two CASE clauses that assign the same value merge into one guard with a value list,
1, 2:.
Ejemplo resuelto: reescribir un CASE sin usar CASE
CASE OF MySwitchcon1: ThisChar ← 'a',2: ThisChar ← 'y',3: ThisChar ← '7',OTHERWISE: ThisChar ← '*'.- Cada valor se convierte en una rama de una cadena de IFs, y
OTHERWISEse convierte en el últimoELSE.
IF MySwitch = 1 THEN
ThisChar <- 'a'
ELSE
IF MySwitch = 2 THEN
ThisChar <- 'y'
ELSE
IF MySwitch = 3 THEN
ThisChar <- '7'
ELSE
ThisChar <- '*'
ENDIF
ENDIF
ENDIF
- Tres IFs, tres ENDIFs. Yendo en dirección contraria, dos cláusulas CASE que asignan el mismo valor se fusionan en un solo guardián con una lista de valores,
1, 2:.
The three loops
- Iteration 迭代 repeats a block, and the three loops differ in where the condition is tested.
- A count-controlled loop 计数循环,
FOR i ← 1 TO 10 … NEXT i, runs a known number of times;STEP -1counts down. Use it for a fixed count or every element of an array 数组. - A pre-condition loop 前测循环,
WHILE … DO … ENDWHILE, tests before each pass, so it may run zero times. A post-condition loop 后测循环,REPEAT … UNTIL, tests after each pass, so it always runs at least once.
Where the condition sits decides how many times the body can run
Los tres bucles
- Iteración 迭代 repite un bloque, y los tres bucles difieren en dónde se evalúa la condición.
- Un bucle controlado por contador 计数循环,
FOR i ← 1 TO 10 … NEXT i, se ejecuta un número conocido de veces;STEP -1cuenta hacia atrás. Úsalo para un conteo fijo o para cada elemento de un array 数组. - Un bucle con precondición 前测循环,
WHILE … DO … ENDWHILE, verifica la condición antes de cada pasada, por lo que puede ejecutarse cero veces. Un bucle con poscondición 后测循环,REPEAT … UNTIL, verifica la condición después de cada pasada, por lo que siempre se ejecuta al menos una vez.

La posición de la condición determina cuántas veces puede ejecutarse el cuerpo del bucle
Match each loop to when you'd use it. · Empareja cada bucle con cuándo usarlo.
FOR = count-controlled; WHILE = condition tested before (0+ passes); REPEAT = condition tested after (1+ passes). · FOR = controlado por conteo; WHILE = condición probada antes (0+ pasadas); REPEAT = condición probada después (1+ pasadas).
REPEAT...UNTIL tests its condition AFTER the body, so the body always runs at least once. · REPEAT...UNTIL prueba su condición DESPUÉS del cuerpo, por lo que el cuerpo siempre se ejecuta al menos una vez.
That post-condition test is the difference from WHILE, which can run zero times. · Esa prueba de post-condición es la diferencia con WHILE, que puede ejecutarse cero veces.
Choosing the loop: the two-mark answer
- One mark for the name, one for the reason, in the scheme's words.
- Count-controlled, because the number of iterations is known before the loop starts. Post-condition, because the loop body must be executed at least once. Pre-condition, because the loop may not need to execute at all.
- A loop over the four elements of an array written as a
WHILEwith a counter is "not the most appropriate"; the FOR loop is, because the count is known.
Elegir el bucle: la respuesta de dos puntos
- Un punto por el nombre, uno por la razón, usando las palabras del esquema.
- Controlado por contador, porque el número de iteraciones es conocido antes de iniciar el bucle. Poscondicionado, porque el cuerpo del bucle debe ejecutarse al menos una vez. Precondicionado, porque el bucle puede no necesitar ejecutarse en absoluto.
- Un bucle sobre los cuatro elementos de un array escrito como un
WHILEcon un contador es "no lo más apropiado"; el FOR es, porque el conteo es conocido.
A question asks you to "identify a more appropriate loop and justify your choice" for 2 marks. What earns the two marks? · Una pregunta te pide "identificar un bucle más apropiado y justificar tu elección" por 2 puntos. ¿Qué obtiene los dos puntos?
One mark for the loop, one for the reason: the count is known, the body must run once, or the loop may not run at all. · Un punto por el bucle, uno por la razón: el conteo es conocido, el cuerpo debe ejecutarse al menos una vez, o el bucle puede no ejecutarse en absoluto.
Worked example: which loop fits each task?
- Print the 12 times table: the count is known in advance, so a FOR loop.
- Keep reading numbers until the user enters 0: the count is unknown and the very first input might already be 0, so the test must come before the body: a WHILE loop.
- Ask for a password until it is correct: the user must be asked at least once, so a REPEAT … UNTIL loop.
- Ask two questions: how many times, and must the body run before the first test?
Ejemplo resuelto: qué bucle se adapta a cada tarea?
- Imprimir la tabla del 12: el conteo es conocido de antemano, así que un bucle FOR.
- Seguir leyendo números hasta que el usuario ingrese 0: el conteo es desconocido y la primera entrada podría ser ya 0, así que la prueba debe ir antes del cuerpo: un bucle WHILE.
- Pedir una contraseña hasta que sea correcta: el usuario debe ser preguntado al menos una vez, así que un bucle REPEAT … UNTIL.
- Hacer dos preguntas: cuántas veces, y si el cuerpo debe ejecutarse antes de la primera prueba?
"Keep asking for a password until it is correct, but always ask at least once." Which loop fits? · "Sigue pidiendo una contraseña hasta que sea correcta, pero siempre pídela al menos una vez." ¿Qué bucle se ajusta?
You must ask at least once, so the post-condition REPEAT...UNTIL is the natural choice. · Debe preguntar al menos una vez, por lo que la postcondición REPEAT...UNTIL es la opción natural.
Trace tables
- A trace table 跟踪表 records every variable's value as you dry run 手工跟踪 the algorithm by hand. It is how a loop is tested on paper and a six-mark question on most Paper 2s.
- One column per variable, plus a column for any output. Write a new row only when a value changes, and evaluate the loop condition at the moment the loop reaches it.
- Keep going until the condition ends the loop, then record the final output.
Tablas de trazado
- Una tabla de trazado 跟踪表 registra el valor de cada variable mientras haces un dry run 手工跟踪 del algoritmo a mano. Es cómo se prueba un bucle en papel y una pregunta de seis puntos en la mayoría de los Paper 2.
- Una columna por variable, más una columna para cualquier salida. Escribe una nueva fila solo cuando cambia un valor, y evalúa la condición del bucle en el momento exacto en que el bucle llega a ella.
- Continúa hasta que la condición termine el bucle, luego registra la salida final.
Trace a loop, pass by pass · Rastrear un bucle, paso a paso
A trace table records each variable after every pass of the loop. Watch the counter i climb while the running total builds up — exactly what an exam trace question asks you to fill in. · Una tabla de rastreo registra cada variable después de cada pasada del bucle. Observa cómo aumenta el contador i mientras se acumula el total — exactamente lo que una pregunta de examen sobre trazas te pide completar.
After total = 0; FOR i = 1 TO 5: total = total + i, what is the value of total? · Después de total = 0; FOR i = 1 TO 5: total = total + i, ¿cuál es el valor de total?
Adding 1+2+3+4+5 = 15 — exactly what the trace table builds up pass by pass. · Sumar 1+2+3+4+5 = 15 — exactamente lo que la tabla de trazos acumula paso a paso.
Worked example: a trace table filled
- Rows of (Count, Total): (1, 0) → (2, 1) → (3, 3) → (4, 6) → (5, 10).
- At Total = 10 the condition
Total < 10is false, the loop ends, and the output is 5. - The last row is the one most often wrong: check the condition one more time before writing the output.
Ejemplo resuelto: una tabla de trazado completada
Count <- 1
Total <- 0
WHILE Total < 10 DO
Total <- Total + Count
Count <- Count + 1
ENDWHILE
OUTPUT Count
- Filas de (Count, Total): (1, 0) → (2, 1) → (3, 3) → (4, 6) → (5, 10).
- En Total = 10 la condición
Total < 10es falsa, el bucle termina, y la salida es 5. - La última fila es la que más se equivoca: verifica la condición una vez más antes de escribir la salida.
In the worked trace, the loop ends with Total = 10 and Count = 5, so the output is 5. · En el trazo resuelto, el bucle termina con Total = 10 y Count = 5, por lo que la salida es 5.
After the fourth pass Total reaches 10, the condition Total < 10 becomes false, and Count has been incremented to 5. · Después de la cuarta pasada Total alcanza 10, la condición Total < 10 se vuelve falsa, y Count ha sido incrementado a 5.
Marks that slip away
>=and>are different answers. Test the boundary value in your head before you write the comparison.OTHERWISEis a keyword, not a condition. And everyIF,CASE,WHILEandFORcloses withENDIF,ENDCASE,ENDWHILEorNEXT.- A
WHILEcan run zero times; aREPEATcannot. Choose by whether the body must run once before the first test. - In a trace table, a value that does not change is not rewritten, and the output is written only when the
OUTPUTline runs.
Puntos que se pierden fácilmente
>=y>son respuestas diferentes. Prueba el valor límite mentalmente antes de escribir la comparación.OTHERWISEes una palabra clave, no una condición. Y cadaIF,CASE,WHILEyFORcierra conENDIF,ENDCASE,ENDWHILEoNEXT.- Un
WHILEpuede ejecutarse cero veces; unREPEATno. Elige según si el cuerpo debe ejecutarse una vez antes de la primera prueba. - En una tabla de trazado, un valor que no cambia no se reescribe, y la salida se escribe solo cuando se ejecuta la línea de
OUTPUT.
You've got it
- IF … ELSE … ENDIF for a choice; nested IFs each closed; CASE for one value against many guards, tested in order,
OTHERWISElast - FOR count known · WHILE tests before, may run zero times · REPEAT … UNTIL tests after, runs at least once
- justify a loop with its name and reason: known count, may not run, must run once
- a trace table dry-runs the algorithm one row per change; check the condition once more before the final output
Lo has entendido
- IF … ELSE … ENDIF para una elección; anidados IFs cada uno cerrado; CASE para un valor contra muchos guardas, evaluados en orden,
OTHERWISEúltimo - FOR conteo conocido · WHILE prueba antes, puede ejecutarse cero veces · REPEAT … UNTIL prueba después, ejecútase al menos una vez
- justifica un bucle con su nombre y razón: conteo conocido, puede no ejecutarse, debe ejecutarse una vez
- una tabla de trazado hace dry-run del algoritmo una fila por cambio; verifica la condición una vez más antes de la salida final