본문 바로가기

프로그래밍

A-Level 컴퓨터 과학 · 주제 11

이 주제용 영상 수업 영상 페이지 열기
23:32

프로그래밍 기초

프로그램은 비밀번호를 요청해야 하며, 맞을 때까지 계속 묻습니다. 간단해 보입니다 — 하지만 어떤 루프를 사용합니까? 프로그램은 결정을 내리고 작업을 반복하며, 선택하는 것이…

영어 내레이션 · 영어 + 중국어 자막 burned-in

11.1

프로그래밍 기초

Syllabus
응시자가 다음을 수행할 수 있어야 함: 참고 사항 및 가이드라인
프로그램 흐름도(program flowchart) 또는 **구조화 영어(structured English)**로 제시된 주어진 설계로부터 **가위법(pseudocode)**을 구현하고 작성함
가상코드 문장을 작성하시오: • 상수의 선언 및 초기화 • 변수의 선언 • 변수에 값 할당 • 키보드로 입력된 수학적 또는 논리적 연산자를 사용하는 식을 콘솔로 출력
내장 함수와 라이브러리_argv를 사용함 가상코드 가이드에 명시되지 않은 모든 함수는 제공됨. 문자열 조작 함수는 항상 제공됨

출처: Cambridge International syllabus

어두운 화면 위의 소스 코드 줄
프로그래밍은 디자인을 코드로 작성된 지시사항으로 변환합니다
컴퓨터 앞에서 작업하는 프로그래머
프로그래머는 코드를 작성하면서 동시에 테스트합니다

디자인에서 코드로

플로우차트(프로그램 플로우차트) 또는 구조화된 영어와 같은 디자인을 **가상 언어(pseudocode)**로, 그리고 실제 언어로 변환할 수 있어야 합니다:

  1. 변수와 데이터 타입을 찾습니다.
  2. 입력/출력 상자를 INPUT / OUTPUT로 변환합니다.
  3. 결정 다이아몬드(결정상자)를 IF...ELSE...ENDIF (또는 CASE)로 변환합니다.
  4. 루프 화살표를 WHILE, REPEAT...UNTIL, 또는 FOR로 변환합니다.
  5. 프로세스 상자를 대입문 또는 계산식으로 변환합니다.
  6. 작은 입력값을 따라가며 검증합니다.
플로우차트 기호에서 가상 언어로의 매핑: 입력/출력 마름모는 INPUT 또는 OUTPUT, 결정 다이아몬드는 IF...THEN 또는 CASE, 프로세스 상자는 대입 x = expression, 루프 화살표는 WHILE, FOR 또는 REPEAT
각 플로우차트 기호가 가상 언어 키워드로 변환됩니다

상수와 변수

**상수(constant)**는 절대 변하지 않는 값을 저장하고, **변수(variable)**는 변경될 수 있는 값을 저장합니다. 타입을 지정하여 선언합니다:

변수의 값은 변할 수 있지만, 상수는 고정됨
변수의 값은 변경될 수 있으나, 상수는 고정됨
CONSTANT Pi = 3.14159
DECLARE Radius : REAL
DECLARE Area : REAL

Radius ← 5
Area ← Pi * Radius * Radius

반복되는 고정된 값(Pi, MaxScore)에는 상수를 사용하여 코드를 명확하게 하고 한 곳에서 쉽게 수정할 수 있게 하십시오.

In the exam, a constant is the answer to "identify a more appropriate way of representing" a fixed value, such as a tax rate or a maximum score, that appears at several places in the pseudocode. The benefits the scheme lists: the value is set once and cannot be changed accidentally by the program; a change is made in one place and reaches every statement that uses it; the identifier gives the value a meaning (MaxScore rather than 100), so the code is easier to read and to check; and there is less risk of a typing error in a long value such as 3.14159. A "state a value that could be replaced by a constant" question wants the literal from the pseudocode (0.2, 40), not a new name.

모든 변수는 사용되기 전에 식별자(이름)와 데이터 타입을 포함하여 한 번만 선언됩니다. 9618 가짜 코드 가이드의 여섯 가지 유형:

타입 저장 내용 코드 표기법 일반적 용도
INTEGER 정수 42, -3 카운트, 배열 인덱스, 루프 카운터
REAL 소수점 부분이 있는 숫자 3.75 가격, 평균
CHAR 하나의 문자 'A' (단일 인용부호) 등급 문자, 메뉴 키
STRING 일련의 문자 "Hello" (이중 인용부호) 이름, 우편번호
BOOLEAN TRUE 또는 FALSE TRUE Found와 같은 플래그
DATE 달력 날짜 12/05/2026 생일

"적절한 데이터 타입을 제시하시오"라는 질문은 변수가 가상의 언어에서 어떻게 사용되는지에 근거하여 답합니다: 소수점이 있는 값은 REAL; TRUE 또는 FALSE로 설정된 것은 BOOLEAN; 단일 인용부호 안의 값은 CHAR; 배열 인덱스로 사용되거나 DIV 및 MOD과 함께 사용되는 값은 INTEGER입니다. 가이드에서 정한 철자로 대문자로 타입을 쓰십시오.

해설 예제. 각 변수에 적절한 데이터 타입을 제시하시오.

Found ← FALSE
Initial ← 'K'
Price ← 12.99
Count ← Count + 1
Name ← "Li Wei"

Found은 BOOLEAN입니다 (FALSE를 저장함); Initial은 CHAR입니다 (단일 인용부호 안의 하나만의 문자); Price은 REAL입니다 (소수점 값); Count은 INTEGER입니다 (하나씩 증가하는 카운터); Name은 STRING입니다 (이중 인용부호 안의 텍스트).

대입 및 식

대입에는 ←을 사용합니다:

Total ← Total + 1
Average ← Sum / Count

식은 연산자를 사용합니다:

  • 산술 연산 + - * /, 합산 DIV (정수 나눈 값) 및 MOD (나머지): 7 DIV 2 = 3; 7 MOD 2 = 1.
  • 비교 연산 =, <>, <, >, <=, >=.
  • 논리 연산 AND, OR, NOT.

우선순위(높음에서 낮음): NOT → * / DIV MOD → + - → 비교 연산 → AND → OR. 불확실할 때는 괄호를 사용하시오.

입력 및 출력

OUTPUT "Enter your name:"
INPUT Name
OUTPUT "Hello, ", Name

내장 함수 및 라이브러리 루틴

대부분의 작업에는 미리 작성된 라이브러리 루틴이 제공되므로 직접 작성할 필요가 없습니다. Paper 2 삽입문에서는 사용 가능한 루틴을 정확한 이름, 매개변수 및 반환 타입과 함께 나열해 놓았으며, 그 외의 함수는 문제에서 명시합니다. 아래에 제시된 이름은 삽입문의 명칭입니다. VAL와 STR는 IGCSE 명칭이며 9618 문서 어디에도 등장하지 않으므로 점수를 얻을 수 없습니다. UCASE와 LCASE는 다른 사례입니다: 이 둘은 9618 표준에 속하며 Pseudocode 가이드에 정의되어 있지만 단일 **CHAR**를 accept하며, 삽입문에는 전혀 목록에 없기 때문입니다. Paper 2에서 전체 문자열에 대해 사용해야 할 루틴은 TO_UPPER입니다.

프로그램 라이브러리는 이미 작성, 컴파일 및 테스트된 루틴들을 보유하며, 프로그램은 자체 코드를 작성하는 대신 이를 호출합니다. "state three benefits"(세 가지 이점) 질문에 대한 답안에서 인정받는 이점은 다음과 같습니다: 루틴들은 이미 테스트되었으므로 오류가 포함될 가능성이 적습니다; 개발 시간을 절약할 수 있습니다; 프로그래머가 직접 작성하기 어려운 복잡한 연산(복잡한 통계, 그래픽 등)을 수행할 수 있습니다; 전문가에 의해 작성되어 여러 프로그램에서 재사용됩니다; 고정된 인터페이스를 가진 루틴은 프로그램 내 어디서나 호출할 수 있습니다.

루틴 반환값 예시
LENGTH(s) s에 포함된 문자의 개수 LENGTH("Hello") = 5
LEFT(s, n) / RIGHT(s, n) 첫 번째 / 마지막 n개의 문자 RIGHT("Hello", 2) = "lo"
MID(s, start, n) 시작 위치 start로부터 n개의 문자 (위치는 1부터 세림) MID("Hello", 2, 3) = "ell"
TO_UPPER(s) / TO_LOWER(s) 대문자 / 소문자로 된 s TO_UPPER("ab1") = "AB1"
NUM_TO_STR(x) / STR_TO_NUM(s) 숫자를 문자열로 / 문자열을 숫자로 변환 STR_TO_NUM("3.5") = 3.5
IS_NUM(s) s가 유효한 숫자일 때 TRUE 반환 IS_NUM("12a") = FALSE
ASC(c) / CHR(n) c의 문자 코드 / 코드 n에 해당하는 문자 ASC('A') = 65, CHR(66) = 'B'
INT(x) x의 정수 부분 INT(7.9) = 7
RAND(n) 0 이상 n 미만(포함 안 함)의 무작실 실수 INT(RAND(6)) + 1는 주사위 굴림 결과
DAY(d), MONTH(d), YEAR(d) DATE의 구성 요소 YEAR(TODAY())
DAYINDEX(d), SETDATE(d, m, y), TODAY() 요일 (1 = 일요일); 세 정수로 구성된 날짜; 오늘 날짜
EOF(f) 파일 f에 더 읽을 줄이 없을 때 TRUE 반환 WHILE NOT EOF("data.txt")

문자열은 &(연결/concatenation)로 합칩니다: "A" & "BC"은 "ABC"입니다. 삽입문의 정확한 명칭을 사용하되 매개변수의 순서를 따르십시오.

날짜와 무작실 숫자는 한 줄 문장으로 표현됩니다. SETDATE(17, 11, 2007)는 2007년 11월 17일을 생성하고; 12 - MONTH(MyDOB)은 출생 월부터 해당 해 말까지의 달 수를 나타냅니다; IF DAYINDEX(MyDOB) = 5 THEN는 목요일을 검사하는데, 일요일이 1번이기 때문입니다. RAND(n)는 0 이상 n 미만(포함 안 함)의 실수를 반환하므로, Low부터 High까지의 무작실 정수는 INT(RAND(High - Low + 1)) + Low입니다: INT(RAND(21)) - 10는 -10부터 10까지 값을 제공합니다.

COMPUTER 문자열이 8개의 번호 매긴 문자 상자로 표시됨 (위치 1~8), 풀이 결과 포함: LENGTH(s) = 8, LEFT(s, 3) = COM, MID(s, 4, 3) = PUT, RIGHT(s, 2) = ER, 그리고 UCASE/LCASE는 문자 대소 변경
s = "COMPUTER"(위치 1–8)에 작용하는 일반적인 문자열 루틴

풀이 예제. Word ← "Program", Code ← 'Q', N ← 7가 주어질 때 각 식을 계산하시오.

식 값 이유
LENGTH(Word) 7 7개의 문자
MID(Word, 4, 2) "gr" 위치 4에서 시작하는 2개의 문자
LEFT(Word, 3) & "!" "Pro!" &으로 연결됨
TO_UPPER(RIGHT(Word, 2)) "AM" 내부 함수가 먼저 실행됨
ASC(Code) - ASC('A') 16 'Q'는 81이고 'A'는 65임
N DIV 2 + N MOD 2 4 3 + 1
NUM_TO_STR(N) & "th" "7th" 숫자가 먼저 문자열로 변환됨
INT(N / 2) 3 3.5가 정수 부분으로 잘림

안쪽에서 바깥쪽으로 계산하고, 인용부호를 유지하십시오: "7"는 문자열이고 7는 숫자입니다.

풀이 예제. 각 문장은 함수나 연산자의 사용에 오류가 있을 수 있습니다. 오류를 설명하거나 NO ERROR라고 쓰십시오. (모든 변수는 올바른 타입이라고 가정합니다.)

문장 오류
Result ← 2 & 4 &은 문자열을 연결합니다; 2와 4는 정수이므로 +가 필요합니다
SubString ← MID("pseudocode", 4, 1) NO ERROR: 위치 4에서 하나의 문자, "u"
IF x = 3 OR 4 THEN OR은 양쪽에 부울리안이 필요합니다: IF x = 3 OR x = 4 THEN
Result ← Status AND INT(x / 2) AND은 두 개의 부울리안이 필요합니다; INT(x / 2)는 정수임
Message ← "Done" + LENGTH(MyString) +은 문자열에 정수를 더할 수 없음: "Done" & NUM_TO_STR(LENGTH(MyString))

모든 연산자는 특정 타입에 적용됩니다: &는 문자열, + - * / DIV MOD은 숫자, AND OR NOT는 부울리안, 그리고 = <>는 같은 타입의 두 값에 적용됩니다. "each expression을 평가하거나 ERROR를 쓰라"는 표는 다음과 같이 채워집니다: LENGTH(42)와 "A" + 1는 ERROR입니다. 타입이 함수나 연산자와 일치하지 않기 때문입니다.

풀이 예제. Points ← 100, Active ← TRUE, Exempt ← FALSE가 주어질 때 각 식을 계산하시오.

식 값 이유
(Points > 99) OR Active TRUE 양쪽 모두 참입니다; 하나만 해도 됩니다
(Points MOD 2 = 0) OR Exempt TRUE 100 MOD 2는 0입니다
(Points <= 75) AND (Active OR Exempt) FALSE 첫 번째 쪽은 거짓이고, AND는 양쪽 다 필요함
(Active OR NOT Active) AND NOT Exempt TRUE Active OR NOT Active는 항상 참임

마지막 식은 단순화된다: X이 무엇이든 상관없이 X OR NOT X은 TRUE이므로, 전체 식은 단순히 NOT Exempt이다. 괄호를 먼저 계산한 뒤, NOT, AND, OR 순서대로 계산한다.

탐색하기

변수는 레이블이 붙은 상자입니다

각 할당은 이름이 붙은 상자에 하나의 값을 저장하며, 동일한 이름을 다시 할당하면 덮어씁니다. 프로그램을 단계별로 추적하여 각 상자가 현재 값을 갖도록 확인하십시오.

English 한국어
pseudocode/ˈsuːdəʊkəʊd/ 가짜 코드
variables/ˈveərɪəblz/ 변수
data types/ˈdeɪtə taɪps/ 데이터 타입
assignment/əˈsaɪnmənt/ 대입
constant/ˈkɒnstənt/ constant: 상수
identifier/aɪˈdentɪfaɪə/ identifier: 식별자
function/ˈfʌŋkʃn/ 함수
library routines/ˈlaɪbrəri ruːˈtiːnz/ 라이브러리 루틴
concatenation/kənˌkætəˈneɪʃn/ 연결
selection/sɪˈlekʃn/ 선택 구조
IDE/ˌaɪ diː ˈiː/ 통합 개발 환경
11.2

선택 (Selection)

Syllabus
응시자가 다음을 수행할 수 있어야 함: 참고 사항 및 가이드라인
가상코드를 사용하여 다음을 작성하시오: • ELSE 절 및 중첩 IF 문이 포함된 ‘IF’문 • ‘CASE’ 구조 • ‘카운트 제어’ 루프: • ‘후위 조건’ 루프 • ‘전위 조건’ 루프
다른 루프 구조보다 특정 문제 해결에 더 적합한 이유를 설명하시오

출처: Cambridge International syllabus

선택은 어떤 단계가 실행될지 결정합니다.

IF age >= 18 THEN
    OUTPUT "Adult"
ELSE
    OUTPUT "Minor"
ENDIF
플로우차트: 시작점에서 결정 다이아몬드가 age >= 18을 검사; TRUE 분기는 Adult 출력, FALSE 분기는 Minor 출력, 양쪽이 끝에서 재합침
IF...ELSE는 조건을 한 번 테스트한 후 정확히 하나의 분기를 실행합니다

두 개 이상의 경우를 처리하려면 중첩 IF를 사용할 수 있으나, 깊은 중첩은 가독성이 떨어집니다 — 여러 옵션 중 하나를 대조할 때는 CASE가 더 깔끔합니다:

CASE OF Grade
    "A": OUTPUT "Excellent"
    "B": OUTPUT "Good"
    OTHERWISE: OUTPUT "Try again"
ENDCASE

Cambridge CASE는 단일 값, 값 목록 (1, 2, 3:), 및 범위 (1 TO 5:)를 허용합니다.

중첩 IF는 다른 IF의 분기 내에 있는 IF입니다. 각 IF에는 자체 ENDIF이 필요하며, 시험관은 모든 구성 요소가 닫혀 있는지 확인합니다:

IF Mark >= 50 THEN
    IF Mark >= 80 THEN
        OUTPUT "Distinction"
    ELSE
        OUTPUT "Pass"
    ENDIF
ELSE
    OUTPUT "Fail"
ENDIF

경계값에서 점수가 빠집니다. "50점 이상이면 합격"이라는 조건은 Mark >= 50이며, Mark > 50이 아닙니다; 마지막 CASE 분기는 "나머지 모든 경우"를 위해 OTHERWISE으로 작성되며, > 200과 같은 조건이 아닙니다. 여기서 잘못된 비교 연산자는 논리 오류입니다: 프로그램은 실행되지만 특정 입력에 대해 잘못된 출력을 생성하며, 50과 같은 경계값을 포함하는 추적 표는 이를 Finds하는 방법입니다.

CASE OF Grade 문장의 유추도: 값은 각 가드(단일 값, 값 목록, 범위)와 순차적으로 테스트됩니다. 첫 번째 일치하는 분기가 해당 문장을 실행하고, 그렇지 않으면 OTHERWISE 분기가 실행되며, 모든 분기는 ENDCASE에서 재합류합니다
CASE 문장은 값과 일치하는 분기를 실행합니다

해설 예시. CASE 구조를 사용하지 않고 동일한 기능을 갖도록 이 코드를 다시 작성하십시오.

CASE OF MySwitch
    1: ThisChar ← 'a'
    2: ThisChar ← 'y'
    3: ThisChar ← '7'
    OTHERWISE: ThisChar ← '*'
ENDCASE

각 값은 IF들의 사슬 구조의 분기가 되며, OTHERWISE은 마지막 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

동일한 값을 할당하는 두 구절은 값 목록이 있는 하나의 구절로 병합됩니다: 1, 2: ThisChar ← 'a'. 가드는 순서대로 테스트됩니다: 1 TO 50:과 같은 범위가 먼저 오고 40 TO 60:가 이어질 때, 45이라는 값은 첫 번째 일치하는 분기로 들어갑니다. 따라서 나중 분기의 할당은 절대 수행되지 않을 수 있으며, 앞쪽 분기가 이미 가능한 모든 값을 커버할 경우, OTHERWISE 분기도 도달하지 못합니다.

반대로 여러 부울 variable를 테스트하는 중첩 IF는 결과별로 하나의 조건으로 작성하는 것이 더 명확합니다: IF A AND B AND C THEN CALL Sub1(), 그 다음 IF A AND B AND NOT C THEN CALL Sub2() 등. AND와 OR으로 테스트를 결합하면 중첩이 제거되고, IF A THEN이 IF A = TRUE THEN 대신 허용됩니다.

탐색하기

선택 (IF / ELSE)

입력을 변경하여 어떤 분기가 실행되는지 확인하세요—선택의 본질입니다.

English 한국어
flowchart/ˈfləʊtʃɑːt/ 플로우차트
structured English/ˈstrʌktʃəd ˈɪŋɡlɪʃ/ 구조화 영어
11.2

반복

반복은 블록을 여러 번 실행합니다. 세 가지 루프는 본문의 실행 횟수에 따라 다릅니다.

카운트 제어 (FOR) 루프

카운트 제어 루프 — 반복 횟수를 알고 있을 때 사용하세요:

FOR i ← 1 TO 10
    OUTPUT i
NEXT i

STEP는 카운트를 변경할 수 있습니다(예: FOR i ← 10 TO 1 STEP -1). 고정된 횟수의 반복이나 배열의 각 요소를 처리하기에 적합합니다.

전조건 (WHILE) 루프

전조건 루프는 각 반복 전에 조건을 테스트하므로 0회 실행될 수 있습니다:

WHILE total < 100 DO
    INPUT n
    total ← total + n
ENDWHILE

후조건 (REPEAT...UNTIL) 루프

후조건 루프는 각 반복 후에 조건을 테스트하므로 최소 한 번은 반드시 실행됩니다:

REPEAT
    INPUT password
UNTIL password = correctPassword

적절한 루프 선택

세 개의 유추도 열. FOR: 카운트 상자(i = 1 to N) 이후 본문 상자가 있고, 일정한 횟수의 반복을 위해 다시 연결됨. WHILE: 본문 상자 위에 테스트 마름모가 있어 본문 전에 조건이 확인되며 루프가 0회 실행될 수 있음. REPEAT: 본문 상자 위에 테스트 마름모가 있어 본문 후에 조건이 확인되며 루프가 최소 한 번 실행됨
세 루프는 조건 테스트 위치가 다릅니다—본문 이전(WHILE), 본문 이후(REPEAT), 또는 고정 횟수(FOR)
  • 초기에 카운트가 알려짐 → FOR.
  • 0회 실행 가능함 → WHILE.
  • 최소 한 번은 반드시 실행됨 → REPEAT...UNTIL.

선택의 근거는 카운트가 알려진지 여부와 본문이 최소 한 번 실되어야 하는지 여부입니다. 일반적인 문제에서는 시나리오("올바른 비밀번호를 입력할 때까지 물어야 하지만 최소 한 번은 물어봐야 함")를 제시하여 어떤 루프가 적합한지 묻습니다.

The two marks are for the name of the loop and 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 that has been written as a WHILE with a counter is "not the most appropriate": the count, four, is known, so a FOR loop fits.

해설 예시. 각 작업에 적합한 루프는 무엇인가? (a) 12의 곱셈표 출력; (b) 사용자가 0을 입력할 때까지 숫자 계속 읽기; (c) 비밀번호를 맞출 때까지 요청. 본문이 얼마나 자주 실행되는지와 테스트가 언제 일어나는지 묻음으로써 선택하시오. (a) 카운트는 사전에 알려져 있다(12), 따라서 FOR 루프를 사용. (b) 카운트는 알 수 없으며, 첫 번째 입력이 이미 0일 수 있음—따라서 본문 앞에 테스트가 와야 함: WHILE 루프, 0회 이상 실행. (c) 카운트는 알 수 없으나, 테스트할 대상이 생기기 전에 최소 한 번은 반드시 물어야 함—따라서 본문 뒤에 테스트가 와야 함: REPEAT...UNTIL, 1회 이상 실행. 결정적 질문은 본문이 최소 한 번 실행되어야 하는지 여부임: WHILE은 0회 실행 가능, REPEAT은 항상 한 번 실행됨.

추적 표를 이용한 수작업 행(Dry running)

추적 표는 알고리즘을 수작업으로 실행(손으로 따라 감)할 때 각 변수의 값을 기록합니다. 종이에 루프를 테스트하는 방법이며, 대부분 Paper 2의 6점 문제입니다.

DECLARE Count, Total : INTEGER
Count ← 1
Total ← 0
WHILE Total < 10
    Total ← Total + Count * 2
    Count ← Count + 1
ENDWHILE
OUTPUT Count, Total
카운트 합계 합계 < 10 출력
1 0 TRUE
2 2 TRUE
3 6 TRUE
4 12 FALSE 4, 12

Rules that earn the marks: one column per variable, in the order the question gives; write a value only when it changes; start a new row each time the loop repeats; evaluate the condition with the current values, and stop the moment it is FALSE; put the output in its own column, exactly as it would appear. Trace the algorithm as written, not the one you think was intended — if it never stops, say so.

해설 예시. 각 줄에는 어떤 구조가 사용되는가—선택, 반복, 또는 서브ROUTINE 호출?

가식코드 선택 반복 서브ROUTINE
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 및 CASE은 선택; FOR, WHILE 및 REPEAT은 반복; 괄호를 따르는 이름 — Start(), IsFull() —은 조건 내부에 있는 경우를 포함하여 프로시저 또는 함수의 호출을 의미합니다.

탐색하기

루틴을 단계별로 추적하십시오

추적 표(trace table)는 루프의 각 반복 후 모든 변수를 기록합니다. 카운터 i가 증가하고 누적 합계가 쌓이는 과정을 확인하세요 — 이것이 시험 추적 문제에서 채우도록 요구하는 내용과 정확히 일치합니다.

탐색하기

루프 추적

루프를 한 단계씩 진행하며 매 반복 시 변수가 어떻게 변하는지 관찰하십시오 — 이것이 바로 트레이스 표가 기록하는 내용입니다.

English 한국어
array/əˈreɪ/ 배열
operators/ˈɒpəreɪtəz/ operators: 연산자
precedence/ˈpresɪdəns/ 우선순위
iteration/ˌɪtəˈreɪʃn/ 반복
dry run/draɪ rʌn/ dry run: 수동 추적
11.3

프로시저와 함수

Syllabus
응시자가 다음을 수행할 수 있어야 함: 참고 사항 및 가이드라인
절차(procedure) 를 정의하고 사용함
알고리즘 구성 시 절차를 사용하는 것이 적절한 위치를 설명하시오
매개변수 사용 절차는 매개변수가 없거나 하나 이상일 수 있음. 매개변수는 참조 또는 값으로 전달될 수 있음
함수(function) 를 정의하고 사용함
알고리즘 구성 시 함수를 사용하는 것이 적절한 위치를 설명하시오 함수는 식에서 사용되며, 예로 반환값이 호출을 대체함
절차 및 함수와 관련된 용어를 사용함 절차/함수 헤더, 절차/함수 인터페이스, 매개변수, 인자(argument), 반환값(return value) 포함
효율적인 가상코드를 작성함

출처: Cambridge International syllabus

구조적 프로그래밍은 각기 하나의 임무를 수행하는 작은 서브루틴(subroutines) 으로 프로그램을 구성합니다.

프로시저

프로시저는 작동을 수행하는 명명된 블록으로, 파라미터를 받을 수 있지만 값을 반환하지 않습니다.

PROCEDURE Greet(name : STRING)
    OUTPUT "Hello, ", name
ENDPROCEDURE

CALL Greet("Ada")

함수

함수는 프로시저와 유사하지만 값을 반환하며, 이返回值가 식의 일부가 됩니다.

FUNCTION Square(x : INTEGER) RETURNS INTEGER
    RETURN x * x
ENDFUNCTION

result ← Square(5) + 1     // result = 26

서브루틴이 작업을 수행할 때는 프로시저를 사용하고, 호출자에게 값을 계산해 줄 때는 함수를 사용합니다.

교과과정은 알고리즘 구성의 어디에서 각각이 적절한지를 묻습니다. 프로시저는 동일한 단계 그룹이 여러 지점에서 필요한 곳에 적합합니다(입력 검증, 메뉴 인쇄, 두 값 교체): 단계는 한 번 작성되어 이름으로 CALL됩니다. 함수는 총합, TRUE/FALSE 결과, 두 숫자 중 더 큰 수치 등 단일 값을 계산하여 식에서 사용해야 할 때 적합합니다. 이는 반환 값이 호출을 대체하기 때문입니다: IF IsValid(Code) THEN.

두 패널. 절차: Greet(Ada) 호출은 동작을 수행하고 'Hello, Ada'를 출력하며 값을 반환하지 않음. 함수: set y = Square(5)는 5 × 5 = 25를 계산하여 25를 반환하므로, 이후 y는 25을 갖음
프로시저는 작업을 수행하고 아무것도 반환하지 않으며, 함수는 식에서 사용할 값을 반환합니다

파라미터

파라미터는 서브_neighbor가 입력을 받기 위해 선언하는 변수입니다. 호출자가 제공하는 값들은 인자입니다. 두 가지 전달 방법:

  • 값 전달(pass by value) —_argv가 복사본을 얻으므로, 내부에서의 변경은 호출자에 영향을 미치지 않습니다. 읽기 전용 입력에 사용합니다.
  • 참조 전달(pass by reference) —_argv가 호출자의 변수에 대한 참조(references) 를 얻으므로, 변경사항이 callers에게 반영됩니다. 파라미터를 업데이트해야 할 때 사용합니다.
두 개의 메모리 상자 도형. 값 전달: 호출자의 변수 x = 5가 별도의 파라미터 상자 a = 5에 복사되므로, a를 변경해도 x는 5로 남음. 참조 전달: 파라미터 a는 호출자의 자체 x 상자를 가리키는 화살표이므로, a를 변경하면 x도 변경됨
값 전달은 값을 새 상자로 복사하고, 참조 전달은_argv가 호출자의 자체 변수를 변경하게 함
PROCEDURE Swap(BYREF a : INTEGER, BYREF b : INTEGER)
    DECLARE temp : INTEGER
    temp ← a
    a ← b
    b ← temp
ENDPROCEDURE

Cambridge 가짜코드(pseudocode)는 각 파라미터 앞에 헤더에 모드를 명시하며, BYVAL 또는 BYREF을 표기합니다. 어느 것도 표기되지 않으면 BYVAL이 기본값으로 간주되므로, 호출자의 변수를 변경해야 하는 routine — Swap 또는 누적 합계를 업데이트하는 프로시저 — 은 헤더에 BYREF이 필요합니다.

작업 예제. 출력은 무엇입니까?

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은 A에 대한 참조이므로, A은 8로 변합니다. Y은 B의 복사본이므로, Y을 두 배로 만들어도 B은 여전히 3에 머물러 있습니다. 출력은 8, 3입니다. 만약 헤더에 BYVAL X이라고 적었다면, A은 여전히 5이었을 것입니다.

로컬 변수 vs 글로벌 변수

로컬 변수(local variable) 는 서브루틴 내부에서 선언되며 실행 중에만 존재합니다. 글로벌 변수(global variable) 는 외부에서 선언되어 어디에서나 볼 수 있습니다. 로컬 변수와 파라미터를 선호하십시오: 글로벌 변수의 과도한 사용은 코드의 추적을 어렵게 만들고 테스트하기 불편하게 만듭니다. (이름이 보이는 영역을 그 스코프(scope) 라고 합니다.)

일행 차이: 전역 변수는 프로그램 어디에서나 접근할 수 있지만, 로컬 변수는 이를 선언한 서브_neighbor 내부에서만 접근할 수 있습니다. 로컬 변수의 장점은 scheme에서 인정합니다: 동일한 식별자를 다른 서브_neighbor에서 사용할 수 있어 충돌이 발생하지 않습니다; 값이 프로그램의 다른 부분에 의해 실수로 변경되지 않습니다; 서브_neighbor가 종료되면 메모리가 해제됩니다; 그리고 서브_neighbor가 자기 완결적이므로 개별적으로 테스트할 수 있고 다른 프로그램에서 재사용할 수 있습니다.

로컬 변수는 서브루틴이 호출될 때마다 생성되고 반환되면 파괴되므로, 한 호출에서 다음 호출으로 값을 전달할 수 없다. 반복적인 호출을 통해 문자열을 쌓아 올리는 절차에서는 해당 문자열이 글로벌(또는 BYREF으로 전달됨)이어야 한다. 만약 MyString이 글로벌에서 MyOutput() 내부에 선언된 로컬로 변경된다면, 모든 호출이 새로운 빈 MyString으로 시작하게 되어 이전 호출에 의해 추가된 텍스트가 사라지며, 절차가 "예상대로 작동하지 않게" 된다.

타임라인 상 동일한 프로시저의 세 가지 호출; 각 호출은 자체 MyString 박스(새롭고 비어 있음)를 생성하여 호출이 반환되면 사라지지만, 위쪽의 하나 전역 MyString 박스는 호출 간(value)를 유지함
로컬 변수는 매번 호출마다 새롭고 빈 상자이며, 글로벌 변수(또는 BYREF 파라미터)만이 호출 사이에서 값을 유지함
전체 범위를 나타내는 큰 바깥 상자는 글로벌 변수 Total을 포함하여 어디에서나 보이며, 더 작은 안쪽 상자는 PROCEDURE Calc로 표시된 로컬 스코프를 나타내며 로컬 변수 temp를 포함하여 Calc가 실행될 때만 존재함
글로벌 변수는 어디에서나 보이며, 로컬 변수는 오직 자신의 프로시저 내부에 존재함

서브루틴 사용 시기

다음과 같은 경우에 서브루틴을 사용하십시오:

  • 동일한 로직이 여러 곳에 나타날 때 — 한 번 작성하고 여러 번 호출하십시오.
  • 블록이 명확한 명명된 목적을 가질 때 — 이름이 무엇을 하는지를 문서화합니다.
  • 프로그램이 복잡할 때 — 부분으로 나누십시오 (분해(decomposition)).
  • 특정 부분을 독립적으로 테스트하고 싶을 때.

호출 비용이 내부 작업보다 더 크도록 너무 작게 만들지 마십시오.

용어

  • 정의 definition — PROCEDURE ... ENDPROCEDURE(또는 함수) 블록.
  • call — 호출 위치. argument — 전달되는 값. parameter — 이를 받는 변수입니다.
  • 반환 값 return value — 함수가 다시 보내는 것.
  • 프로시저/함수 헤더 procedure/function header — 이름과 파라미터를 주는 첫 번째 줄 (PROCEDURE Name(params) 또는 FUNCTION Name(params) RETURNS type).
  • 절차/함수 인터페이스 / 서명 — 이름 + 매개변수 + 반환 유형: 호출자가 이를 사용하기 위해 알아야 할 내용입니다.

해설 예제. 헤더 FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN에 사용된 각 용어를 설명하십시오.

용어 의미
FUNCTION 값을 반환하는 하위 절차
Pass2 이를 호출하기 위해 사용되는 식별자
Count 매개변수: 전달된 인수를 받아들이는 식별자
INTEGER 매개변수의 데이터 타입
RETURNS BOOLEAN 함수가 반환하는 값의 데이터 타입

PROCEDURE MyProc(Count : INTEGER, Message : STRING)의 두 식별자는 파라미터입니다: 이들은 프로시저가 호출될 때 전달되는 값을 받아들이며, 내부에서 로컬 변수처럼 사용됩니다.

절차를 함수로 변환하려면: PROCEDURE를 FUNCTION로 변경하고 RETURNS <type>을 추가하며; 결과를 외부로 전달하던 OUTPUT(또는 BYREF 매개변수)를 RETURN 문장으로 교체합니다. 또한 모든 호출 지점에서 반환된 값을 사용하도록 하여, Result ← Unpack(Text) 대신 CALL Unpack(Text, Result)이 되도록 변경해야 합니다. "헤더 작성" 문제의 경우 전체 줄을 작성합니다: FUNCTION Calculate(Expression : STRING) RETURNS INTEGER. 배열 매개변수는 참조(joint reference) 방식으로 전달되므로, 배열에 값을 쓰는 절차는 호출자의 배열을 직접 변경합니다.

프로그램이 새로운 모듈을 추가할 때, 먼저 합의되는 것이 인터페이스입니다: 이름, 매개변수(수, 순서, 타입), 반환 유형, 그리고 모듈이 읽거나 Writes하는 모든 글로벌 데이터. 만료일 전 알림을 보내는 모듈은 레코드(또는 인덱스)를 매개변수로 필요로 하며 아무 것도 반환하지 않으므로 절차입니다; 메인 프로그램은 레코드마다 한 번씩 이를 호출합니다.

Paper 2용 모듈 작성

Paper 2의 절반은 "모듈 X에 대한 가짜 코드를 작성"입니다. 평가 기준은 기능당 점수를 부여하므로, 완성되지 않은 모듈도 올바른 부분마다 점수를 받습니다. 검사가 확인하는 부분:

주석 처리된 가짜 코드 함수 CountAbove, 점수를 얻는 각 부분에 대한 표시: 매개변수와 반환 유types인 헤더, 로컬 선언문, 루프 시작 전 초기화된 총합, 모든 요소를 순환하는 FOR 루프, 올바른 경계를 가진 IF 조건문, IF 내부 업데이트, 닫힌 구조, 루프 이후 RETURN
모듈 답안의 각 부분은 독립적인 점수를 가지므로, 한 부분이 불확실하더라도 모두 작성하십시오
  1. 헤더: 질문에서 설명한 대로: PROCEDURE Name(Param : TYPE) 또는 FUNCTION Name(Param : TYPE) RETURNS TYPE, routine이 인수를 Must change해야 하는 곳에 BYREF.
  2. 로컬 선언문: DECLARE 모든 로컬 변수와 그 타입, 카운터와 총합을 초기화 (Count ← 0).
  3. 모든 요소를 방문하는 루프: 크기가 주어진 배열에는 FOR Index ← 1 TO 50; 파일에는 WHILE NOT EOF(...).
  4. 조건문: 올바른 비교와 경계, 올바른 항목에 대해: IF Score[Index] > Limit THEN.
  5. 브랜치 내부 업데이트: 카운터 증가, 값 저장, 또는 메시지 출력.
  6. 마무리: 함수에서는 루프 후 한 번 RETURN; ENDFUNCTION 또는 ENDPROCEDURE; 그리고 모든 IF, FOR 및 WHILE를 닫음.

작업 예제. 전역 배열 Score : ARRAY[1:50] OF INTEGER가 시험 점수를 저장하고 있습니다. 점수가 Limit보다 많은 개수를 반환하는 함수 CountAbove(Limit : INTEGER)를 작성하십시오.

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

점수: 매개변수와 RETURNS INTEGER가 있는 헤더; declared되고 0로 설정된 Count; 모든 50개의 요소를 순회하는 루프; 비교문 > Limit (>=이 아님); IF 내부에서 카운터 업데이트; 루프 후 RETURN Count. 메인 프로그램은 표현식이나 출력에서 반환값을 사용합니다: OUTPUT "Above 70: ", CountAbove(70).

해설 예제. Code가 대문자 두 개 뒤에 숫자 네 개를 따르는 양식 AB1234일 때 TRUE를 반환하고 그렇지 않을 때는 FALSE를 반환하는 함수 IsValid(Code : STRING)를 작성하십시오.

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

길이 검증이 먼저 이루어지므로, MID는 존재하지 않는 위치를 요청받지 않습니다. 이러한 검증은 호출자가 IF IsValid(Entry) THEN ... ELSE OUTPUT "Invalid code" ENDIF를 Writes할 수 있도록 BOOLEAN를 반환합니다: 사용자에게 보낼 메시지는 호출자가 Output하며, 함수는 계산하고 절차는 Action을 수행합니다.

해설 예제. Word가 뒤집었을 때 똑같이 읽히는 경우, 예를 들어 "RACECAR"과 같이, TRUE를 반환하는 함수 IsPalindrome(Word : STRING)를 작성하십시오.

두 끝에서 문자를 비교하며 안쪽으로 이동합니다: 위치 Index는 위치 Len - Index + 1와 짝을 이루며, 첫 번째 반쪽만 테스트하면 됩니다.

단어 RACECAR가 7개의 번호 매긴 상자에; 화살표가 위치 1을 7, 2를 6, 3을 5와 짝을 이룹니다. 위치 i와 위치 Len minus i plus 1로 표기됨; 중간 문자는 짝이 없음
Palindrome 체크는 위치 i와 위치 Len - i + 1를 짝을 이루고 중간에서 멈춥니다
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

동일한 세 가지 도구 — 위치를 순회하는 FOR, 한 문자를 읽는 MID(s, i, 1), 새로운 문자열을 만드는 & — 는 Exam Paper 2의 대부분의 문자열 모듈 문제를 해결합니다: 특정 문자가 나타나는 횟수 세기(IF MID(s, i, 1) = Ch THEN Count ← Count + 1), 모든 instances의 문자 교체(각 위치마다 NewChar 또는 원본 문자를 NewString에 추가), 카드 번호의 마지막 4자리 외 숨기기(Len - 4까지의 모든 위치마다 '*'를 추가), 또는 Start부터 Start + Length - 1까지의 문자들을 결합하여 자체적으로 MID()를 작성하기. MID에 문자열의 끝을 초과하는 위치를 요청하면 런타임 오류가 발생하므로, 먼저 LENGTH를 확인해야 합니다.

파일. 변수의 값은 프로그램 종료 시 사라지므로, 다음 실행 시 데이터를 유지해야 하는 모듈은 파일을 Write합니다: OPENFILE "scores.txt" FOR WRITE, 루프 내에서 매 WRITEFILE "scores.txt", NUM_TO_STR(Score[Index]) 라인당, 그리고 루프 후 한 번 CLOSEFILE "scores.txt"; 다시 Reads하는 것은 FOR READ, READFILE 및 WHILE NOT EOF("scores.txt")를 사용합니다. Topic 10에는 완전한 파일 섹션이 있습니다; 여기서는 올바른 모드 Open, 루프 내 Reads 또는 Writes, 그리고 루프 후 한 번 Close에 대한 점수가 주어집니다.

탐색하기

콜 스택: 호출 시 push, 반환 시 pop

서브루틴을 호출하면 새로운 프레임이 상단에 적재되며, 리턴할 때 해당 프레임을 제거하고 값을 호출자에게 반환합니다. 현재 실행 중인 호출은 항상 최상단 프레임입니다.

English 한국어
procedure/prəˈsiːdʒə/ 절차
structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ structured programming: 구조화 프로그래밍
subroutines/ˈsʌbruːtiːnz/ 서브루틴
return value/rɪˈtɜːn ˈvæljuː/ 반환 값
arguments/ˈɑːɡjuːmənts/ arguments: 실제 인자
pass by value/pæs baɪ ˈvæljuː/ 값 전달
pass by reference/pæs baɪ ˈrefrəns/ 참조 전달
global variable/ˈɡləʊbl ˈveərɪəbl/ 전역 변수
local variable/ˈləʊkl ˈveərɪəbl/ 로컬 변수
scope/skəʊp/ 범위
decomposition/ˌdiːkɒmpəˈzɪʃn/ 분해
signature/ˈsɪɡnɪtʃə/ signature: 서명
format/ˈfɔːmæt/ 포맷
Validation/ˌvælɪˈdeɪʃn/ 검증
run-time error/rʌn taɪm ˈerə/ 실행 중 오류
수업 보기
11.3

효율적인 가짜 코드 작성

"세 가지 특징을 나열하라"는 질문에 대한 답으로, 가상어法를 이해하기 쉽게 만드는 세 가지 특징은 의미 있는 식별자(Total, t가 아님), 각 구조체 내부의 문장을 들여쓰기하는 것, 그리고 목적을 설명하는 주석(// ...)입니다. 대문자로 표기된 키워드, 줄마다 하나의 문장, 섹션 사이의 빈 줄도 허용됩니다. 효율적인 가사어法는 다음과 같이 더 발전합니다:

  • 루프 바깥으로 불변량(invariant) 이동 — 루프 카운터와 관계없이 변하지 않는 값(불변량)은 루프 실행 전에 한 번만 계산합니다.
  • 조기 종료 — 정답을 찾았을 때 루프를 즉시 종료합니다(타겟이 나타나는 즉시 선형 탐색(linear search) 을 멈춥니다).
  • 중복 작업 방지 — 결과를 저장하여 다시 계산하지 않고 재사용합니다.
  • 적절한 데이터 구조 선택 — 항목들이 함께 묶여 있다면 여러 개의 개별 변수보다 배열(array)이 유리합니다.
  • deep nested IF를 CASE로 교체 — 한 값을 여러 조건에서 테스트할 때 사용합니다.
  • 의도를 주석으로 남기기 — 메커니즘(// validate the postcode)이 아닌 의도(// loop 6 times)를 설명합니다.
  • 의미 있는 이름 사용 (numberOfPupils, n이 아님) 및 사용 전에 변수 초기화.
변하지 않는 작업을 루프 바깥으로 이동하여 매 반복마다가 아닌 한 번만 실행되도록 함
변하지 않는 작업을 루프 바깥으로 이동하여 한 번만 실행되도록 함
English 한국어
nested/ˈnestɪd/ nested: 중첩된
logic error/ˈlɒdʒɪk ˈerə/ logic error: 논리 오류
invariant/ɪnˈveərɪənt/ 불변량
linear search/ˈlɪnɪə sɜːtʃ/ 선형 탐색
syntax error/ˈsɪntæks ˈerə/ 문법 오류
11.3

테스트 및 오류

세 가지 종류의 오류가 있으며, 각각 다른 방식으로 발견됩니다:

오류 정의 예시 발견 방법
구문 오류 언어 규칙을 위반하는 문장 ENDIF이 누락됨; OUTPT "Hi" 프로그램 실행 전, 번역기
실행 중 오류 프로그램은 실행되지만 특정 문장을 수행할 수 없음 0으로 나누기; 배열 인덱스 0 또는 51; 유효하지 않은 매개변수로 함수 호출; 루프가 끝나지 않아 프로그램이 "멈춤(freeze)"됨 실행 중: 프로그램이 중단되거나 갇힘(hang)
논리 오류 프로그램은 끝까지 실행되지만 출력이 틀림 >이 필요했던 곳에 >=; 합계가 0로 설정되지 않음 추론 표(trace table)와 선택된 테스트 데이터로 검증

IDE는 마지막 두 오류를 찾는 데 도움이 됩니다: 브레이크포인트(breakpoint) 은 지정된 라인에서 프로그램을 일시정지하고, 단일 스텝(single stepping) 은 문장을 하나씩 순차적으로 실행하며, 리포트(또는 감시) 창은 해당 시점의 각 변수 값을 표시하므로 값이 잘못된 라인을 직접 확인할 수 있습니다. 테스트 방법과 테스트 데이터는 주제 12에 있습니다.

English 한국어
trace table/treɪs ˈteɪbl/ trace table: 추적 표
breakpoint/ˈbreɪkpɔɪnt/ 브레이크 포인트
single stepping/ˈsɪŋɡl ˈstepɪŋ/ 단위 실행
11.3

출제자가 인정하는 정의

정의형 질문은 고정된 용어에 따라 채점됩니다. 이를 정확히 암기하십시오.

용어 정의
프로시저(procedure) 과제를 수행하는 단계의 서열을 실행하지만 값을 반환하지 않는 하위程序(subroutine); CALL로 호출함
함수(function) 호출된 지점으로 단일 값을 반환하므로 식(expression) 내에서 사용할 수 있는 하위程序(subroutine)
매개변수 서브루틴 호출 시 값을 받거나 주소를 전달받는 서브루틴 헤더 내 식별자
인자(argument) 호출 시 제공되는 값(또는 변수)으로, 매개변수와 대응됨
value 전달(passing by value) 인자의 값 사본을 하위程序(subroutine)에 전달하므로 내부에서의 변경은 원본 변수에 영향을 주지 않음
reference 전달(passing by reference) 변수의 주소가 하위程序(subroutine)에 전달되므로 내부에서의 변경이 원본 변수에도 반영됨
헤더(header) 하위程序(subroutine) 정의의 첫 번째 줄: 이름, 매개변수, 그리고 함수인 경우 반환 타입
인터페이스(interface) 하위程序(subroutine)를 사용하기 위해 호출 프로그램이 알아야 하는 내용: 이름, 매개변수(수, 순서, 타입), 반환 타입
반환 값(return value) 함수가 호출한 식에 다시 전달하는 값
로컬 변수(local variable) 하위程序(subroutine) 내부에서 선언됨; 하위程序(subroutine)가 실행되는 동안에만 존재하며 내부에서만 사용 가능
글로벌 변수(global variable) 모든 하위程序(subroutine) 외부에서 선언됨; 프로그램 내 어디에서나 사용 가능
카운트 제어 루프(count-controlled loop) 고정된 횟수만큼 반복되며, 카운터(FOR ... NEXT)에 의해 제어됨
전제 조건 루프(pre-condition loop) 각 반복 시작 전에 조건을 검사하므로 본체가 절대 실행되지 않을 수 있음 (WHILE ... ENDWHILE)
후방 조건 루프(post-condition loop) 각 반복 완료 후에 조건을 검사하므로 본체가 최소 한 번은 실행됨 (REPEAT ... UNTIL)
상수(constant) 프로그램 실행 중 변경할 수 없는 명명된 값
하위程序(subroutine) 과제를 수행하는 자체 독립적인 코드 블록으로, 이름으로 호출됨: 프로시저 또는 함수
라이브러리 routine 이미 작성되고 테스트되어 프로그램에서 호출할 수 있는 하위程序(subroutine)
English 한국어
count-controlled loop/kaʊnt kənˈtrəʊld luːp/ 카운트 제어 반복문
pre-condition loop/priː kənˈdɪʃn luːp/ 전제 조건 반복문
post-condition loop/pəʊst kənˈdɪʃn luːp/ 후위 조건 반복문
11.3

시험 팁

  • 프로시저(반환 값 없음)와 함수(값 반환)를 구분하고, value 전달 vs reference 전달을 숙지해야 합니다.
  • 적절한 루프 선택: 반복 횟수가 알려졌을 때는 카운트 제어(FOR), 그렇지 않을 때는 조건 제어(WHILE/REPEAT) 를 사용하십시오.
  • 로컬 vs 글로벌 변수와 스코프(scope)를 구분하고, 재사용 가능한 모듈에서는 로컬 변수를 선호하십시오.
  • 삽입(insert)의 정확한 routine명과 매개변수 순서를 사용하십시오. VAL와 STR는 IGCSE 용어이며 채점이 안 되며, UCASE와 LCASE는 Pseudocode Guide의 실제 9618 routine이지만 한 문자(one character) 에만 작용하므로 Paper 2에서는 전체 문자열에 TO_UPPER 또는 TO_LOWER가 필요합니다.
  • "가변식 작성(write pseudocode)" 문제의 답안에는 헤더, 선언, 루프, 조건, 업데이트, 그리고 RETURN이 각각 1점을 부여받습니다: 한 부분이 확실치 않더라도 여섯 부분 모두 작성하십시오.

흔한 실수

  • 함수를 호출하고 반환된 값을 사용하지 않음. 결과를 할당하거나 식(output)이나 출력(output)에서 사용하십시오: Sorted ← BubbleSort(MyArray, 7).
  • 길이 1을 넘겨줌: 7개의 요소가 있는 배열에 대해 6, 혹은 길이를 요청했을 때 마지막 인덱스. 매개변수가 길이인지 인덱인지 결정하고, 마지막 요소가 방문되었는지 확인하십시오.
  • 파일을 읽는 루프 내부에서 파일을 닫음. 한 번 열고, 루프 이후에 한 번 닫으십시오.
  • 입력값을 파일명으로 직접 사용함. 문제가 제시한 확장자를 추가하십시오: FileName ← Choice & ".txt".
  • 구조체(construct)를 열려 있게 두는 것. 모든 IF에는 그 ENDIF이 필요하고, 모든 FOR에는 그 NEXT이 필요하며, 모든 WHILE에는 그 ENDWHILE이 필요하고, 모든 함수에는 그 RETURN이 필요합니다; 이 방식은 이에 대한 채점이 있습니다.
  • 경계 조건 오류: "최소(at least)"를 의미하는 >(이는 >=에 해당) 또는, [1:50]로 선언된 배열에 대해 0에서 시작하는 FOR 사용.
  • A counter or total that is never set to 0 before the loop.
  • 추적 표(trace table)에서 매 행에 모든 변수를 다시 적거나, 값을 변경하는 문장이 실행되기 전에 값을 변경하는 것입니다.
  • 조건식(conditional)의 절반만 사용하는 것: IF x = 3 OR 4 — OR과 AND의 양쪽 모두 완전한 비교여야 합니다. 그리고 +은 문자열을 연결하지 않으며, &가 연결합니다.
  • 호출 간에 존재해야 할 값을 로컬로 선언하는 것. 누적 합계나 여러 호출에 걸쳐 구축되는 문자열은 글로벌이거나 BYREF이어야 합니다.
English 한국어
insert/ˈɪnsɜːt/ insert: 삽입
parameters/pəˈræmɪtəz/ parameters: 매개변수
program library/ˈprəʊɡræm ˈlaɪbrəri/ 프로그램 라이브러리

이 주제에 대한 인터랙티브 수업

즉시 체크 기능 exercises를 통해 단계별로 진행하세요.

과거 시험지

A-Level 컴퓨터 과학 내 추가 주제

로그인 또는 계정 만들기

IGCSE, A-Level & AP