[파이썬 기초문법] 연습문제

서대철·2023년 7월 6일
0
<연습 내용 요약>
연산자
	거스름돈 계산기
조건문
	복리 계산기
    문자 요금 책정기
    성적 요약 프로그램
    상수도 요금 계산기 (중첩조건문)
    차량2/5부제 안내문 (중첩조건문)
반복문
    난수 맞히기
  1. 연산자
  • 거스름돈 계산기
# 상품 가격 입력, 거스름 돈 계산(원단위 절삭), 최소 지폐/동전 활용

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))
  1. 성적 요약 프로그램
# 입력된 시험 점수를 반평균 점수와 비교(총합, 평균, 편차)
# 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)

계산할 공식들이 많아지면 하나하나 변수로 저장해 놓는 게 코드를 알아보기 쉽다.

  1. 상수도 요금 계산기 (중첩조건문)
# 업종 및 사용량 입력
# 가정용/대중탕용/공업용 상수도 요금 책정

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으로 초기화 해준다. 그게 왜 필요한지 잘 이해가 안간다. 사용량에 말도 안되는 값이 입력되었을 때 요금을 계산하는 것을 방지하기 위함일까?

  1. 차량2/5부제 안내문 (중첩조건문)
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개로 줄었다는 것.

  • if: 공기가 안 좋을 때
  • else: 공기가 괜찮을 때
    이렇게 두 가지 줄기로 나눠놓음으로 훨씬 코드가 읽기 편해진 것 같다. 논리적으로도 더 간결해져서 직관적으로 구조가 이해가 된다.

0개의 댓글