여태까지는 정해진 개수의 데이터만 받는 코드를 짰다.
하지만 개수를 모른다면? 어쩔테지?
변수의 개수마다 코드를 짤 수도 없는 노릇이다.
이 때 반복문을 사용할 수 있다.
반복문에 부합하지 않는 숫자가 들어오면, 반복문을 패스하기 때문이다.
반면 부합하는 숫자가 들어온다면? 걔네는 계속 반복 처리가 되는 것이다.
이렇게 반복문의 끝, 데이터의 끝을 알리는데 사용되는 데이터 값을 보초값, 센티넬(sentinel)이라고 한다.
예제를 풀어보며 이해해보자.
> 사용자로부터 임의의 개수의 성적을 받아서 평균을 계산한 후에 출력하는 프로그램
1. 1트는 실패해야 제맛이죠
![]() |
여기서 문제되는 것은 무엇이었을까? 바로 C는 절차적인 언어라는 생각을 하지 않았다. 이게 무슨 말이냐고? 차근히 살펴 보자. 1. 10점 0은 0과 같은 값이다. 그러므로 while문에 의해서 SUM=10, N=1, AVERAGE=10이 된다. 2. 30점 10도 0보다 큰 값이다. 그러므로 while문에 의해 SUM=40, N=2, AVERAGE=20이 된다. 3. 10점 30도 0보다 큰값이다. SUM=50, N=3, AVERAGE=50/3 4. 30점 10도 0보다 큰값이다. SUM=80, N=4, AVERAGE=20 5. -1 보초값 30이 0보다 큰값이기 때문에 -1도 while문 안으로 들어온다. SUM=79, N=5, AVERAGE=79/5 6. 반복문 종료 이제 i가 0보다 크거나 같지 않으므로, 반복문을 빠져나온다. 그럼 5의 값이 그대로~ 출력되어서 이상한 값이 나오게 되는 거다. 맙소사! |
2. 해결하기
그럼, 이 문제는 어떻게 해결할 수 있을까?
답은 간단하다. while문 바깥에서 보초값이 일으킨 문제를 수정해주면 된다.
SUM에서 i를 빼고, N에서 1을 빼고, AVERAGE를 바깥에서만 계산하면 된다.
![]() |
![]() |
아주 간단하게 해결된다. 간단..?한 가 싶었는데 간단하다.
> 오호 그렇다면 네 녀석 반감기도 해결할 수 있을까?
초기 양이 100일 때 반감기를 받아서 방사능 물질이 1/10이하로 줄어들 때까지 걸리는 시간을 계산하여 보자.
1. 아 1트는 실패라니까요
![]() |
![]() 아ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이게 뭐야 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ |
솔직히 왜 틀렸는지 안 보여서 한참 고민했다... 여기서 INITIAL은 지정된 상수의 값이다. 그래서... present의 값은 항상 50이 되고... 항상 조건을 성립해서 무한으로 반복된다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이걸 고치려면 INITIAL을 바꿔주면 되겠지요? |
2. 2트는 성공인지?
![]() |
![]() |
ㅇㅇ 2번 실패하면 막막하거든여 저도 저지만 선생님?교수님?친구? 아무튼 그분이요
3. 초기물질의 양까지 받아보자.
![]() |
그냥 Initial만 따로 받아주면 되그든여 그리고 0.1*initial 해주면 되그든여 |
'C 프로그래밍 C programming > 수업' 카테고리의 다른 글
220314 수업 로또 과제(미완)와 for문의 기초 (0) | 2022.03.14 |
---|---|
220306 do while문 (0) | 2022.03.12 |
switch문(조건문)과 while문(반복문) (0) | 2022.02.20 |
다중 if 문 (0) | 2022.02.13 |
조건문 01 if문 (0) | 2022.02.06 |