Saltar al contenido

Programación

A-Level Ciencias de la Computación · Tema 11

Entrenar
Lección de video para este tema Abrir la página de video
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
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

Fuente: Plan de estudios Cambridge International

Lines of source code on a dark screen
La programación convierte un diseño en instrucciones escritas como código
A programmer working at a computer
Un programador escribe el código y lo prueba a medida que avanza

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:

  1. find the variables 变量 and their data types 数据类型.
  2. turn input/output boxes into INPUT / OUTPUT.
  3. turn decision diamonds into IF...ELSE...ENDIF (or CASE).
  4. turn loop arrows into WHILE, REPEAT...UNTIL, or FOR.
  5. turn process boxes into assignments or calculations.
  6. check by tracing a small input.
Un mapeo de símbolos de diagrama de flujo a pseudocódigo: un paralelogramo de entrada/salida se convierte en INPUT u OUTPUT, un diamante de decisión se convierte en IF...THEN o CASE, una caja de proceso se convierte en una asignación x = expresión, y una flecha de bucle se convierte en WHILE, FOR o REPEAT
Cada símbolo del diagrama de flujo se convierte en una palabra clave del pseudocódigo

Constants and variables

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

El valor de una variable puede cambiar; una constante permanece fija
El valor de una variable puede cambiar; el de una constante permanece fijo
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 + - * /, plus DIV (integer division) and MOD (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.

La cadena COMPUTER mostrada como ocho cajas de caracteres numeradas (posiciones 1 a 8), con resultados trabajados: LENGTH(s) = 8, LEFT(s, 3) = COM, MID(s, 4, 3) = PUT, RIGHT(s, 2) = ER, y UCASE/LCASE cambiando el caso de la letra
Las rutinas comunes de cadenas actuando sobre 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.

Explorar

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.

Vocabulario Entrenar
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
Un diagrama de flujo: desde el inicio, un diamante de decisión prueba age >= 18; la rama TRUE emite Adult y la rama FALSE emite Minor, y ambas se reúnen al final
Un IF...ELSE evalúa la condición una vez, luego ejecuta exactamente una rama

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.

Un diagrama de flujo de una sentencia CASE OF Grade: el valor se prueba contra cada guardia sucesivamente (un valor único, una lista de valores, luego un rango); la primera rama coincidente ejecuta su sentencia, de lo contrario se ejecuta la rama OTHERWISE, y todas las ramas se vuelven a unir en ENDCASE
Una instrucción CASE ejecuta la rama que coincide con el valor

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.

Explorar

Selección (IF / ELSE)

Cambia la entrada y observa qué rama se ejecuta: la esencia de la selección.

Vocabulario Entrenar
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

Tres columnas de diagrama de flujo. FOR: una caja de conteo (i = 1 a N) luego una caja de cuerpo, volviendo atrás, para un número fijo de pasadas. WHILE: un diamante de prueba encima de una caja de cuerpo, por lo que la condición se verifica antes del cuerpo y el bucle puede ejecutarse cero veces. REPEAT: una caja de cuerpo encima de un diamante de prueba, por lo que la condición se verifica después del cuerpo y el bucle se ejecuta al menos una vez
Los tres bucles difieren en dónde se evalúa la condición — antes del cuerpo (WHILE), después (REPEAT), o un número fijo de veces (FOR)
  • 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.

Explorar

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.

Explorar

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.

Vocabulario Entrenar
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.

Dos paneles. Procedimiento: llamar a Greet(Ada) realiza una acción e imprime Hola, Ada, sin devolver valor. Función: establecer y = Square(5) calcula 5 por 5 = 25, devuelve 25, por lo que y luego contiene 25
Un procedimiento realiza una acción y no devuelve nada; una función devuelve un valor que usas en una expresión

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.
Dos diagramas de cajas de memoria. Paso por valor: la variable x = 5 del llamante se copia en una caja de parámetro separada a = 5, por lo que cambiar a deja x como 5. Paso por referencia: el parámetro a es una flecha que apunta a la propia caja x del llamante, por lo que cambiar a cambia x también
Pasar por valor copia el valor en una nueva caja; pasar por referencia permite a la rutina cambiar la variable propia del solicitante
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".

Tres llamadas del mismo procedimiento en una línea temporal; cada llamada crea su propia caja local MyString, nueva y vacía, que desaparece cuando la llamada regresa, mientras que una caja global MyString encima mantiene su valor entre las llamadas
Una variable local es una nueva caja vacía en cada llamada; solo una variable global (o un parámetro BYREF) mantiene un valor entre llamadas
Un gran cuadro exterior etiquetado alcance global contiene la variable global Total, visible en todas partes, y un cuadro interior más pequeño etiquetado PROCEDURE Calc, alcance local, contiene la variable local temp, que existe solo mientras Calc está en ejecución
Una variable global es visible en todas partes; una variable local existe solo dentro de su propio procedimiento

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) o FUNCTION 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:

Una función de pseudocódigo anotada, CountAbove, con una etiqueta en cada parte que obtiene una marca: la cabecera con su parámetro y tipo de retorno, las declaraciones locales, el total inicializado antes del bucle, el bucle FOR sobre cada elemento, la condición IF con el límite correcto, la actualización dentro de la IF, las construcciones cerradas, y el RETURN después del bucle
Cada parte de la respuesta del módulo lleva su propia marca, así escribe todas ellas incluso cuando una sea incierta
  1. La cabecera, según la describe la pregunta: PROCEDURE Name(Param : TYPE) o FUNCTION Name(Param : TYPE) RETURNS TYPE, con BYREF donde la rutina debe cambiar el argumento.
  2. Declaraciones locales: DECLARE cada variable local con su tipo, e inicializar contadores y totales (Count ← 0).
  3. El bucle que visita cada elemento: FOR Index ← 1 TO 50 para un array cuyo tamaño está dado; WHILE NOT EOF(...) para un archivo.
  4. La condición, con la comparación y el límite correctos, en el elemento adecuado: IF Score[Index] > Limit THEN.
  5. La actualización dentro de la rama: el contador aumentado, el valor almacenado o el mensaje emitido.
  6. El final: RETURN una vez, después del bucle, en una función; ENDFUNCTION o ENDPROCEDURE; y cada IF, FOR y WHILE cerrado.

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.

La palabra RACECAR en siete cajas numeradas; arcos emparejan la posición 1 con 7, 2 con 6 y 3 con 5, etiquetados posición i y posición Len menos i más 1; el carácter central no tiene pareja
Una comprobación de palíndromo empareja la posición i con la posición Len - i + 1 y se detiene en el medio
FUNCTION 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.

Explorar

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.

Vocabulario Entrenar
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, no n) e inicializar variables antes de usarlas.
Mover el trabajo que nunca cambia fuera del bucle, para que se ejecute una vez en lugar de cada pasada
Mover el trabajo invariable fuera del bucle para que se ejecute una vez
Vocabulario Entrenar
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.

Vocabulario Entrenar
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
Vocabulario Entrenar
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. VAL y STR son nombres IGCSE y no puntúan; UCASE y LCASE son 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 toma TO_UPPER o TO_LOWER.
  • En una respuesta de "escribir pseudocódigo" la cabecera, las declaraciones, el bucle, la condición, la actualización y el RETURN llevan 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: 6 para 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 IF necesita su ENDIF, cada FOR su NEXT, cada WHILE su ENDWHILE, y cada función su RETURN; el esquema tiene una marca para ello.
  • Límites incorrectos: > para "al menos" (que es >=), o un FOR que comienza en 0 para un array declarado [1:50].
  • Un contador o total que nunca se establece en 0 antes 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 de OR y AND debe 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.

Exámenes Anteriores

Más temas en A-Level Ciencias de la Computación

Iniciar sesión o crear cuenta

IGCSE, A-Level & AP