위와 같은 부동소수점(실수)상수 를 입력받으면 yes가 되고
그 외에 정수를 입력하면 No로 표시되는 프로그램을 인코딩하고 싶습니다.
#include <stdio.h>
int isReal(char s[]) {
int i=0;
int state=0, x;
//
// state: 0 초기 상태 올수 있는 문자는 [+/-] [숫자] 혹은 [.] 이 올 수 있다.
// state: 0 [+/-] ==> state: 1
// state: 0 [숫자] ==> state: 3
// state: 0 [.] ==> state: 2
// state: 0 [다른 경우] ==> 실수가 아니다.
//
// state: 1 [숫자] ==> state: 3
// state: 1 [.] ==> state: 2
// state: 1 [다른 경우] ==> 실수가 아니다.
//
// state: 2 [숫자] ==> state: 5
// state: 2 [다른 경우] ==> 실수가 아니다.
//
// state: 3 [숫자] ==> state: 3
// state: 3 [.] ==> state: 4
// state: 3 [E/e] ==> state: 6
// state: 3 [F/f] ==> state: 9
// state: 3 [다른 경우] ==> 실수가 아니다.
//
// state: 4 [숫자] ==> state: 5
// state: 4 [E/e] ==> state: 6
// state: 4 [F/f] ==> state: 9
// state: 4 [끝] ==> [실수]
// state: 4 [다른 경우] ==> 실수가 아니다.
//
// state: 5 [숫자] ==> state: 5
// state: 5 [E/e] ==> state: 6
// state: 5 [F/f/L/l] ==> state: 9
// state: 5 [끝] ==> [실수]
// state: 5 [다른 경우] ==> 실수가 아니다.
//
// state: 6 [+/-] ==>state: 7
// state: 6 [숫자] ==> state: 8
// state: 6 [다른 경우] ==> 실수가 아니다.
//
// state: 7 [숫자] ==> state: 8
// state: 7 [다른 경우] ==> 실수가 아니다.
//
// state: 8 [숫자] ==> state: 8
// state: 8 [F/f/L/l] ==> state: 9
// state: 8 [끝] ==> [실수]
// state: 8 [다른 경우] ==> 실수가 아니다.
//
// state: 9 [끝] ==> [실수]
// state: 9 [다른 경우] ==> 실수가 아니다.
//
i=0;
state=0;
while(1) {
x=s[i];
//printf("x=%c state=%d\n", x, state);
switch(state) {
case 0:
if(x=='+'||x=='-') {
state=1;
} else if(x=='.') {
state=2;
} else if('0'<=x && x<='9') {
state=3;
} else {
return 0;
}
break;
case 1:
if(x=='.') {
state=2;
} else if('0'<=x && x<='9') {
state=3;
} else {
return 0;
}
break;
case 2:
if('0'<=x && x<='9') {
state=5;
} else {
return 0;
}
break;
case 3:
if('0'<=x && x<='9') {
state=3;
} else if(x=='.') {
state=4;
} else if(x=='E'||x=='e') {
state=6;
} else if(x=='F'||x=='f') {
state=9;
} else {
return 0;
}
break;
case 4:
if(x==0) {
return 1;
} else if('0'<=x && x<='9') {
state=5;
} else if(x=='E'||x=='e') {
state=6;
} else if(x=='F'||x=='f') {
state=9;
} else {
return 0;
}
break;
case 5:
if(x==0) {
return 1;
} else if('0'<=x && x<='9') {
state=5;
} else if(x=='E'||x=='e') {
state=6;
} else if(x=='F'||x=='f'||x=='L'||x=='l') {
state=9;
} else {
return 0;
}
break;
case 6:
if(x=='+'||x=='-') {
state=7;
} else if('0'<=x && x<='9') {
state=8;
} else {
return 0;
}
break;
case 7:
if('0'<=x && x<='9') {
state=8;
} else {
return 0;
}
break;
case 8:
if(x==0) {
return 1;
} else if('0'<=x && x<='9') {
state=8;
} else if(x=='F'||x=='f'||x=='L'||x=='l') {
state=9;
} else {
return 0;
}
break;
case 9:
if(x==0) {
return 1;
} else {
return 0;
}
break;
}
i+=1;
}
}
int main() {
char tmp[40];
int num, x;
printf("num= ");
// 문자열로 입력을 받는다. 서식앞에 빈칸을 한개 준다.
scanf(" %s", tmp);
// 입력받은 문자열이 실수형인지 확인한다.
if(isReal(tmp)) {
printf("yes\n");
} else { // 실수형이 아니다. 이때는 no를 출력해 준다.
printf("no\n");
}
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
c소스 정리(이쁘게 만들기) (0) | 2014.05.25 |
---|---|
infix to prefix (0) | 2014.05.12 |
컴퓨터공학 c언어공부 미리선행 해야되나요?? (0) | 2014.04.12 |
숫자 마름모 (0) | 2014.04.02 |
문자열안의 문자정렬 (0) | 2014.04.02 |