c·c++/c 프로그래밍

부동소수점 판정

바로이순간 2014. 5. 11. 16:11



위와 같은 부동소수점(실수)상수 를 입력받으면 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