2012-04-11 84 views
0

我的程序試圖將特殊公式(請參閱示例)擴展爲明確的公式。有幾個術語,語法必須站在: - 沒有空格(「」)在整個公式 - 該公式僅包含圓括號「(,)」,而不是括號中的所有括號「{} []」 - 公式僅包含字母(az,AZ),數字(也包含數字)和圓括號。 - 對於每個開口支架,必須是合適的閉合支架。 - 公式不能以括號開頭。擴展和圖特殊處理公式

這裏是一些例子: *輸入: 'abz2(圖3(a)2(AB))一個 輸出:' abzaaaababaaaababa

  • 輸入:「A2(A)6(G2(a)中)」 輸出: 'aAAgagagagagaga'

和繼承人的代碼:

 bool ExistBrackets(string st) 
    { 
     for (int i = 0; i < st.Length; i++) 
     { 
      if (IsBracket(st[i])) 
       return false; 
     } 
     return true; 
    } 

    string AddChainDeleteBracks(int open, int close, string input) 
    { 
     string to="",from=""; 
     //get the local chain multipule the number in input[open-1] 

     //the number of the times the chain should be multiplied 
     for (int i = input[open - 1]; i > 0; i--) 
     { 
      //the content 
      for (int m = open + 1; m < close; m++) 
      { 
       to = to + input[m]; 
      } 
     } 

     //get the chain i want to replace with "to" 
     for (int j = open - 1; j <= close; j++) 
     { 
      from = from + input[j]; 
     } 
     String output = input.Replace(from, to); 
     return output; 
    } 

    private void PopulateStartEnd() 
    { 
     //assuming that start and end are empty 
     int cS=0,cE=0; 
     //populate start 
     for (int i = 0; i < (textBox1.Text.Length); i++) 
     { 
      if (textBox1.Text[i] == '(') 
      { 
       start[cS] = i; 
       cS++; 
      } 
      if (textBox1.Text[i] == ')') 
      { 
       end[cE] = i; 
       cE++; 
      } 
     } 

     } 


    private string FigureInput(string st) 
    { 
     int i,close; 
     PopulateStartEnd(); 
     //get the index in the start array which is populated 
     for (i = start.Length - 1; start[i] != 0; i--) ; 
     //populate the last letters if there is outside the brackets 
     while (!ExistBrackets(st)) 
     { 
      //loop on the latest opening brackets in start array 
      for (; i >= 0; i++) 
      { 
       //find the suitable closing brackets in the end array 
       for (close = 0; ((end[close] > start[i]) && (end[close] != null)); close++) ; 
       st=AddChainDeleteBracks(i, close, st); 
      } 
     } 

     return st; 

    } 

的主要方法是FigureInput

錯誤我得到:

** * ** 異常文本 ** * **** 系統。 IndexOutOfRangeException:索引超出了數組的範圍。 C:\ Projects_2012 \ Project_Noam \ Project \ myProject \ myProject \ Formula.cs中的myProject.Formula.PopulateStartEnd()中的 :行156 at myProject.Formula.FigureInput(String st)in C:\ Projects_2012 \ Project_Noam \ myProject的\ myProject的\ Formula.cs:線135 在myProject.Formula.generateButton_Click(對象發件人,EventArgs e)如C:\ Projects_2012 \ Project_Noam \項目\ myProject的\ myProject的\ Formula.cs:線36

+0

您是否在異常被引發的位置檢查了不同字符串的值?字符串長度是否正確? 「開始」和「結束」數組是否以合適的大小初始化? – Oded 2012-04-11 11:10:59

+0

開始和結束的大小相同,但並非所有單元格都已填充。你的意思是輸入字符串? – Noam650 2012-04-11 11:40:48

+0

也可能是輸入字符串。異常表明你要訪問一個不存在的索引 - 它可能在'textBox1.Text','start'或'end'中(檢查'i','cS'和'cE的值'當發生異常並且與不同數組的'Length'進行比較時)。 – Oded 2012-04-11 12:34:29

回答

0

你從不檢查close小於end.LengthFigureInput的最內圈for循環中。注意:C#中的字符串不是空終止的。

改變循環到這一點:

for (close = 0; (close < end.Length && (end[close] > start[i])); close++) ; 

我從來沒有看到你初始化endstart具有足夠的大小。確保它們足夠大或更好使用List<int>,您可以使用Add添加索引。

+0

結束和開始是輸入字符串的一半大小,但不是所有單元格結束和開始填充。那麼我怎麼能要求到達我填充的最後一個? – Noam650 2012-04-11 11:26:04

+0

和我鋼鐵得到這個錯誤。 – Noam650 2012-04-11 11:27:40