삼각형의 넓이는 밑변 곱하기 높이 나누기 2입니다. 누구나 다 아는 기본적인 공식이죠. 그런데 세 변의 길이만 주어져도 삼각형의 넓이를 구할 수가 있습니다. 바로 헤론의 공식 (Heron’s Formula)덕분입니다.
그럼 파이썬으로 만들어 보겠습니다. 매우 간단하고 쉽습니다.
import math
a = float(input("Input 1st side length of the triangle : "))
b = float(input("Input 2nd side length of the triangle : "))
c = float(input("Input 3rd side length of the triangle : "))
s = (a + b + c) / 2
area = math.sqrt(s * (s-a) * (s-b) * (s-c))
print(area)
제곱근 함수 sqrt를 사용하기 위해 math 라이브러리를 가져오면서 시작합니다. 그리고 변수 a, b, c에 사용자로부터 입력 받은 세 변의 길이를 헤론의 공식 그대로 입력만 하면 됩니다. 이렇게 보면 파이썬도 별 거 아니죠?
그런데 문제는 항상 안심하고 방심할 때 일어납니다. 코딩을 할 때는 항상 사용자를 의심해야 합니다. 경험에 의한 시행착오를 겪다 보면 자연스럽게 의심병부터 생깁니다. 어떤 사용자든 믿으면 안 됩니다. 사람은 누구나 실수를 하기 때문입니다. 모르고 접근하기 때문에 더욱 조심해야 합니다.
무슨 말이냐면, 사용자가 변수 a, b, c에 항상 숫자만 입력할까요? 사실 float 함수를 사용한 것도 input으로 받으면 항상 문자열로 인식하기 때문에 실수(實數)로 바꿔주기 위해서였지만, 아예 대놓고 문자열을 잘못 입력하면 어떻게 될까요? 곧바로 에러가 나고 프로그램은 종료됩니다. 아마 이런 에러 메시지를 보시게 될 것입니다.
ValueError: could not convert string to float: 'a'
문자열이라서 실수(實數)로 변환을 할 수가 없다는 얘기입니다. 그냥 10을 입력했다면 파이썬은 문자열 ‘10’으로 받고 float 함수를 통해 실수 10으로 변환되는 원리인데, 대놓고 문자열을 입력하면 float 함수에서 에러가 발생하게 됩니다.
이때 사용할 수 있는 방법이 바로 try, except과 무한 반복 구문을 사용하는 것입니다. 가령 아래와 같이 말입니다.
while True:
try:
a = float(input("Input 1st side length of the triangle : "))
break
except:
print("Please try again...")
try 부분에서 사용자가 문자열을 잘못 입력하게 되어 에라가 발생하면, except로 바로 넘어가게 되고 다시 입력하라는 메시지를 출력하고 다시 입력할 것을 요구합니다. 만약 제대로 입력했다면 break로 무한 반복 구문을 탈출하게 되는 원리입니다. 이렇게 변수 a, b, c를 사용자가 제대로 입력할 때까지 무한 반복시키면 계산에 오류가 없을 것입니다.
그러나… 여기서 끝내면 안 됩니다. 삼각형의 정의와 기본 원리를 잘 생각해보세요. 그리고 사용자들을 또 의심해야 합니다. 그냥 생각없이 숫자 세 개 입력한다고 계산이 되지 않습니다. 바로 삼각형의 정의 때문입니다. 삼각형의 여러 정의 중 이런 것이 있습니다.
“두 변의 길이의 합보다 나머지 한 변의 길이가 작아야 한다.”
당연한 얘기입니다. 두 변의 길이의 합보다 나머지 한 변의 길이가 더 길면 삼각형이 안 됩니다. 예를 들어, 10, 10, 30 막대기로 삼각형을 만들 수가 없습니다.그렇다면 입력한 값을 평가하여 계산 오류를 막아야 합니다. 그래서 저는 이렇게 만들어봤습니다.
while True:
if a+b <= c or a+c <= b or b+c <= a :
continue
else:
break
어느 두 변의 길이의 합보다 한 변의 길이가 크거나 같으면 처음부터 a, b, c를 다시 정의하고, 그렇지 않으면 무한 반복 구문을 탈출하라는 구문입니다.
세 변의 길이만 입력하면 삼각형의 넓이를 계산해주는 프로그램의 완성 모습은 다음과 같습니다.
import math
while True:
while True:
try:
a = float(input("Input 1st side length of the triangle : "))
break
except:
print("Please try again...")
while True:
try:
b = float(input("Input 2nd side length of the triangle : "))
break
except:
print("Please try again...")
while True:
try:
c = float(input("Input 3rd side length of the triangle : "))
break
except:
print("Please try again...")
if a+b <= c or a+c <= b or b+c <= a :
continue
else:
break
s = (a + b + c) / 2
area = math.sqrt(s * (s-a) * (s-b) * (s-c))
print(area)
제가 만든 것이 정답은 아닙니다. 저는 정답이라고 글을 쓰거나 자랑하려고 올리는 것이 아닙니다. 저는 부족한 것 투성이임을 누구보다 잘 알고 있습니다. 그래서 공부를 놓지 못하고 계속하는 것입니다. 반복해서 말씀 드리지만, 저도 처음 공부 시작할 때 누군가에게 도움을 받았으니, 저도 누군가에게 도움을 드리고자 할 뿐입니다. 시작할 때의 그 막막함과 답답함을 저는 너무 잘 알고 있으니까요.
끝으로…
프로그램 언어 공부는 이렇게 갑자기 만들고 싶은 것이 있어야 실력이 향상됩니다. 함수를 잔뜩 외운다고 늘지 않습니다. 직접 프로그램을 만들어 보고, 책이나 인터넷에서 남이 만든 코딩을 영어 해석하듯이 해석해보고, 때론 응용도 하면서 씹고, 뜯고, 맛보고, 즐기고 해야 합니다. 저도 그랬습니다.
세상 모든 것이 그러하듯이, 코딩도 꾸준히 하다 보면 실력이 늡니다.
[Python] 파이썬으로 로또 번호 추출 프로그램 예제 (0) | 2023.04.06 |
---|---|
[Python] 파이썬으로 이차방정식 근의 공식의 해 구하기 프로그램 예제 (0) | 2023.04.05 |
[Python] 1에서 100까지 숫자들 중 소수 (Prime Number)만 찾아서 출력하기 파이썬 프로그램 예제 (0) | 2023.04.03 |
[Python] 파이썬 에러 메시지 (Error messages) 총정리 (0) | 2023.04.02 |
[Python] 파이썬 urllib.error.HTTPError: HTTP Error 403: Forbidden 해결방법에 대한 결론 (0) | 2023.04.01 |
댓글 영역