**3.1 다음과 같이 2에서 6까지의 제곱 값을 표로 출력하는 프로그램 square_table.py를 작성하시오. 아래 결과와 같이 a는 2에서 6까지 증가되는 수가 있으며, n은 2의 값을 가진다. 그리고 a ** n에 해당하는 부분은 실제 값을 넣어서 2 ** 2와 같은 수식의 결과가 출력되도록 하시오.**
(힌트 : a와 n에 각각 2를 할당한 후 print(a, '$\quad$', n, '$\quad$', a ** n)을 출력해 보고, 무엇을 바꾸면 될지 생각해 보자)
a n a ** n
2 2 4
3 2 9
4 2 16
5 2 25
6 2 36
# 3.1 solution
n = 2
a = 2
print('a n a ** n')
print(a, ' ', n, ' ', a**n)
a +=1
print(a, ' ', n, ' ', a**n)
a +=1
print(a, ' ', n, ' ', a**n)
a +=1
print(a, ' ', n, ' ', a**n)
a +=1
print(a, ' ', n, ' ', a**n)
a n a ** n 2 2 4 3 2 9 4 2 16 5 2 25 6 2 36
**3.2 거듭제곱 연산자( ** )을 이용하여 어떤 수의 제곱근을 구할 수 있다. 1부터 10까지 수의 제곱근을 구해서 다음과 같이 출력하는 sqrt_table.py라는 프로그램을 작성하시오.**
(힌트 : 2의 제곱근은 2 ** 0.5 로 구할 수 있다)
2의 제곱근 = 1.4142135623730951
3의 제곱근 = 1.7320508075688772
4의 제곱근 = 2.0
5의 제곱근 = 2.23606797749979
6의 제곱근 = 2.449489742783178
7의 제곱근 = 2.6457513110645907
8의 제곱근 = 2.8284271247461903
9의 제곱근 = 3.0
10의 제곱근 = 3.1622776601683795
# 3.2 solution
print('2의 제곱근 =', 2**0.5)
print('3의 제곱근 =', 3**0.5)
print('4의 제곱근 =', 4**0.5)
print('5의 제곱근 =', 5**0.5)
print('6의 제곱근 =', 6**0.5)
print('7의 제곱근 =', 7**0.5)
print('8의 제곱근 =', 8**0.5)
print('9의 제곱근 =', 9**0.5)
print('10의 제곱근 =', 10**0.5)
2의 제곱근 = 1.4142135623730951 3의 제곱근 = 1.7320508075688772 4의 제곱근 = 2.0 5의 제곱근 = 2.23606797749979 6의 제곱근 = 2.449489742783178 7의 제곱근 = 2.6457513110645907 8의 제곱근 = 2.8284271247461903 9의 제곱근 = 3.0 10의 제곱근 = 3.1622776601683795
3.3 비트 이동 연산자를 이용하여 2의 거듭제곱 수 10개를 다음과 같이 표시하시오.
(힌트 : 2 << 1 의 결과는 4이다)
2 4 8 16 32 64 128 256 512 1024
# 3.3 solution
print(2 << 0, 2 << 1, 2 << 2, 2 << 3, 2 << 4, 2 << 5, 2 << 6, 2 << 7, 2 << 8, 2 << 9)
2 4 8 16 32 64 128 256 512 1024
3.4 사용자부터 입력받은 정수 값 n이 0에서 100의 범위 안에 있는 짝수인지 그렇지 않은지를 판단하는 코드를 작성하여 다음과 같은 결과가 나타나도록 하시오.
정수를 입력하세요 : 120
입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요? False
정수를 입력하세요 : 88
입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요? True
# 3.4 solution
num = input('정수를 입력하세요 : ')
n = int(num)
print('입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요?', (n%2 == 0) and (n >= 0) and (n <= 100))
정수를 입력하세요 : 88 입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요? True
3.5 정수 5를 이진수로 표현하면 0b101이며 6은 0b110이며 이 값은 다음과 같이 출력할 수 있다.
>>> print(bin(5))
0b101
>>> print(bin(6))
0b110
이 두 정수의 비트 단위 AND, OR, XOR 연산을 수행한 후 다음과 같이 결과를 출력하시오.
0b101 & 0b110 = 0b100
0b101 | 0b110 = 0b111
0b101 ^ 0b110 = 0b11
# 3.5 solution
print(bin(5), '&', bin(6), '=', bin(5&6))
print(bin(5), '|', bin(6), '=', bin(5|6))
print(bin(5), '^', bin(6), '=', bin(5^6))
a = bin(5)
b = bin(6)
print(f"{a} & {b} = {a & b}")
0b101 & 0b110 = 0b100 0b101 | 0b110 = 0b111 0b101 ^ 0b110 = 0b11
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-7b5e27e8712e> in <module>() 9 b = bin(6) 10 ---> 11 print(f"{a} & {b} = {a & b}") TypeError: unsupported operand type(s) for &: 'str' and 'str'
3.6 사용자로부터 2개의 정수 a와 b를 입력으로 받은 다음 a를 b로 나눈 몫과 나머지를 다음과 같이 출력하시오.
정수 a를 입력하시오 : 202
정수 b를 입력하시오 : 50
a / b의 몫 : 4
a / b의 나머지 : 2
# 3.6 solution
str_a = input('정수 a를 입력하시오 : ')
str_b = input('정수 b를 입력하시오 : ')
print('a / b의 몫 :', int(str_a)//int(str_b))
print('a / b의 나머지 :', int(str_a)%int(str_b))
정수 a를 입력하시오 : 202 정수 b를 입력하시오 : 50 a / b의 몫 : 4 a / b의 나머지 : 2
3.7 사용자로부터 세 자리 정수를 입력으로 받으시오. 이때 입력받은 정수 n에 대한 백의 자리, 십의 자리, 일의 자리 십진수 값을 다음과 같이 출력하시오.
(힌트 : // 연산자와 % 연산자를 사용하시오. 예를 들어 백의 자리는 n // 100 을 통해서 구할 수 있다)
세 자리 정수를 입력하시오 : 349
백의 자리 : 3
십의 자리 : 4
일의 자리 : 9
# 3.7 solution
n = int(input('세 자리 정수를 입력하시오 : '))
print('백의 자리 :', n//100)
print('십의 자리 :', ((n - (n//100)*100))//10)
print('일의 자리 :', (n - (n//10)*10)//1)
세 자리 정수를 입력하시오 : 349 백의 자리 : 3 십의 자리 : 4 일의 자리 : 9
**3.8 $$$$
(힌트 : // 연산자와 % 연산자를 사용하시오)
세 자리 정수를 입력하시오 : 349
9
4
3
2) 문제 1)의 결과를 참고하여 사용자로부터 입력받은 3자리 숫자를 거꾸로 만든 3자리 숫자를 출력하시오.
세 자리 정수를 입력하시오 : 349
943
# 3.8-1 solution
n = int(input('세 자리 정수를 입력하시오 : '))
n_100 = n//100
n_10 = n%(100)//10
n_1 = n%(10)
print(n_100)
print(n_10)
print(n_1)
# 3.8-2 solution
n = int(input('세 자리 정수를 입력하시오 : '))
n_100 = n//100
n_10 = n%(100)//10
n_1 = n%(10)
print(n_1*100 + n_10*10 + n_100)
세 자리 정수를 입력하시오 : 349 3 4 9 세 자리 정수를 입력하시오 : 349 943
3.9 이동 거리 구하기 : 평균 시속과 이동 시간을 입력으로 받아 다음과 같이 이 이동 시간을 시간, 분, 초 단위로 출력하고, 이동한 거리를 계산하여 출력하시오.
평균 시속(km/h)을 입력하세요 : 46.5
이동 시간(h)을 입력하세요 : 12.342
평균 시속 : 46.5 km/h
이동 시간 : 12시간 20분 31초
이동 거리 : 573.903 km
# 3.9 solution
vel = float(input('평균 시속(km/h)을 입력하세요 : '))
time = float(input('이동 시간(h)을 입력하세요 : '))
print('평균 시속 :', vel, 'km/h')
hour = int(time//1)
min = int((time%1)*60//1)
sec = int(((time%1)*60%1)*60)
print('이동 시간 :', hour, '시간', min, '분', sec, '초')
print('이동 거리 :', vel*time, 'km')
평균 시속(km/h)을 입력하세요 : 46.5 이동 시간(h)을 입력하세요 : 12.342 평균 시속 : 46.5 km/h 이동 시간 : 12 시간 20 분 31 초 이동 거리 : 573.903 km
3.10 다음과 같이 사용자로부터 두 점의 좌표 (x1, y1), (x2, y2)를 입력받아 두 점 사이의 거리를 출력하시오.
x1 좌표를 입력하시오 : 0
y1 좌표를 입력하시오 : 0
x2 좌표를 입력하시오 : 3
y2 좌표를 입력하시오 : 4
두 점의 거리: 5.0
# 3.10 solution
x1 = int(input('x1 좌표를 입력하시오 : '))
y1 = int(input('y1 좌표를 입력하시오 : '))
x2 = int(input('x2 좌표를 입력하시오 : '))
y2 = int(input('y2 좌표를 입력하시오 : '))
print('두 점의 거리 :', ((x2 - x1)**2 + (y2 - y1)**2)**0.5)
x1 좌표를 입력하시오 : 0 y1 좌표를 입력하시오 : 0 x2 좌표를 입력하시오 : 3 y2 좌표를 입력하시오 : 4 두 점의 거리 : 5.0
3.11 3.10의 일부 코드를 참고하여 직각삼각형의 빗변을 이루는 선분의 양 끝점을 나타내는 두 좌표 (x1, y1), (x2, y2)를 입력받아 직각삼각형의 면적을 구하는 프로그램을 작성하시오(참고 : 직각삼각형의 면적은 (밑변x높이)/2 로 구할 수 있다. 입력되는 좌표는 x2가 x1보다 크고, y2가 y1보다 크다). 위 문제의 결과는 다음과 같이 나타난다.
x1 좌표를 입력하시오 : 0
y1 좌표를 입력하시오 : 0
x2 좌표를 입력하시오 : 3
y2 좌표를 입력하시오 : 4
직각삼각형의 면적은 : 6.0
# 3.11 solution
x1 = int(input('x1 좌표를 입력하시오 : '))
y1 = int(input('y1 좌표를 입력하시오 : '))
x2 = int(input('x2 좌표를 입력하시오 : '))
y2 = int(input('y2 좌표를 입력하시오 : '))
print('두 점의 거리 :', (x2 - x1)*(y2 - y1)*0.5)
x1 좌표를 입력하시오 : 0 y1 좌표를 입력하시오 : 0 x2 좌표를 입력하시오 : 3 y2 좌표를 입력하시오 : 4 두 점의 거리 : 6.0
3.12 다음과 같은 공식을 참고하여 입체도형의 부피를 구하는 함수를 만드시오. 원주율 $\pi$는 3.14로 두고 원뿔, 구, 원기둥 부피의 근사값을 구하시오.
입체도형 | 입체도형의 부피 | 입력 값 |
---|---|---|
정육면체 | $s^3$ | $s$ : 모서리의 길이 |
직육면체 | $lwh$ | $w$ : 가로, $h$ : 세로, $l$ : 깊이 |
원뿔 | $\frac{1}{3}{\pi}r^2h$ | $r$ : 원뿔의 반지름, $h$ : 원뿔의 높이 |
구 | $\frac{4}{3}{\pi}r^3$ | $r$ : 구의 반지름 |
원기둥 | ${\pi}r^2h$ | $r$ : 원기둥의 반지름, $h$ : 원기둥의 높이 |
(1) 모서리의 길이가 13인 정육면체
(2) 모서리의 길이가 22인 정육면체
(3) 가로, 세로 길이가 각각 17, 25, 16인 직육면체
(4) 반지름과 높이가 각각 10, 15인 원뿔
(5) 반지름이 25인 구
(6) 반지름과 높이가 각각 10, 15인 원기둥
(7) import math를 이용하여 math.pi 값을 가져와서 (4), (5), (6)번 문제를 다시 풀어보아라.
# 3.12 solution
pi = 3.14
print('(1) 모서리의 길이가 13인 정육면체의 부피 :', 13**3)
print('(2) 모서리의 길이가 22인 정육면체의 부피 :', 22**3)
print('(3) 가로, 세로 길이가 각각 17, 25, 16인 직육면체의 부피 :', 17*25*16)
print('(4) 반지름과 높이가 각각 10, 15인 원뿔의 부피 :', pi*10**2*15/3)
print('(5) 반지름이 25인 구의 부피 :', 4*pi*25**3/3)
print('(6) 반지름과 높이가 각각 10, 15인 원기둥의 부피 :', pi*10**2*15)
import math
print('(7) import math를 이용하여 math.pi 값을 가져와서 (4), (5), (6)번 문제를 다시 풀어보아라. :', math.pi*10**2*15/3, ',', 4*math.pi*25**3/3, ',', math.pi*10**2*15)
(1) 모서리의 길이가 13인 정육면체의 부피 : 2197 (2) 모서리의 길이가 22인 정육면체의 부피 : 10648 (3) 가로, 세로 길이가 각각 17, 25, 16인 직육면체의 부피 : 6800 (4) 반지름과 높이가 각각 10, 15인 원뿔의 부피 : 1570.0 (5) 반지름이 25인 구의 부피 : 65416.666666666664 (6) 반지름과 높이가 각각 10, 15인 원기둥의 부피 : 4710.0 (7) import math를 이용하여 math.pi 값을 가져와서 (4), (5), (6)번 문제를 다시 풀어보아라. : 1570.7963267948965 , 65449.84694978735 , 4712.38898038469
**3.13 $Binary~Decimal~Conversion,~Full~Adder.$ $$$$
0과 7 사이의 정수 a를 입력하시오 : 6
0과 7 사이의 정수 b를 입력하시오 : 7
a를 2진수로 변환하면 : 1 1 0
b를 2진수로 변환하면 : 1 1 1
# 3.13-1 solution
a = int(input('0과 7 사이의 정수 a를 입력하시오 : '))
b = int(input('0과 7 사이의 정수 b를 입력하시오 : '))
a3 = a % 2
a2 = (a // 2) % 2
a1 = (a // 2) // 2
b3 = b % 2
b2 = (b // 2) % 2
b1 = (b // 2) // 2
print('\na를 2진수로 변환하면 :', a1, a2, a3)
print('b를 2진수로 변환하면 :', b1, b2, b3)
0과 7 사이의 정수 a를 입력하시오 : 6 0과 7 사이의 정수 b를 입력하시오 : 7 a를 2진수로 변환하면 : 1 1 0 b를 2진수로 변환하면 : 1 1 1
2) 2진수로 변환된 두 개의 숫자는 전가산기에 가수(addend)와 피가수(augend)로 입력되어, 합(sum)과 올림수(carry)를 출력한다. 전가산기의 구조를 참고하여, 2진수의 덧셈을 수행하는 프로그램을 작성하고 그 결과를 올림수를 포함해 나타내시오(4비트).
2진수 a와 b의 합은 다음과 같다 : 1 1 0 1
# 3.13-2 solution
s3 = (a3 ^ b3) ^ 0
c3 = (a3 & b3) | (0 & (a3 ^ b3))
s2 = (a2 ^ b2) ^ c3
c2 = (a2 & b2) | (c3 & (a2 ^ b2))
s1 = (a1 ^ b1) ^ c2
c1 = (a1 & b1) | (c2 & (a1 ^ b1))
print('\n2진수 a와 b의 합은 다음과 같다 :', c1, s1, s2, s3)
2진수 a와 b의 합은 다음과 같다 : 1 1 0 1
3) 마지막으로, 계산된 결과를 10진수로 변환해 출력하고 계산 결과가 맞는지 확인하시오.
위 결과를 10진수로 변환하면 : 13
# 3.13-3 solution
sum = c1*2**3 + s1*2**2 + s2*2**1 + s3*2**0
print('\n위 결과를 10진수로 변환하면 :',sum)
위 결과를 10진수로 변환하면 : 13