C# 检查特殊公式中支架的完整性

C# 检查特殊公式中支架的完整性,c#,string,boolean,formula,C#,String,Boolean,Formula,如果用户输入的公式适用于术语,我的程序应该在屏幕上打印一条消息(您只能使用数字和字母,不能以“(”开头,就像数学公式一样,对于每个开括号,必须是合适的(并且在正确的位置)闭括号 以下是程序应接受并打印的一些公式: 真的- a(aa(a)aaa(aa(a)aa)aa)AAAA a((())) 以下是程序不应接受并打印的一些公式: 假的- ()()() )()()( 但是程序总是打印错误 谢谢你的帮助 代码如下:编辑 bool是数字(字符) { 返回“0123456789”。包含(字符);

如果用户输入的公式适用于术语,我的程序应该在屏幕上打印一条消息(您只能使用数字和字母,不能以“(”开头,就像数学公式一样,对于每个开括号,必须是合适的(并且在正确的位置)闭括号

以下是程序应接受并打印的一些公式:

真的-

  • a(aa(a)aaa(aa(a)aa)aa)AAAA
  • a((()))
以下是程序不应接受并打印的一些公式:

假的-

  • ()()()
  • )()()(
但是程序总是打印错误 谢谢你的帮助 代码如下:编辑

bool是数字(字符)
{
返回“0123456789”。包含(字符);
//或返回Char.IsNumber(字符);
}
布尔-伊斯兰特(字符)
{
返回“abcdefghijklmnopqrstuvwxwzabcdeffghigjklmnopqrstuvxyz”。包含(字符);
}
布尔已识别(字符)
{
返回is括号(字符)| IsNumeric(字符)| IsLetter(字符);
}
公共bool IsValidInput(字符串输入)
{
if(String.IsNullOrEmpty(输入)| | IsBracket(输入[0]))
{
返回false;
}
var BracketsCenter=0;
对于(变量i=0;i0)
{
返回false;
}
返回括号中心==0;
}
}
}

您的算法过于复杂-您只需要一个循环和一个计数器

  • 检查
    的初始字符(
    (您已经这样做了)
  • 将计数器设置为零,然后逐个检查每个字符
  • 如果字符不是字母或括号,则返回false
  • 如果字符是开口
    ),则递增计数器
  • 如果字符是一个结束符
    ,则减小计数器;如果计数器小于零,则返回false
  • 如果循环结束后计数为零,则返回
    true
    ;否则返回
    false

    • 您的算法过于复杂-您只需要一个循环和一个计数器

      • 检查
        的初始字符(
        (您已经这样做了)
      • 将计数器设置为零,然后逐个检查每个字符
      • 如果字符不是字母或括号,则返回false
      • 如果字符是开口
        ),则递增计数器
      • 如果字符是一个结束符
        ,则减小计数器;如果计数器小于零,则返回false
      • 如果循环结束后计数为零,则返回
        true
        ;否则返回
        false

        • 调试真的这么难吗?这种情况:

          ((!IsNumeric(st[i])) && (st[i] != '(') && (st[i] != ')')&&((st[i]<'a')||(st[i]>'z')||(st[i]<'A')||(st[i]>'Z')))
              return false;
          
          然后在您的大方法中,您可以安全地使用:

          if (!IsRecognized(st[i]))
              return false;
          
          对于这样一个琐碎的例子来说,这看起来可能有些过分,但从原则上讲,这是一种更好的方法,当然也更具可读性

          之后,您可以将代码简化为以下内容:

              bool IsInputValid(string input)
              {
                  if (String.IsNullOrEmpty(input) || IsBracket(input[0]))
                  {
                      return false;
                  }
                  var bracketsCounter = 0;
                  for (var i = 0; i < input.Length; i++)
                  {
                      var character = input[i];
                      if (!IsRecognized(character))
                      {
                          return false;
                      }
                      if (IsBracket(character)) // redundant?
                      {
                          if (character == '(') // then what?
                          if (character == ')') // then what?
                      }
                      if (bracketsCounter < what?)
                      {
                          what?
                      }
                  }
                  return bracketsCounter == what?;
              }
          
          顺便说一下,您的Isleter方法也犯了一个错误:
          …UVWXWZ?应该是UVWXYZ

          调试真的这么难吗?这种情况:

          ((!IsNumeric(st[i])) && (st[i] != '(') && (st[i] != ')')&&((st[i]<'a')||(st[i]>'z')||(st[i]<'A')||(st[i]>'Z')))
              return false;
          
          然后在您的大方法中,您可以安全地使用:

          if (!IsRecognized(st[i]))
              return false;
          
          对于这样一个琐碎的例子来说,这看起来可能有些过分,但从原则上讲,这是一种更好的方法,当然也更具可读性

          之后,您可以将代码简化为以下内容:

              bool IsInputValid(string input)
              {
                  if (String.IsNullOrEmpty(input) || IsBracket(input[0]))
                  {
                      return false;
                  }
                  var bracketsCounter = 0;
                  for (var i = 0; i < input.Length; i++)
                  {
                      var character = input[i];
                      if (!IsRecognized(character))
                      {
                          return false;
                      }
                      if (IsBracket(character)) // redundant?
                      {
                          if (character == '(') // then what?
                          if (character == ')') // then what?
                      }
                      if (bracketsCounter < what?)
                      {
                          what?
                      }
                  }
                  return bracketsCounter == what?;
              }
          
          顺便说一下,您的Isleter方法也犯了一个错误:

          …UVWXWZ?应该是UVWXYZ

          一个使用调试器的好机会。这是家庭作业吗?请说明。使用
          i这不是家庭作业。这是我在编程课程中做的大项目的一小部分。我忘了告诉你。这是一个使用调试器的好机会。这是家庭作业吗?请说明。使用
          i这不是家庭作业。它是我这是我在编程课上做的一个大项目的一小部分。我忘了告诉你。它有dubbuged。另外它应该检查相邻的括号-()应该是非法的,too@MorawskiOP示例表明它是好的(示例2)。但是我怎么能问它是否是无党派的呢?这是主要问题。我需要程序“理解”对于每个左括号,哪个是合适的parthner。@user1266429就是这样,您不需要精确地找到当前括号的“partner”来回答问题“括号是否平衡”。我描述的算法非常可靠地识别正确和错误的位置,而且非常简单。@user1266429你错了-看看他的算法:
          如果字符是结束符),递减计数器;如果计数器小于零,则返回false
          。如果在第一个结束括号之前没有开始括号,则遇到第一个结束括号时,计数器递减至-1,从而返回false。无需记住括号的索引。此外,它还应检查每个括号旁边的括号r-()应该是非法的,too@MorawskiOP示例表明它是好的(示例#2)。但是我怎么能问它是否没有parthnerless?这是主要问题。我需要程序“理解”每个左括号中哪个是合适的parthner。@user1266429就是这样,您不需要精确地找到哪个括号“partner”为了回答“括号是否平衡”的问题,使用当前的一个。我描述的算法识别corr