While 和 Do-While 循环

While and Do-While Loops

提问人:Heidihale58 提问时间:5/3/2023 最后编辑:trincotHeidihale58 更新时间:5/4/2023 访问量:74

问:

这是使用 WHILE 和 DO 的正确方法吗?WHILE 循环?

这两个循环示例是另一个用户向我建议的,所以,我想我会把它们放到我的伪代码中,看看它们的外观。

编写的伪代码用于计算房间面积以购买油漆罐的程序。

Start
    Display "Enter room length"
    Input roomLength
    Display "Enter room width"
    Input roomWidth
    Display "Enter room height"
    Input roomHeight
    Display "Enter number of doors"
    // Use a WHILE loop to validate input for doors
    While doors < 0 Display "Invalid input. Please enter a positive number of doors:" 
        Input doors 
    End While
    Display "Enter number of windows"
    Do If windows < 0 Then
        Display "Invalid input. Please enter a positive number of windows:" 
        Input windows 
    End If Loop While windows < 0
    Set paintCans = (L x W x H) - (20 sq. ft. per door & 15 sq. ft. per window) / (400 sq. ft. per gallon)
    Display "Total cans of paint is", + paintCans
End
循环 while-loop do-while 伪代码

评论

0赞 Gilbert Le Blanc 5/3/2023
While 循环执行 0 到 N 次。Do-while 循环执行 1 到 N 次。选择是要执行代码零次还是一次。
0赞 trincot 5/3/2023
您尝试在输入验证完全相同的两种情况下使用两种不同的循环样式。因此,应该没有理由使用两种不同的循环结构。

答:

0赞 Olaf Kock 5/3/2023 #1

自己浏览该代码:

在第一次评估时:门的价值是什么?我们在这里看到的片段没有给我们任何线索,所以这取决于实际的语言(这里的标签表明它是伪代码)。doors < 0

如果默认值为 ,您将永远无法输入门数,因为条件永远不会为真0doors < 0

否则,如果它默认为 -1,则在用户输入任何数字之前显示错误消息。不太人性化。

如果未初始化的值默认为其他值,并且/或无法计算,则在计算第一个条件时可能会遇到错误情况。while

第二个循环的类似步骤:结果将取决于默认值,并且在输入任何值之前显示错误消息。

我想这意味着,这不是使用这种循环的正确方法。虽然一般来说,你可以让两种方式都起作用。

0赞 Heidihale58 5/4/2023 #2

我决定在我的伪代码中使用 While 循环来输入门窗,并为该区域添加了一个 If-then-else 语句。希望我正确地编写了代码。

Start
DECLARE REAL roomLength, roomWidth, roomHeight, area
DECLARE INTEGER doors, windows // Integer variables will be whole numbers
DISPLAY "Enter room length"
INPUT roomLength
DISPLAY "Enter room width"
INPUT roomWidth
DISPLAY "Enter room height"
INPUT roomHeight

DISPLAY "Enter number of doors"
// Use a WHILE loop to validate input for doors
WHILE doors < 1
DISPLAY "Invalid input. Please enter a positive number of doors:"
INPUT doors
END WHILE

DISPLAY "Enter number of windows"
// Use WHILE loop to validate input for windows
While windows < 1
DISPLAY "Invalid input. Please enter a positive number of windows:"
INPUT windows
END WHILE

Set area = (L x W x H) - (20 sq. ft. per door & 15 sq. ft. per window)
// USE IF-THEN-ELSE statement for square footage
IF area is <= 400 square feet Then
DISPLAY “One can of paint is needed”
Else
DISPLAY “Two cans of paint are needed”
END IF
END

评论

0赞 Olaf Kock 5/4/2023
这并不是对您的问题的真正回答,而是对问题的改进/编辑。它遇到了我在回答中提到的相同问题。恕我直言,这仍然不是正确的用法 - 或者至少在他们有机会输入任何值之前显示错误消息不是非常用户友好
0赞 Heidihale58 5/4/2023
@OlafKock,我的教授要求我们在伪代码中验证两种类型的循环。如果您发现我选择的循环不够用,您会推荐哪两种类型的循环来使我的程序更有效率?
0赞 trincot 5/4/2023 #3

这个问题可以用许多不同的方式来回答。例如,我们可以在一个数组上有一个循环,该数组具有 5 个不同的输入提示,每个提示都获取输入,并将这些输入收集到第二个数组中。

内部循环可以用于确保输入值不是负数。

只要用户愿意,外部循环就可以用于重复程序。

请注意,您的油漆罐数量公式不正确。长 x 宽 x 高是一个体积,而不是一个表面。然而,我认为你想粉刷墙壁,而不是用油漆填满整个房间。有两个(相对)墙的表面为 L x H,两个(相对)墙的表面为 W x H,因此公式应以 2 x (L + W) x H 开头。

下面的程序可能有点矫枉过正,但至少它显示了一些可以使用循环的选项,以及不同类型的循环:

PROGRAM
    SET sq_ft_per_door := 20
    SET sq_ft_per_window := 15
    SET sq_ft_per_gallon := 400
    
    SET metrics := ['room length', 'room width', 'room height', 
                    'number of doors', 'number of windows']
    
    DO // Each iteration is a new input/output session
        SET values := [0, 0, 0, 0, 0]
        FOR i := 1 TO 5 // To input 5 values
            DISPLAY 'Enter ', metrics[i]
            INPUT value[i]
            WHILE value[i] < 0  // Not OK
                DISPLAY 'Invalid input. Please enter a positive ', metrics[i]
                INPUT value[i]
            END WHILE
        END FOR
        SET sq_ft_to_paint := 2 * (values[1] + values[2]) * value[3]
                              - sq_ft_per_door * values[4] 
                              - sq_ft_per_window * values[5]
        SET num_gallons := sq_ft_to_paint / sq_ft_per_gallon
        DISPLAY 'Total cans of paint is', paintCans
        DISPLAY 'Do you want to repeat the calculation with new values? (Y/N)'
        INPUT answer
    REPEAT WHILE answer = 'Y'
END