숫자인식 오토마타
프로그래밍/C/C++ 2007. 4. 14. 03:43 |확실한건지는 나도 모름..--
#include
#include
#include
enum STATE{IS_START, IS_INTEGER, IS_OCTAL, IS_HEXA, IS_POINT, IS_POWER, IS_QUIT};
bool plus = true;
bool powerPlus = true;
int main()
{
int NowState = 0;
int CharLen = 0;
int index = 0;
double result = 0;
int length = 0;
int temp = 0;
int square = 0;
char data[10];
printf("Input Data: ",data);
scanf("%s", data);
CharLen = strlen(data);
if(data[0] == '-')
{
plus = false;
index = 1;
}
while(index != CharLen)
{
switch(NowState)
{
case IS_START:
if(data[index] >= (int)'1' && data[index] <= (int)'9')
NowState = IS_INTEGER;
else if(data[index] == (int)'0')
NowState = IS_OCTAL;
else NowState = IS_QUIT;
break;
case IS_INTEGER:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_INTEGER;
else if(data[index] == (int)'0')
NowState = IS_OCTAL;
else if(data[index] == (int)'.')
NowState = IS_POINT;
else if(data[index] == (int)'E' || data[index] == (int)'e')
NowState = IS_POWER;
else NowState = IS_QUIT;
break;
case IS_OCTAL:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_OCTAL;
else if(data[index] == (int)'x')
NowState = IS_HEXA;
else if(data[index] == (int)'.')
NowState = IS_POINT;
else NowState = IS_QUIT;
break;
case IS_HEXA:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_HEXA;
else if((data[index] >= (int)'A' && data[index] <= (int)'F')
||(data[index] >= (int)'a' && data[index] <= (int)'f'))
NowState = IS_HEXA;
else if(data[index] == (int)'.')
NowState = IS_POINT;
else NowState = IS_QUIT;
break;
case IS_POINT:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_POINT;
else if(data[index] == (int)'E' || data[index] == (int)'e')
NowState = IS_POWER;
else NowState = IS_QUIT;
case IS_POWER:
if(data[index] == (int)'-')
{
powerPlus = false;
break;
}
else if(data[index] >= (int)'0' && data[index] <= (int)'9')
{
NowState = IS_POWER;
}
else NowState = IS_QUIT;
break;
}//End of Switch
index++;
}//End of While
printf("nNowState: ");
if(plus == false)
printf("-");
switch(NowState)
{
case IS_START:
printf("Start");
break;
case IS_INTEGER:
result = atoi(data);
printf("integer");
break;
case IS_OCTAL:
if(plus==true)
length = CharLen-1;
else length = CharLen-2;
index = CharLen;
square = 1;
while(index>CharLen-length)
{
temp = ((int)data[index-1]-48);
result += temp*square;
square = square*8;
index--;
}
printf("octal");
break;
case IS_HEXA:
if(plus==true)
length = CharLen-2;
else length = CharLen-3;
index = CharLen;
square = 1;
while(index>CharLen-length)
{
if(data[index-1] >= (int)'A' && data[index-1] >= (int)'F')
temp = (int)data[index-1]-54;
else if(data[index-1] >= (int)'a' && data[index-1] >= (int)'f')
temp = (int)data[index-1]-86;
else temp = (int)data[index-1]-48;
result += temp*square;
square = square*16;
index--;
}
printf("hexa");
break;
case IS_POWER:
printf("power");
break;
case IS_QUIT:
printf("quit");
}
printf("nDataResult: %0.3lf", result);
return 0;
}
8 진 정수 - 숫자 앞에 0
10 진 정수
16 진 정수 - 숫자 앞에 0x 또는 0X
7e2 - 7 x 10^2
05E-2 - 0.5 x 10^-2
직접 뚜드려서 변환도 가능(단, 10진수 → 문자 only)
=> ALT 를 누른상태에서 10진수(키패드 only)를 입력한뒤 ALT를 떼면 문자로 바뀌게된다.
//================================================================
//12-5
//================================================================
#include
#include
/*
int main(int argc, char *argv[])
{
int i;
//
printf("nThe following arguments were passed to main(): ");
printf("nARGC: %dn", argc);
for(i=1;i
printf("n");
//
printf("nParameter test: ");
printf(" of argc: %dn", argc);
for(i = 0; i< argc; i++){
printf("%s", argv[i]);
}
printf("n");
return 0;
}
*/
//===============================================================
//cd Microsoft vi*: 알아서 찾아 들어가준다..신기신기~
//test.exe도 argc에 포함이 된다 그래서 초기 카운터는 1
//===============================================================
int main(int argc, char* argv[])
{
int i;
int value;
int sum = 0;
printf("nThe following numerical data of the arguments passed to main(): ");
for(i=1;i
value = atoi(argv[i]);
sum += value;
printf("%d", value);
}
printf("nThe sum of the numerical data is %dn", sum);
return 0;
}
#include
#include
//===============================================================
//11-5
//===============================================================
/*
int main()
{
FILE* fptr;
char ch;
long int offset, last;
fptr = fopen("test.txt", "r");
if(fptr == NULL)
{
printf("error");
exit(1);
}
fseek(fptr, 0L, SEEK_END);
last = ftell(fptr);
for(offset = 0; offset < last; ++offset)
{
fseek(fptr, offset, SEEK_SET);//앞에서부터 출력
//fseek(fptr, -offset, SEEK_END);//뒤에서 부터 출력
ch = getc(fptr);
switch(ch)
{
case 'n': printf("LF : ");
break;
case EOF : printf("EOF : ");
break;
default: printf("%c :", ch );
}
}
fclose(fptr);
return 0;
}
*/
//===========================================================
//11-6
//===========================================================
int main()
{
FILE* fptr;
char ch;
fptr = fopen("test.txt", "r");
if(fptr == NULL)
{
printf("Error");
exit(1);
}
fseek(fptr, 0L, SEEK_SET);
ch = getc(fptr);
printf("%c", ch);
return 0;
}
//12장=========================
#include
/*
int main()
{
enum color {red, green = 4, yellow};
//4를 넣으면 yellow는 5가 된다
enum color crayon = red;
printf("nThe color is %dn", crayon);
printf("Enter a value: ");
scanf("%d", &crayon);
if(crayon == red)
printf("The crayon is red.n");
else if(crayon == green)
printf("The crayon is green.n");
else if(crayon == yellow)
printf("The crayon is yellow.n");
else
printf("The color is not defined.n");
return 0;
}
*/
//입력에 yellow를 쓰면 red가 나온다...집접 타이핑은 안된다...
int main()
{
int hour, rate;
hour = 50;
rate = (hour>40)?1:2;
printf("The rate is: %d", rate);
return 0;
}
여러분이 고생했던것 중 하나가 숫자 입력과는 달리 문자 입력의 경우에는 공백도 하나의 문자로 취급되어진다는 것을 지금은 알고 있을 것입니다.
그래서 대부분 학생이 %s를 사용했고요..
과연 %c를 사용해서 해결할 수 있는 방법은 없을까요...
물론 있겠지요....
몇분은 fflush(stdin)라고 말을 할것입니다.
그럼 다른 방법은요??
아래 소스를 보세요