요약
이 수업은 제어 흐름을 다루는, 강좌의 네 번째 단원을 연다. 수업은 단원의 목적을 설명한다. 곧, 프로그램의 문이 실행되는 순서를 조건문과 반복문으로 다스리고, 그 올바름에 대해 추론하는 법, 다시 말해 모든 경우가 처리되고, 모든 반복문이 해야 할 일을 하며, 끝내 종료하도록 보장하는 법을 가르치는 것이다. 또 단원의 네 수업과 그 수업들을 잇는 실을 소개하고, 단원이 이미 안다고 전제하는 것, 특히 세 번째 단원의 복합 조건을 되짚는다. 그리고 단원이 해결하는 문제, 곧 정해진 수의 단계로 최대공약수를 계산하여 데이터에 따라 틀린 답을 내거나 0으로 나누기에서 멈추어 버리는 프로그램의 문제를 제시한다. 불변식을 단원이 반복문을 정당화할 때 쓸 도구로 미리 소개하고, 끝으로 단원이 뒤의 단원들과 C++ 프로그래밍 II 강좌에서 어디로 이어지는지 보여 준다.
학습 목표
- 단원 내용의 순서를 기술하고, 각 수업이 바로 뒤에 오는 수업에 무엇을 보태는지 설명한다.
- 세 번째 단원의 복합 조건(논리 연결사, 단락 평가, 드모르간 법칙에 의한 부정)을 떠올리고, 필요하면 복습한다.
- 예를 통해, 추론의 도구로서의 불변식을 미리 접한다. 불변식이란 반복이 보존하고, 반복이 끝났을 때 결과를 주는 변수들 사이의 관계이다.
- 단원을 마쳤을 때 할 줄 알아야 하는 것을 알아보고, 그것을 뒤의 단원들에서 배울 것과 구별한다.
입문 평가
단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 자기 평가이며 점수를 매기지 않는다. 목적은 오직 학습의 방향을 잡는 데 있다. 처음 네 문항은 단원이 이미 안다고 전제하는 것을 확인한다. 복합 조건의 부정, 단락 평가, 1.1강에 나온 반복의 추적, 그리고 int 타입의 한계이다. 그 뒤의 일곱 문항은 수업 순서대로 단원의 핵심 개념을 다루며, 그중 몇 문항은 학교 수학에서 출발한다. 최대공약수, 합의 기호, 절차의 종료성이다. 아직 맞힐 의무는 누구에게도 없으며, 그중 몇 문항에서는 “아직 모르겠다”가 정직한 답이다. 맞든 틀리든 모든 답이 요점을 설명하고 그 요점을 다루는 수업을 알려 주기 때문이다. 같은 능력은 단원 끝의 종합 수업에서 다시 측정한다.
단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.
문제 1이전 단원에서
1 <= n && n <= 10조건의 부정은 무엇인가?각 부분을 부정했지만 논리곱을 그대로 두었다. 드모르간 법칙을 잊은 것이다. 게다가 1보다 작으면서 10보다 큰 수는 없으므로, 이 조건은 언제나 거짓이다.연결사는 올바르게 바꾸었지만 관계를 잘못 부정했다. 원래 조건을 만족하는 경계 1과 10까지 쓸데없이 제외한다.첫 번째 부분만 부정했다.드모르간 법칙에 따라 논리곱의 부정은 각 부정의 논리합이며,1 <= n식의 부정은n <= 1식이 아니라n < 1식이다. 단원은 연쇄 조건문마다 이것을 필요로 한다.else가지는 앞선 조건들의 부정을 정확히 처리하기 때문이다. 또 반복문마다 필요로 한다. 빠져나올 때 성립하는 것은 그 조건의 부정이기 때문이다.복습: 관계와 논리
문제 2이전 단원에서
int d{0};선언과int n{5};선언이 있을 때,d != 0 && n / d > 2식을 계산하면 무슨 일이 일어나는가?단락 평가를 무시했다. 나눗셈은 아예 계산되지 않는다.거짓인 피연산자가 있는 논리곱이 참이 될 수는 없다.식은 올바르다. 컴파일러는 실행 시점의d변수의 값을 알지 못한다.첫 번째 피연산자가 거짓이므로 단락 평가는 두 번째를 계산하지 않는다. 왼쪽의 보초가 나눗셈을 지킨다. 단원은 이 보초를 명시적인 조건문으로, 그리고 본문을 지키는 반복문 조건으로 바꾼다.복습: 관계와 논리
문제 3이전 단원에서1.1강의 뺄셈을 거듭하는 나눗셈은 , 에서 시작하여 “인 동안, 의 값을 에서 빼고 에 1을 더한다”를 되풀이한다. , 일 때 반복의 본문은 몇 번 실행되는가?
조건의 계산 횟수를 센 것이다. 이것은 회차 수보다 하나 많다.에서 반복을 멈추었다. 조건을 조건으로 읽은 것이다.회차 수를 의 초깃값과 혼동했다.추적하면 의 값이 나온다. 본문은 네 번 실행되고 조건은 다섯 번 계산되는데, 마지막 계산이 바로 거짓이 되는 계산이기 때문이다. 4.2강은 이 반복을 C++로 쓰고 추적을 표로 바꾼다.복습: 문제에서 알고리즘으로
문제 4이전 단원에서32비트
int타입에서,46341 * 46341식의 값에 대해 표준은 무엇을 보장하는가?자료형의 범위를 무시했다. 이 수는int타입에 들어가지 않는다.오버플로가 경계에서 멈춘다고 생각했다. 표준은 아무것도 약속하지 않는다.결과의 자료형을 정하는 것은 결과의 값이 아니라int타입인 피연산자들이다.최댓값은 이다. 단원은 이 곱을 아무도 찾지 않는 곳에서 만난다. 약수를 시험하는 반복문의d * d <= n조건인데, 이 조건은 바로 의 값이 최댓값에 가까울 때 오버플로가 난다.복습: 정수와 그 표현
문제 5어떤 프로그램에 이런 연쇄 조건문이 있다고 하자. “합격”을 출력하는
if (score >= 50)가지, “우수”를 출력하는else if (score >= 90)가지, 그리고 “불합격”을 출력하는else가지이다.score변수가 95일 때 무엇을 출력하는가?가장 까다로운 조건이 이긴다고 생각했다. 이기는 것은 처음으로 만족되는 조건이다.참인 가지가 모두 실행된다고 생각했다. 연쇄에서는 하나만 실행된다.정직한 답이다. 4.1강에서 설명하며, 마무리 평가에서 연쇄의 경계를 다시 다룬다.연쇄에서는 조건이 참인 첫 번째 가지가 실행되며, 의 관계가 성립한다. “우수” 가지는 결코 실행되지 않는다. 그 실제 경우는 이고 인 경우인데, 이것은 공집합이다. 4.1강은 각 가지의 실제 경우를 읽고 조건을 배열하는 법을 가르친다.복습: 조건문
문제 6아래 식 가운데 의 합을 나타내는 것은 어느 것인가?
번에 걸쳐 수 을 더하므로 의 값이 된다. 항과 위끝을 혼동했다.의 합을 구한다. 범위를 밀어 마지막 항을 잃었으며, 반복문의 하나 차이 오류이다.위끝이 첨자 자신일 수는 없다. 이 식은 의미가 없다.첨자 의 값은 1부터 까지의 정수를 거치며, 각 항은 자신이다. 누적하는for반복문은 이 기호를 그대로 옮긴 것이다. 제어 변수가 첨자이고, 그 범위가 합의 범위이며, 본문이 항을 더한다.복습: 반복문
문제 7
int total{0};선언이 있을 때,for (int i{0}; i < 5; ++i) { total += i; }반복문 뒤에std::println("{}", total);문은 무엇을 출력하는가?i변수가 5에 이른다고 생각했다.<연산자를<=연산자로 읽은 것이다.누산기와 카운터를 혼동했다. 5는 회차 수이지 합이 아니다.정직한 답이다. 4.2강에서for문의 형태와 그 회차를 세는 법을 배운다.i변수는 0, 1, 2, 3, 4의 값을 차례로 가지며, 의 값이 된다.i변수가 5일 때 조건이 거짓이 되어 본문은 실행되지 않는다. 앞 문항의 합에서 범위를 0부터 4까지로 한 것이다.복습: 반복문
문제 8뺄셈을 거듭하는 나눗셈(, 에서 시작하여, 인 동안 의 값을 의 값으로, 의 값을 의 값으로 바꾼다)에서, 조건이 계산될 때마다 성립하는 변수들 사이의 관계는 무엇인가?
빠져나올 때만 성립한다. 반복하는 동안에는 조건이 그 반대를 보장한다.끝났을 때만 성립한다. 그 전에는 의 값이 몫보다 작다.정직한 답이다. 4.3강에서 이 관계를 찾고 확인하는 법을 배우며, 마무리 평가에서 다시 묻는다.처음에 성립한다. 이기 때문이다. 그리고 어떤 회차 앞에서 성립하면 그 뒤에도 성립한다. 이기 때문이다. 빠져나올 때 조건의 부정 의 관계가 더해지며, 둘을 합치면 결과가 나온다. 이런 관계를 불변식이라 하며, 4.3강은 이것을 반복문을 설계하고 정당화하는 방법으로 만든다.복습: 올바른 반복문 설계
문제 9어떤 절차가 임의의 정수 에서 출발하여(양수, 0, 음수 어느 것이든) “인 동안, 에서 2를 뺀다”를 되풀이한다. 모든 에 대해 종료하는가?
그것은 조건일 때 일어나는 일이다. 조건이라면 의 값이 0이나 의 값이 되는 순간 반복이 멈춘다.의 값이 음수이면 조건이 처음부터 거짓이고, 본문은 실행되지 않는다.결론은 옳지만 이유는 옳지 않다. 정수라는 것만으로는 부족하다. 그 양이 반복하는 동안 자연수이고, 게다가 감소해야 한다.양 의 값은 반복하는 동안 자연수이고(조건이 이를 보장한다) 순감소한다. 이것이 변량이며, 1.1강의 도구로서 4.3강이 모든 반복문에서 쓴다. “인 동안”이라면 답이 달라진다. 홀수인 의 값은 0을 건너뛴다.복습: 올바른 반복문 설계
문제 1084와 36의 최대공약수는 얼마인가?
공약수이기는 하지만 최대는 아니다.공약수이기는 하지만 최대는 아니다. 두 수가 마찬가지로 공유하는 인수 3이 빠져 있다.최소공배수이지 최대공약수가 아니다.공약수는 1, 2, 3, 4, 6, 12이다. 유클리드 호제법은 약수를 찾지 않고 이것을 구한다. 이고 이므로 이다. 4.4강은 이것을 반복문으로 쓰고, 왜 작동하는지 증명한다.복습: 수치 알고리즘
문제 11약수를 시험하여 101이 소수인지 판정하려면 어느 약수까지 가면 충분한가?
절반을 쓴다. 옳지만 필요한 것보다 다섯 배 길다.후보를 모두 시험한다. 옳지만 약수가 짝을 지어 나타난다는 점을 활용하지 않는다.정직한 답이다. 4.4강에서 증명한다.101에 약수 의 값이 있고 라면, 의 값도 약수이며, 둘 중 하나는 많아야 이다. 2부터 10까지 시험하면 충분하며, 어느 것도 101을 나누어떨어뜨리지 못하므로 101은 소수이다. 4.4강은 이 규칙을 증명하고, 제곱근도, 오버플로가 나는 곱도 쓰지 않고 이를 코드로 쓴다.복습: 수치 알고리즘
콘텐츠를 불러오는 중…