嵌套for循环转换为do-while循环

4

你好,我已经阅读了有关作业问题的指南,并且它说要明确说明这是一份作业。这是一份作业,我已经尝试了45分钟,但仍无法解决问题,需要帮助。

我的任务是将这个来自双重For循环的代码转换为嵌套在for循环中的while循环。我已经成功完成了这部分。然而,第三部分是将外层的for循环改为do while循环。 输出需要每行递增一个"#",例如如果输入为“4”

#
##
###
####

以下是我编写的代码,我需要将外部的for循环改为do while循环:
int main()
{
    int side;

    cout << "Enter a number: ";
    cin >> side;

    for (int i = 0; i < side; i++)
    {
        int j = i;
        while(j >= 0)
        {
            cout << "#";
            j--;
        }
        cout << "\n";
    }
}

这是我迄今为止的尝试:
int main()
{
    int side;
    int i;

    cout << "Enter a number: ";
    cin >> side;
    int j=side;
    do
    {
        while(j >= 0)
        {
            cout << "#";
            j--;
        }
        cout << "\n";
        i++;
    }
    while(j >= side);
}

我的老师说只要代码被解释清楚并且我理解它的工作原理就可以了。非常感谢您的帮助。 谢谢。


3
在你的循环中,i++; 的目的是什么? - πάντα ῥεῖ
1
我觉得你是我见过的第一个在发帖前尝试解决自己作业的人...哇。嗯,为什么do-while循环在条件中没有使用i? - Treycos
请不要破坏您的帖子。 - Hatted Rooster
4个回答

1
我建议
int main()
{
    int side;
    int i = 0;
    cout << "Enter a number: ";
    cin >> side;

    do
    {
        int j = i;
        while(j >= 0)
        {
           cout << "#";
           j--;
        }
        cout << "\n";
        i++;
    }while(i < side)
}

通常情况下,for循环包括初始化(i=0)、停止条件(i < side)和递增(i++);为什么你不再使用i

1
你犯的第一个错误是这个:


int i; //not initialized!
/*...*/
i++;

你甚至没有在do-while条件中使用它。

所以while(j >= side); > while (i >= side);

实际上,这也不是正确的。由于side是输入值,你想让i检查它是否比输入值而不是。所以应该是while (i < side);

另一件事是int j = side;,当你递减j时,它将永远不会重置,所以你必须将其设置到你的do-while循环中,并用i而不是side进行初始化....

无论如何,这是完整的代码:

#include <iostream>
using namespace std;

int main()
{
    int side;
    int i = 0;

    cout << "Enter a number: ";
    cin >> side;
    do
    {
        int j = i;
        while (j >= 0)
        {
            cout << "#";
            j--;
        }
        cout << "\n";
        i++;
    } while (i < side);

    return 0;
}

例子输出:
Enter a number: 10
#
##
###
####
#####
######
#######
########
#########
##########

非常感谢!我想我只是因为现在是凌晨3点,脑子有些迷糊 :) 但是在跟踪代码后,它实际上是有意义的!现在我只需要处理错误并在明天让它接受负数 :) 如果我在明天遇到问题,给您发消息可以吗? - XeXVeX
当然可以。祝你好运! - Stack Danny
还有一件事,编程时我需要使用"return 0;"吗?我的代码没有它也可以正常运行。@treycos也不使用它。 - XeXVeX
1
由于 int main() 是一个返回 int 的函数,最好的做法是实际上返回 0(没有发生错误)。如果您省略它,编译器会为您添加它。但在我看来,写一点额外的代码不会对任何人造成伤害。 - Stack Danny
1
哦,好的,我有点困惑,因为我的老师在一些问题中使用它,在一些问题中则不使用...我不知道编译器只是自动添加它...再次感谢Danny提供的所有帮助。 - XeXVeX

0
  • while(j >= side); 应该改为 while(i <= side);
  • 每次外部循环迭代时应初始化 j (j = i;)
  • int j=side; 是不必要的。

一个友好的建议 - 给你的变量和函数起一个描述性的名字 - rowcolumnij 更好。


0

他们给出的答案解决了你的问题,但是让我向你展示一个更短的方法:

int main()
{
    int side;

    std::cout << "Enter a number: ";
    std::cin >> side;

    int row = 1;
    do
    {
        int col = 0;
        while (col++ != row)
        {
            std::cout << "#";
        }
        std::cout << "\n";
    } while (row++ != side); //This way, the condition is checked (row != side), and then row is incremented
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接