이 페이지의 목차
입력을 받아 처리하다
코드 예제: Python · C · 예상 50분
학습 목표
- 표준 입력으로 값을 받아 변수에 저장한다.
- 입력받은 문자열을 필요한 자료형으로 바꿔 계산한다.
관련 성취기준
- 프그02-02
입력과 출력의 기능을 이해하고, 형식을 지정하여 데이터를 입력하고 출력할 수 있다.
생각 열기 — 값이 코드에 박혀 있으면
체질량지수를 구하는 프로그램을 이렇게 만들었다.
키 = 170
몸무게 = 62
print(몸무게 / ((키/100) ** 2))
내 값은 나온다. 그런데 짝의 값을 보려면 코드를 고쳐서 다시 실행해야 한다. 반 전체가 쓰려면 서른 번 고쳐야 한다.
표준 입력 — 키보드로 들어오는 값
표준 입력(standard input) — 프로그램이 값을 받아들이는 기본 창구. 대개 키보드로 들어온다은 프로그램이 값을 받는 기본 창구다. 5차시의 표준 출력과 짝을 이룬다.
키 = float(input("키(cm): "))
몸무게 = float(input("몸무게(kg): "))
미터 = 키 / 100
bmi = 몸무게 / (미터 * 미터)
print(f"체질량지수: {bmi:.1f}")키(cm): 몸무게(kg): 체질량지수: 21.5
#include <stdio.h>
int main(void)
{
double cm, kg;
printf("키(cm): ");
scanf("%lf", &cm);
printf("몸무게(kg): ");
scanf("%lf", &kg);
double m = cm / 100;
printf("체질량지수: %.1f\n", kg / (m * m));
return 0;
}170 62
키(cm): 몸무게(kg): 체질량지수: 21.5
안내 문구와 결과가 한 줄에 붙는 까닭
출력이 키(cm): 몸무게(kg): 체질량지수: 21.5 로 나왔다. 안내 문구 세 개가 붙어 버렸다.
input("키(cm): ") 의 안내 문구는 줄바꿈 없이 찍힌다. 사람이 직접 쓸 때는 그 뒤에 값을 타이핑하고 엔터를 치므로 줄이 바뀐다. 그런데 이 실행기는 입력을 미리 받아 두므로 타이핑하는 순간이 없어 줄이 안 바뀐다.
이것은 프로그램의 잘못이 아니다. 전산실에서 직접 타이핑해 보면 이렇게 나온다.
키(cm): 170
몸무게(kg): 62
체질량지수: 21.5
들어온 값은 언제나 글자다
가장 중요한 것이다. 2차시에서 예고한 형 변환이 여기서 실제로 필요해진다.
| 하려는 일 | Python | C |
|---|---|---|
| 글자 그대로 받기 | 이름 = input() | scanf("%s", name) |
| 정수로 받기 | n = int(input()) | scanf("%d", &n) |
| 실수로 받기 | x = float(input()) | scanf("%lf", &x) |
| 형 변환 시점 | 받은 뒤 사람이 바꾼다 | 받으면서 형식 지정으로 정한다 |
C의 & — 어디에 담을지 알려 준다
C의 scanf("%lf", &cm) 에 붙은 & 가 눈에 걸린다. Python의 input() 은 값을 돌려주지만, C의 scanf 는 받은 값을 어디에 넣을지 알려 줘야 한다. &cm 은 “cm 이라는 변수가 있는 자리”를 뜻한다.
3단원 5차시에서 C의 average(scores, 5, &avg) 가 결과를 &avg 에 채웠던 것과 같은 방식이다. C에서 함수가 값을 바깥에 남기려면 이 방법을 쓴다.
& 를 빠뜨리면 컴파일 경고가 나거나 프로그램이 엉뚱하게 동작한다. C에서 scanf 를 쓸 때 가장 자주 하는 실수다.
잘못된 입력을 어떻게 다룰까
사용자는 숫자 자리에 글자를 넣는다. 3단원 8차시에서 다른 모둠 프로그램을 깨뜨려 봤을 때 나온 그 문제다.
| Python | C | |
|---|---|---|
| 무슨 일이 생기나 | ValueError 로 프로그램이 멈춘다 | scanf 가 값을 못 읽고 조용히 넘어간다 |
| 드러나는가 | 오류 메시지로 바로 드러난다 | 드러나지 않는다. 변수에 쓰레기 값이 남는다 |
| 어느 쪽이 위험한가 | — | C — 잘못을 모른 채 계산이 이어진다 |
C에서는 scanf 가 몇 개를 제대로 읽었는지 돌려준다. 그것을 확인하면 잘못된 입력을 잡을 수 있다.
if (scanf("%lf", &cm) != 1) {
printf("숫자를 넣어야 한다\n");
return 1;
}
3단원 3차시 설계서의 「실패하면」 칸에 적을 내용이 바로 이것이다. 12차시에서 조건문을 배운 뒤 이 검사를 제대로 붙여 볼 것이다.
활동
키와 몸무게를 입력받아 체질량지수 계산하기
약 25분1단계 — 값을 바꿔 실행한다 (5분)
위 예제의 「입력」 칸에 자기 값과 짝의 값을 넣어 각각 실행한다.
| 키(cm) | 몸무게(kg) | 나온 체질량지수 |
|---|---|---|
| 170 | 62 | 21.5 |
- 코드를 한 글자도 안 고치고 결과가 바뀌었는가?
- 생각 열기의 “서른 번 고쳐야 한다”는 문제가 해결됐는가?
2단계 — 형 변환을 빼 본다 (5분)
[고치기]로 float(input(...)) 을 input(...) 으로 바꿔 실행한다.
- 오류 메시지를 그대로 적는다.
- 메시지에서
'str'과'int'가 보이는가? 무엇을 무엇으로 나누려 했다는 뜻인가?
3단계 — 판정을 붙인다 (10분)
체질량지수에 따라 안내 문구를 덧붙여 보자. 아직 조건문을 배우지 않았으므로 입력을 여러 번 바꿔 가며 손으로 확인한다.
| 체질량지수 | 어떤 문구를 보일까 | 그 값이 나오는 키·몸무게 |
|---|---|---|
| 18.5 미만 | ||
| 18.5 이상 23 미만 | ||
| 23 이상 |
- 이 판정을 프로그램이 스스로 하게 하려면 무엇이 필요한가? (9차시에서 배운다)
4단계 — 줄이 모자라면 (5분)
「입력」 칸에서 둘째 줄(62)을 지우고 실행한다.
- 무슨 일이 일어나는가? 오류 메시지를 적는다.
- 이 실행기가
input()을 어떻게 다루는지 앞의 설명과 맞춰 생각해 보자.
개인정보 주의 — 실제 몸무게를 남에게 보여 주기 싫으면 지어낸 값을 쓰면 된다. 프로그램은 값이 참인지 알 수 없다.
개념 확인 문제
보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.
키보드로 입력받은 값의 자료형은?프그02-02
Python에서 키 = input() 뒤에 키 / 100 을 하면?프그02-02
C의 scanf(「%lf」, &cm) 에서 & 가 하는 일은?프그02-02
숫자를 받는 자리에 글자가 들어왔을 때 더 위험한 쪽과 그 까닭은?프그02-02
이 교과서 실행기에서 input() 이 동작하는 방식으로 알맞은 것은?프그02-02
더 알아보기
심화한 줄에 여러 값을 받기
값을 하나씩 줄을 나눠 받는 것이 번거로울 때가 있다. 170 62 처럼 한 줄에 두 값을 받으려면 Python에서는 받은 문자열을 쪼갠다.
키, 몸무게 = input().split()
키 = float(키)
몸무게 = float(몸무게)C의 scanf("%lf %lf", &cm, &kg) 는 한 번에 두 값을 읽는다 — 공백이나 줄바꿈을 알아서 건너뛰기 때문이다. C의 scanf 는 이 점에서 편하고, 잘못된 입력을 다룰 때 불편하다. 편한 쪽과 안전한 쪽이 갈리는 자리가 여기다.
실무입력을 믿지 않는 것이 기본이다
3단원 8차시에서 다른 모둠 프로그램을 일부러 잘못 써 봤다. 실무에서는 그것이 훨씬 심하다. 프로그램을 쓰는 사람은 실수하고, 때로는 일부러 이상한 값을 넣는다. 그래서 입력을 받는 곳이 프로그램의 문지기가 된다. 3단원 4차시 「더 알아보기」에서 “잘못된 값은 들어오는 문 앞에서 막는 편이 낫다”고 한 이유다. 안쪽 함수들이 “여기 오는 값은 이미 정수다”라고 믿고 만들어질 수 있기 때문이다.
심화키보드가 아닌 곳에서 입력받기
표준 입력이라는 이름에는 뜻이 있다. 키보드로 고정된 것이 아니라, 프로그램이 값을 받는 표준 창구라는 말이다. 그래서 파일의 내용을 표준 입력으로 흘려 넣을 수도 있다. 명령 창에서 python 프로그램.py < 값.txt 라고 적으면 키보드 대신 파일에서 읽는다. 이 교과서의 예제 검사 도구도 같은 방식으로 동작한다 — 「입력」 칸의 내용을 표준 입력으로 넣어 실행하고 결과를 대조한다. 코드를 한 글자도 안 고치고 입력원을 바꿀 수 있다는 것이 이 구조의 이점이다.
이어지는 학습
이 차시를 이해하려면 다음을 먼저 알아야 한다.
- 5차시의 출력 형식 지정 — 프로그래밍 프그02-02
교과서에서 찾기
| 교과서 | 해당 위치 | 쪽수 |
|---|---|---|
| 성림출판(Python) | 프로그래밍의 기초 › 02 입력과 출력 | 104쪽 |
| 씨마스커뮤니케이션(Python) | 프로그래밍 기초 › 1 입력과 출력 | 72쪽 |
| 삼양미디어(Python) | 프로그래밍의 기초 › 01 데이터 입출력 (프그02-01과 통합) | 42쪽 |
| 삼양미디어(C) | 프로그래밍의 기초 › 01 데이터 입출력 (프그02-01과 통합) | 42쪽 |
| 씨마스(C) | C 프로그래밍의 기초 › 2 입출력 함수 | 72쪽 |
| 웅보출판사(C) | 프로그래밍의 기초 › Chapter 02 입출력 함수 | 85쪽 |