| Los candidatos deben ser capaces de: | Notas y orientación |
|---|---|
| Implementar y escribir pseudocódigo a partir de un diseño dado presentado como diagrama de flujo del programa o inglés estructurado | |
| Escribir sentencias en pseudocódigo para: • la declaración e inicialización de constantes • la declaración de variables • la asignación de valores a variables • expresiones que involucren cualquiera de los operadores aritméticos o lógicos entrada desde el teclado y salida en la consola | |
| Utilizar funciones integradas y rutinas de biblioteca | Cualquier función no especificada en la guía de pseudocódigo se proporcionará Las funciones de manipulación de cadenas siempre se proporcionarán |
Programación
A-Level Ciencias de la Computación · Tema 11
24:05
Fundamentos de programación
Un programa debe solicitar una contraseña y seguir solicitándola hasta que sea correcta. Simple — ¿pero qué bucle usas? Los programas toman decisiones y repiten tareas, y elegir…
Narración en inglés · Subtítulos en inglés + 中文 quemados en pantalla
11.1
Conceptos básicos de programación
Syllabus
Fuente: Plan de estudios Cambridge International


From design to code
Deberías poder convertir un diseño — un diagrama de flujo (diagrama de flujo del programa) o inglés estructurado — en pseudocódigo, y luego en un lenguaje real:
- find the variables 变量 and their data types 数据类型.
- turn input/output boxes into
INPUT/OUTPUT. - turn decision diamonds into
IF...ELSE...ENDIF(orCASE). - turn loop arrows into
WHILE,REPEAT...UNTIL, orFOR. - turn process boxes into assignments or calculations.
- check by tracing a small input.

Constants and variables
Una constante mantiene un valor que nunca cambia; una variable mantiene uno que puede cambiar. Decláralas con un tipo:

CONSTANT Pi = 3.14159
DECLARE Radius : REAL
DECLARE Area : REAL
Radius ← 5
Area ← Pi * Radius * Radius
Usa constantes para valores fijos que se repiten (Pi, MaxScore); hacen el código más claro y fácil de cambiar en un solo lugar.
En el examen, una constante es la respuesta a "identificar una forma más adecuada de representar" un valor fijo, como una tasa impositiva o una puntuación máxima, que aparece en varios lugares en el pseudocódigo. Los beneficios que menciona el esquema: el valor se establece una vez y no puede cambiarse accidentalmente por el programa; un cambio se realiza en un solo lugar y alcanza todas las sentencias que lo utilizan; el identificador da al valor un significado (MaxScore en lugar de 100), por lo que el código es más fácil de leer y verificar; y hay menos riesgo de un error de escritura en un valor largo como 3.14159. Una pregunta de "indique un valor que podría reemplazarse por una constante" busca el literal del pseudocódigo (0.2, 40), no un nuevo nombre.
Cada variable se declara una sola vez, con un identificador (su nombre) y un tipo de dato, antes de ser usada. Los seis tipos en la guía de pseudocódigo 9618:
| Tipo | Holds | Written in the code as | Typical use |
|---|---|---|---|
INTEGER |
números enteros | 42, -3 |
un contador, un índice de matriz, un contador de bucle |
REAL |
números con parte fraccionaria | 3.75 |
un precio, un promedio |
CHAR |
un carácter | 'A' (comillas simples) |
una letra de calificación, una tecla de menú |
STRING |
una secuencia de caracteres | "Hello" (comillas dobles) |
un nombre, un código postal |
BOOLEAN |
TRUE or FALSE |
TRUE |
a flag such as Found |
DATE |
a calendar date | 12/05/2026 |
a date of birth |
Una pregunta de "dar el tipo de datos adecuado" se responde según cómo se utiliza la variable en el pseudocódigo: un valor con un punto decimal es REAL; algo establecido a TRUE o FALSE es BOOLEAN; un valor entre comillas simples es CHAR; un valor utilizado como índice de array, o con DIV y MOD, es INTEGER. Escriba el tipo en mayúsculas, escrito tal como lo escribe la guía.
Ejemplo resuelto. Establece el tipo de dato apropiado para cada variable.
Found ← FALSE
Initial ← 'K'
Price ← 12.99
Count ← Count + 1
Name ← "Li Wei"
Found es BOOLEAN (contiene FALSE); Initial es CHAR (un carácter entre comillas simples); Price es REAL (un valor decimal); Count es INTEGER (un contador que aumenta de uno en uno); Name es STRING (texto entre comillas dobles).
Assignment and expressions
Use ← for assignment 赋值:
Total ← Total + 1
Average ← Sum / Count
Expressions use operators 运算符:
- arithmetic
+ - * /, plusDIV(integer division) andMOD(remainder):7 DIV 2 = 3;7 MOD 2 = 1. - comparisons
=,<>,<,>,<=,>=. - logic
AND,OR,NOT.
Precedence 优先级 (highest to lowest): NOT → * / DIV MOD → + - → comparisons → AND → OR. Use brackets when unsure.
Input and output
OUTPUT "Enter your name:"
INPUT Name
OUTPUT "Hello, ", Name
Built-in functions and library routines
Muchas tareas tienen rutinas de biblioteca 库例程 listas, por lo que no es necesario escribirlas. El Paper 2 insert 附页 enumera las que puede utilizar, con sus nombres exactos, parámetros y tipos de retorno; cualquier otra función que necesite una pregunta se proporciona en la propia pregunta. Los nombres siguientes son los del insert. VAL y STR son nombres de IGCSE y no aparecen en ningún documento 9618, por lo que no otorgan puntos. UCASE y LCASE son un caso diferente: son 9618, definidas en la Guía de Pseudocódigo, pero toman un único CHAR, y el insert no las enumera en absoluto: para una cadena completa en el Paper 2, la rutina es TO_UPPER.
Una biblioteca de programas 程序库 contiene rutinas que ya han sido escritas, compiladas y probadas; un programa las llama en lugar de escribir las suyas propias. Los beneficios que acepta el esquema, para una pregunta de "indique tres beneficios": las rutinas están ya probadas, por lo que es menos probable que contengan errores; ahorran tiempo de desarrollo; pueden hacer cosas que el programador no podría escribir (estadísticas complejas, gráficos); están escritas por expertos y se reutilizan en muchos programas; y una rutina con una interfaz fija puede ser llamada desde cualquier parte del programa.
| Routine | Retorna | Ejemplo |
|---|---|---|
LENGTH(s) |
the number of characters in s |
LENGTH("Hello") = 5 |
LEFT(s, n) / RIGHT(s, n) |
the first / last n characters |
RIGHT("Hello", 2) = "lo" |
MID(s, start, n) |
n characters from position start (positions count from 1) |
MID("Hello", 2, 3) = "ell" |
TO_UPPER(s) / TO_LOWER(s) |
s in capitals / in small letters |
TO_UPPER("ab1") = "AB1" |
NUM_TO_STR(x) / STR_TO_NUM(s) |
un número como cadena / una cadena como número | STR_TO_NUM("3.5") = 3.5 |
IS_NUM(s) |
TRUE if s is a valid number |
IS_NUM("12a") = FALSE |
ASC(c) / CHR(n) |
el código de carácter de c / el carácter con código n |
ASC('A') = 65, CHR(66) = 'B' |
INT(x) |
the whole-number part of x |
INT(7.9) = 7 |
RAND(n) |
un número real aleatorio desde 0 hasta, pero sin incluir, n |
INT(RAND(6)) + 1 es el lanzamiento de un dado |
DAY(d), MONTH(d), YEAR(d) |
the parts of a DATE |
YEAR(TODAY()) |
DAYINDEX(d), SETDATE(d, m, y), TODAY() |
el día de la semana (1 = Domingo); una fecha construida de tres enteros; la fecha de hoy | |
EOF(f) |
TRUE cuando el archivo f no tiene más líneas para leer |
WHILE NOT EOF("data.txt") |
Las cadenas se unen con & (concatenación 连接): "A" & "BC" es "ABC". Utilice los nombres exactos del insert, con los parámetros en su orden.
Las fechas y los números aleatorios aparecen como sentencias de una línea. SETDATE(17, 11, 2007) construye el 17 de noviembre de 2007; 12 - MONTH(MyDOB) es el número de meses desde el mes de nacimiento hasta el final del año; IF DAYINDEX(MyDOB) = 5 THEN prueba si es jueves, porque el domingo es el día 1. RAND(n) devuelve un número real desde 0 hasta, pero sin incluir, n, por lo que un entero aleatorio desde Low hasta High inclusive es INT(RAND(High - Low + 1)) + Low: INT(RAND(21)) - 10 da un valor desde -10 hasta 10.

s = "COMPUTER" (posiciones 1–8)Worked example. Evaluate each expression, given Word ← "Program", Code ← 'Q' y N ← 7.
| Expression | Valor | Por qué |
|---|---|---|
LENGTH(Word) |
7 |
seven characters |
MID(Word, 4, 2) |
"gr" |
two characters, starting at position 4 |
LEFT(Word, 3) & "!" |
"Pro!" |
joined with & |
TO_UPPER(RIGHT(Word, 2)) |
"AM" |
the inner function runs first |
ASC(Code) - ASC('A') |
16 |
'Q' is 81 and 'A' is 65 |
N DIV 2 + N MOD 2 |
4 |
3 + 1 |
NUM_TO_STR(N) & "th" |
"7th" |
the number becomes a string first |
INT(N / 2) |
3 |
3.5 cut to its whole part |
Trabaja desde el interior hacia afuera, y mantén las comillas: "7" es una cadena y 7 es un número.
Ejemplo resuelto. Cada declaración puede contener un error en su uso de una función o operador. Describe el error, o escribe NO ERROR. (Asume que cada variable tiene el tipo correcto.)
| Instrucción | Error |
|---|---|
Result ← 2 & 4 |
& une cadenas; 2 y 4 son enteros, por lo que se necesita + |
SubString ← MID("pseudocode", 4, 1) |
NO ERROR: one character from position 4, "u" |
IF x = 3 OR 4 THEN |
OR needs a Boolean on each side: IF x = 3 OR x = 4 THEN |
Result ← Status AND INT(x / 2) |
AND needs two Booleans; INT(x / 2) is an integer |
Message ← "Done" + LENGTH(MyString) |
+ cannot add a string to an integer: "Done" & NUM_TO_STR(LENGTH(MyString)) |
Cada operador funciona sobre tipos específicos: & sobre cadenas, + - * / DIV MOD sobre números, AND OR NOT sobre booleanos, y = <> sobre dos valores del mismo tipo. Una tabla de "evalúe cada expresión, o escriba ERROR" se marca de la misma manera: LENGTH(42) y "A" + 1 son ERROR, porque el tipo no coincide con la función o el operador.
Worked example. With Points ← 100, Active ← TRUE y Exempt ← FALSE, evaluate each expression.
| Expression | Valor | Por qué |
|---|---|---|
(Points > 99) OR Active |
TRUE |
both sides are true; one would do |
(Points MOD 2 = 0) OR Exempt |
TRUE |
100 MOD 2 is 0 |
(Points <= 75) AND (Active OR Exempt) |
FALSE |
el primer lado es falso, y AND necesita ambos |
(Active OR NOT Active) AND NOT Exempt |
TRUE |
Active OR NOT Active is always true |
La última expresión se simplifica: X OR NOT X es TRUE independientemente de lo que sea X, por lo que toda la expresión es simplemente NOT Exempt. Evalúe primero los paréntesis, luego NOT, luego AND, luego OR.
Una variable es una caja etiquetada
Cada asignación almacena un valor en una caja con nombre; reasignar el mismo nombre lo sobrescribe. Recorra el programa y observe cómo cada caja toma su valor actual.
| Inglés | Chino | Pinyin |
|---|---|---|
| pseudocode/ˈsuːdəʊkəʊd/ | 伪代码 | wěi dài mǎ |
| variables/ˈveərɪəblz/ | 变量 | biàn liàng |
| data types/ˈdeɪtə taɪps/ | 数据类型 | shù jù lèi xíng |
| assignment/əˈsaɪnmənt/ | 赋值 | fù zhí |
| constant/ˈkɒnstənt/ | 常量 | cháng liàng |
| operators/ˈɒpəreɪtəz/ | 运算符 | yùn suàn fú |
| precedence/ˈpresɪdəns/ | 优先级 | yōu xiān jí |
| function/ˈfʌŋkʃn/ | 函数 | hán shù |
| library routines/ˈlaɪbrəri ruːˈtiːnz/ | 库例程 | kù lì chéng |
| insert/ˈɪnsɜːt/ | 附页 | fù yè |
11.2
Selección
Syllabus
| Los candidatos deben ser capaces de: | Notas y orientaciones |
|---|---|
| Utilizar pseudocódigo para escribir: • una instrucción ‘IF’ que incluya la cláusula ‘ELSE’ e instrucciones ‘IF’ anidadas • una estructura ‘CASE’ • un bucle ‘controlado por contador’: • un bucle ‘post-condición’ • un bucle ‘pre-condición’ | |
| Justificar por qué una estructura de bucle puede ser más adecuada para resolver un problema que las otras |
Fuente: Plan de estudios Cambridge International
Selección 选择 chooses which steps run.
IF age >= 18 THEN
OUTPUT "Adult"
ELSE
OUTPUT "Minor"
ENDIF

Para más de dos casos puedes usar un IF anidado, pero la anidación profunda es difícil de leer — un CASE es más limpio al probar un valor contra varias opciones:
CASE OF Grade
"A": OUTPUT "Excellent"
"B": OUTPUT "Good"
OTHERWISE: OUTPUT "Try again"
ENDCASE
Cambridge CASE allows single values, value lists (1, 2, 3:), and ranges (1 TO 5:).
Un IF anidado es un IF dentro de una rama de otro IF. Cada IF necesita su propio ENDIF, y el examinador verifica que cada constructo esté cerrado:
IF Mark >= 50 THEN
IF Mark >= 80 THEN
OUTPUT "Distinction"
ELSE
OUTPUT "Pass"
ENDIF
ELSE
OUTPUT "Fail"
ENDIF
Los límites son donde se pierden puntos. "Una nota de 50 o más aprueba" es Mark >= 50, no Mark > 50; la última rama CASE, para "cualquier otra cosa", se escribe OTHERWISE, no una condición como > 200. Una comparación incorrecta aquí es un error lógico 逻辑错误: el programa se ejecuta, pero produce la salida incorrecta para algunas entradas: y una tabla de seguimiento con un valor límite como 50 es cómo se encuentra.

Ejemplo resuelto. Reescriba esto con la misma funcionalidad, sin usar una estructura CASE.
CASE OF MySwitch
1: ThisChar ← 'a'
2: ThisChar ← 'y'
3: ThisChar ← '7'
OTHERWISE: ThisChar ← '*'
ENDCASE
Cada valor se convierte en una rama de una cadena de IFs, y OTHERWISE se convierte en el último ELSE:
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
Dos cláusulas que asignan el mismo valor se fusionan en una sola cláusula con una lista de valores: 1, 2: ThisChar ← 'a'. Las guardias se prueban en orden: con rangos como 1 TO 50: seguidos de 40 TO 60:, un valor de 45 toma la primera rama que coincide, por lo que una asignación en una rama posterior puede nunca realizarse: y cuando las ramas anteriores ya cubren todos los valores posibles, la rama OTHERWISE tampoco se alcanza nunca.
Yendo en sentido contrario, las IF anidadas que prueban varios booleanos son más claras como una condición por resultado: IF A AND B AND C THEN CALL Sub1(), luego IF A AND B AND NOT C THEN CALL Sub2(), y así sucesivamente. Unir pruebas con AND y OR elimina el anidamiento, y IF A THEN se acepta en lugar de IF A = TRUE THEN.
Selección (IF / ELSE)
Cambia la entrada y observa qué rama se ejecuta: la esencia de la selección.
| Inglés | Chino | Pinyin |
|---|---|---|
| flowchart/ˈfləʊtʃɑːt/ | 流程图 | liú chéng tú |
| structured English/ˈstrʌktʃəd ˈɪŋɡlɪʃ/ | 结构化英语 | jié gòu huà yīng yǔ |
| selection/sɪˈlekʃn/ | 选择 | xuǎn zé |
| nested/ˈnestɪd/ | 嵌套 | qiàn tào |
| logic error/ˈlɒdʒɪk ˈerə/ | 逻辑错误 | luó jí cuò wù |
11.2
Iteración
Iteración 迭代 repite un bloque. Tres bucles difieren en cuántas veces se ejecuta el cuerpo.
Count-controlled (FOR) loop
Un bucle controlado por contador 计数循环 — úsalo cuando sabes cuántas veces repetir:
FOR i ← 1 TO 10
OUTPUT i
NEXT i
Un STEP puede cambiar el contador (p. ej. FOR i ← 10 TO 1 STEP -1). Mejor para un número fijo de repeticiones o procesar cada elemento de un array 数组.
Pre-condition (WHILE) loop
Un bucle de precondición 前测循环 prueba la condición antes de cada pasada, por lo que puede ejecutarse cero veces:
WHILE total < 100 DO
INPUT n
total ← total + n
ENDWHILE
Post-condition (REPEAT...UNTIL) loop
Un bucle de postcondición 后测循环 prueba la condición después de cada pasada, por lo que siempre se ejecuta al menos una vez:
REPEAT
INPUT password
UNTIL password = correctPassword
Choosing the right loop

- count known up front → FOR.
- may need zero passes → WHILE.
- always at least one pass → REPEAT...UNTIL.
Justifique su elección según si el conteo es conocido y si el cuerpo debe ejecutarse al menos una vez. Una pregunta típica presenta un escenario ("pregunte por una contraseña hasta que sea correcta, pero pregunte siempre al menos una vez") y pide cuál de los bucles se ajusta mejor.
Las dos marcas son para el nombre del bucle y la razón, en las palabras del esquema: controlado por conteo, porque el número de iteraciones es conocido antes de que comience el bucle; post-condición, porque el cuerpo del bucle debe ejecutarse al menos una vez; pre-condición, porque el bucle puede no necesitar ejecutarse en absoluto. Un bucle sobre los cuatro elementos de un array que ha sido escrito como un WHILE con un contador "no es el más apropiado": el conteo, cuatro, es conocido, por lo que un bucle FOR se ajusta mejor.
Ejemplo resuelto. ¿Qué bucle se adapta a cada tarea? (a) imprimir la tabla del 12; (b) seguir leyendo números hasta que el usuario introduzca 0; (c) pedir una contraseña hasta que sea correcta. Elija preguntándose cuántas veces se ejecuta el cuerpo y cuándo ocurre la prueba. (a) El conteo se conoce de antemano (12), por lo que use un bucle FOR. (b) El conteo es desconocido, y la primera entrada podría ya ser 0: por lo tanto, la prueba debe venir antes del cuerpo: un bucle WHILE, que se ejecuta cero o más veces. (c) El conteo es desconocido, pero debe preguntar al menos una vez antes de que haya algo que probar: por lo tanto, la prueba viene después del cuerpo: un REPEAT...UNTIL, que se ejecuta uno o más veces. La pregunta decisiva es si el cuerpo debe ejecutarse al menos una vez: WHILE puede ejecutarse cero veces, REPEAT siempre se ejecuta una vez.
Dry running with a trace table
Una tabla de trazas 跟踪表 registra el valor de cada variable mientras haces un ejecución manual 手工跟踪 (recorrido a mano) de un algoritmo. Es cómo pruebas un bucle en papel, y una pregunta de seis marcas en la mayoría de los Exámenes 2.
DECLARE Count, Total : INTEGER
Count ← 1
Total ← 0
WHILE Total < 10
Total ← Total + Count * 2
Count ← Count + 1
ENDWHILE
OUTPUT Count, Total
| Count | Total | Total < 10 | OUTPUT |
|---|---|---|---|
| 1 | 0 | VERDADERO | |
| 2 | 2 | VERDADERO | |
| 3 | 6 | VERDADERO | |
| 4 | 12 | FALSO | 4, 12 |
Reglas que otorgan puntos: una columna por variable, en el orden que da la pregunta; escriba un valor solo cuando cambie; inicie una nueva fila cada vez que el bucle se repita; evalúe la condición con los valores actuales, y deténgase en el momento en que es FALSE; ponga la salida en su propia columna, exactamente como aparecería. Rastree el algoritmo tal como está escrito, no el que cree que estaba previsto: si nunca termina, dígalo.
Ejemplo resuelto. ¿Qué constructos usa cada línea: selección, iteración o llamada a subrutina?
| Pseudocode | Selección | Iteración | Subroutine |
|---|---|---|---|
| IF Ready = TRUE THEN |
CALL Start()
ENDIF
| FOR I ← 1 TO 20 ... NEXT I | | yes | |
| WHILE NOT IsFull() ... ENDWHILE | | yes | yes |
| CASE OF Key ... OTHERWISE ... ENDCASE | yes | | |
IF y CASE son selección; FOR, WHILE y REPEAT son iteración; un nombre seguido de paréntesis — Start(), IsFull() — es una llamada a un procedimiento o función, dondequiera que aparezca, incluso dentro de una condición.
Rastrear un bucle, paso a paso
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.
Seguimiento de un bucle
Recorre el bucle y observa cómo cambian las variables en cada pasada: exactamente lo que registra una tabla de trazado.
| Inglés | Chino | Pinyin |
|---|---|---|
| array/əˈreɪ/ | 数组 | shù zǔ |
| trace table/treɪs ˈteɪbl/ | 跟踪表 | gēn zōng biǎo |
| iteration/ˌɪtəˈreɪʃn/ | 迭代 | dié dài |
| dry run/draɪ rʌn/ | 手工跟踪 | shǒu gōng gēn zōng |
11.3
Procedimientos y funciones
Syllabus
| Los candidatos deben ser capaces de: | Notas y orientaciones |
|---|---|
| Definir y utilizar un procedimiento | |
| Explicar en qué parte de la construcción de un algoritmo sería apropiado usar un procedimiento | |
| Utilizar parámetros | Un procedimiento puede tener cero, uno o más parámetros. Un parámetro se puede pasar por referencia o por valor. |
| Definir y utilizar una función | |
| Explicar en qué parte de la construcción de un algoritmo es apropiado usar una función | Una función se utiliza en una expresión, p. ej., el valor de retorno reemplaza a la llamada. |
| Utilizar la terminología asociada con los procedimientos y las funciones | incluyendo encabezado del procedimiento/función, interfaz del procedimiento/función, parámetro, argumento, valor de retorno |
| Escribir pseudocódigo eficiente |
Fuente: Plan de estudios Cambridge International
Programación estructurada 结构化编程 construye un programa a partir de pequeñas subrutinas 子程序 nombradas, cada una con una sola tarea.
Procedure
Un procedimiento 过程 es un bloque nombrado que realiza una acción; puede tomar parámetros 参数 pero no devuelve un valor.
PROCEDURE Greet(name : STRING)
OUTPUT "Hello, ", name
ENDPROCEDURE
CALL Greet("Ada")
Function
Una función 函数 es como un procedimiento pero devuelve un valor que forma parte de una expresión.
FUNCTION Square(x : INTEGER) RETURNS INTEGER
RETURN x * x
ENDFUNCTION
result ← Square(5) + 1 // result = 26
Usa un procedimiento cuando la subrutina realiza una acción; usa una función cuando calcula un valor para quien llama.
El programa de estudios pide dónde en la construcción de un algoritmo es apropiado cada uno. Un procedimiento es apropiado donde se necesita el mismo grupo de pasos en varios puntos (validar una entrada, imprimir un menú, intercambiar dos valores): los pasos se escriben una vez y se CALLan por nombre. Una función es apropiada donde se debe calcular un único valor y luego usarse en una expresión: un total, un resultado TRUE/FALSE, el mayor de dos números: porque el valor de retorno 返回值 reemplaza la llamada: IF IsValid(Code) THEN.

Parámetros
Un parámetro es una variable que declara una subrutina para recibir entrada; los valores que proporciona el llamador son argumentos 实参. Dos formas de pasarlos:
- paso por valor 传值 — la rutina obtiene una copia; los cambios dentro no afectan al llamador. Úsalo para entradas que solo lee.
- paso por referencia 传引用 — la rutina obtiene una referencia a la variable del llamante; los cambios sí afectan al llamante. Úselo cuando deba actualizar un parámetro.

PROCEDURE Swap(BYREF a : INTEGER, BYREF b : INTEGER)
DECLARE temp : INTEGER
temp ← a
a ← b
b ← temp
ENDPROCEDURE
El pseudocódigo de Cambridge escribe el modo en la cabecera, BYVAL o BYREF, antes de cada parámetro. Si no se escribe ninguno, se asume BYVAL, por lo que una rutina que debe cambiar la variable del llamante — Swap, o un procedimiento que actualiza un total acumulado — necesita BYREF en su cabecera.
Worked example. What is output?
PROCEDURE Adjust(BYREF X : INTEGER, BYVAL Y : INTEGER)
X ← X + Y
Y ← Y * 2
ENDPROCEDURE
A ← 5
B ← 3
CALL Adjust(A, B)
OUTPUT A, B
X es una referencia a A, por lo que A se convierte en 8. Y es una copia de B, por lo que duplicar Y deja B en 3. La salida es 8, 3. Si la cabecera dijera BYVAL X, A seguiría siendo 5.
Local vs global variables
Una variable local se declara dentro de una subrutina y existe solo mientras esta se ejecuta. Una variable global se declara fuera y es visible en todas partes. Prefiera las variables locales y los parámetros; el uso excesivo de globales hace que el código sea difícil de seguir y probar. (La región donde un nombre es visible es su alcance).
La diferencia de una línea: una variable global puede accederse desde cualquier lugar del programa; una variable local solo dentro de la subrutina que la declara. Beneficios de las variables locales que acepta el esquema: se puede usar el mismo identificador en otra subrutina sin conflicto; el valor no puede cambiarse accidentalmente por otras partes del programa; la memoria se libera cuando termina la subrutina; y la subrutina es autocontenida, por lo que puede probarse por sí sola y reutilizarse en otro programa.
Una variable local se crea cada vez que se llama a la subrutina y se destruye cuando esta retorna, por lo que no puede conservar un valor de una llamada a la siguiente. Por tanto, un procedimiento que acumula una cadena en llamadas repetidas necesita que dicha cadena sea global (o pasada BYREF). Si MyString cambia de ser global a ser una variable local declarada dentro de MyOutput(), cada llamada comienza con una nueva cadena vacía MyString, el texto añadido en llamadas anteriores se pierde y el procedimiento "no funciona como se espera".


When to use a subroutine
Use a subroutine when:
- la misma lógica aparece en más de un lugar — escríbela una vez, llámala muchas veces.
- un bloque tiene un propósito nombrado claro — el nombre documenta qué hace.
- el programa es complejo — divídelo en partes (descomposición 分解).
- quieres probar una pieza de forma aislada.
No las hagas tan pequeñas que el costo de la llamada supere al trabajo dentro de ella.
Terminology
- definition — the
PROCEDURE ... ENDPROCEDURE(or function) block. - llamar — dónde se invoca. argumento — un valor pasado. parámetro — la variable que lo recibe.
- return value — what a function passes back.
- cabecera de procedimiento/función — la primera línea que da el nombre y los parámetros (
PROCEDURE Name(params)oFUNCTION Name(params) RETURNS type). - interfaz de procedimiento/función / firma 签名 — nombre + parámetros + tipo de retorno: lo que un llamador debe saber para usarla.
Worked example. Describe each term used in the header FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.
| Term | Significado |
|---|---|
FUNCTION |
a subroutine that returns a value |
Pass2 |
the identifier used to call it |
Count |
el parámetro: el identificador que recibe el argumento pasado |
INTEGER |
the data type of the parameter |
RETURNS BOOLEAN |
el tipo de datos del valor que devuelve la función |
Los dos identificadores en PROCEDURE MyProc(Count : INTEGER, Message : STRING) son parámetros: reciben los valores pasados cuando se llama al procedimiento y se usan dentro de él como variables locales.
Para convertir un procedimiento en una función: cambiar PROCEDURE a FUNCTION y añadir RETURNS <type>; reemplazar el OUTPUT (o el parámetro BYREF que llevaba el resultado hacia afuera) con una declaración RETURN; y cambiar cada llamada para que el valor devuelto se utilice, Result ← Unpack(Text) en lugar de CALL Unpack(Text, Result). Para una pregunta de "escribir la cabecera", escribir toda la línea: FUNCTION Calculate(Expression : STRING) RETURNS INTEGER. Un parámetro de matriz se pasa por referencia, por lo que un procedimiento que escribe en una matriz cambia la matriz del llamante.
Cuando un programa gana un nuevo módulo, la interfaz es lo que se acuerda primero: el nombre, los parámetros (cuántos, en qué orden, de qué tipo) y el tipo de retorno, además de cualquier dato global que el módulo lea o escriba. Un módulo que envía un recordatorio antes de la fecha límite necesita el registro (o su índice) como parámetro y no devuelve nada, por lo que es un procedimiento; el programa principal lo llama una vez por registro.
Writing a module for Paper 2
La mitad del Paper 2 es "escribir pseudocódigo para el módulo X". El esquema otorga una marca por característica, por lo que un módulo que no está terminado aún obtiene puntos por cada parte correcta. Las partes que busca el examinador:

- La cabecera, según la describe la pregunta:
PROCEDURE Name(Param : TYPE)oFUNCTION Name(Param : TYPE) RETURNS TYPE, conBYREFdonde la rutina debe cambiar el argumento. - Declaraciones locales:
DECLAREcada variable local con su tipo, e inicializar contadores y totales (Count ← 0). - El bucle que visita cada elemento:
FOR Index ← 1 TO 50para un array cuyo tamaño está dado;WHILE NOT EOF(...)para un archivo. - La condición, con la comparación y el límite correctos, en el elemento adecuado:
IF Score[Index] > Limit THEN. - La actualización dentro de la rama: el contador aumentado, el valor almacenado o el mensaje emitido.
- El final:
RETURNuna vez, después del bucle, en una función;ENDFUNCTIONoENDPROCEDURE; y cadaIF,FORyWHILEcerrado.
Ejemplo resuelto. Un array global Score : ARRAY[1:50] OF INTEGER guarda puntuaciones de examen. Escribe una función CountAbove(Limit : INTEGER) que devuelva cuántas puntuaciones son mayores que Limit.
FUNCTION CountAbove(BYVAL Limit : INTEGER) RETURNS INTEGER
DECLARE Index, Count : INTEGER
Count ← 0
FOR Index ← 1 TO 50
IF Score[Index] > Limit THEN
Count ← Count + 1
ENDIF
NEXT Index
RETURN Count
ENDFUNCTION
Marcas: la cabecera con su parámetro y RETURNS INTEGER; Count declarado y establecido en 0; un bucle sobre todos los 50 elementos; la comparación > Limit (no >=); el contador actualizado dentro del IF; RETURN Count después del bucle. El programa principal utiliza el valor devuelto en una expresión o una salida: OUTPUT "Above 70: ", CountAbove(70).
Ejemplo resuelto. Escribe una función IsValid(Code : STRING) que devuelva TRUE cuando Code sean dos letras mayúsculas seguidas de cuatro dígitos — el formato 格式 AB1234 — y FALSE de lo contrario.
FUNCTION IsValid(BYVAL Code : STRING) RETURNS BOOLEAN
DECLARE Index : INTEGER
DECLARE Ch : STRING
IF LENGTH(Code) <> 6 THEN
RETURN FALSE
ENDIF
FOR Index ← 1 TO 6
Ch ← MID(Code, Index, 1)
IF Index <= 2 THEN
IF Ch < "A" OR Ch > "Z" THEN
RETURN FALSE
ENDIF
ELSE
IF Ch < "0" OR Ch > "9" THEN
RETURN FALSE
ENDIF
ENDIF
NEXT Index
RETURN TRUE
ENDFUNCTION
La comprobación de longitud viene primero, por lo que nunca se pide a MID una posición que no existe. La validación 验证 de este tipo devuelve un BOOLEAN para que el llamante pueda escribir IF IsValid(Entry) THEN ... ELSE OUTPUT "Invalid code" ENDIF: un mensaje al usuario es emitido por el llamante, no por la función; una función calcula, un procedimiento actúa.
Ejemplo resuelto. Escribe una función IsPalindrome(Word : STRING) que devuelva TRUE cuando Word se lea igual al revés, como "RACECAR".
Comparar los caracteres desde ambos extremos, moviéndose hacia adentro: la posición Index se empareja con la posición Len - Index + 1, y solo se necesita probar la primera mitad.

i con la posición Len - i + 1 y se detiene en el medioFUNCTION IsPalindrome(BYVAL Word : STRING) RETURNS BOOLEAN
DECLARE Len, Index : INTEGER
Len ← LENGTH(Word)
FOR Index ← 1 TO Len DIV 2
IF MID(Word, Index, 1) <> MID(Word, Len - Index + 1, 1) THEN
RETURN FALSE
ENDIF
NEXT Index
RETURN TRUE
ENDFUNCTION
Las mismas tres herramientas — un FOR sobre las posiciones, MID(s, i, 1) para leer un carácter, y & para construir una nueva cadena — responden a la mayoría de los módulos de cadenas en el Paper 2: contar cuántas veces ocurre un carácter (IF MID(s, i, 1) = Ch THEN Count ← Count + 1), reemplazar cada instancia de un carácter (añadir ya sea NewChar o el carácter original a NewString en cada posición), ocultar todos menos los últimos cuatro dígitos de un número de tarjeta (añadir '*' para cada posición hasta Len - 4), o escribir tu propio MID() uniendo los caracteres desde Start hasta Start + Length - 1. Pedirle a MID una posición pasada el final de la cadena es un error de tiempo de ejecución, por lo que comprobar LENGTH primero.
Archivos. Los valores en las variables desaparecen cuando el programa finaliza, por lo que un módulo que debe conservar datos para la siguiente ejecución los escribe en un archivo: OPENFILE "scores.txt" FOR WRITE, una línea WRITEFILE "scores.txt", NUM_TO_STR(Score[Index]) por iteración dentro del bucle, y CLOSEFILE "scores.txt" una vez, después del bucle; la lectura posterior utiliza FOR READ, READFILE y WHILE NOT EOF("scores.txt"). El tema 10 contiene la sección completa sobre archivos; aquí las marcas se otorgan por abrir con el modo correcto, realizar la lectura o escritura dentro del bucle y cerrar una vez al finalizarlo.
La pila de llamadas: apilado en la llamada, desapilado al retorno
Llamar a una subrutina apila un nuevo marco en la parte superior; retornar lo desapila y devuelve un valor al llamador. La llamada que se está ejecutando es siempre el marco en la parte superior.
| Inglés | Chino | Pinyin |
|---|---|---|
| identifier/aɪˈdentɪfaɪə/ | 标识符 | biāo shí fú |
| parameters/pəˈræmɪtəz/ | 参数 | cān shù |
| program library/ˈprəʊɡræm ˈlaɪbrəri/ | 程序库 | chéng xù kù |
| concatenation/kənˌkætəˈneɪʃn/ | 连接 | lián jiē |
| procedure/prəˈsiːdʒə/ | 过程 | guò chéng |
| structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ | 结构化编程 | jié gòu huà biān chéng |
| subroutines/ˈsʌbruːtiːnz/ | 子程序 | zi chéng xù |
| return value/rɪˈtɜːn ˈvæljuː/ | 返回值 | fǎn huí zhí |
| arguments/ˈɑːɡjuːmənts/ | 实参 | shí cān |
| pass by value/pæs baɪ ˈvæljuː/ | 传值 | chuán zhí |
| pass by reference/pæs baɪ ˈrefrəns/ | 传引用 | chuán yǐn yòng |
| global variable/ˈɡləʊbl ˈveərɪəbl/ | 全局变量 | quán jú biàn liàng |
| scope/skəʊp/ | 作用域 | zuò yòng yù |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | 分解 | fēn jiě |
| signature/ˈsɪɡnɪtʃə/ | 签名 | qiān míng |
| format/ˈfɔːmæt/ | 格式 | gé shì |
| Validation/ˌvælɪˈdeɪʃn/ | 验证 | yàn zhèng |
| run-time error/rʌn taɪm ˈerə/ | 运行时错误 | yùn xíng shí cuò wù |
11.3
Writing efficient pseudocode
Tres características que hacen que el pseudocódigo sea más fácil de entender — la respuesta a una pregunta de "indica tres características" — son identificadores significativos (Total, no t), la indentación de las instrucciones dentro de cada construcción, y los comentarios (// ...) que explican el propósito; también se aceptan palabras clave en mayúsculas, una instrucción por línea y líneas en blanco entre secciones. El pseudocódigo eficiente va más allá:
- mover invariantes fuera de los bucles — si un valor (un invariante 不变量) no cambia con el contador del bucle, calcularlo una vez antes del bucle.
- salir de un bucle temprano cuando se encuentra la respuesta (detener una búsqueda lineal 线性查找 en cuanto aparezca el objetivo).
- evitar trabajo redundante — almacenar un resultado y reutilizarlo en lugar de recalcularlo.
- elegir la estructura de datos adecuada — un array supera a muchas variables separadas cuando los elementos pertenecen juntos.
- reemplazar IF anidados profundos con CASE al probar un valor contra muchos.
- comment the intent, not the mechanics (
// validate the postcode, not// loop 6 times). - usar nombres significativos (
numberOfPupils, non) e inicializar variables antes de usarlas.

| Inglés | Chino | Pinyin |
|---|---|---|
| invariant/ɪnˈveərɪənt/ | 不变量 | bù biàn liàng |
| linear search/ˈlɪnɪə sɜːtʃ/ | 线性查找 | xiàn xìng chá zhǎo |
| syntax error/ˈsɪntæks ˈerə/ | 语法错误 | yǔ fǎ cuò wù |
11.3
Testing and errors
Tres tipos de error, cada uno encontrado de manera diferente:
| Error | What it is | Ejemplo | Found by |
|---|---|---|---|
| error de sintaxis 语法错误 | una instrucción que rompe las reglas del lenguaje | un ENDIF faltante; OUTPT "Hi" |
el traductor, antes de que el programa se ejecute |
| error de tiempo de ejecución 运行时错误 | el programa se ejecuta, pero una instrucción no puede llevarse a cabo | división por cero; un índice de matriz de 0 o 51; una función llamada con un parámetro inválido; un bucle que nunca termina, por lo que el programa se "congela" | durante la ejecución: el programa se detiene o se cuelga |
| error lógico | el programa se ejecuta hasta el final, pero la salida es incorrecta | > donde se necesitaba >=; un total nunca establecido en 0 |
prueba con una tabla de trazas y datos de prueba elegidos |
Un IDE 集成开发环境 ayuda a encontrar los dos últimos: un punto de ruptura 断point detiene el programa en una línea elegida; el ejecución paso a paso 单步执行 luego ejecuta una instrucción a la vez; y la ventana de informe (o vigilancia) muestra el valor de cada variable en ese momento, por lo que la línea donde un valor se vuelve incorrecto se ve directamente. Los métodos de prueba y los datos de prueba están en el tema 12.
| Inglés | Chino | Pinyin |
|---|---|---|
| IDE/ˌaɪ diː ˈiː/ | 集成开发环境 | jí chéng kāi fā huán jìng |
| breakpoint/ˈbreɪkpɔɪnt/ | 断点 | duàn diǎn |
| single stepping/ˈsɪŋɡl ˈstepɪŋ/ | 单步执行 | dān bù zhí xíng |
11.3
Definiciones aceptadas por el examinador
Una pregunta de definición se califica según palabras fijas. Aprenda estas exactamente.
| Término | Definición |
|---|---|
| procedure | un subprograma que realiza una tarea (una secuencia de pasos) y no devuelve un valor; se llama con CALL |
| función | un subprograma que devuelve un único valor al punto donde fue llamado, por lo que puede usarse en una expresión |
| parameter | el identificador en la cabecera de un subprograma que recibe un valor o una referencia cuando se llama al subprograma |
| argument | el valor (o variable) suministrado en la llamada, coincidente con un parámetro |
| paso por valor | se da una copia del valor del argumento a la subrutina, por lo que los cambios dentro de ella no afectan a la variable original |
| paso por referencia | se da la dirección de la variable a la subrutina, por lo que los cambios dentro de ella cambian la variable original |
| header | la primera línea de una definición de subprograma: su nombre, sus parámetros y, para una función, su tipo de retorno |
| interface | lo que un programa llamador debe saber para usar un subprograma: su nombre, sus parámetros (número, orden, tipo) y su tipo de retorno |
| return value | el valor que una función pasa de vuelta a la expresión que la llamó |
| local variable | declarada dentro de un subprograma; existe solo mientras el subprograma se ejecuta y solo puede usarse dentro de él |
| global variable | declarada fuera de todos los subprogramas; puede usarse en cualquier lugar del programa |
| count-controlled loop | se repite un número fijo de veces, controlado por un contador (FOR ... NEXT) |
| pre-condition loop | prueba su condición antes de cada iteración, por lo que el cuerpo puede nunca ejecutarse (WHILE ... ENDWHILE) |
| post-condition loop | prueba su condición después de cada iteración, por lo que el cuerpo se ejecuta al menos una vez (REPEAT ... UNTIL) |
| constante | un valor nombrado que no puede cambiar mientras el programa se ejecuta |
| subroutine | un bloque autocontenido de código que realiza una tarea y se llama por nombre: un procedimiento o una función |
| library routine | un subprograma que ya ha sido escrito y probado, y está disponible para ser llamado desde un programa |
| Inglés | Chino | Pinyin |
|---|---|---|
| count-controlled loop/kaʊnt kənˈtrəʊld luːp/ | 计数循环 | jì shù xún huán |
| pre-condition loop/priː kənˈdɪʃn luːp/ | 前测循环 | qián cè xún huán |
| post-condition loop/pəʊst kənˈdɪʃn luːp/ | 后测循环 | hòu cè xún huán |
| local variable/ˈləʊkl ˈveərɪəbl/ | 局部变量 | jú bù biàn liàng |
11.3
Consejos para el examen
- Distinguir un procedimiento (sin valor de retorno) de una función (devuelve un valor); conocer paso por valor frente a paso por referencia.
- Elegir el bucle correcto: controlado por contador (FOR) cuando se conoce el número de repeticiones, controlado por condición (WHILE/REPEAT) de lo contrario.
- Distinguir variables locales frente a globales y alcance; preferir variables locales en módulos reutilizables.
- Usar los nombres exactos de rutina y orden de parámetros del inserto.
VALySTRson nombres IGCSE y no puntúan;UCASEyLCASEson rutinas reales 9618 de la Guía de Pseudocódigo pero actúan sobre un carácter, por lo que en el Examen 2 una cadena completa tomaTO_UPPERoTO_LOWER. - En una respuesta de "escribir pseudocódigo" la cabecera, las declaraciones, el bucle, la condición, la actualización y el
RETURNllevan cada uno una marca: escribir las seis partes, incluso si una es incierta.
Errores comunes
- Llamar a una función y no usar lo que devuelve. Asignar el resultado, o usarlo en la expresión o salida:
Sorted ← BubbleSort(MyArray, 7). - Pasar una longitud de uno hacia afuera:
6para una matriz de siete elementos, o el último índice donde se quería la longitud. Decidir si el parámetro es una longitud o un índice, y comprobar que el último elemento se visita. - Cerrar un archivo dentro del bucle que lo lee. Abrir una vez, cerrar una vez, después del bucle.
- Usar la entrada como un nombre de archivo directamente. Añadir la extensión que dio la pregunta:
FileName ← Choice & ".txt". - Dejar constructos abiertos. Cada
IFnecesita suENDIF, cadaFORsuNEXT, cadaWHILEsuENDWHILE, y cada función suRETURN; el esquema tiene una marca para ello. - Límites incorrectos:
>para "al menos" (que es>=), o unFORque comienza en0para un array declarado[1:50]. - Un contador o total que nunca se establece en
0antes del bucle. - En una tabla de trazas, reescribir cada variable en cada fila, o cambiar un valor antes de que se ejecute la instrucción que lo cambia.
- Una condición a medias:
IF x = 3 OR 4— cada lado deORyANDdebe ser una comparación completa. Y+no une cadenas;&sí. - Declarar como local un valor que debe sobrevivir entre llamadas. Un total acumulado o una cadena construida a lo largo de varias llamadas es global o
BYREF.
Lecciones interactivas sobre este tema
Trátalo paso a paso, con ejercicios de verificación instantánea.