#!/usr/bin/env python
# coding: utf-8
#
# # ASE1302 - Assignment \#02
# __
ASE1302: Computer programming, Inha University.
__
# _ Jong-Han Kim (jonghank@inha.ac.kr)
_
# _ Ho-Young Jeon (hy13776@inha.edu)
_
#
#
#
#
# ---
# **2.1 연습문제의 첫 줄에는 100과 200의 합을 출력하기 위한 방법을 보여주고 있다. print() 함수와 + 연산을 이용하여 200, 300, 400의 합을 결과와 같이 화면에 출력해보자. 이때 print() 함수 내부에 들어갈 알맞은 값을 적으시오.**
# In[ ]:
print( 100,'+', 200, '=', 100 + 200)
# In[ ]:
# 2.1 solution
print(200, '+', 300, '+', 400, '=', 200 + 300 + 400)
#
#
# ---
# **2.2 width(너비) 변수에는 30, height(높이) 변수에는 60 값이 출력되도록 하시오.**
# ~~~
# print(width)
# print(height)
# ~~~
# In[ ]:
# 2.2 solution
width = 30
height = 60
print(f"width : {width}\nheight: {height}")
#
#
# ---
# **2.3 위의 코드에서 width와 height 변수를 두개의 줄에 걸쳐 선언하지 말고 한 줄에 할당하는 동시 할당문을 사용하여 width(너비) 변수에는 30, height(높이) 변수에는 60 값이 출력되도록 하시오.**
# In[ ]:
# 2.3 solution
width, height = 30, 60
print(f"width : {width}\nheight: {height}")
#
#
# ---
# **2.4 width와 height라는 변수에 각각 40, 20 값을 할당한 후 이 두변수를 이용하여 곱셈 연산자를 적용한 후 다음과 같이 삼각형의 면적(area)을 구하는 프로그램을 작성하시오.**
# ~~~
# 삼각형의 면적 : 400.0
# ~~~
# In[ ]:
# 2.4 solution
width, height = 40, 20
area = width*height/2
print(f"area : {area}")
#
#
# ---
# **2.5 정사각형의 면적을 구하기 위하여 사용자로부터 밑변의 길이를 정수로 입력받아서 다음과 같이 출력하시오(힌트 : 정수값 입력을 받기 위하여 int(input("정사각형의 밑변을 입력하시오 : ")) 를 사용함).**
# ~~~
# 정사각형의 밑변을 입력하시오 : 40
# 정사각형의 면적 : 1600
# ~~~
# In[ ]:
# 2.5 solution
base = int(input("정사각형의 밑변을 입력하시오 : "))
print(f"정사각형의 면적 : {base**2}")
#
#
# ---
# **2.6 섭씨(celsius)를 화씨온도(fahrenheit)로 변환하는 식은 다음과 같다.**
# > fahrenheit = (9/5) * celsius + 32
#
# **이 식을 바탕으로 섭씨온도를 0도에서 50도까지 10도 단위로 증가시키면서 이에 해당하는 화씨온도를 다음과 같이 출력하는 코드를 작성하시오.**
#
# ~~~
# 섭씨 화씨
# 0 32.0
# 10 50.0
# 20 68.0
# 30 86.0
# 40 104.0
# 50 122.0
# ~~~
# In[ ]:
# 2.6 solution
# 학생들은 for문을 안쓰고 작성해도 상관없음.
print("섭씨 화씨")
cel = 0
for i in range(6):
fah = 9/5*cel + 32
cel += 10
print(cel," ",fah)
#
#
# ---
# **2.7 앞서 다룬 섭씨온도를 화씨온도로 변환하는 식을 바탕으로 사용자로부터 섭씨온도를 입력받아서 다음과 같이 화씨온도로 출력하시오.**
# >섭씨온도를 입력하세요 : **30**
# 섭씨 **30** 도는 화씨 **86.0** 도 입니다.
#
# In[ ]:
# 2.7 solution
cel = int(input("섭씨온도를 입력하세요 : "))
fah = fah = 9/5*cel + 32
print(f"섭씨 {cel}도는 화씨 {fah}도 입니다.")
#
#
# ---
# **2.8 입력을 10으로 받아서 다음과 같이 10!의 값을 출력하는 코드를 작성하시오.**
# ~~~
# input : 10
# 10! = 3628800
# ~~~
# In[ ]:
# 2.8 solution
# 학생들은 직접 10! 값을 모두 작성해도 상관없음.
import math
num = int(input("input : "))
print(f"10! = {math.factorial(num)}")
#
#
# ---
# **2.9 사용자로부터 반지름 값을 입력받아서, 이 반지름을 가진 원의 둘레와 면적을 다음과 같이 출력하라. 이 값을 구하기 위하여 $\pi$ = 3.141592 라는 변수를 사용하시오.**
#
# > 원의 반지름을 입력하세요 : **11**
# 원의 둘레 = **69.115024**, 원의 면적 = **380.13263200000006**
# In[ ]:
# 2.9 solution
# 학생들은 pi 값을 직접 작성해도 상관없음
import math
radias = int(input("원의 반지름을 입력하세요 : "))
print(f"원의 둘레 = {2*math.pi*radias}, 원의 면적 = {math.pi*radias**2}")
#
#
# ---
#
# **2.10**
# > **f-문자열**
# 파이썬 3.6부터는 %를 사용하는 오래된 C스타일 형식화 문자열보다 더 표현력이 좋은 인터폴레이션(interpolation)을 통한 형식 문자열(짧게 f-문자열 이라고 부름)이 도입됐다. 이 새로운 언어 문법에서는 형식 문자열 앞에 f 문자를 붙여야한다. f-문자열은 형식화 식 안에서 현재 파이썬 영역에서 사용할 수 있는 모든 이름을 자유롭게 참조할 수 있도록 허용함으로써 이런 간결함을 제공한다.
# 다음 코드는 f-문자열의 간단한 예를 보여준다
#
#
#
#
#
# 참고 : 똑똑하게 코딩하는법 파이썬 코딩의기술, 길벗
#
#
# In[ ]:
apple = 4
banana = 3
cherry = 2
print(f"#1 apple의 개수: {apple}")
print(f"#2 banana의 개수: {banana}")
print(f"#3 cherry의 개수: {cherry}")
print(f"#4 과일의 총 개수: {apple+banana+cherry}")
# 위의 예제를 참고하여 과제1의 1.8에서의 모든 변수를 선언 후, 고도를 입력받아서 공기밀도를 출력하는 코드를 작성하라.
#
# ~~~
# Input1 : -
# input2 : -
# input3 : -
#
# 1km : 답1
# 2km : 답2
# 3km : 답3
# ~~~
#
# In[ ]:
# 2.10 solution
# 학생들은 함수를 사용하지 않아도 상관없음.
def cal_rho(alt):
p_0 = 101325
T_0 = 288.15
g = 9.80665
L = 0.0065
R = 8.31446
M = 0.0289652
return p_0*M/(R*T_0)*(1-L*alt/T_0)**(g*M/(R*L)-1)
alt1 = int(input("Input1 : "))
alt2 = int(input("Input2 : "))
alt3 = int(input("input3 : "))
rho1 = cal_rho(alt1)
rho2 = cal_rho(alt2)
rho3 = cal_rho(alt3)
print(f"1km : {rho1} \n2km : {rho2}\n3km : {rho3}")
#
#
# ---
# **2.11**
# >인공 신경망은 수많은 머신 러닝 방법 중 하나이다. 그중 퍼셉트론(Perceptron)은 학습이 가능한 초창기 신경망 모델로 현대적 의미로 보면 아주 원시적인 신경망일 뿐이다. 하지만, 노드, 가중치, 층과 같은 새로운 개념이 도입되었으며, 주어진 데이터가 선형 분리할 수 있다면 미분을 활용한 학습 알고리즘은 반드시 100% 정확률로 수렴한다는 정리가 증명되었다. 퍼셉트론의 구조는 아래의 그림과 같이 아주 단순하며, 퍼셉트론이 동작하는 방식은 다음과 같다. 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치보다 크면 뉴런이 활성화되고 결괏값으로 1을 출력한다. 뉴련이 활성화되지 않으면 결과값으로 -1을 출력한다. 다음 예제는 OR 논리 게이트를 분류 문제로 간주하여 만든 데이터로 퍼셉트론의 동작을 이해한다.
#
#
#
#
#
#
#
# **2차원 특징 벡터로 표현되는 샘플을 4개 가진 훈련집합** $\mathbb{X} = \left\{\mathbf{x_1}, \mathbf{x_2}. \mathbf{x_3}. \mathbf{x_4} \right\}, \mathbb{Y} = \left\{\mathbf{y_1}, \mathbf{y_2}. \mathbf{y_3}. \mathbf{y_4} \right\}$ **를 생각하자. 다음 그림은 이 데이터를 보여준다.**
#
# $\mathbf{x_1} = {x_{11} \choose x_{12}} = {0 \choose 0}, \mathbf{y_1} = -1,\quad\mathbf{x_2} = {x_{21} \choose x_{22}} = {1 \choose 0}, \mathbf{y_2} = 1$
#
# $\mathbf{x_3} = {x_{31} \choose x_{32}} = {0 \choose 1}, \mathbf{y_3} = 1,\quad\mathbf{x_4} = {x_{41} \choose x_{42}} = {1 \choose 1}, \mathbf{y_4} = 1$
#
#
#
#
#
#
# **다음 식은 위 그림을 식으로 표현 한 것이다.**
#
# \begin{equation}
# \tag{1}
# s = -0.5 + x_{n1} * 1.0 + x_{n2}*1.0,\quad \tau(s) = -1,1
# \end{equation}
#
#
# **2.11-(1) 위 샘플 4개** $x_1, x_2, x_3, x_4$ **를 하나씩 입력으로 받아서 제대로 분류하는지 확인해본다**
#
# **2.11-(2)** $\mathbb{X}$ **를 100% 정확하게 분류하는 만족하는 식 (1)의 상수를 찾아서 변경한 후, 제대로 분류하는지 확인해본다.**
#
#
#
# 참고 : 기계학습- 오일석 (한빛아카데미)
#
# In[ ]:
# 2.10 solution
# 활성함수는 생략함.
# 학생들은 함수를 사용하지않아도 상관없음.
def or_gate(x1, x2):
s = -0.5 + x1*1 + x2*1
return s
def or_gate2(x1, x2):
s = -0.2 + x1*0.5 + x2*1
return s
x_11 ,x_12 = 0, 0
x_21, x_22 = 1, 0
x_31, x_32 = 0, 1
x_41, x_42 = 1, 1
s1 = or_gate(x_11,x_12)
s2 = or_gate(x_21, x_22)
s3 = or_gate(x_31, x_32)
s4 = or_gate(x_41, x_42)
print("2.11-(1) : ", s1, s2, s3, s4)
s1_2 = or_gate2(x_11,x_12)
s2_2 = or_gate2(x_21, x_22)
s3_2 = or_gate2(x_31, x_32)
s4_2 = or_gate2(x_41, x_42)
print("2.11-(2) : ", s1_2, s2_2, s3_2, s4_2)
# In[ ]: