scanf() 중에서 마지막에 있는
scanf("%c",&E);
를 하신 다음, 변수 E에 들어있는 내용은 보면 개행문자('\n')이 있을 겁니다.
앞에서 세 번 호출한 scanf(), 즉
scanf(%f",&a);
scanf(%f",&b);
scanf(%f",&c);
에서 마지막 c 를 입력하면서 친 Enter 가 남아있다가
scanf("%c",&E);
에 반응한 것입니다. 마지막으로 입력한 Enter를 무효화하기 위해서
scanf("%c",&E);
scanf("%c",&E);
와 같이 두 번 연이어 써 버리면, 처음 scanf()는 앞서 입력된 Enter를 받아들이고,
뒤에 scamf()가 사용자의 입력을 기다릴 겁니다.
그리고, 실행해보니 약간 오류가 있어서 마저 말씀드립니다.
허근을 가지는 경우에
w=x/(2*a);
는 아래와 같이
w=sqrt(-x)/(2*a);
로 고쳐야 하겠고요. scanf("%c",&E) 다음에 있는
if (E=='Y'||E=='y') break;
는 아래와 같이 고쳐야 할 것 같습니다.
if (E=='N'||E=='n') break;
(사족) : 사실 저는 scanf()의 여러 가지 특성 때문에 scanf()를 잘 사용하지는 않습니다.
scanf() 보다는 좀 복잡하지만, 다른 방법들도 있습니다. 예를 들어 마지막에
계속할 것인지 묻는 부분에 아래와 같이 하실 수도 있습디다.
아래는 제가 사용하는 방법입니다. 더 좋은 방법이 많이 있을 겁니다.
(사실 아래의 방법이 ansi.c 의 일부인지 좀 헤깔리네요.)
아래에서 getch() 함수는 한 개의 문자를 콘솔(키보드)에서 받아 들이는 함수이고,
키보드에서 화살표나 F9 같이 일반문자가 아닌 키가 입력되면, 처음에는 0을 반환하고,
그 다음 번에 그 키에 대한 코드를 반환합니다. (따라서, 그 코드 값을 알면 화살표 등의
키 중에서도 어느 키가 눌러졌나 알 수 있습니다. - 다른 함수들도 있습니다) 그리고,
눌러진 키를 화면에 표시하지 않습니다. 필요하다면 프로그래머가 표시해야 합니다.
(암호를 입력받을 때 등에 유용하겠지요)
헤더파일중 conio.h 를 include 해야 합니다.
=== 님이 하신 부분 ===
printf("계속 하시겠습니까? (Y/N)");
scanf("%c",&E);
if (E=='Y'||E=='y') break;
else
;
=== 제가 한 부분 ===
printf("계속 하시겠습니까? (Y/N) : ");
/* 'Y', 'y', 'N', 'n' 중 하나가 입력될 때까지 반복합니다.
화살표 등의 키가 입력되면 한 번 더 호출하여 그 다음 입력값을 건너뜁니다. */
while((E = getch()) != 'Y' && E != 'y' && E != 'N' && E != 'n')
if(E == '\0') getch();
if(E == 'Y' || E == 'y') putchar('Y');
else {putchar('N'); break;}
|