?? 有限自動機.cpp
字號:
//程序功能:
//利用狀態表和有限自動機的運行原理,識別一個輸入串是否為一個有效的無符號定點實數。
//
//例:
//輸入:1#
//輸出:接受
//輸入:3.14#
//輸出:接受
//輸入:3ab#
//輸出:不接受
//輸入:1.2.3
//輸出:不接受
//
//輸入數據要求:不能有空格,以'#'結束(在本程序可以不用'#'結束)。
//輸出:如果是無符號定點實數,顯示“接受”;否則顯示“不接受”。
//
//注:通過改變狀態表和Run()函數,可以改變程序的功能。
// 如可將狀態表改變成識別“偶數”的有限自動機的狀態表
// 將狀態表改變成識別“無符號實數”的有限自動機的狀態表
/////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
//狀態表相關存儲信息:
#define STATE_NUMBER 4 //狀態數目
#define CHAR_NUMBER 2 //輸入字符的種類: d 和 .
#define DIGIT 0 //輸入數字在狀態表中位于第0列
#define DOT 1 //小數點位于狀態表的第1列
//State[][]為狀態表,以整數組形式存放,0,1,2,3表示狀態,-1表示沒有此狀態
int State[STATE_NUMBER][CHAR_NUMBER]
= {{1,-1},
{1,2},
{3,-1},
{3,-1}};
int Q[STATE_NUMBER] = {0,1,0,1}; //終態標志:0非終態,1終態。
//緩沖區:
//輸入緩沖區:由專門函數操作(ReadALine(),GetChar())
#define BUFFER_SIZE 1000 //表達式緩沖區大小
char Buffer[BUFFER_SIZE]; //表達式緩沖區,以'\0'表示結束
int ipBuffer = 0; //表達式緩沖區當前位置序號
char ch; //存放取得的一個字符
//函數聲明:
bool Run(); //對存儲在緩沖區的一行字符串(以'#'結束)進行運行
void Init(); //全局初始化
bool ReadALine(); //從鍵盤讀一行(沒有空格),存于表達式緩沖區Buffer[]中
char GetChar(); //從緩沖區取一個字符,返回該字符的同時將它存于全局變量ch中
//主程序:
void main()
{
Init();
while(ReadALine()) //讀一行成功,對它進行判斷
{
if(Run()) //對該行進行運行,看是否能被接受?
printf("接受\n\n");
else
printf("不接受\n\n");
}
}
//對存儲在緩沖區的一行字符串(以'#'結束)進行運行
//返回:如果是無符號定點實數,返回true;否則返回:false
bool Run()
{
int S=0; //S存放運行時的當前狀態,目前為初態
while(GetChar()!='#')
{
if(ch >= '0' && ch <= '9') //數字
S = State[S][DIGIT]; //將狀態轉換成輸入數字后的狀態
else if(ch == '.') //小數點
S = State[S][DOT]; //將狀態轉換成輸入小數點后的狀態
else //其他都為非法字符
return false;
if(S == -1) //處于非法狀態
return false;
}
//運行結束,判斷S是否為終態
if(Q[S] == 1) //終態
return true;
else //非終態
return false;
}
//全局初始化
void Init()
{
//好像無需初始化
printf("程序功能:輸入一個字符串,判斷它是否是無符號定點實數。\n");
printf("======================================================\n\n");
}
//從鍵盤讀一行(沒有空格),存于表達式緩沖區Buffer[]中,以'#'結束,并置ipBuffer=0;
//讀到非空字符串:返回 true;讀到單獨的“#”:返回 false
bool ReadALine()
{
int l;
printf("請輸入以\"#\"號結束的無空格字符串:");
scanf("%s",Buffer);
l = strlen(Buffer); //讀入的字符串的長度
if(l == 0) return ReadALine(); //輸入了空字符串,重新輸入
if(Buffer[0] == '#') return false; //輸入單獨的'#'表示不再輸入
Buffer[l] = '#'; //最后一個字符用結束標記'#'代替(本來是'\0')
ipBuffer = 0; //初始化緩沖區指針
return true;
}
//從緩沖區取一個字符,返回該字符的同時將它存于全局變量ch中
//成功:返回字符;不成功:返回'#'
char GetChar()
{
if((ch = Buffer[ipBuffer]) != '#')
ipBuffer ++;
return ch;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -