1. 알고리즘(30점)
<문제>
크기가 8인 배열 T(8)에 저장된 2진수를 10진수로 변환하여 출력하는 순서도이다. <그림>의 괄호 안 내용 (1)~(5)에 가장 적합한 항목을 <답항 보기>에서 선택하여 답안지의 해당 번호 (1)~(5)에 각각 마크하시오.
<처리조건>
1. <그림>에 제시되어 있는 알고리즘과 연계하여 가장 적합한 로직으로 구현될 수 있도록 답안 선택시 유의하시오.
2. 8비트 이진수 값의 최상위 비트는 부호 비트로 0이면 양수, 1이면 음수이다. 단, 음수일 경우 2의 보수로 표현된 값
3. 8비트 이진수 값은 크기가 8인 배열 T에 T(1)부터 T(8)까지 순차적으로 저장되어 있다. 단, T(1)에 부호 비트가 저장
4. 배열 T에 저장되어 있는 값의 범위는 10진수 -127 ~ 127에 해당하는 2진수 값이라고 가정한다.
5. 함수 “ABS()”는 절대값을 구하는 함수로 정의되어 있다. 예를 들면 ABS(-5)의 값은 5가 된다.
6. 함수 “POW(a, b)”는 누승값(a의 b승)을 구하는 함수로 정의되어 있다. 예를 들면 POW(2, 3)의 값은 2의 3승이 된다.
7. “&”는 마름모 내의 조건을 모두 만족하는 경우 YES, 하나라도 만족하지 않을 경우는 NO로 정의한다.
8. 반복문 a = 1, 50, 1일 경우에 1이 초기값, 50은 최종값, 1은 증가값이 된다.
<순서도>
<답항보기>
1
|
K
|
2
|
P=0
|
3
|
H(I)=0
|
4
|
I/ST
|
5
|
HAP+T(I)
|
6
|
K=0
|
7
|
SW=0
|
8
|
H(I)=1
|
9
|
J=I
|
10
|
HAP+H(B)
|
11
|
I
|
12
|
ABS(H(I))
|
13
|
H(S)=0
|
14
|
T=1
|
15
|
T=I
|
16
|
I=0
|
17
|
YES
|
18
|
T(I)*POW(2, 8-I)
|
19
|
B/K
|
20
|
T=B
|
21
|
T(10)
|
22
|
NO
|
23
|
T(S)=T(I)
|
24
|
1-H(I)
|
25
|
T=T(I)
|
26
|
T(9)
|
27
|
SIGN
|
28
|
T(I)=B
|
29
|
(I)-B
|
30
|
T=H(B)
|
31
|
T(12)
|
32
|
P+2
|
33
|
T(I)*POW(2, I-8)
|
34
|
ABS(T(I))
|
35
|
S+T
|
36
|
T(5)
|
37
|
T+1
|
38
|
S
|
39
|
H(I)-B
|
40
|
S+B
|
<정답>
1. T(I) - B
2. ABS(H(I))
3. 1-H(I)
4. T(I)*POW(2, 8-I)
5. SIGN
<순서도>
<요약 설명>
<관련 C# 코드>
1 using System;
2
3 namespace Eip20080706
4 {
5 /// <summary>
6 /// 정보처리기사 실기 2008-07-06 기출문제
7 /// 음의 이진수를 십진수로 변환 : 최상위부호비트가 1이라면,
8 /// 2의 보수법을 사용하여 최상위부호비트를 제외한, 나머지 비트를 비트반전시킨 후 1을 더함
9 /// 또는
10 /// 그 반대로, 1을 먼저 뺀 후 비트반전
11 ///
12 /// </summary>
13 class Program
14 {
15 static void Main(string[] args)
16 {
17 //[1] Input
18 int S = 0; // 2진수의 합을 더해서 10진수 만들기
19 int K = 0; // 각 자릿수에 해당하는 10진수값 임시보관
20
21 int[] T = {1, 1, 1, 0 };
22 int B = 1;
23 int[] H = {0, 0, 0, 0 };
24 int SIGN = 1;
25
26 //[2] Process
27 if (T[0] == 0) // 양의 이진수일 때
28 {
29 SIGN = 1; // 부호를 1로 두어서 1을 곱하면 원래 그대로... 양의 정수형으로 나타남.
30 }
31 else // 음의 이진수일 때
32 {
33 SIGN = -1; // 부호를 -1로 두어서 -1을 곱하면 음수로 나타남.
34 B = 1;
35 for (int I = 3; I > 0; I--)
36 {
37 H[I] = T[I] - B; // 1을 먼저 뺀다.
38 if (T[I] == 0 && B == 1) // 최하위비트(오른쪽비트)부터 0일 경우 반올림한다.
39 {
40 B = 1; // 1을 뺄 목적으로
41 }
42 else
43 {
44 B = 0; // 그렇지 않은 경우에는 그대로 둔다.
45 }
46 H[I] = Math.Abs(H[I]);
47 }
48 for (int I = 1; I < T.Length; I++)
49 {
50 T[I] = 1 - H[I]; // 비트반전
51 }
52 }
53
54 for (int I = 3; I > 0; I--)
55 {
56 K = T[I] * (int)Math.Pow(2, 3 - I); // 각 자리수의 이진수를 십진수로 변환
57 S = S + K; // 각자리수의 10진수 합계
58 }
59
60 S = S * SIGN; // 부호를 저장함
61 //[3] Output
62 Console.WriteLine(S); // 이진수를 십진수로 변환한 값 출력
63 }
64 }
65 }
66