class//CartridgeFinder

搜尋一整串的Cartridge2(RNA),要怎麼做?

我要找...黑色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);
}

文章分類維度