我要找...黑色81點的第23點
在這一串RNA若還有255點的Gamma和白色9點並且以區域排序,那勢必要在裡面大海撈針是一件可怕的事。
在此,建了一個搜尋器,只要打進關鍵字,會重建關鍵字,再使用重建的關鍵字去找你要找的點。
提供的功能:
找關鍵字搜尋,例如「白色」或「9點」的某一個特定的特色找出來。
精準搜尋,例如「白色9點,離邊1/3的第2點...」
下面可以看見,列舉了很多種,其中列舉的第一項(=0的那一項)可以拿它來設定成error的狀態。
CartridgeFinder.h
#ifndef CARTRIDGEFINDER_H
#define CARTRIDGEFINDER_H
enum reColorType{ rCL_NoMatch, rCL_Se, rCL_CrossTalk, ..., rCL_ShortCode };
enum rePtTotalType{ rPT_NoMatch, rPT_Normal, ..., rPT_Center, rPT_Word, rPT_PureDigital };
enum reMrIndexType{ rMI_NoMatch, rMI_Normal, rMI_Dian, rMI_PureDigital };
enum reParaType{ rPM_NoMatch, rPM_NoPara, rPM_Over, rPM_Length, rPM_Welt,..., rPM_PureDigital };
class CartridgeFinder
{
public:
const BOOL ReconstrKeyWord(CString&, CString&, CString&, CString&);
const BOOL Reconstr(CString&, CString&, CString&, CString&);
const BOOL Reconstr(CString&);
private:
const BOOL color(CString&);
const reColorType reColor(CString);
void reColorCrossTalk(CString&);
void reColorNits(CString&);
void reColorSe(CString&);
void reColorShortCode(CString&);
private:
const BOOL pointTotal(CString&);
const rePtTotalType rePointTotal(CString);
void rePointTotalCenter(CString&);
void rePointTotalWord(CString&);
void rePointTotalNormal(CString&);
void rePointTotalPureDig(CString&);
private:
const BOOL msrIndex(CString&);
const reMrIndexType reMsrIndex(CString);
void reMsrIndexDian(CString&);
void reMsrIndexNormal(CString&);
void reMsrIndexPureDig(CString&);
private:
const BOOL para(CString&);
const reParaType rePara(CString);
void reParaOver(CString&);
void reParaLength(CString&);
void reParaNoPara(CString&);
void reParaNits(CString&);
void reParaPureDig(CString&);
private:
BOOL isNumber(const CString& strResult);
};
#endif
CartridgeFinder.cpp
精準搜尋和關鍵字搜尋的關鍵
這兩個重建關鍵字的邏輯不同,結果也不同。一個是全都要對,另一個是部份對就可以了。有趣的是CString中找關鍵字的技巧的最後有提到關於「搜尋空字串」和「找不到」是兩回事。- 「找某關鍵字or空字串」→true
- 「找某關鍵字and找不到」→false
const BOOL CartridgeFinder::Reconstr(CString& sample)
{
CString clr = sample;
CString pt = sample;
CString mi = sample;
CString pr = sample;
if (Reconstr(clr, pt, mi, pr))
{
sample.Format("%s%s%s%s", clr, pt, mi, pr);
return TRUE;
}
else
return FALSE;
}
const BOOL CartridgeFinder::Reconstr( CString& bkColor, CString& PointTotal,
CString& MsrPointIndex, CString& Parameter)
{
if (color(bkColor) & pointTotal(PointTotal) & msrIndex(MsrPointIndex) & para(Parameter))
return TRUE;
else
return FALSE;
}
const BOOL CartridgeFinder::ReconstrKeyWord( CString& bkColor,
CString& PointTotal, CString& MsrPointIndex, CString& Parameter)
{
if (color(bkColor) | pointTotal(PointTotal) | msrIndex(MsrPointIndex) | para(Parameter))
return TRUE;
else
return FALSE;
}
重建關鍵字
為了判斷關鍵字的準確性,利用CString中找關鍵字的技巧在此對輸入的字做處理,重建成Cartridge2中會生成的字,到時使用==運算就可以找到了。 在此,只用「找出該量測項目位總共有多少點」的部份來示範設計。const BOOL CartridgeFinder::pointTotal(CString& strResult) { switch(rePointTotal(strResult)) { case rPT_Normal: rePointTotalNormal(strResult); return TRUE; case rPT_Center: rePointTotalCenter(strResult); return TRUE; case rPT_PureDigital: rePointTotalPureDig(strResult); return TRUE; case rPT_Word: rePointTotalWord(strResult); return TRUE; default: return FALSE; } } const rePtTotalType CartridgeFinder::rePointTotal(CString strResult) { int dianIndex(0); if ( strResult.Find("點") >= 0) { dianIndex = strResult.Find("點"); // 中心點; // 1點; // 12點; // 三點; CString centerSample = strResult.Mid(dianIndex-6, 6); CString oneSample = strResult.Mid(dianIndex-2, 2); CString wordSample = strResult.Mid(dianIndex-2, 2); if ( (atoi(oneSample) == 1) || (centerSample.Find("中心") >= 0) ) return rPT_Center; else if (atoi(wordSample) == 0) return rPT_Word; else return rPT_Normal; } //分開的 else if (isNumber(strResult)) return rPT_PureDigital; else { strResult.Empty(); return rPT_NoMatch; } } void CartridgeFinder::rePointTotalCenter(CString& strResult) { strResult.Format("中心點"); } void CartridgeFinder::rePointTotalNormal(CString& strResult) { const int colorName(strResult.Find("點")); int digitsCount(0); if (strResult.Left(colorName).GetLength() > 3) { //字串在三位數字前有別的字,用轉成數字判斷 if ( atoi(strResult.Mid(colorName-(3), 3)) >100) digitsCount = 3; else if ( atoi(strResult.Mid(colorName-(2), 2)) >10) digitsCount = 2; else if ( atoi(strResult.Mid(colorName-(1), 1)) > 0) digitsCount = 1; } else //三位數以內 digitsCount = strResult.Left(colorName).GetLength(); strResult.Format("%3s點", strResult.Mid(colorName-(digitsCount), digitsCount) ); } void CartridgeFinder::rePointTotalWord(CString& strResult) { const int DianIndex(strResult.Find("點")); CString Word; Word.Format("%s", strResult.Left(DianIndex)); if ( (DianIndex - Word.Find("一") == 2) && (Word.Find("一") >= 0) ) strResult.Format("中心點"); else if ( (DianIndex - Word.Find("二") == 2) && (Word.Find("二") >= 0) ) strResult.Format("2點"); else if ( (DianIndex - Word.Find("三") == 2) && (Word.Find("三") >= 0) ) strResult.Format("3點"); else if ( (DianIndex - Word.Find("四") == 2) && (Word.Find("四") >= 0) ) strResult.Format("4點"); else if ( (DianIndex - Word.Find("五") == 2) && (Word.Find("五") >= 0) ) strResult.Format("5點"); else if ( (DianIndex - Word.Find("六") == 2) && (Word.Find("六") >= 0) ) strResult.Format("6點"); else if ( (DianIndex - Word.Find("七") == 2) && (Word.Find("七") >= 0) ) strResult.Format("7點"); else if ( (DianIndex - Word.Find("八") == 2) && (Word.Find("八") >= 0) ) strResult.Format("8點"); else if ( (DianIndex - Word.Find("九") == 2) && (Word.Find("九") >= 0) ) strResult.Format("9點"); else if ( (DianIndex - Word.Find("十") == 2) && (Word.Find("十") >= 0) ) strResult.Format("10點"); else strResult.Format(""); } void CartridgeFinder::rePointTotalPureDig(CString& strResult) { int Digital = atoi(strResult); if (Digital == 1) strResult.Format("中心點"); else strResult.Format("%3d點", Digital); }