• [혼잣말] C언어 괴수형님들 살려주세요 2012.04.20 PM 05:09

게시물 주소 FONT글자 작게하기 글자 키우기

#include

int main(void)
{
int s;
char g;
printf("정수를 입력하세요 : ");
scanf("%d", &s);

switch( s / 10)
{
case 10 :
case 9 :
g = 'A' ;
break;
case 8 :
g = 'B' ;
break;
case 7 :
g = 'C' ;
break;
case 6 :
g = 'D' ;
break;
case 5 :
g = 'F' ;
break;
case 4 :
g = 'F' ;
break;
case 3 :
g = 'F' ;
break;
case 2 :
g = 'F' ;
break;
case 1 :
g = 'F' ;
break;
case 0 :
g = 'F' ;
break;

default :
printf("잘못 입력하셨습니다.\n");
break;

}

printf("%c 학점입니다.\n", g);

return 0;
}

연습문제를 푸는중인데 if else를 switch로 바꾸라그래서 변환하면서 잘모르겠는데..

현재 문제가 뭐냐면 0 ~ 100 을 제외하고는 잘못입력하셨습니다. 가 나와야하고
60점 이하는 F를 만들어줘야하는데

저런식으로밖에 못하겠습니다 거기다 -2를 입력하면 F학점이나옵니다...

아 ㅠㅠ 모르겠네요 이건...
댓글 : 9 개
#include<stdio.h>

int main(void)
{
unsigned int s; // - 입력 없으므로 unsigned
char g = NULL; // 초기화 후 해당 case가 있을때만 값 대입.
printf("정수를 입력하세요 : ");
scanf("%d", &s);

if(s > 100) s = 100; // 101~109 도 10으로 나누면 10이므로 A가 나옴.

switch( int(s / 10))
{
case 10 :
case 9 :
g = 'A' ;
break;

case 8 :
g = 'B' ;
break;

case 7 :
g = 'C' ;
break;

case 6 :
g = 'D' ;
break;

case 5 :
case 4 :
case 3 :
case 2 :
case 1 :
case 0 :
g = 'F' ;
break;
// break;가 없으면 아래조건의 행까지 모두 수행함. 실행문이 같다면 몰아서 씀.

default :
printf("잘못 입력하셨습니다.\n");
break;

}

if(g!=NULL) printf("%c 학점입니다.\n", g);
// 범위 밖의 수가 입력되면 g는 NULL 초기화 그대로이므로 출력되지 않음.

return 0;
}
#include <stdio.h>

int main(void)
{
int s;
char g;

printf("정수를 입력하세요 : ");
scanf("%d", &s);
switch(s / 10)
{
case 10 :
case 9 :
g = 'A' ;
break;
case 8 :
g = 'B' ;
break;
case 7 :
g = 'C' ;
break;
case 6 :
g = 'D' ;
break;
case 5 :
case 4 :
case 3 :
case 2 :
case 1 :
case 0 :
g = 'F' ;
break;
default :
printf("잘못 입력하셨습니다.\n");
break;

}
if (s >= 0 && s <= 100)
{
printf("%c 학점입니다.\n", g);
}
return 0;
}
아 두분 감사드립니다 !!
흔히 ..많이들 하는 예제인데..

if else가 안되는 이유는 보기에 복잡하니..
직관적이고 쉬운 switch문으로 보기좋게 바꾸라는 겁니다.

때문에 if문을 굳이 안쓸이유가 없습니다..섞어써서
완벽한 결과를 얻으세요
0 ~ 100 사이의 숫자라면 switch문 들어가기 전에 0 ~ 100 사이의 숫자인지 유효성 체크를 먼저 하는게 더 좋은 방법입니다.
-2를 입력하시면 나누기 연산시 값이 int형의 경우 0이 나올겁니다 그래서 F가 나오게 됩니다.
그러니 시로우카무이 님 말씀대로 미리 체크를 하는게 더 좋은방법이되겠네요
그냥 간단히 int s; ==> unsigned s; 로 고치세요.

-2가 됐든 뭐가 됐든 10미만의 값을 10으로 나누니까 몫이 '0'이 되잖아요.
그래서 case 문에서 항상 's'로 들어가는 겁니다.
각 case 문마다 printf 찍어서 확인해 보시면 어떤 로직을 타는지 아실 수 있죠.

기본적으로 점수는 마이너스가 있을 수 없기 때문에, 입력에서 무조건 부호없는 정수값을 받도록 정해야겠죠.

만일 부호있는 값을 입력 받을 수는 있는데, 코드에서 음수인지 검사하려고 한다면 결국 if문을 사용해야 합니다.
아니면 case 문에다가 일일이 모든 마이너스 정수값을 다 기입해야 합니다만, 이건 미친짓이죠.

단순히 if 문을 사용하지 않는 코드를 작성하는 것이라면, 첫 문장에 적어놓은 방법을 사용하세요.
#include <stdio.h>

int main(void)
{
int s;
char g;

printf("1~100 사이의 정수를 입력하세요 : ");
scanf("%d", &s);

if (s < 0 || s > 100 )
{
printf("잘못 입력하셨습니다.\n");
return 0;
}

switch(s / 10)
{
case 10 :
case 9 :
g = 'A' ;
break;
case 8 :
g = 'B' ;
break;
case 7 :
g = 'C' ;
break;
case 6 :
g = 'D' ;
break;
default :
g = 'F' ;
break;
}

printf("%c 학점입니다.\n", g);
return 0;
}
똑같은 답이 몇개여... 졸라쉽구만...
친구글 비밀글 댓글 쓰기

user error : Error. B.