延伸并计算特殊处理配方

时间:2012-04-11 11:05:33

标签: c# formula brackets

我的程序试图将特殊公式(参见示例)扩展为明确的公式。很少有关于furmula必须代表的术语: - 整个公式中没有空格(“”) -it公式只有圆括号“(,)”而不是所有括号形式“{} []” - 公式只包含字母(a-z,A-Z),数字(也是数字)和圆括号。 - 对于每个开口支架,必须是合适的封闭支架。 - 公式不能以括号开头。

以下是一些例子: *输入:'abz2(3(a)2(ab))a     输出:'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

我得到的错误:

** * ** 异常文字 ** * **** System.IndexOutOfRangeException:索引超出了数组的范围。    在C:\ Projects_2012 \ Project_Noam \ Project \ myProject \ myProject \ Formula.cs中的myProject.Formula.PopulateStartEnd():第156行    在C:\ Projects_2012 \ Project_Noam \ Project \ myProject \ myProject \ Formula.cs中的myProject.Formula.FigureInput(String st):第135行    at myProject.Formula.generateButton_Click(Object sender,EventArgs e)在C:\ Projects_2012 \ Project_Noam \ Project \ myProject \ myProject \ Formula.cs:第36行

1 个答案:

答案 0 :(得分:0)

您永远不会检查closeend.Length的{​​{1}}循环中for是否小于FigureInput。注意:C#中的字符串不会以空值终止。

将循环更改为:

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

我从未见过你以适当的尺寸初始化endstart。确保它们足够大或更好地使用List<int>,您可以使用Add添加索引。