C# 輸出一個字符串的前綴、後綴和它的子串(信息內容安全 實驗一)

  • 2021 年 3 月 31 日
  • 筆記

一、什麼是前後綴

     字符串的前綴:符號串左部的任意子串(或者說是字符串的任意首部)

  字符串的後綴:符號串右部的任意子串(或者說是字符串的任意尾部)

  舉例:比如 101110 它的前綴就是空串、1、10、101、1011、10111、101110 ;後綴就是空串、0、01、011、0111、01110、011101

二、設計窗口界面

  進入vs,選擇C#窗口應用,創建一個新的項目,然後就是設計一個窗口界面

  1、字符串輸入

    想要獲取輸入的字符串,這裡選擇TextBox這個控件,直接在工具箱中選擇這個控件,拖入到窗口中,然後放到你想要放的位置

  2、執行按鈕

    執行按鈕就是運行函數的按鈕,通過這些函數來獲取通過TextBox輸入的字符串的前後綴以及子串,這裡的控件就選擇Button

  3、結果輸出

    輸出窗口就是輸出經過運行函數後得到的結果,這裡控件選用ListBox

 

  4、退出窗口

    退出按鈕就是直接結束整個文件的運行,同樣選用Button

這是最終設計結果的樣圖(可以按照自己的喜好來進行排版)

 

 

三、函數實現

  在這裡我們從難到易開始講解,先是退出按鈕的定義,然後是執行按鈕的定義。

  1、退出

    在退出按鈕上雙擊,進行這個按鈕的定義,在這個按鈕的函數中輸入以下內容,就達到了我們的目的了

     1 this.Close(); 

  2、執行

    在執行按鈕中包含了許多的函數,用來對字符串進行前綴、後綴、子串的篩選,在這個版塊中,首先講解一下,我們自己定義的前後綴函數的含義

       //前綴函數
        private string[] prefix(string str)
        {
            int len = str.Length; //獲取字符串的長度
            string s = "";  //用於存放每一個元素
            string[] result = new string[len];  //定義新的數組
            for(int i=0;i<len;i++)
            {
                s = s + str[i];   //每次往後加一個字符
                result[i] = s;    //把結果存放到新的數組中
            }
            return result;
        }
       //後綴函數
        private string[] suffix(string str)
        {
            int len = str.Length;  //獲取字符串長度
            string s = "";   //用於存放每一個元素
            string[] result = new string[len];//定義新的數組
            for (int i = len - 1; i >= 0; i--)
            {
                s = str[i] + s;  //每次從後往前加一個字符
                result[len - 1 - i] = s;  //把結果存放到新的數組
            }
            return result;
        }

因為我已經在代碼注釋中詳細解釋了每一行的含義,這裡就不再進行過多的贅述,所以接下來我們就直接講述,對這兩個函數的調用,以及輸出結果

接下來所有的代碼都是定義在執行按鈕里的,也就是你要雙擊執行按鈕,進入代碼界面,找到執行的函數,然後在裏面輸入以下的代碼

首先,是對於輸入空字符串的警告(也就是你啥也沒輸入,就點擊了執行,總要提醒讓你輸入)

if (text_input.Text == "")
{
    MessageBox.Show("尚未輸入字符!請重新輸入。");  //顯示警告提示窗
}

上面出現了if,那下面就少不了else,但是這個else里的內容比較多;

首先出現在else里的是對TextBox中內容的獲取,在C++中就相當於cin

string str = text_input.Text;//獲取用戶輸入的串
int len = text_input.Text.Length;  //獲取這串字符串的長度
string output_str = "串X = " + str;               
result.Items.Add(output_str);//把文本值附加到listbox中

既然我們已經獲取到了想要處理的字符串,那接下來就是把這串字符串送到我們之前定義的前後綴函數中進行處理,也就是輸出,我們想要的前後綴字符串

//輸出前綴及個數
string[] result_pre = prefix(str);  //定義新的數組,存放前綴函數處理的內容
string output_pre = "X的前綴 = { ";   //定義輸出的格式
for(int i=0;i<len;i++)               //循環輸出上述新數組中的內容
{
    output_pre = output_pre + result_pre[i] + ", ";
}
output_pre = output_pre + "空串 }   個數 = " + (len + 1);  //這裡對len加1 是因為還有一個空串
result.Items.Add(output_pre); //把結果添加到ListBox中,顯示出來
//輸出後綴及個數
string[] result_suf = suffix(str);     //定義新的數組,存放前綴函數處理的內容
string output_suf = "X的後綴 = { ";    //定義輸出的格式
for (int i = 0; i < len; i++)      //循環輸出上述新數組中的內容
{
    output_suf = output_suf + result_suf[i] + ", ";
}
output_suf = output_suf + "空串 }   個數 = " + (len + 1);    //這裡對len加1 是因為還有一個空串
result.Items.Add(output_suf);                            //把結果添加到ListBox中,顯示出來

在上述輸出前後綴代碼中,對每一行代碼都進行了詳細的注釋,這裡也就不再進行過多的贅述,自行參悟

在輸出了前綴、後綴之後,我們就需要輸出最後的內容——子串

//輸出子串及其個數
int max_res_index = ((1 + len) * len) / 2;   //計算得出字串的最長長度
string[] result_son = new string[max_res_index]; //定義一個新的數組,長度為計算的長度
int res_index = 0;
for (int i = 0; i < len; i++)
{
    string[] temp = prefix(str);  //去掉一個字符之後的串的前綴
    for (int j = 0; j < len - i; j++)
    {
        result_son[res_index] = temp[j];
        res_index++;
     }
      str = str.Remove(0, 1);//刪除開頭的字符
}    

經過上面的運算後,會發現會出現重複的子串,這裡就要進行去重處理

//去重
for (int i = 0; i < max_res_index; i++)
{
    for (int j = i + 1; j < max_res_index; j++)
    {
        if (result_son[i] == result_son[j])
            {
                 for (int k = j + 1; k < max_res_index; k++)
                     {
                          result_son[k - 1] = result_son[k];
                      }
                      max_res_index--;
                      j--;
        }
    }
}       

在完成所有的操作後,就要把得到的子串通過ListBox輸出

string output_son = "X除前後綴之外的子串 = { ";
for (int i = 0; i < max_res_index - 1; i++)
    {
        output_son = output_son + result_son[i] + ", ";
    }
output_son = output_son + result_son[max_res_index - 1] + "  空串 }   個數 = " + (max_res_index+1);
result.Items.Add(output_son);

因為和上面的代碼類似,這裡也就不解釋了

到這裡我們的執行按鈕的所有代碼就結束了這麼多的內容都是在else里的,千萬不要搞錯了

以上所有內容就是本次實驗的所有內容了。

最後給出我們做出來的最終結果

 

圖片我也不知道怎麼回事,全是橢圓形,就湊活着看吧!!!