鱼C论坛

 找回密码
 立即注册
查看: 113|回复: 10

[已解决]为什么循环中的break没有按照预定的那样跳出循环,导致变量i的值恒等于目标值

[复制链接]
发表于 2024-8-28 10:40:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是020讲课后作业的动手环节,代码如下。在代码中,设置当出现指定元素不相等的情况就跳出循环,此时变量i并未执行i+=1,直到所有元素都正确匹配后i才会等于列表长度。
但是运算的结果是:只要输入的字符串长度为偶数,不管实际是否合法,最终打印的将结果都是“合法”,这与代码的预先设置不符。
求助大佬指点以下代码中的错误出现在哪里。【万分感谢!!】
#020讲课后作业:判断字符串的括号写法是否合法#

str_test = input("请输入测试字符串:")  #这里得到的只是一个字符串#

str_test0 = []    #将字符串单个拆分,装入给定的列表,初始列表为空#

for each in str_test:

    str_test0.append(each)    #将字符串中的每个元素按顺序装入列表#

str_test = str_test0      #列表重命名#

str_len = len(str_test)    #得到列表的长度,表明里面的元素总数#

a = int(str_len/2)    #列表长度的一半,需要取整数#

if str_len % 2 == 0:    #只有当列表长度为偶数时才有可能合法,奇数可以直接判定不合法#

    str_f = str_test[:a]    #将列表的前半部分切片给新列表f#

    str_b = str_test[a:]    #将列表的后半部分切片给新列表b#

    str_b = str_b[-1::-1]    #将新列表b中的元素倒序排布并重新指定为列表b#

    i = 0                    #定义一个变量i用于遍历#

    while i < len(str_f):    #因为列表的下标索引从0开始,所以为<,而不是<=#

        if str_f[i] == ["("]:    #判断列表f中指定元素的类型#

            if str_b[i] != [")"]:    #判断列表b中对应指定元素的类型#

                break              #若不满足条件,直接退出循环,不必再判断后面的元素,此时i的值为上一次,未更新# 

        if str_f[i] == ["["]:

            if str_b[i] != ["]"]:

                break

        if str_f[i] == ["{"]:

            if str_b[i] != ["}"]:

                break
        i += 1
        

    if i == len(str_f):    #根据i最终的值判断是否所有元素都符合判断条件,即合法#

        print("合法^o^")    #注意:若要合法,则i应遍历f的所有元素,再完成最后一个元素的判断后,i还需要执行依次i+=1的语句#

    else:

        print("非法T_T")

else:

    print("非法T_T")
最佳答案
2024-8-28 11:12:38
好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("]     直接 == "(" 就行了,你又不是比较列表。。。
str_test = input("请输入测试字符串:")  #这里得到的只是一个字符串#

str_test0 = []    #将字符串单个拆分,装入给定的列表,初始列表为空#

for each in str_test:

    str_test0.append(each)    #将字符串中的每个元素按顺序装入列表#

str_test = str_test0      #列表重命名#

str_len = len(str_test)    #得到列表的长度,表明里面的元素总数#

a = int(str_len/2)    #列表长度的一半,需要取整数#

if str_len % 2 == 0:    #只有当列表长度为偶数时才有可能合法,奇数可以直接判定不合法#

    str_f = str_test[:a]    #将列表的前半部分切片给新列表f#

    str_b = str_test[a:]    #将列表的后半部分切片给新列表b#

    str_b = str_b[-1::-1]    #将新列表b中的元素倒序排布并重新指定为列表b#

    i = 0
    while i < len(str_f):
        print(str_f[i], "-", str_b[i]);
        if str_f[i] == "(":

            if str_b[i] != ")":
                break

        if str_f[i] == "[":

            if str_b[i] != "]":

                break

        if str_f[i] == "{":

            if str_b[i] != "}":

                break
        i += 1
        

    if i == len(str_f):

        print("合法^o^")

    else:

        print("非法T_T")

else:

    print("非法T_T")

代码运行结果

代码运行结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-28 10:40:19 | 显示全部楼层
您好!看了您的代码,我发现了一些错误和改进的地方。让我们按步骤来修正:

1. **字符串拆分成列表**:这一部分可以简化。
2. **前半部分和后半部分**:需要通过切片操作,但您的代码有些混乱。
3. **比较过程**:比较过程中设置有误,需要确保使用正确的嵌套逻辑和break语句。

修改后的代码如下:
# 020讲课后作业:判断字符串的括号写法是否合法

# 输入字符串
str_test = input("请输入测试字符串:")

# 将字符串转换为列表
str_list = list(str_test)

# 得到列表的长度
str_len = len(str_list)

# 检查是否为偶数长度
if str_len % 2 == 0:
    # 将字符串分为前后两部分
    a = int(str_len / 2)
    str_f = str_list[:a]
    str_b = str_list[a:]
    
    # 将后半部分反转
    str_b.reverse()
    
    # 检查前后半部分是否完全相等
    for i in range(a):
        if str_f[i] != str_b[i]:
            print("不合法")
            break
    else:
        # 如果没有在循环中跳出,则说明合法
        print("合法")
else:
    print("不合法")

具体的修正如下:

1. **字符串转列表**:使用`list()`函数可以直接把字符串拆分为单个字符的列表。
2. **分割与反转**:使用切片操作来分割列表,并用`reverse()`方法反转后半部分。
3. **比较过程**:如果前半部分与反转后的后半部分每个元素都相等,则字符串的括号写法是合法的。

希望这能帮助您理解原代码中的问题,进而修复代码。若有其他疑问,欢迎继续咨询!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-28 10:49:36 | 显示全部楼层
FishC 发表于 2024-8-28 10:40
您好!看了您的代码,我发现了一些错误和改进的地方。让我们按步骤来修正:

1. **字符串拆分成列表**: ...

字符串反转之后只是顺序颠倒,但是字符串本身是保持不变的。在这一道题中,要求括号匹配。例如:['[','[']反转之后的列表为['[','['],而不是[']',']']。所以如果直接比较str_f和str_b中相同位置元素是否相同,这种思路应该是不可行的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 10:49:46 | 显示全部楼层
aibd 发表于 2024-08-28 10:49
字符串反转之后只是顺序颠倒,但是字符串本身是保持不 ...


你说得对,抱歉给你带来困惑。你的问题是如何正确地判断括号匹配,而不仅仅是字符串反转。在括号匹配问题中,需要关注括号的配对关系。

可以使用栈的数据结构来解决括号匹配问题。以下是改进后的代码:
# 020讲课后作业:判断字符串的括号写法是否合法

# 输入字符串
str_test = input("请输入测试字符串:")

# 用于匹配括号的栈
stack = []

# 括号配对字典
bracket_pairs = {'(': ')', '{': '}', '[': ']'}

# 遍历输入字符串中的每一个字符
for char in str_test:
    if char in bracket_pairs:
        # 如果字符是左括号,入栈
        stack.append(char)
    elif char in bracket_pairs.values():
        # 如果字符是右括号,检查是否与栈顶左括号匹配
        if stack and bracket_pairs[stack[-1]] == char:
            # 匹配成功,出栈
            stack.pop()
        else:
            # 匹配失败
            print("不合法")
            break
else:
    # 最后检查栈是否为空,如果为空则括号合法
    if not stack:
        print("合法")
    else:
        print("不合法")

这个代码的逻辑是:

1. **使用栈**:当遇到左括号,入栈;遇到右括号,检查栈顶是否匹配。
2. **匹配成功**:若匹配成功,出栈;若匹配失败,判定为不合法。
3. **遍历结束后**:检查栈是否为空,若为空则字符串合法,否则不合法。

这样可以正确判断括号的配对关系。希望这次的解释能帮到你,有其他问题欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 10:52:48 | 显示全部楼层
。。。你的 i 是下标。。。当然会一直加下去了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-28 11:00:13 | 显示全部楼层
学习编程中的Ben 发表于 2024-8-28 10:52
。。。你的 i 是下标。。。当然会一直加下去了.

感谢抽出时间回答!
但是我的下标i只有在匹配成功的情况下才会加下去,如果匹配不成功的话就执行break跳出了循环,此时的i值应该没有再增加吧。我还特意检查了以下缩进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-28 11:03:01 | 显示全部楼层
FishC 发表于 2024-8-28 10:49
你说得对,抱歉给你带来困惑。你的问题是如何正确地判断括号匹配,而不仅仅是字符串反转。在括号匹配问 ...

谢谢回复!
只是我还没有学到字典,后面学到这部分知识点的时候我再回来看一看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 11:03:07 | 显示全部楼层
aibd 发表于 2024-08-28 11:03
谢谢回复!
只是我还没有学到字典,后面学 ...


明白您的情况。那我们可以用一些更基础的技术来实现括号匹配——依然使用栈的思路,去掉字典。以下是改进后的代码,不使用字典:

```python
# 020讲课后作业:判断字符串的括号写法是否合法

# 输入字符串
str_test = input("请输入测试字符串:")

# 用于匹配括号的栈
stack = []

# 用一个函数来判断是否是匹配的括号
def is_match(open_bracket, close_bracket

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 11:12:38 | 显示全部楼层    本楼为最佳答案   
好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("]     直接 == "(" 就行了,你又不是比较列表。。。
str_test = input("请输入测试字符串:")  #这里得到的只是一个字符串#

str_test0 = []    #将字符串单个拆分,装入给定的列表,初始列表为空#

for each in str_test:

    str_test0.append(each)    #将字符串中的每个元素按顺序装入列表#

str_test = str_test0      #列表重命名#

str_len = len(str_test)    #得到列表的长度,表明里面的元素总数#

a = int(str_len/2)    #列表长度的一半,需要取整数#

if str_len % 2 == 0:    #只有当列表长度为偶数时才有可能合法,奇数可以直接判定不合法#

    str_f = str_test[:a]    #将列表的前半部分切片给新列表f#

    str_b = str_test[a:]    #将列表的后半部分切片给新列表b#

    str_b = str_b[-1::-1]    #将新列表b中的元素倒序排布并重新指定为列表b#

    i = 0
    while i < len(str_f):
        print(str_f[i], "-", str_b[i]);
        if str_f[i] == "(":

            if str_b[i] != ")":
                break

        if str_f[i] == "[":

            if str_b[i] != "]":

                break

        if str_f[i] == "{":

            if str_b[i] != "}":

                break
        i += 1
        

    if i == len(str_f):

        print("合法^o^")

    else:

        print("非法T_T")

else:

    print("非法T_T")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-28 11:25:39 | 显示全部楼层
学习编程中的Ben 发表于 2024-8-28 11:12
好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("]     直接 == "(" 就行了 ...

谢谢
确实是这个问题,比较的是元素,而不是列表。当然,改过来之后我的代码还有很多问题,不过这个帖子想找到的问题点已经找到了。谢谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 12:48:04 | 显示全部楼层
aibd 发表于 2024-8-28 11:25
谢谢
确实是这个问题,比较的是元素,而不是列表。当然,改过来之后我的代码还有很多问题,不 ...

不用谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-17 03:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表