| English | 의미 |
|---|---|
| subroutines/ˈsʌbruːtiːnz/ | 서브루틴 |
| function/ˈfʌŋkʃn/ | 함수 |
| procedure/prəˈsiːdʒə/ | 절차 |
| structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ | structured programming: 구조화 프로그래밍 |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | 분해 |
| parameters/pəˈræmɪtəz/ | parameters: 매개변수 |
| arguments/ˈɑːɡjuːmənts/ | arguments: 실제 인자 |
| signature/ˈsɪɡnɪtʃə/ | signature: 서명 |
| 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/ | 범위 |
누구나 빌려 쓸 수 있는 관례의 테이프
- 1951년까지 캠브리지의 EDSAC 팀은 파운드지 테이프에 서브루틴 라이브러리를 보관했습니다: 제곱근, 인쇄, 로그함수 등. 어떤 프로그램이라도其中之一를 읽고 호출할 수 있었습니다.
- 가장 어려운 점은 복귀하는 것이었습니다. 데이비드 휠러의 기법인 "휠러 점프"는 복귀 주소를 저장하여 서브루틴이 호출되었던 곳으로 돌아갈 수 있게 했습니다.
- 오늘 당신이 쓰는 모든 함수 호출은 동일한 일을 하며, 모든 언어의 라이브러리도 그 테이프에서 파생되었습니다.
- 이 수업은 프로시저와 함수입니다: 어떻게 정의하고, 값을进来하고 outside로 전달하며, Paper 2가 점수를 매기는 방식으로 어떻게 쓰는지를 배웁니다.
프로시저와 함수
- 구조적 프로그래밍은 작은 이름 붙여진 서브루틴으로 프로그램을 구성하며, 각각 하나의 임무를 수행합니다.
- 절차는 동작을 수행하고 값을 반환하지 않는 이름이 붙은 블록입니다:
PROCEDURE Greet(Name : STRING) … ENDPROCEDURE,CALL Greet("Ada")로 실행됩니다. - 함수는 식의 일부가 되는 값을 반환합니다:
FUNCTION Square(X : INTEGER) RETURNS INTEGER … RETURN X * X … ENDFUNCTION,Result ← Square(5) + 1로 사용됩니다.

절차는 무언가를 수행하고, 함수는 값을 다시 넘겨줍니다
콜 스택: 호출 시 push, 반환 시 pop
서브루틴을 호출하면 새로운 프레임이 상단에 적재되며, 리턴할 때 해당 프레임을 제거하고 값을 호출자에게 반환합니다. 현재 실행 중인 호출은 항상 최상단 프레임입니다.
절차와 함수의 가장 큰 차이는 함수가:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
함수는 값을 반환하여 식에 사용되며, 절차는 특정 작업 수행 후 값을 반환하지 않습니다.
함수 Square(x)는 x * x를 반환합니다. 이 호출 Square(5)의返回值는 무엇입니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
5 × 5 = 25 — 함수가 호출자에게(호출 스택에서 제거된 프레임) 반환하는 값입니다.
각자가 적절한 상황
- 여러 지점에서 동일한 단계 집합이 필요한 경우: 입력 검증, 메뉴 표시, 두 값 swapping. 단계는 한 번 작성되고 이름으로 호출됩니다.
- 단일 값을 계산하여 식에 사용해야 하는 경우: 합계,
TRUE/FALSE결과, 두 수 중 더 큰 수. 반환값은 호출을 대체합니다. - 논리가 여러 곳에 나타나거나, 블록에 명확한 이름이 붙은 목적이 있거나, 프로그램이 복잡하여 **분해(decomposition)**가 필요하거나, 특정 부분을 독립적으로 테스트하고 싶을 때 서브루틴을 사용합니다.
서브루틴을 작성해야 할 좋은 이유는:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
서브루틴은 중복을 제거하고 명료한 목적을 부여하며, 독립적으로 테스트할 수 있습니다.
매개변수, 인자 및 인터페이스
- 매개변수(parameter) 는 서브루틴이 값을受け받기 위해 선언하는 변수이며, 호출자가 제공하는 값들은 인자(argument) 입니다.
- 헤더(header) 는 첫 번째 줄:
PROCEDURE Name(Param : TYPE)또는FUNCTION Name(Param : TYPE) RETURNS TYPE. 인터페이스, 혹은 시그니처(signature) 는 이름, 순서대로 있는 매개변수와 그 타입, 그리고 반환 타입으로, 호출자가 알아야 할 모든 것입니다. - 반환값(return value) 은 함수가
RETURN와 함께 다시 전달하는 값입니다.
각 용어를 의미에 따라 매칭하시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
함수 vs 절차 = 값을 반환하느냐 여부; 값 전달 vs 참조 전달 = 복사본 또는 원본입니다.
worked example: 헤더 내 각 용어를 설명
FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.FUNCTION: 값을 반환하는 서브루틴.Pass2: 이를 호출할 때 사용하는 식별자.Count: 매개변수, 전달된 인자를 받는 식별자.INTEGER: 해당 매개변수의 데이터 타입.RETURNS BOOLEAN: 함수가 반환하는 값의 데이터 타입입니다. 5가지 부분, 각 1점씩.
FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN에서 식별자 Count는 ____입니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
파라미터는 호출자가 전달한 인수를 받아 내부에서 로컬 변수처럼 사용됩니다.
값으로 전달(pass by value)과 참조로 전달(pass by reference)
- 값으로 전달: 루틴이 복사(copy) 를 받으므로 내부에서의 변경 사항은 호출자에게 영향을 미치지 않습니다. 루틴이 읽기만 하는 입력에 사용할 때 적합합니다.
- 참조로 전달: 루틴이 호출자의 자체 변수에 대한 참조를 받으므로 변경 사항이 callers에게 도달합니다. 루틴이 인자를 업데이트해야 할 때 사용하며,
Swap와 같은 경우에 해당합니다. - Cambridge는 헤더에 각 매개변수 앞에 모드를 표기하며,
BYVAL또는BYREF을 사용합니다. 아무것도 적지 않으면BYVAL이 기본값으로 가정됩니다.

복사, 혹은 호출자의 변수에 대한 링크
worked example: 출력이 무엇인가?
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였을 것입니다.
해당worked example에서 CALL Adjust(A, B) 이후 A의 값은 무엇입니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
X는 BYREF로 전달되므로 X ← X + Y는 호출자의 A에 3을 더합니다: 5 + 3 = 8. Y는 복사본이었으므로 B는 3으로 유지됩니다.
로컬 변수와 글로벌 변수
- 로컬 변수(local variable) 는 서브루틴 내부에서 선언되어 실행 중일 때만 존재하며, 글로벌 변수(global variable) 는 외부에서 선언되어 어디에서나 볼 수 있습니다. 이름이 보이는 영역을 스cope(범위) 라고 합니다.
- 로컬 변수가 선호됩니다: 동일한 식별자가 다른 곳에서 재사용되어 충돌하지 않으며, 값이 프로그램의 다른 부분에 의해 우연히 변경되지 않으며, 반환 시 메모리가 해제되며, 서브루틴이 자체적(self-contained)이기 때문입니다.
- 로컬 변수는 매번 호출될 때마다 새로 생성되므로 호출 간에 값을 유지할 수 없습니다. 반복되는 호출에 걸쳐 문자열을 구축하는 루틴은 해당 문자열이 글로벌이거나,
BYREF로 전달되어야 합니다.

글로벌은 어디에서나 보이며, 로컬은 자신의 서브루틴 내부에서만 존재함
로컬 변수는 선언된 서브루틴 내부에서만 존재하며, 전역 변수는 프로그램 전체에서 가시성 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
변수를 로컬로 유지하면 범위(Scope)를 제한하고, 이름 충돌을 방지하며 서브루틴을 독립적으로 테스트 가능하게 합니다. 전역 변수는 가능한 피하는 것이 좋습니다.
로컬 변수 사용의 장점은 무엇입니까? 모든 해당 항목을 선택하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
로컬 변수는 매 호출 시 새로 생성되므로 호출 간에 값을 유지할 수 없습니다. 전역 변수나 BYREF 파라미터가 대신 그 역할을 수행합니다.
절차를 함수로 변환하기
- **
PROCEDURE**를 **FUNCTION**으로 변경하고 헤더에 **RETURNS <type>**를 추가하십시오. OUTPUT또는 결과를 밖으로 가져온BYREF매개변수를RETURN문장으로 교체합니다.- 반환된 값이 사용되도록 모든 호출을 변경하십시오:
Result ← Unpack(Text)instead ofCALL Unpack(Text, Result).
절차를 함수로 변환하려면 헤더를 FUNCTION with RETURNS로 변경하고, OUTPUT을 RETURN으로 교체하며, 호출 부문을 반환된 값을 사용하는 방식으로 수정합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
세 가지 변경 사항, 세 가지 점수: 헤더, RETURN, 그리고 호출 부문입니다.
worked example: Paper 2용 모듈 작성
- 전역 배열
Score : ARRAY[1:50] OF INTEGER가 시험 점수를 хранит. 함수CountAbove(Limit : INTEGER)을 작성하여 점수가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
- 평가 기준은 기능마다 1점을 부여합니다: 매개변수와 반환 타입이 있는 헤더, 로컬 선언, 루프 이전의 카운터 초기화, 모든 요소에 대한 루프, 올바른 비교가 있는 조건문, 내부의 업데이트, 닫힌 구조체, 그리고 루프 이후의 하나의
RETURN. - 완성되지 않은 모듈도 올바른 부분에 대해 점수를 부여하므로 모두 작성하십시오.

모듈 답안의 각 부분은 자체적인 점수를 갖습니다
Paper 2 모듈 답안의 구성 요소를 작성 순서에 따라 배치하십시오.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
헤더, 선언, 루프, 조건, 업데이트, 반환. 각 구성 요소는 점수이며, 다른 부분이 틀리더라도 해당 부분은 점수를 받습니다.
놓칠 수 있는 점
- 호출자의 변수를 변경해야 하는 루틴에는 헤더에
BYREF가 필요합니다; 없으면BYVAL이 기본값으로 가정되어 변경사항이 사라집니다. - 함수는 루프 이후에 하나의
RETURN와ENDFUNCTION을 가집니다. 루프 내부의RETURN는 첫 번째 요소에서 루프를 종료합니다. DECLARE모든 로컬 변수를声明하고, 카운터나 합계를 루프 전에 0으로 초기화하십시오.- "효율적인 pseudocode"는 변하지 않는 작업을 루프에서 خارج으로 이동시키고, 첫 번째 일치 지점에서 검색을 멈추며, 결과를 저장할 수 있는 호출을 반복하지 않는 것을 의미합니다.
루프를 더 효율적으로 만들기 위해 루프 카운터와 무관한 값은:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
루프 불변량을 외부로 이동시키면 매 iteration마다 동일한 값을 재계산하는 것을 방지합니다.
이해했습니다
- 절차는 동작을 수행하고
CALL됩니다; 함수는 식에서 사용되는 값을 반환합니다 - 헤더는 루틴의 이름, 타입이 있는 매개변수와 반환 타입을 명시하며, 인자는 전달되는 값들입니다
- BYVAL은 복사(intentionally misspelled as 'intentionally' but context implies copy)를 전달(기본값); BYREF는 루틴이 호출자의 변수를 변경하게 합니다
- 로컬 변수를 선호하십시오; 로컬 변수는 매번 호출될 때마다 새로 생성되고, 글로벌 변수는 값을 유지합니다
- Paper 2 모듈: 헤더, 선언, 초기화, 루프, 조건, 업데이트, 폐쇄 구조, 하나의
RETURN