一、什麼是前字尾
字串的字首:符號串左部的任意子串(或者說是字串的任意首部)
字串的字尾:符號串右部的任意子串(或者說是字串的任意尾部)
舉例:比如 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裡的,千萬不要搞錯了
以上所有內容就是本次實驗的所有內容了。
最後給出我們做出來的最終結果
圖片我也不知道怎麼回事,全是橢圓形,就湊活著看吧!!!