1. 조합회로와 순차회로의 개념과 종류를 나열하고 설명하시오조합 논리회로와 순차 논리회로는 둘 다 AND, OR등의 게이트들이 서로 연결해서 구현한다. 그러나 두 논리회로 차이점은 출력값이 입력 신호에만 의존하는가, 내부 상태값에도 의존하는가에 있다.조합회로는 여러개의 논리 게이트들로 이루어져 있고 이 논리 게이트들은 현재 input의 조합에 의해 output이 결정된다. 즉, 특정 시점의 출력이 그 시점의 입력에 의해서만 결정되는 회로이며, 예로는 가산기, 감산기, 비교기, 디코더, 인코더가 있다.순차회로는 조합회로와는 다르게 기억장치를 가지고 있다. 따라서 기억요소의 현재 상태와 외부의 input으로부터 output이 결정된다. 순차회로는 입력, 출력, 내부 상태의 시간에 따른 시퀀스에 의해 결정된다. 내부 상태의 시간에 따른 시퀀스는 쉽게 말해 기억요소를 갱신하는 것으로 생각하면 된다. 예로는 자판기, 전자계산기가 있으며, 기억요소의 갱신 방법에 따라 동기식 순차회로와 비동기식 순차회로로 나뉜다.동기식 순차회로는 이산시점에서 회로의 입력신호에 따라 동작을 정의하는 시스템이다. 이산시점이란 1,2,3...등 어떤 특정 시간을 의미한다. 비동기식 순차회로는 입력신호와 그들이 변하는 순서에 따라 달라진다. 둘의 가장 큰 차이점은 1개의 신호에 의해 회로가 동작하는지 아닌지의 차이이다. 음악에 맞춰 모든 사람이 춤추는 것을 동기식 순차회로라고 알아두면 편하다. 비동기식 회로는 카운터를 설계할 때 그 의미를 좀 더 정확히 알 수 있을 것이다.
2. 이진 트리, 완전 이진 트리, 포화 이진 트리를 설명하고 비교하시오.트리는 비선형 구조로서 계증적 관계를 표현하는 자료구조이다. 노드는 트리의 구성요소에 해당하는 A, B, C와 같은 요소이며, 선은 노드와 노드를 연결하는 연결선이다. 루트노드는 트리구조에서 최상위에 존재하는 노드로 그림에서는 A가 해당된다. 단말노드는 아래로 노드가 연결되 있지 않은 노드로 이진 트리 그림에서 H, I, F, G에 해당하며 내부노드는 단말노트를 제외한 모든 노드이다.이진 트리란 자식 노드가 최대 2개인 트리를 의미한다. 자식 노드가 하나도 없거나, 하나 혹은 두 개를 갖는 트리 모두 이진 트리에 속하며, 최대 차수가 2이기 때문에 이진 트리는 왼쪽 서브 트리와 오른쪽 서브 트리를 구분한다. 이진 트리는 완전 이진 트리와 편향 이진 트리로 구분된다.완전 이진 트리란 높이가 H일 때, 레벨1부터 h-1까지 모든 노드가 두 개씩 채워져 있고 왼쪽부터 노드가 채워져 있는 트리를 의미한다.
1. 함수의 매개변수 전달방식인 값호출 방식과 참조호출 방식을 설명하고 비교하시오.값호출 방식(Call by value)이란 이름 그대로 함수를 호출할 때 값으로 호출하는 것을 말한다.함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. 함수가 종료되면 해당 공간은 사라진다. C++의 경우 스택 프레임을 의미하며, 스택 프레임이란 함수 호출시 할당되는 메모리 블록이다.call-by-value 값에 의한 호출방식은 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다. 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다. 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.참조에 의한 호출(call-by-reference)은 함수에서 함수 외부 메모리 공간을 참조할 때 사용하며, 함수 선언시 매개변수에 &를 사용해 변수의 위치를 받도록 하고 함수 내부에서는 위치를 준 변수를 일반 변수처럼 사용한다. 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성되며, 함수가 종료되면 해당 공간은 사라진다. 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. 따라서 함수 안에서 인자의 값이 변경되면, 아규먼트로 전달된 객체의 값도 함께 변경된다.위 그림의 1번예제에서 형식 인수 a가 대입받는 대상이 main의 실인수 i의 값이기 때문에 이런 호출 방식을 값 호출이라고 한다. a는 plusone으로 전달된 실인수의 임시 사본이라고 할 수 있는데 실인수 i와는 전혀 다른 새로운 변수이다. 함수 호출 직후에 i의 값을 대입받았으므로 일시적으로 i와 같은 값을 가지고 있을 뿐이지 i와는 아예 기억되는 메모리 공간 자체가 다르다. plusone 함수에서 a의 값을 1 증가시켰지만 main에 있는 실인수 i의 값이 바뀌는 것은 아니다. a가 i의 값을 대입받았지만 a를 어떻게 바꾸더라도 i의 값은 전혀 영향을 받지 않는다. a는 어디까지나 사본에 불과하므로 사본이 증가하든 감소하든 원본에 영향을 주지 못한다. plusone은 1증가시킨 a의 값을 리턴했고 main은 이 리턴값을 별도의 변수 j에 대입함으로써 i를 1증가시킨 결과를 취했다. 함수 호출시 전달되는 대상이 실인수 그 자체가 아니라 실인수의 값이기 때문에 이런 호출 방식을 값 호출이라고 부른다. 값 호출의 특징은 형식 인수가 함수내에서 변경되더라도 실인수에는 전혀 영향을 미치지 못한다는 것이다.2번예제는 값호출 방식의 예제와 plusref 함수의 원형이 바뀌었고 main 함수의 중간 변수 j가 없어졌다. 참조 호출은 실인수의 값을 전달하는 것이 아니라 실인수의 번지를 전달하는 방식이다. &i는 i가 들어 있는 번지인데 이 번지를 plusref 함수로 전달했다. plusref 함수는 이 번지를 a로 받아서 다음 연산을 수행한다."*a=*a+1;" 이 연산식에서 *a란 a가 가리키고 있는 번지에 들어 있는 값을 가리킨다. a가 &i를 대입받았으므로 *a는 *(&i)라고 할 수 있으며 *(&i)는 곧 실인수 i와 같다. *a를 1증가시켰으므로 이 연산식에 의해 증가되는 대상은 실인수 i이다. 즉, *a=*a+1; 연산문은 결국 i=i+1;과 같아지는 것이다. main에서 i의 번지를 넘겼고 그 번지값을 a로 받아 a가 가리키는 메모리의 값을 1 증가시켰으므로 결국 1증가된 것은 실인수 i이다. 함수 내부에서 포인터를 통해 실인수값을 직접 조작하기 때문에 결과값을 리턴할 필요가 없으며 그래서 plusref 함수는 void형이고 main에서 이 함수의 리턴값을 대입받기 위한 j가 필요없어진 것이다.
1. 컴퓨터에서 정수와 실수의 표현 방법에 대해서 설명하시오.일반적으로 사람들은 10진수를 사용하지만 컴퓨터는 2진수로 데이터를 표현한다. 정수의 표현방식은 사람의 경우 ‘3’를 표현한다고 하면 10진수 그대로 ‘3’이라고 말하지만 컴퓨터에서는‘11{}_{(2)}’으로 표현한다.정수의 가장 왼쪽에 존재하는 비트는 ‘부호비트’이다. 그리고 나머지 공간에 메모리가 채워진다. 예를 들어 3을 컴퓨터에 저장한다고 할 때, 1바이트 기준으로 부호가 +이기 때문에 부호에 0이 들어가고 나머지 공간은 오른쪽부터 채워진다.2 ^{0}부터2 ^{1}이 차례로 들어가며 각각 1과 2를 의미한다.그림 1 정수 표현 방법부호표현은 양수라면 0, 음수라면 1을 저장한다. 이 비트를 가리켜 MSB(Most Significant Bit)라고 하는데, 가장 중요한 비트라는 뜻을 지닌다. 이 비트의 설정에 따라 정수의 부호가 달라지므로 가장 중요한 비트임에 틀림이 없다. 그리고 이 비트를 제외한 나머지 비트들은 데이터의 크기를 나타낸다. 위의 경우에는 나머지 일곱 비트가 0000011{}_{(2)}이므로 크기는 3이다. 즉, MSB가 0 이고 크기가 3이므로 +3을 나타냄을 알 수 있다. (그림1)그럼 위에서 양의 정수를 나타냈듯이 음의 정수는 부호비트에 1만 취해주면 바로 음의 부호가 되는가? 이 말은 맞으면서도 틀렸다. 음의 정수 표현 방법은 총 3가지가 존재한다. 부동화 ?크기 방법(절대값), 1의 보수, 2의 보수가 있으며, 보통 2의 보수 방법을 주로 사용한다.부동화 ?크기 방법은 부호 비트를 제외한 수를 값으로 읽고, 마이너스를 붙이는 방법이다. 즉 이진수 000011{}_{(2)} = +3으로, 100011{}_{(2)} = -3으로 인식하는 것이다. 이는 표기하기 편리하고 곱셈이나 나눗셈을 할 때 매우 유리하지만, 음수의 덧셈이 양수의 뺄셈과 전혀 딴판이라는 엉뚱한 결과가 나오므로 이를 해결하기 위해 피연산자의 절대값을 서로 비교하는 등 추가적인 연산을 필요로 한다는 단점이 있다.1의 보수 방법은 비트들의 값을 반전시켜서 음수를 표현하는 방법이다. 즉 이진수 000011{}_{(2)} = +3의 비트를 모두 반전시켜 111100{}_{(2)}을 만들어 -3을 표현하는 방법이다. 1의 보수 방법에서는 2진수 연산값이 실제 값과 같다. 하지만 0을 나타내는 값이 000…00{}_{(2)}(모든 비트가 0인 수)과 111…11{}_{(2)}(모든 비트가 1인 수) 두 가지가 나오고, 덧셈 연산을 할 때 end around carry가 발생해서 1을 더해줘야 할 때가 있다는 단점이 있다.2의 보수 방법은 1의 보수 방법에 1을 더하는 방법이다. 즉 이진수 000011{}_{(2)} = +3의 비트를 모두 반전시켜 111100{}_{(2)}을 만들고, 여기에 1을 더해 111101{}_{(2)}로 -3을 표현하는 방법이다. 2의 보수 방법에서는 1의 보수 방법에서와 다르게 111…11{}_{(2)}이 의미하는 값이 -1을 의미하므로 000…00{}_{(2)} = 0과 구분된다. 다만 음의 부호를 붙일 때 1을 더해주는 연산을 해야 한다는 단점이 있다.만약 부동화 ?크기 방법(절대값)을 사용할 경우 어떤점이 잘못되었는지 살펴보면 다음과 같다.00000111{}_{(2)} [정수 +7]+ 10000111{}_{(2)} [부동화 ?크기 방법(절대값)의 -7]----------------------------------------------10001110{}_{(2)} [0이 아닌 ?14]-7의 표현이 적절했다면, 덧셈의 결과는 0이 되어야 한다. 그런데 결과가 그렇지 않다. 즉, 음수의 표현이 잘못된 것이다.주로 사용하는 2의 보수 방법으로 구할 경우, 아래 그림에서 보면 제일 먼저 각각의 비트 별로 1의 보수를 취해준다. 여기서 1의 보수는 1은 0으로, 0은 1로 바꿔주는 것이다. 그러고 나서 1을 더해 얻게 되는 11111001이 바로 ?7가 된다. (그림2)그림 2 2의 보수아래의 계산 결과를 통해 2의 보수를 취해준 값에 +7을 더해 0이 되는지를 확인할 수 있다.00000111{}_{(2)} [정수 +7]+ 11111001{}_{(2)} [정수 -7]----------------------------------------100000000{}_{(2)} [올림수는 버려져서 0]컴퓨터에서 실수를 표현하는 방식으로 '고정 소수점 방식과 '부동 소수점 방식' 두 가지가 존재한다. 명확히 해둘것은 실수는 컴퓨터상에서 완벽하게 표현할수 없다는 것이다. 정수는 자릿수가 허용하는 범위에서 모든 수를 완벽히 나타낼 수 있지만, 실수는 그 특성상 수를 완벽하게 나타낼 수 없고 대부분의 경우 오차가 생기게 된다. 종이 위에 숫자를 적어놓는다고 할 때, 종이가 충분히 크다면 백만자리 정수든 천만자리 정수든 한 글자도 빠짐없이 적는 게 가능하지만, 아무리 종이가 크다고 하더라도 유한한 크기의 종이 위에 1/3(0.*************....)을 한 글자도 빠짐없이 종이 위에 적는건 불가능한 것과 같은 이치이다.