본문 바로가기
Topos Uranos

요약

이 수업은 강좌의 5단원, 곧 함수를 다루는 단원을 연다. 단원이 무엇을 위한 것인지 설명한다. 문제를 이름 붙은 부분들로 분해하되 각 부분에 인터페이스와 계약을 주는 법과, 어떤 문제들을 그 자신의 더 작은 사례로 환원하여 푸는 법, 곧 재귀를 가르치는 것이다. 단원의 네 수업과 그것들을 잇는 실을 소개한다. 단원이 이미 안다고 전제하는 것, 특히 4단원의 반복문과 그 불변식을 되짚는다. 단원이 해결하는 문제를 제시한다. 같은 계산을 복사해서 되풀이하다가 복사할 때의 부주의 때문에, 컴파일러가 아무 말도 하지 않는 가운데 틀린 답을 내는 프로그램의 문제이다. 단원이 각 부분을 명세하는 형식으로서 계약(사전 조건과 사후 조건)을 미리 소개한다. 그리고 단원이 뒤의 단원들과 C++ 프로그래밍 II 강좌에서 어디로 이어지는지 보여 준다.

학습 목표

  1. 단원의 내용 순서를 설명하고, 각 수업이 뒤이은 수업에 무엇을 보태는지 설명한다.
  2. 4단원의 알고리즘(반복문의 추적, 그 불변식과 변량)을 떠올리고, 필요하면 복습한다.
  3. 예를 통해 계약이라는 생각을 미리 익힌다. 프로그램의 한 부분이 그것을 쓰는 쪽에 무엇을 요구하고, 그 대가로 무엇을 보장하는가이다.
  4. 단원을 마쳤을 때 할 줄 알아야 하는 것이 무엇인지 알고, 그것을 뒤의 단원들에서 배울 것과 구별한다.

입문 평가

단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 자기 평가이며 점수를 매기지 않는다. 목적은 오직 학습의 방향을 잡는 데 있다. 처음 다섯 문항은 단원이 이미 안다고 전제하는 것을 확인한다. 반복문의 추적, 그 불변식, 명세의 사전 조건, 초기화에서 일어나는 값의 복사, 그리고 4단원의 한 프로그램 안에서 자기만의 입력과 출력을 가진 계산을 찾아내는 일이다. 그 뒤의 다섯 문항은 수업 순서대로 단원의 핵심 개념을 다룬다. 호출 스택, 인자의 전달, 계산과 표시의 분리, 팩토리얼의 재귀적 정의, 그리고 자기 자신을 호출하는 함수의 실행이다. 아직 맞힐 의무는 누구에게도 없으며, 그중 몇 문항에서는 “아직 모르겠다”가 정직한 답이다. 맞든 틀리든 모든 답이 요점을 설명하고 그 요점을 다루는 수업을 알려 주기 때문이다. 같은 능력은 단원 끝의 종합 수업에서 다시 측정한다.

입문 평가

단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.

  1. 문제 1이전 단원에서int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c); 코드는 무엇을 출력하는가?

  2. 문제 2이전 단원에서반복문 int total{0}; int k{1}; while (k <= n) { total += k; ++k; }에서(n≥0n \geq 0의 경우), 조건을 계산할 때마다 성립하는 관계는 무엇인가?

  3. 문제 3이전 단원에서나눗셈의 명세는 “정수 a≥0a \geq 0과 b>0b > 0이 주어졌을 때, qq와 rr을 구하라. 단, a=b⋅q+ra = b \cdot q + r이고 0≤r<b0 \leq r < b.”이다. 이 명세의 사전 조건은 무엇인가?

  4. 문제 4이전 단원에서int a{3}; int b{a}; b = 7; 코드를 실행한 뒤 a 변수의 값은 얼마인가?

  5. 문제 5이전 단원에서100보다 작은 소수를 출력하는 4.4강의 프로그램에는 후보들을 차례로 도는 반복문이 있고, 그 안에 후보의 약수를 시험하는 반복문이 또 있다. 자기만의 입력과 출력을 가진 계산으로서 이름을 붙일 만한 부분은 어디인가?

  6. 문제 6프로그램은 main 함수에서 시작한다. main 함수는 g 함수를 호출하고, g 함수는 또 다른 함수인 h 함수를 호출한다. h 함수가 실행되는 동안 진행 중인 호출은 어느 것인가?

  7. 문제 7함수 int f(int x) { x = x + 1; return x; }가 있을 때, int a{3}; int b{f(a)}; std::println("{} {}", a, b); 코드는 무엇을 출력하는가?

  8. 문제 8어떤 프로그램이 날짜를 읽고 그 요일을 출력해야 한다. 계산과 표시를 분리하는 분해는 어느 것인가?

  9. 문제 9아래 정의 가운데 n!n!를 정의하는 것은 어느 것인가(모든 자연수 nn에 대해)?

  10. 문제 10int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); } 함수가 있을 때, std::println("{}", f(3)); 코드는 무엇을 출력하는가?