用狀態機進行檔案字元分析的程式設計

2021-09-01 03:31:55 字數 1757 閱讀 6956

1、 問題描述

設計c++ 類,使其能夠統計文字檔案中字元個數,在終端中顯示結果,並將結果儲存到指定的檔案中。需要統計的字元有: a 、英文本母總數 b 、英文單詞總數從 c 、中文字元總數(包括標點符號) d 、行總數e 、其他字元總數(包括英文標點、空白符等)。

2、 問題分析

從問題描述中可以看到,我們所要做的就是將一篇文章(txt 格式,字元格式為 ansi )中出現的中英文本元出現的次數進行統計。而一篇文字檔案中出現的字元種類和順序沒有規律,如何對當前讀取的字元的種類進行判斷並轉入到相應的統計狀態成為了問題的關鍵。

但是,我們知道對於英文本母其ascii 碼範圍在 65 ~ 90 和 97 ~ 122 兩個區間,而英文單詞的判斷就是在相鄰兩個非英文本母之間夾著一串英文本母,所以我們可以在讀取了第乙個非英文本母後判斷下乙個讀取的是否為英文本母,如果是便轉入英文本元的處理狀態,其中可同時對字母個數進行統計,在讀到非英文本元時退出該狀態,並將英文單詞數加 1 ,然後轉入「狀態轉換中心」進行狀態轉換的判斷。

同理,對於中文字元的處理,也同上所述。但是由於中文字元佔兩個位元組,而且各個編碼格式中中文字元的編碼範圍不一致,所以處理起來比較麻煩,但是原理是一致的。在本例中僅對ansi 格式的編碼進行處理,所以中文字元每個位元組的範圍為 0x80 ~ 0xff ,不過在實際操作中發現有些中文字元還是被漏掉了,應該是中文字元的編碼範圍並沒有全部包括進去的原因。

其他的字元處理沒有什麼難處,所以在此就不多述了。具體的見狀態轉換圖吧。

3、 程式設計

首先,為類定義乙個狀態,如: 

typedef enumsticstate;
其中,chn 表示「中文字元處理」狀態, word 表示「英文本元處理」狀態, lin 表示「行符處理」狀態, bound 表示「分界符處理」狀態, prepro (預處理)就是「狀態轉換中心」。

字元統計程式如下:

file.get(ch);

sticstate state=prepro;

while(1) while(file.get(ch));

state=prepro;

break;

case word:

do while(file.get(ch));

wordnum++;

state=prepro;

break;

case lin:

do while(file.get(ch));

state=prepro;

break;

case bound:

do while(file.get(ch));

state=prepro;

break;

case prepro:

if(到檔案尾)

else if(ch=分界符) state=bound;

else if(ch=英文本元) state=word;

else if(ch=中文字元) state=chn;

else if(ch=行符) state=lin;

break;

default:

cout<

本程式採用狀態機的思想完成了設計要求,雖然不盡完美,但是我們也能從中學到如何用狀態機的思想來比較輕鬆的完成程式設計。從本例可以看出,通過狀態機的思想可以使程式變得簡單、清晰、明了。所以,我們應該充分利用好這一有利的工具為我們的程式設計增添光彩!

另附狀態機學習的文章一篇:

系統程式設計師成長計畫-文字處理(ini解析器)

按鍵的程式設計 狀態機1

現在的大學教育就是這樣。學無法致用。狀態機第一次見的時候是在數電裡面,那個時候是研究數位電路 比如鎖存器 用到的。不過由於是自學的,所以早就忘的一塌糊塗了。沒上完大學的人就是這樣啊。不過狀態機同樣在硬體的程式設計中得到廣泛使用。第一次見到狀態機的程式設計,就是在按鍵的程式設計中 馬潮老師的書 後來覺...

用element ui進行檔案的上傳

在進項的專案中,我使用vue配合element搭建的專案,現在需要用到上傳檔案的寫法!現在列舉下我的專案中所使用的上傳檔案的方法!選取檔案 匯入 上傳檔案有多重方式來進行,這裡敘述下手動上傳的方法,並且用了請求的攔截。如果你的上傳不需要其他的引數,那麼你可以直接通過action填寫上傳位址來進行,如...

狀態機思路在程式設計中的應用

狀態機思路在微控制器程式設計中的應用 狀態機的概念 狀態機是軟體程式設計中的乙個重要概念。比這個概念更重要的是對它的靈活應用。在乙個思路清晰而且高效的程式中,必然有狀態機的身影浮現。比如說乙個按鍵命令解析程式,就可以被看做狀態機 本來在a狀態下,觸發乙個按鍵後切換到了b狀態 再觸發另乙個鍵後切換到c...