충격량 계산기

이 프로젝트는 학교 물리 과목의 세특을 위해 제작되었습니다. (20916 이동훈)

소개

  • 이 프로젝트는 python 3.8.10 으로 제작되었습니다.
  • VScode 에디터를 이용하였습니다.
  • 이 프로젝트는 세특 제출용으로 제작되었으며, 정보시간의 문제해결과 프로그래밍 단원과, 물리시간의 역학과 에너지 - 힘과 운동 단원을 활용하였습니다.

프로그램 실행방법

  • 이 프로젝트는 파이썬이 설치외어있지 않은 곳에서도 실행할수 있도록 하기 위해서, EXE 파일로 패키징 되어 있습니다.
  • 오른쪽의 release 를 확인해주세요.

문제분석

문제 : 물리 교과서 45p의 11번 문제를 보던중, 이 문제의 입력값에 딱 나누어 떨어지는 값이 아닌, 복잡한 값이 주어진다면 계산이 매우 어려워질것이다.

문제의 이해와 분석

현재상태 : 복잡한 입력값에 대한 계산이 어렵다.

목표상태 : 입력값의 복잡도와 상관없이, 계산이 가능하다.

필요한 정보 : A물체의 질량, B물체의 질량, 충돌과정에서의 힘, 힘이 작용한 시간

문제의 분해

  • 주어진 정보들을 이용하여 구하려는 값인 자동차와 트럭의 속력을 어떻게 구할수 있는가?
  • 프로그램이 어떤 순서로 동작해야하는가?
  • 목표상태에 도달하기 위한 가장 효율적인 방법은 무었인가?

문제의 구조화

위의 문제들을 이제 그림으로 구조화 해보도록 하자! image

알고리즘

이제 프로그램을 만들기 위한 알고리즘을 짜볼것이다.

알고리즘을 설계하기 전에, 먼저 알고리즘의 다섯가지 조건들을 알아보도록 하자!!

  1. 입력이 0개 이상일것
  2. 출력이 1개 이상일것
  3. 수행이 가능할것
  4. 명확할것
  5. 유한할것

다음의 조건에 맞게, 알고리즘을 설계하여 보자.

알고리즘 설계하기

이 프로젝트 에서는 의사코드로 먼저 구성을 하고 난 뒤, 순서도를 이용하여 조금 더 자세히 설계해 볼것이다.

우선 의사코드로 설계해보도록 하자.

  1. 사용자에게 값들을 입력받는다. [A물체의 질량, B물체의 질량, 힘의 총량, 힘이 가해진 시간]
  2. I = Ft 공식을 이용해서, 총 운동량의 변화량을 구한다.
  3. 운동량의 변화량 = 질량 * 속도 인것을 이용하여 A, B 물체의 속도를 각각 구한다.
  4. 구한 값들을 출력한다.
  5. 다른값을 계산할지 물어본다.
  6. 만약 더 계산한다를 선택했다면, 처음으로 돌아가고, 아니라면 종료한다.

이제 순서도로 그려보기 전에 순서도의 기호들이 가지는 의미를 알아보자.

image

이제 순서도를 그려보도록 하자. 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파일로 변환후, 테스트를 해보도록 하자. usingexample4

정상적으로 작동하는것을 확인할수 있었다.

느낀점

예전에 교과서의 이 문제를 풀면서, "음... 이게 값이 복잡해지면 계산이 힘들겠네... 이런거 해주는 계산기 없나?" 라는 생각을 했었고(물론 없었다), 지금이 되어서 이 내용에 대해서 탐구를 해보고, 이 내용을 이용해서 계산기를 만드는 프로젝트를 만들어 보니, 처음 시작할때는 어떤식으로 구성해야하고, 어떤 방식을 써야하는지, 계산을 어떻게 해야하는지, 순서도를 어떤 모양으로 그려야 하는지, 이 버그를 어떻게 해결하는지 등등 고민이 많았고, 이것들을 정하느라 조금 힘들었지만, 그래도 막상 다 만들고나서 내가 만든것들을 돌아보니 매우 뿌듯했고, 재미있었던 활동이였다.

이 내용을 통해서 나중에 프로그래밍에 관심이 있는 친구를 가르쳐 주어야겠다.

선생님 긴글 읽으시느라 수고하셨습니다 !!