이 프로젝트는 학교 물리 과목의 세특을 위해 제작되었습니다. (20916 이동훈)
- 이 프로젝트는 python 3.8.10 으로 제작되었습니다.
- VScode 에디터를 이용하였습니다.
- 이 프로젝트는 세특 제출용으로 제작되었으며, 정보시간의 문제해결과 프로그래밍 단원과, 물리시간의 역학과 에너지 - 힘과 운동 단원을 활용하였습니다.
- 이 프로젝트는 파이썬이 설치외어있지 않은 곳에서도 실행할수 있도록 하기 위해서, EXE 파일로 패키징 되어 있습니다.
- 오른쪽의 release 를 확인해주세요.
문제 : 물리 교과서 45p의 11번 문제를 보던중, 이 문제의 입력값에 딱 나누어 떨어지는 값이 아닌, 복잡한 값이 주어진다면 계산이 매우 어려워질것이다.
현재상태 : 복잡한 입력값에 대한 계산이 어렵다.
목표상태 : 입력값의 복잡도와 상관없이, 계산이 가능하다.
필요한 정보 : A물체의 질량, B물체의 질량, 충돌과정에서의 힘, 힘이 작용한 시간
- 주어진 정보들을 이용하여 구하려는 값인 자동차와 트럭의 속력을 어떻게 구할수 있는가?
- 프로그램이 어떤 순서로 동작해야하는가?
- 목표상태에 도달하기 위한 가장 효율적인 방법은 무었인가?
이제 프로그램을 만들기 위한 알고리즘을 짜볼것이다.
알고리즘을 설계하기 전에, 먼저 알고리즘의 다섯가지 조건들을 알아보도록 하자!!
- 입력이 0개 이상일것
- 출력이 1개 이상일것
- 수행이 가능할것
- 명확할것
- 유한할것
다음의 조건에 맞게, 알고리즘을 설계하여 보자.
이 프로젝트 에서는 의사코드로 먼저 구성을 하고 난 뒤, 순서도를 이용하여 조금 더 자세히 설계해 볼것이다.
우선 의사코드로 설계해보도록 하자.
- 사용자에게 값들을 입력받는다. [A물체의 질량, B물체의 질량, 힘의 총량, 힘이 가해진 시간]
- I = Ft 공식을 이용해서, 총 운동량의 변화량을 구한다.
- 운동량의 변화량 = 질량 * 속도 인것을 이용하여 A, B 물체의 속도를 각각 구한다.
- 구한 값들을 출력한다.
- 다른값을 계산할지 물어본다.
- 만약 더 계산한다를 선택했다면, 처음으로 돌아가고, 아니라면 종료한다.
이제 순서도로 그려보기 전에 순서도의 기호들이 가지는 의미를 알아보자.
이제 순서도를 그려보도록 하자. 2-PLND-ANNd9mAhBQUABTwCAEtSFwASAGJtHcgA.zip
이제 코드를 짜보도록 할것이다.
우선, 위의 의사코드에서 2번에 해당하는 기능을 만들어보자.
# 인자로 F(힘의 크기)(실수형), T(힘이 작용한 시간)(실수형) 을 받아서 실수형의 값을 리턴하는 delta_momentum (운동량의 변화량) 이라는 함수를 정의합니다.
def delta_momentum(F:float, T:float)->float:
dF = F * T # 운동량의 변화량은 가해진 힘의 크기 X 힘이 가해진 시간 과 같습니다.
return dF # 계산한 값을 리턴합니다.
계산할 값이 별로 없기때문에, 코드가 간단하다.
그 다음은 의사코드에서의 3번을 구현해보자.
def calc_velocity(A: float, B: float, dF: float) -> Tuple[float, float]:
Av = dF / A # A 물체의 속력은 운동량의 변화량을 A의 질량으로 나눈것과 같다.
Bv = dF / B # B 물체의 속력은 운동량의 변화량을 B의 질량으로 나눈것과 같다.
return Av, Bv # 계산한 값들을 리턴한다.
이제 의사코드의 1, 4, 5, 6에 해당하는 메인 함수를 만들어보자!
def main():
# 파이썬의 내장함수인 input() 를 이용하여 값을 입력받는다.
# input() 함수는 괄호안의 내용을 출력하고, 사용자의 입력을 기다린다.
A = float(input("A물체의 질량을 입력해주세요. (kg) : "))
B = float(input("B물체의 질량을 입력해주세요. (kg) : "))
F = float(input("충돌에서 작용한 총 힘의 크기를 입력해주세요. (N) : "))
T = float(input("힘이 가해진 시간을 입력해주세요. (초) : "))
# 위에서 만들어둔 운동량의 변화량을 구하는 함수를 이용하여, 운동량의 변화량을 구한후, dF에 넣는다.
dF = delta_momentum(F, T)
# 위에서 만들어둔 각 물체의 속력을 구하는 함수를 이용하여, 속력을 구한뒤, 각각 Av, Bv 에 넣는다.
Av, Bv = calc_velocity(A, B, dF)
# 결괏값들을 출력한다. 파이썬의 print() 함수는 괄호안의 내용을 출력한다.
print(
f"""
=========[입력값]==========
A 물체의 질량 : {A}
B 물체의 질량 : {B}
충돌에서 작용한 힘 : {F}
힘이 가해진 시간 : {T}
=========[출력값]==========
A 물체의 속도 : {Av}
B 물체의 속도 : {Bv}
"""
) # 파이썬에서 여러줄의 문자열을 표현할땐, """ 를 사용한다.
while True: # 무한히 반복한다.
isrestart = input("다른 값을 계산하시겠습니까? (y/n) : ")
if isrestart == 'y': # 만약 isrestart 가 y 라면
main() # 메인함수를 다시 호출한다.
return
elif isrestart == 'n': # 만약 isrestart 가 n 이라면
print("프로그램이 종료됩니다...") # 괄호안의 내용을 출력한다.
time.sleep(2) # 2초간 기다린다.
return # 함수를 탈출한다.
else: # 위의 조건이 모두 성립하지 않는다면
continue # 다시 반복한다.
음! 이제 exe파일로 변환후, 테스트를 해보도록 하자.
정상적으로 작동하는것을 확인할수 있었다.
예전에 교과서의 이 문제를 풀면서, "음... 이게 값이 복잡해지면 계산이 힘들겠네... 이런거 해주는 계산기 없나?" 라는 생각을 했었고(물론 없었다), 지금이 되어서 이 내용에 대해서 탐구를 해보고, 이 내용을 이용해서 계산기를 만드는 프로젝트를 만들어 보니, 처음 시작할때는 어떤식으로 구성해야하고, 어떤 방식을 써야하는지, 계산을 어떻게 해야하는지, 순서도를 어떤 모양으로 그려야 하는지, 이 버그를 어떻게 해결하는지 등등 고민이 많았고, 이것들을 정하느라 조금 힘들었지만, 그래도 막상 다 만들고나서 내가 만든것들을 돌아보니 매우 뿌듯했고, 재미있었던 활동이였다.
이 내용을 통해서 나중에 프로그래밍에 관심이 있는 친구를 가르쳐 주어야겠다.
선생님 긴글 읽으시느라 수고하셨습니다 !!