상세 컨텐츠

본문 제목

[Python] 파이썬으로 각종 단위 변환 프로그램 예제

IT & Programming/파이썬 (Python) 공부

by 그림아이 2023. 4. 7. 02:00

본문

반응형

 

미국과 영국은 독특한 단위 체계를 사용하는 것으로 유명합니다. 전세계가 공용으로 사용하고 있는 SI (International System of Units) 단위 체계, 즉 미터법을 받아들이지 않고 버티는 것으로 유명합니다. 자신들의 단위 체계를 US 단위, 또는 Imperial Units라고 부르며 아직도 인치, 피트, 야드, 마일, 파운드, 에이커를 사용하고 있습니다.

 

워낙 오랫동안 사용하다 보니 단시간에 바꾸는 것이 불가능한 것은 이해하지만, 해외 사업을 하다 보면 불편한 점이 한 두가지가 아닙니다. 저같이 엔지니어들은 설계 도면의 단위 체계가 달라지면 일하는 방식 자체가 달라집니다. 설계 기준도 바뀌지만, 도면의 축척, 좌표체계까지 달라져 적응하는데 많은 시간이 필요합니다.

 

그래서 이번 시간에는 단위 변환 프로그램을 만들어볼까 합니다. 단위 하나 바꾸는 것은 쉽습니다. 숫자를 입력 받아서 변환 인수를 곱하기만 하면 되니까요. 단순히 킬로미터를 마일로 바꿔보겠습니다.

 

kilometers = float(input("Enter value in kilometers: "))

conv_fac = 0.621371 #Km -> mile

miles = kilometers * conv_fac

print('%0.2f kilometers is equal to %0.2f miles'%(kilometers,miles))

 

사용자로부터 입력 받은 킬로미터 값을 미일로만 바꿔주면 됩니다. 마지막 출력 부분은 이제 적응이 좀 되시죠? 결과 값을 보기 좋게 문자열과 함께 출력하는 방식으로 알아두시면 유용하게 사용할 수 있습니다.

 

이렇게 단순해보이는 구문인데 더 이상 뭔가 더할 게 있나 생각하시는 분들이 계시겠지만, 뭔가 욕심을 더 내보겠습니다. 사용자로부터 옵션을 입력 받아서 여러 단위를 바꾸고 싶을 때는 어떻게 할까요? 반복적으로 말씀 드리지만 코딩은 좀 더 욕심 내고 만들고 싶어 해야 실력이 늡니다.

 

거창하게 알고리즘이라기 보다 스토리를 생각해 보겠습니다. 가장 먼저 SI 단위를 US 단위로 변환할지, US 단위를 SI 단위로 변환할지 선택해야 합니다. 그리고 어떤 단위를 바꾸고 싶은지 사용자가 선택해야 합니다. 그리고는 결과 값을 출력만 하면 됩니다. 스토리는 간단합니다.

 

맨 먼저 사용자로부터 어떤 단위 체계로 바꾸고 싶은지 묻습니다. 물론 사용자가 엉뚱한 선택을 하지 않도록 주의해야 합니다. 저는 이렇게 약간 장난스럽게 해봤습니다.

 

while True:
    opt1 = float(input("[1] SI -> US, [2] US -> SI : "))
    if opt1 == 1 or opt1 == 2:
        break
    else:
        print("잘 좀 입력해주시죠. :(")
        continue

 

사용자가 1이나 2를 입력하지 않으면 무한반복 구문을 돌아야 하고, 핀잔의 메시지를 봐야 합니다. 제가 혼자 공부하면서 만드는데 뭐 어떻습니까. 일이든 공부든 재미있게 해야한다는 것이 제 신념 중 하나입니다.

 

특정 단위 하나를 또 하나의 특정 단위로만 바꾸는 것을 생각할 수도 있습니다. 본인이 가장 자주 사용하는 변환 단위 위주로 생각할 수도 있을 것입니다. 그러나 저는 길이, 무게, 넓이 단위를 최대한 다양하게 변환하여 결과값으로 출력해주고자 합니다. 그냥 순수하게 재미로 말입니다. 이렇게 하면 구문이 길어질 수밖에 없는데 사실 원리만 이해하면 나머지는 복사 및 붙여넣기만 잘하면 됩니다. 일단 큰 틀은 다음과 같이 만들어봤습니다.

 

if opt1 == 1:
    while True:
        opt2 = float(input("[1] Millimeter\n[2] Centimeter\n[3] Meter\n[4] Kilometer\n[5] Gram\
            \n[6] Kilogram\n[7] Ton\n[8] M2 (Square Meter)\n[9] KM2 (Square Kilometer)\n[10] 평\n"))
        print("\n")
        if opt2 >= 1 and opt1 <= 10:
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue
elif opt1 == 2:
    while True:
        opt2 = float(input("[1] Inch\n[2] Feet\n[3] Yard\n[4] Mile\n[5] Pound\n[6] Acre"))
        if opt2 >= 1 and opt1 <= 6:
            print("\n")
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue

 

반응형

 

구문이 너무 길어져 보기 힘들다면 백슬래시(\) 입력 후 다음 줄에 입력하시면 됩니다여기에 변환하고 싶은 수를 입력하도록 하면 됩니다.

 

    while True:
        target_number = float(input("Input number : "))
        if target_number:
            print("\n")
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue

 

역시 사용자가 숫자만 입력하도록 무한 반복 구문으로 처리했습니다.

 

그리고 이제 단위 변환만 열심히 해주면 됩니다. 옵션 번호에 따라 if와 elif 구문으로 처리하면 되며 다음과 같은 방식입니다.

 

if opt2 == 1:

elif opt2 == 2:

elif opt2 == 3:

 

1부터 10까지 경우의 수를 모두 처리하면 되며미터법1번 옵션만 살펴보면 다음과 같습니다.

 

    if opt2 == 1:
        print('%0.2f Millimeter was converted like below.'%(target_number))
        print('%0.2f mm = %0.2f in'%(target_number,target_number*0.0393701))
        print('%0.2f mm = %0.2f ft'%(target_number,target_number*0.00328084))
        print('%0.2f mm = %0.2f yd'%(target_number,target_number*0.00109361))
        print('%0.2f mm = %0.2f mile'%(target_number,target_number*6.21371e-7))
        print("\n")
        print("Completed!")
        print("\n")

 

소수점 자리수는 각자의 기호와 환경에 따라 조정해주면 됩니다. %0.2f %0.4f %0.5f 등과 같이 바꿔주기만 하면 됩니다이제 변환을 위한 계수만 잘 입력해주면 끝입니다완성된 코딩 구문은 다음과 같습니다.

 

while True:
    opt1 = float(input("[1] SI -> US, [2] US -> SI : "))
    if opt1 == 1 or opt1 == 2:
        print("\n")
        break
    else:
        print("잘 좀 입력해주시죠. :(")
        continue

if opt1 == 1:
    while True:
        opt2 = float(input("[1] Millimeter\n[2] Centimeter\n[3] Meter\n[4] Kilometer\n[5] Gram\
            \n[6] Kilogram\n[7] Ton\n[8] M2 (Square Meter)\n[9] KM2 (Square Kilometer)\n[10] 평\n\n"))
      print("\n")
        if opt2 >= 1 and opt1 <= 10:
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue
    while True:
        target_number = float(input("Input number : "))
        if target_number:
            print("\n")
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue
    if opt2 == 1:
        print('%0.2f Millimeter was converted like below.' %(target_number))
        print('%0.2f mm = %0.2f in' %(target_number,target_number*0.0393701))
        print('%0.2f mm = %0.2f ft' %(target_number,target_number*0.00328084))
        print('%0.2f mm = %0.2f yd' %(target_number,target_number*0.00109361))
        print('%0.2f mm = %0.2f mile' %(target_number,target_number*6.21371e-7))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 2:
        print('%0.2f Centimeter was converted like below.' %(target_number))
        print('%0.2f cm = %0.2f in' %(target_number,target_number*0.393701))
        print('%0.2f cm = %0.2f ft' %(target_number,target_number*0.0328084))
        print('%0.2f cm = %0.2f yd' %(target_number,target_number*0.0109361))
        print('%0.2f cm = %0.2f mile' %(target_number,target_number*6.21371e-6))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 3:
        print('%0.2f Meter was converted like below.' %(target_number))
        print('%0.2f m = %0.2f in' %(target_number,target_number*39.3701))
        print('%0.2f m = %0.2f ft' %(target_number,target_number*3.28084))
        print('%0.2f m = %0.2f yd' %(target_number,target_number*1.09361))
        print('%0.2f m = %0.2f mile' %(target_number,target_number*6.21371e-4))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 4:
        print('%0.2f Kilometer was converted like below.' %(target_number))
        print('%0.2f Km = %0.2f in' %(target_number,target_number*39370.1))
        print('%0.2f Km = %0.2f ft' %(target_number,target_number*3280.84))
        print('%0.2f Km = %0.2f yd' %(target_number,target_number*1093.61))
        print('%0.2f Km = %0.2f mile' %(target_number,target_number*6.21371e-1))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 5:
        print('%0.2f Gram was converted like below.' %(target_number))
        print('%0.2f g = %0.2f lb (pound)' %(target_number,target_number*0.00220462))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 6:
        print('%0.2f Kilogram was converted like below.' %(target_number))
        print('%0.2f Kg = %0.2f lb (pound)' %(target_number,target_number*2.20462))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 7:
        print('%0.2f Ton was converted like below.' %(target_number))
        print('%0.2f T = %0.2f lb (pound)' %(target_number,target_number*2204.62))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 8:
        print('%0.2f Square Meter was converted like below.' %(target_number))
        print('%0.2f m2 = %0.2f acre' %(target_number,target_number*0.000247105))
        print('%0.2f m2 = %0.2f 평' %(target_number,target_number*0.3025))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 9:
        print('%0.2f Square Kilometer was converted like below.' %(target_number))
        print('%0.2f Km2 = %0.2f acre' %(target_number,target_number*247.105))
        print('%0.2f Km2 = %0.2f 평' %(target_number,target_number*302500))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 10:
        print('%0.2f 평 was converted like below.' %(target_number))
        print('%0.2f 평 = %0.2f acre' %(target_number,target_number*0.000816877))
        print('%0.2f 평 = %0.2f m2' %(target_number,target_number*3.30579))
        print('%0.2f 평 = %0.2f Km2' %(target_number,target_number*3.3058e-6))
        print("\n")
        print("Completed!")
        print("\n")
elif opt1 == 2:
    while True:
        opt2 = float(input("[1] Inch\n[2] Feet\n[3] Yard\n[4] Mile\n[5] Pound\n[6] Acre\n\n"))
        print("\n")
        if opt2 >= 1 and opt1 <= 6:
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue
    while True:
        target_number = float(input("Input number : "))
        if target_number:
            print("\n")
            break
        else:
            print("잘 좀 입력해주시죠. :(")
            continue
    if opt2 == 1:
        print('%0.2f Inch was converted like below.' %(target_number))
        print('%0.2f in = %0.2f mm' %(target_number,target_number*25.4))
        print('%0.2f in = %0.2f cm' %(target_number,target_number*2.54))
        print('%0.2f in = %0.2f m' %(target_number,target_number*0.0254))
        print('%0.2f in = %0.2f Km' %(target_number,target_number*2.54e-5))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 2:
        print('%0.2f Feet was converted like below.' %(target_number))
        print('%0.2f ft = %0.2f mm' %(target_number,target_number*304.8))
        print('%0.2f ft = %0.2f cm' %(target_number,target_number*30.48))
        print('%0.2f ft = %0.2f m' %(target_number,target_number*0.3048))
        print('%0.2f ft = %0.2f Km' %(target_number,target_number*0.0003048))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 3:
        print('%0.2f Yard was converted like below.' %(target_number))
        print('%0.2f yd = %0.2f mm' %(target_number,target_number*914.4))
        print('%0.2f yd = %0.2f cm' %(target_number,target_number*91.44))
        print('%0.2f yd = %0.2f m' %(target_number,target_number*0.9144))
        print('%0.2f yd = %0.2f Km' %(target_number,target_number*0.0009144))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 4:
        print('%0.2f Mile was converted like below.' %(target_number))
        print('%0.2f mile = %0.2f mm' %(target_number,target_number*1.60934e+6))
        print('%0.2f mile = %0.2f cm' %(target_number,target_number*160934))
        print('%0.2f mile = %0.2f m' %(target_number,target_number*1609.34))
        print('%0.2f mile = %0.2f Km' %(target_number,target_number*1.60934))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 5:
        print('%0.2f Pound was converted like below.' %(target_number))
        print('%0.2f lb = %0.2f g' %(target_number,target_number*453.592))
        print('%0.2f lb = %0.2f Kg' %(target_number,target_number*0.453592))
        print('%0.2f lb = %0.2f T' %(target_number,target_number*0.000453592))
        print("\n")
        print("Completed!")
        print("\n")
    elif opt2 == 6:
        print('%0.2f Acre was converted like below.' %(target_number))
        print('%0.2f acre = %0.2f m2' %(target_number,target_number*4046.86))
        print('%0.2f acre = %0.2f Km2' %(target_number,target_number*0.00404686))
        print('%0.2f acre = %0.2f 평' %(target_number,target_number*1224.17))
        print("\n")
        print("Completed!")
        print("\n")

 

시험삼아 메이저리그 투수들이 던지는 100마일/hr의 빠른 공은 몇 Km/hr인지 변환해 보면 다음과 같이 결과값을 출력합니다.

 


[1] SI -> US, [2] US -> SI : 2 <- 입력값

 

[1] Inch

[2] Feet

[3] Yard

[4] Mile

[5] Pound

[6] Acre

 

4 <- 입력값

 

Input number : 100 <- 입력값

 

결과값

100.00 Mile was converted like below.

100.00 mile = 160934000.00 mm

100.00 mile = 16093400.00 cm

100.00 mile = 160934.00 m

100.00 mile = 160.93 Km

 

Completed!


100마일/hr의 직구는 160.93Km/hr, 즉 161Km/hr 정도 됩니다. 우리나라에는 아직 이런 투수는 없습니다. 어쨌든 결과 값을 확인해 보시고 자신의 기호와 환경에 맞게 응용해서 변경하면 됩니다.

 

제가 만든 것이 정답은 아닙니다. 저는 정답이라고 글을 쓰거나 자랑하려고 올리는 것이 아닙니다. 저는 부족한 것 투성이임을 누구보다 잘 알고 있습니다. 그래서 공부를 놓지 못하고 계속하는 것입니다. 반복해서 말씀 드리지만, 저도 처음 공부 시작할 때 누군가에게 도움을 받았으니, 저도 누군가에게 도움을 드리고자 할 뿐입니다. 시작할 때의 그 막막함과 답답함을 저는 너무 잘 알고 있으니까요.

 

끝으로…

 

프로그램 언어 공부는 이렇게 갑자기 만들고 싶은 것이 있어야 실력이 향상됩니다. 함수를 잔뜩 외운다고 늘지 않습니다. 직접 프로그램을 만들어 보고, 책이나 인터넷에서 남이 만든 코딩을 영어 해석하듯이 해석해보고, 때론 응용도 하면서 씹고, 뜯고, 맛보고, 즐기고 해야 합니다. 저도 그랬습니다. 

 

세상 모든 것이 그러하듯이, 코딩도 꾸준히 하다 보면 실력이 늡니다.

 

728x90
반응형

관련글 더보기

댓글 영역