<연습 내용 요약>
연산자
거스름돈 계산기
조건문
복리 계산기
문자 요금 책정기
성적 요약 프로그램
상수도 요금 계산기 (중첩조건문)
차량2/5부제 안내문 (중첩조건문)
반복문
난수 맞히기
# 상품 가격 입력, 거스름 돈 계산(원단위 절삭), 최소 지폐/동전 활용
price = int(input('Enter product price: '))
payment = int(input('Enter payment: '))
change = payment - price
if change > 0:
change -= (change % 10)
elif change < 0:
print("Insert more money.")
print('금액: {:,}원'.format(price))
print('받은 돈: {:,}원'.format(payment))
if change >= 0:
print('거스름 돈: {:,}원(원단위 절사)'.format(change))
chg50000 = 0
chg10000 = 0
chg5000 = 0
chg1000 = 0
chg500 = 0
chg100 = 0
chg50 = 0
chg10 = 0
if change >= 50000:
chg50000 = change // 50000
change %= 50000
if change >= 10000:
chg10000 = change // 10000
change %= 10000
if change >= 5000:
chg5000 = change // 5000
change %= 5000
if change >= 1000:
chg1000 = change // 1000
change %= 1000
if change >= 500:
chg500 = change // 500
change %= 500
if change >= 100:
chg100 = change // 100
change %= 100
if change >= 50:
chg50 = change // 50
change %= 50
if change >= 10:
chg10 = change // 10
change %= 10
print('-' * 30)
print('50,000원권 {}장'.format(chg50000))
print('10,000원권 {}장'.format(chg10000))
print('5,000원권 {}장'.format(chg5000))
print('1,000원권 {}장'.format(chg1000))
print('500원 {}개'.format(chg500))
print('100원 {}개'.format(chg100))
print('50원 {}개'.format(chg50))
print('10원권 {}개'.format(chg10))
print('-' * 30)
elif change < 0:
print('모자란 돈: {:,}원' .format(change))
연습문제 코드를 아래와 같이 조금 수정했음.
1) 돈이 모자라면 잔돈 파트를 출력하지 않고 '모자란 돈' 금액을 출력.
2) {:,} .format() 함수를 사용해서 화폐단위 출력.
# 숫자에 단위 쉼표 넣어주는 2가지 방법
# 방법1. format() 함수
format(variable, ',')
# 방법2. 구글링한 방법
'{:,}' .format(variable)
방법1(수업에서 배운 방법)이 더 간단해 보이기는 하는데, 만약 여러 개의 변수가 들어갈 땐 방법2가 쓰일 때도 있겠다.
print('금액: {:,}원'.format(price))
print('받은 돈: {:,}원'.format(payment))
조건문
2. 복리 계산기
amount = 1500000
rate = 4.3
duration = 5
# 공식으로 구하기
terminal_value_formula = amount * (1+4.3/100) ** 5
print(terminal_value_formula)
# 루프로 구하기
terminal_value = amount
for i in range(duration):
terminal_value += terminal_value * rate/100
print('terminal value: {:,}' .format(terminal_value))
조금 복잡한 코드를 짤 때는 의사코드(pseudocode)를 통해 먼저 전반적인 논리를 구조화하는 방법을 사용하는 것이 좋다.
3. 문자 요금 책정기
# 메시지 길이 따라 다른 요금 책정
message = input('Enter message: ')
mess_length = len(message)
if mess_length <= 50:
fee = 50
print('message length: {}, \t toll: {}' .format(mess_length, fee))
else:
fee = 100
print('message length: {}, \t toll: {}' .format(mess_length, fee))
# 입력된 시험 점수를 반평균 점수와 비교(총합, 평균, 편차)
# abs() 함수 이용해서 막대그래프 그리기 (편차가 +일때 "+", -일때 "-" 막대바 그리기)
kor_avg = 85
eng_avg = 82
math_avg = 89
sci_avg = 75
hist_avg = 94
class_sum = kor_avg + eng_avg + math_avg + sci_avg + hist_avg
class_avg = int(class_sum / 5)
kor_score = int(input('국어점수: '))
eng_score = int(input('영어점수: '))
math_score = int(input('수학점수: '))
sci_score = int(input('과학점수: '))
hist_score = int(input('국사점수: '))
student_sum = kor_score + eng_score + math_score + sci_score + hist_score
student_avg = int(student_sum / 5)
sum_div = student_sum - class_sum
avg_div = student_avg - class_avg
kor_div = kor_score - kor_avg
eng_div = eng_score - eng_avg
math_div = math_score - math_avg
sci_div = sci_score - sci_avg
hist_div = hist_score - hist_avg
print('총점: {}({}), \t 평균: {}({})'
.format(student_sum, sum_div, student_avg, avg_div))
print('국어: {}({}), \t 영어: {}({}), \t 수학: {}({}), \t '
'과학: {}({}), \t 국사: {}({}), \t'
.format(kor_score, kor_div, eng_score, eng_div,
math_score, math_div, sci_score, sci_div, hist_score, hist_div))
print('-'*50)
str = '*' if kor_div > 0 else '-'
print('국어편차: {}({})' .format((str * abs(kor_div)), kor_div))
str = '*' if eng_div > 0 else '-'
print('영어편차: {}({})' .format((str * abs(eng_div)), eng_div))
str = '*' if math_div > 0 else '-'
print('수학편차: {}({})' .format((str * abs(math_div)), math_div))
str = '*' if sci_div > 0 else '-'
print('과학편차: {}({})' .format((str * abs(sci_div)), sci_div))
str = '*' if hist_div > 0 else '-'
print('국사편차: {}({})' .format((str * abs(hist_div)), hist_div))
print('-'*50)
kor_avg = 85
eng_avg = 82
math_avg = 89
sci_avg = 75
hist_avg = 94
class_sum = kor_avg + eng_avg + math_avg + sci_avg + hist_avg
class_avg = int(class_sum / 5)
kor_score = int(input('국어점수: '))
eng_score = int(input('영어점수: '))
math_score = int(input('수학점수: '))
sci_score = int(input('과학점수: '))
hist_score = int(input('국사점수: '))
student_sum = kor_score + eng_score + math_score + sci_score + hist_score
student_avg = int(student_sum / 5)
sum_div = student_sum - class_sum
avg_div = student_avg - class_avg
kor_div = kor_score - kor_avg
eng_div = eng_score - eng_avg
math_div = math_score - math_avg
sci_div = sci_score - sci_avg
hist_div = hist_score - hist_avg
print('총점: {}({}), \t 평균: {}({})'
.format(student_sum, sum_div, student_avg, avg_div))
print('국어: {}({}), \t 영어: {}({}), \t 수학: {}({}), \t '
'과학: {}({}), \t 국사: {}({}), \t'
.format(kor_score, kor_div, eng_score, eng_div,
math_score, math_div, sci_score, sci_div, hist_score, hist_div))
print('-'*50)
str = '*' if kor_div > 0 else '-'
print('국어편차: {}({})' .format((str * abs(kor_div)), kor_div))
str = '*' if eng_div > 0 else '-'
print('영어편차: {}({})' .format((str * abs(eng_div)), eng_div))
str = '*' if math_div > 0 else '-'
print('수학편차: {}({})' .format((str * abs(math_div)), math_div))
str = '*' if sci_div > 0 else '-'
print('과학편차: {}({})' .format((str * abs(sci_div)), sci_div))
str = '*' if hist_div > 0 else '-'
print('국사편차: {}({})' .format((str * abs(hist_div)), hist_div))
print('-'*50)
계산할 공식들이 많아지면 하나하나 변수로 저장해 놓는 게 코드를 알아보기 쉽다.
# 업종 및 사용량 입력
# 가정용/대중탕용/공업용 상수도 요금 책정
category = int(input('1. home 2. public 3. industry'))
usage = float(input('enter usage: '))
# home
if category == 1:
fee = usage * 540
# public
if category == 2:
if usage <= 50:
unit_price = 820
elif 50 < usage <= 300:
unit_price = 1920
elif usage > 300:
unit_price = 2400
# industry
if category == 3:
if usage <= 500:
unit_price = 240
elif usage > 500:
unit_price = 470
else:
print('enter appropriate number!')
fee = usage * unit_price
print('=' * 50)
print('상수도 요금표')
print('-' * 50)
print('사용량 \t : \t 요금')
print('%d \t : \t %s원' % (usage, format(int(fee), ',')))
print('=' * 50)
한 가지 궁금한 거: 연습풀이에서는 if문에 들어가기 전에 unit_price를 0으로 초기화 해준다. 그게 왜 필요한지 잘 이해가 안간다. 사용량에 말도 안되는 값이 입력되었을 때 요금을 계산하는 것을 방지하기 위함일까?
import datetime
today = datetime.datetime.today()
day = today.day
air_limit = 150
air_level = int(input('air level: '))
car_type = int(input('car type: 1. normal \t 2. business'))
car_num = int(input('car number: '))
print('-' * 30)
print(today)
print('-' * 30)
if air_level > air_limit and car_type == 1:
if day % 2 == car_num % 2: # 2부제 시행
print('차량 2부제 적용')
print('운행제한')
else:
print('운행가능')
if air_level > air_limit and car_type == 2:
if day % 5 == car_num % 5: # 5부제 시행
print('차량 5부제 적용')
print('운행제한')
else:
print('운행가능')
if air_level <= air_limit:
if day % 5 == car_num % 5: # 5부제 시행
print('차량 5부제 적용')
print('운행제한')
else:
print('운행가능')
이게 내가 만든 버전인데, 왜인지 모르게 조금 복잡해 보여서 chatGPT에게 코드를 수정해달라고 해보았다. 결과는 아래.
import datetime
today = datetime.datetime.today().day # 변수 2 -> 1개로 간소화
air_limit = 150
air_level = int(input('air level: '))
car_type = int(input('car type: 1. normal \t 2. business'))
car_num = int(input('car number: '))
print('-' * 30)
print(today)
print('-' * 30)
if air_level > air_limit: # 큰 if 루프 3-> 2개로 간소화
if car_type == 1 and today % 2 == car_num % 2:
print('차량 2부제 적용')
print('운행제한')
elif car_type == 2 and today % 5 == car_num % 5:
print('차량 5부제 적용')
print('운행제한')
else:
print('운행가능')
else:
if today % 5 == car_num % 5:
print('차량 5부제 적용')
print('운행제한')
else:
print('운행가능')
가장 눈에 띄는 차이는 큰 if loop가 3개에서 2개로 줄었다는 것.