#include<stdio.h>
int main()
{
double operand, total;
int count, retry;
// 가장 좋은 코드는 의미없는 코드가 존재하지 않는 코드다.
// for 문은 선입제어문이야.
// 그 의미는 루프로 들어가기 전에 루프를 실행해야할지 조건을 판단하는 것이지.
// 그런데 너는 처음엔 무조건 한 번은 입력을 받는다는걸 가정하고 있어.
// 그렇다는건 for 를 쓸 필요 없이 do while 을 쓰거나, while(1)에서 break하는게 경제적일거라는걸 암시해.
// for_retry 를 소거함으로서 retry와의 의미적 유사성이 주는 혼동이 사라졌지.
// 의미를 구분하기 위해 for_ 를 붙인거 귀엽다.
printf(" 평균 구하기 ");
do
{
count = 0;
total = 0;
// 같은 타잎끼리만 연속대입하자. 그렇지 않으면 형변환 (double -> int) 이 발생해서 비싸.
// 초기화를 루프 안에서 해 주면 끝부분의 if 문에 있던 초기화가 필요없지.
while(1)
{
printf("%d 번째의 값을 입력해 주십시오(negative input to quit) ", count + 1);
scanf("%lf", &operand);
if(operand < 0)
break;
total += operand;
count++;
}
if(!count) break; // 하나도 입력 안하면 걍 나가자
getchar(); // scanf 에서 입력 받은 엔터 비우기
printf("%d개의 숫자의 평균값은 %lf 입니다. ", count, total / count);
printf("다시 하시겠습니까? (Y/n)");
// 사소한 약속인데, 대문자로 쓴 Y 는 아무거나 입력하면 yes 로 받아들인다(default)의 의미
retry = getchar();
} while(retry != 'n' && retry != 'N');
return 0;
}
개행 탭 다 날아갔네. ㅋㄷㅋㄷ
밑에 getchar() 2줄 잘 납득이 안가는데 어떻게 동작하는거에여? 함수기능은 아는데 왜 두번 호출하는건지 잘 모르겠음 ㅠㅠ
scanf 에서 %d 를 입력받을때, 숫자 + 엔터 를 치면 숫자는 처리되고 엔터는 처리되지 않은채 입력 버퍼에 남아 있게 돼.
그게 그 다음에 사용한 getchar() 에 자동으로 들어가게 되지. 이런 메카니즘을 buffered stream 이라고 해.
그러면 yes, no 를 입력 받을 의도로 넣은 getchar() 이 무력화되니까, getchar() 하나를 먹이로 던져주는거야.
뭐 반대의 의미지 먹어치우는거야.
새로 따끈따끈한 밥 해 먹으려고 잔밥 처리하는 경우랄까?
아 입력버퍼! ㅎㄷㄷ 소름돋음
근데 아직 getchar() 이게 뭔지를 젠젠 모르겟음
한 문자 입력받는거야.
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.