#!/usr/bin/env python
# coding: utf-8
#
# # ASE1302 - Assignment \#03
# __
ASE1302: Computer programming, Inha University.
__
# _ Jong-Han Kim (jonghank@inha.ac.kr)
_
# _ Gyubin Park (gyubin@inha.edu)
_
#
#
#
#
# ---
# **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
# ~~~
# In[ ]:
# 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)
#
#
# ---
# **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
# ~~~
# In[ ]:
# 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)
#
#
# ---
# **3.3 비트 이동 연산자를 이용하여 2의 거듭제곱 수 10개를 다음과 같이 표시하시오.**
#
# (힌트 : 2 << 1 의 결과는 4이다)
# ~~~
# 2 4 8 16 32 64 128 256 512 1024
# ~~~
# In[ ]:
# 3.3 solution
print(2 << 0, 2 << 1, 2 << 2, 2 << 3, 2 << 4, 2 << 5, 2 << 6, 2 << 7, 2 << 8, 2 << 9)
#
#
# ---
# **3.4 사용자부터 입력받은 정수 값 n이 0에서 100의 범위 안에 있는 짝수인지 그렇지 않은지를 판단하는 코드를 작성하여 다음과 같은 결과가 나타나도록 하시오.**
# ~~~
# 정수를 입력하세요 : 120
# 입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요? False
# 정수를 입력하세요 : 88
# 입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요? True
# ~~~
# In[ ]:
# 3.4 solution
num = input('정수를 입력하세요 : ')
n = int(num)
print('입력된 정수는 0에서 100의 범위 안에 있는 짝수인가요?', (n%2 == 0) and (n >= 0) and (n <= 100))
#
#
# ---
# **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
# ~~~
# In[ ]:
# 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}")
#
#
# ---
# **3.6 사용자로부터 2개의 정수 a와 b를 입력으로 받은 다음 a를 b로 나눈 몫과 나머지를 다음과 같이 출력하시오.**
# ~~~
# 정수 a를 입력하시오 : 202
# 정수 b를 입력하시오 : 50
# a / b의 몫 : 4
# a / b의 나머지 : 2
# ~~~
# In[ ]:
# 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))
#
#
# ---
# **3.7 사용자로부터 세 자리 정수를 입력으로 받으시오. 이때 입력받은 정수 n에 대한 백의 자리, 십의 자리, 일의 자리 십진수 값을 다음과 같이 출력하시오.**
#
# (힌트 : // 연산자와 % 연산자를 사용하시오. 예를 들어 백의 자리는 n // 100 을 통해서 구할 수 있다)
# ~~~
# 세 자리 정수를 입력하시오 : 349
# 백의 자리 : 3
# 십의 자리 : 4
# 일의 자리 : 9
# ~~~
# In[ ]:
# 3.7 solution
n = int(input('세 자리 정수를 입력하시오 : '))
print('백의 자리 :', n//100)
print('십의 자리 :', ((n - (n//100)*100))//10)
print('일의 자리 :', (n - (n//10)*10)//1)
#
#
# ---
# **3.8
# $$$$
# 1) 사용자로부터 세 자리 정수를 입력으로 받으시오. 이때 입력받은 정수를 다음과 같이 역순으로 출력하시오.**
#
# (힌트 : // 연산자와 % 연산자를 사용하시오)
# ~~~
# 세 자리 정수를 입력하시오 : 349
# 9
# 4
# 3
# ~~~
# **2) 문제 1)의 결과를 참고하여 사용자로부터 입력받은 3자리 숫자를 거꾸로 만든 3자리 숫자를 출력하시오.**
# ~~~
# 세 자리 정수를 입력하시오 : 349
# 943
# ~~~
# In[ ]:
# 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)
#
#
# ---
# **3.9 이동 거리 구하기 : 평균 시속과 이동 시간을 입력으로 받아 다음과 같이 이 이동 시간을 시간, 분, 초 단위로 출력하고, 이동한 거리를 계산하여 출력하시오.**
# ~~~
# 평균 시속(km/h)을 입력하세요 : 46.5
# 이동 시간(h)을 입력하세요 : 12.342
# 평균 시속 : 46.5 km/h
# 이동 시간 : 12시간 20분 31초
# 이동 거리 : 573.903 km
# ~~~
# In[ ]:
# 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')
#
#
# ---
#
# **3.10 다음과 같이 사용자로부터 두 점의 좌표 (x1, y1), (x2, y2)를 입력받아 두 점 사이의 거리를 출력하시오.**
# ~~~
# x1 좌표를 입력하시오 : 0
# y1 좌표를 입력하시오 : 0
# x2 좌표를 입력하시오 : 3
# y2 좌표를 입력하시오 : 4
# 두 점의 거리: 5.0
# ~~~
# In[ ]:
# 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)
#
#
# ---
# **3.11 3.10의 일부 코드를 참고하여 직각삼각형의 빗변을 이루는 선분의 양 끝점을 나타내는 두 좌표 (x1, y1), (x2, y2)를 입력받아 직각삼각형의 면적을 구하는 프로그램을 작성하시오(참고 : 직각삼각형의 면적은 (밑변x높이)/2 로 구할 수 있다. 입력되는 좌표는 x2가 x1보다 크고, y2가 y1보다 크다). 위 문제의 결과는 다음과 같이 나타난다.**
# ~~~
# x1 좌표를 입력하시오 : 0
# y1 좌표를 입력하시오 : 0
# x2 좌표를 입력하시오 : 3
# y2 좌표를 입력하시오 : 4
# 직각삼각형의 면적은 : 6.0
# ~~~
# In[ ]:
# 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)
#
#
# ---
# **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)번 문제를 다시 풀어보아라.
# ~~~
# In[ ]:
# 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)
#
#
# ---
# **3.13 $Binary~Decimal~Conversion,~Full~Adder.$
# $$$$
# 1) 익히 알려진 대로, 컴퓨터는 2진법을 이용해 모든 정보를 처리한다. 그 중 덧셈 연산은 사용자로부터 입력받은 두 개의 피연산자(operand)를 2진수로 변환한 뒤 전가산기(full adder)에 집어넣어 수행할 수 있다. 본 문제에서는 3비트 컴퓨터를 고려하여, 사용자로부터 0과 7 사이의 정수 두 개를 입력받을 것이다. 먼저 사용자가 입력한 2개의 10진수 정수를 2진수로 변환하는 프로그램을 작성하시오.**
#
# 
#
# ~~~
# 0과 7 사이의 정수 a를 입력하시오 : 6
# 0과 7 사이의 정수 b를 입력하시오 : 7
#
# a를 2진수로 변환하면 : 1 1 0
# b를 2진수로 변환하면 : 1 1 1
# ~~~
# In[ ]:
# 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)
# **2) 2진수로 변환된 두 개의 숫자는 전가산기에 가수(addend)와 피가수(augend)로 입력되어, 합(sum)과 올림수(carry)를 출력한다. 전가산기의 구조를 참고하여, 2진수의 덧셈을 수행하는 프로그램을 작성하고 그 결과를 올림수를 포함해 나타내시오(4비트).**
#
# 
#
# ~~~
# 2진수 a와 b의 합은 다음과 같다 : 1 1 0 1
# ~~~
# In[ ]:
# 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)
# **3) 마지막으로, 계산된 결과를 10진수로 변환해 출력하고 계산 결과가 맞는지 확인하시오.**
#
# 
#
# ~~~
# 위 결과를 10진수로 변환하면 : 13
# ~~~
# In[ ]:
# 3.13-3 solution
sum = c1*2**3 + s1*2**2 + s2*2**1 + s3*2**0
print('\n위 결과를 10진수로 변환하면 :',sum)