2

如果用户输入的公式适合条款,我的程序应该在屏幕上打印一条消息(你只能使用数字和字母,你不能以'('开头,就像数学公式一样,对于每个左括号,都有成为一个合适的(并且在正确的位置)右括号。

这里有一些程序应该接受并打印的公式:

真的-

  • 一个(aa(a)aaa(aa(a)aa)aa)aaaaa
  • 一种(((())))

这里有一些程序不应该接受和打印的公式:

错误的-

  • ()()()
  • )()()(

但程序总是打印 False 感谢您的帮助 继承代码:编辑

    bool IsNumeric(char character)
    {
        return "0123456789".Contains(character);
        // or return Char.IsNumber(character);
    }

    bool IsLetter(char character)
    {
        return "ABCDEFGHIJKLMNOPQRSTUVWXWZabcdefghigjklmnopqrstuvwxyz".Contains(character);

    }

    bool IsRecognized(char character)
    {
        return IsBracket(character) | IsNumeric(character) | IsLetter(character);
    }
    public bool IsValidInput(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))
            {
                if (character == '(')
                    bracketsCounter++;
                if (character == ')')
                    bracketsCounter--;
            }
        }


        if (bracketsCounter > 0)
        {
            return false;
        }

        return bracketsCounter==0;
    }
}
}
4

2 回答 2

3

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

  • 检查初始字符((您已经这样做了)
  • 将计数器设置为零,并逐个遍历每个字符
  • 如果字符不是字母或括号,则返回 false
  • 如果字符是开口(,则增加计数器
  • 如果字符是 close ),则减少计数器;如果计数器小于零,则返回 false
  • true如果循环结束后计数为零,则返回;否则返回false
于 2012-04-04T11:59:45.657 回答
1

调试真的这么难吗?这个条件:

((!IsNumeric(st[i])) && (st[i] != '(') && (st[i] != ')')&&((st[i]<'a')||(st[i]>'z')||(st[i]<'A')||(st[i]>'Z')))
    return false;

显然是错误的。它每次都返回falsea你不考虑a大于Z

编辑:

那么我怎样才能使它更容易阅读呢?这是我认为的唯一方法。你有其他解决这个问题的方法吗?

至于那个条件块 - 例如,使用更小的方法/函数。

bool IsBracket(char character)
{
    return (character == '(' | character == ')');
}

bool IsNumeric(char character)
{
    return "0123456789".Contains(character);
    // or return Char.IsNumber(character);
}

bool IsLetter(char character)
{
    // see why this is NOT prone to fail just because 'a' is greater than 'Z' in C#?
    return (character >= 'a' & character <= 'z') |
        (character >= 'A' & character <= 'Z');

    // or return Regex.IsMatch(character.ToString(), "[a-zA-Z]", RegexOptions.None);
    // or return Char.IsLetter(character);
}

// now you can implement:
bool IsRecognized(char character)
{
    return IsBracket(character) | IsNumeric(character) | IsLetter(character);
}

然后在你的大方法中你可以安全地使用:

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?;
    }

(dasblinkenlight的算法)

编辑 4 月 10 日

你理解错了。

    bool IsNumeric(char character)
    {
        return "0123456789".Contains(character);
        // or return Char.IsNumber(character);
    }

    bool IsLetter(char character)
    {
        return "ABCDEFGHIJKLMNOPQRSTUVWXWZabcdefghigjklmnopqrstuvwxyz".Contains(character);

    }

    bool IsRecognized(char character)
    {
        return IsBracket(character) | IsNumeric(character) | IsLetter(character);
    }
    public bool IsValidInput(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))
            {
                if (character == '(')
                    bracketsCounter++;
                if (character == ')')
                    bracketsCounter--;
            }
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            if (bracketsCounter < 0) // NOT "> 0", and HERE - INSIDE the for loop
            {
                return false;
            }
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        }

        return bracketsCounter==0;
    }
}
}

顺便说一句,您的 IsLetter 方法也犯了一个错误:...UVWXWZ? 应该是 UVWXYZ

于 2012-04-04T11:59:52.960 回答