for循环中的逻辑错误是什么?

时间:2016-07-03 07:46:54

标签: python

这就是问题:

  

使用调试工具IDLE Debugger来纠正a中的逻辑错误   Python程序。该程序应该生成一行行的模式   偶数列中的星号和奇数列中的美元,数字   行和列的输入由用户输入。预期的输出是:

     

asterickdollar

那么错误在哪里?我无法弄清楚逻辑错误。 代码是:

row = col = int(input("Enter number of row and column: "))
for row in range(row):
    for col in range(col):
        if row % 2 == 0 and col % 2 == 1:
            print('*', end='')
        elif row % 2 == 1 and col % 2 == 0:
            print('$', end='')
        else:
            print(' ', end='')

    print()

For the above code output

3 个答案:

答案 0 :(得分:1)

您可以使用col和row作为循环步骤的输入和变量。

由于range(和您的算法)基于零,因此在第一次运行内for之后,col的值将比原始所需输入小1。等等。

这将有效:

rows = columns = int(input("Enter number of row and column: "))
for row in range(rows):
    for col in range(columns):
        if row % 2 == 0 and col % 2 == 1:
        print('*', end='')
    elif row % 2 == 1 and col % 2 == 0:
        print('$', end='')
    else:
        print(' ', end='')

print()

在python中,循环变量在循环运行的范围内定义,而不是在循环的内部范围内定义。所以他们都跑了过来。先前定义的变量并在循环结束后保持定义。

答案 1 :(得分:1)

您应该将用户输入的数字存储在与您用于迭代的变量不同的变量中。 这很有效:

num = int(input("Enter number of row and column: "))
for row in range(num):
    for col in range(num):
        if row % 2 == 0 and col % 2 == 1:
            print('*', end='')
        elif row % 2 == 1 and col % 2 == 0:
            print('$', end='')
        else:
            print(' ', end='')

    print()

答案 2 :(得分:0)

作为一般规则:太多的逻辑条件会导致调试困难,并且太多的划分会导致代码速度变慢(每个循环执行一次除法操作最多4次!)并且for循环嵌套,所以你和#39; ve平方所需的迭代次数。

在循环开始之前尽可能多地设置逻辑,这简化了事情。

rows = cols = int(input("Enter number of row and column: "))
isAsterix = True
extraColumns =  cols % 2  # 1 if odd; 0 otherwise
numDoubleColumns = int(cols / 2)  # rounds down
for _ in range(rows):
    if isAsterix:
        bigCol = ' *'  # will  be multiplied up to column full width
        pad = ' ' # used if odd number of columns
    else:
        bigCol = '$ '  # will  be multiplied up to column full width
        pad = '$'  # used if odd number of columns

    # yes you can multiply and add strings together...
    print(bigCol*numDoubleColumns + pad*extraColumns)
    isAsterix = not isAsterix  # print the other symbol next time

我很欣赏这个例子,速度提升可以忽略不计,但要记住可以删除for循环的方法仍然是好的做法。简化if陈述绝对不错。