🧮
실습 프로젝트 (Practice) · ★
메뉴 + 결과 누적 + 이력
Lv1 · CLI 계산기
메뉴 선택형 사칙연산 계산기. 결과를 누적해 다음 계산에 사용할 수 있고, 종료 시 전체 이력을 출력합니다.
함수메뉴예외
소요 시간
⏱ 1~2시간
난이도
📊 기초 응용
선수 조건
🎯 기초 4, 9주차
결과물
함수 매핑(dict)과 람다 활용
이 강의에서 배우는 것
- 1연산자별 함수를 dict 로 매핑한다
- 20 나누기 예외를 처리한다
- 3이전 결과 재사용 옵션을 구현한다
프로젝트 개요
- 메뉴: 1.+ 2.- 3.* 4./ 5.이전 결과 사용 6.종료
- 0 나누기 예외 처리 + 친절한 메시지
- 종료 시 전체 이력 한 번에 출력
요구사항
- OPS dict 에 (기호, 함수) 매핑
- history 리스트에 모든 연산 누적
- 직전 결과를 변수에 저장 → '이전결과 사용' 옵션
도전 과제
- ** (제곱), % (나머지) 추가
- 수식 문자열 직접 파싱 (eval 금지)
채점 체크리스트
- 0 나누기 안전
- 이전 결과 재사용
- 이력 출력
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
solution.py— 전체 동작 코드
CODE
"""CLI 계산기 — 메뉴형 + 결과 누적"""
OPS = {
"1": ("+", lambda a, b: a + b),
"2": ("-", lambda a, b: a - b),
"3": ("*", lambda a, b: a * b),
"4": ("/", lambda a, b: a / b if b != 0 else None),
}
def main():
history = []
last = None
while True:
print("\n[메뉴] 1.+ 2.- 3.* 4./ 5.이전결과 사용 6.종료")
choice = input("선택: ").strip()
if choice == "6":
break
if choice not in OPS:
print("잘못된 선택"); continue
try:
if last is not None and input(f"첫 번째 수 (이전 결과 {last}): ").strip() == "":
a = last
else:
a = float(input("첫 번째 수: "))
b = float(input("두 번째 수: "))
except ValueError:
print("숫자만 입력"); continue
symbol, fn = OPS[choice]
result = fn(a, b)
if result is None:
print("0으로 나눌 수 없습니다")
continue
print(f"결과: {a} {symbol} {b} = {result}")
history.append(f"{a} {symbol} {b} = {result}")
last = result
print("\n[연산 이력]")
for h in history:
print(f" {h}")
if __name__ == "__main__":
main()▶ 실행 결과
[메뉴] 1.+ 2.- 3.* 4./ 5.이전결과 사용 6.종료
선택: 1
첫 번째 수: 3
두 번째 수: 4
결과: 3.0 + 4.0 = 7.0
선택: 6
[연산 이력]
3.0 + 4.0 = 7.0📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
프로젝트 구현
목표: 위 사양대로 직접 작성한다.
요구사항
- OPS dict + 람다
- 0 나누기 처리
- 이력 출력
💡 힌트
lambda a, b: a / b if b != 0 else None
입출력 예시
결과: 3.0 + 4.0 = 7.0채점
- · 메뉴 동작
- · 예외 안전
▶정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일▶ 실행 결과
(예제 참고)