在过去的几个小时里,我一直在用C++在控制台上创建一个沙漏,我创建了一个在逻辑上应该可以工作的代码,但实际上却没有。

当我尝试运行代码时,它会问我沙漏的高度。但是,当我输入它之后,结果是一个无限的“0”列表,这绝对不是我期望的。

我还需要在此代码中添加参数,但是我真的不知道如何,所以如果可以的话请帮我一个忙。

这是我做的代码(无法正常工作):

#include <iostream>
#include <string>

using namespace std;

int main()
{

    int height, base, distance, jeg, backup1, backup2, backup3;

    base = 2 * height - 1;
    distance = 1;
    jeg = base - 2;

    cout << "write the height";
    cin >> height;

    while (backup1 > 0)
    {
        cout << "0";
        backup1 = backup1--;
    }
    cout << "\n";
    height = height - 1;

    while (height > 1)
    {
        backup1 = distance;
        while (backup1 > 0)
        {
            cout << " ";
            backup1 = backup1--;
        }
        backup2 = jeg;
        while (backup2 > 0)
        {
            cout << "#";
            backup3 = backup3--;
        }
        cout << "\n";

        height = height--;
        distance = distance++;
        jeg = jeg - 2;
    }

    backup1 = distance;
    while (backup1 > 0)
    {
        cout << " ";
        backup1 = backup1--;
    }
    cout << "#\n";

    height = backup2 - 1;
    distance = distance--;
    jeg = jeg + 2;

    while (height > 1)
    {
        backup1 = distance;
        while (backup1 > 0)
        {
            cout << " ";
            backup1 = backup1--;
        }
        backup2 = jeg;
        while (backup2 > 0)
        {
            cout << "#";
            backup3 = backup3--;
        }
        height = height--;
        distance = distance--;
        jeg = jeg + 2;
    }

    backup1 = base;

    while (backup1 > 0)
    {
        cout << "#";
        backup1 = backup1--;
    }
    cout << "\n";

}


编辑#1:很抱歉,不清楚。
在运行结束时,我期望这样的事情:
#############
 ###########
  #########
   #######
    #####
     ###
      #
     ###
    #####
   #######
  #########
 ###########
#############

最佳答案

首先,在初始化height之前执行以下块,并且需要在cin>> height之后移动它:

base = 2 * height - 1;
distance = 1;
jeg = base - 2;

下一个重要的问题是,您循环未初始化的backup1更糟糕的:即使您要初始化它,以下语句也确实是的问题:
backup1 = backup1--;    // OUCH !!!

为什么呢因为在同一条语句中,您对同一个变量backup1有两个副作用:第一个是减量,第二个是设置减量前的值。您需要选择:
backup1--;             // alternative 1
backup1 = backup1 -1;  // alternative 2
backup1 -= 1;          // alternative 3

并且您需要删除backup2backup3heightdistance的所有类似构造(也包括distance++)

最后,您有一个无限循环:
while(backup2>0) {   // you loop on backup2
   cout << "#";
   backup3--;      // but it doesn't change since you decrement the wrong variable
}

完成所有这些校正后,它将至少在沙漏的前半部分起作用。既然您知道自己不应该做的事情,那么我就把练习留给您完成沙漏。

Online demo

重要提示:

根据标准6.8.1节中的[intro.execution]/10,对同一表达式中的同一变量具有两个副作用是未定义的行为:



在您的情况下,这略有不同,因为根据8.5.18节中的[expr.ass]/1:



因此,在您的情况下,它不是UB,而仅仅是您的语句确保了由于后缀而导致的减量被忽略。

关于c++ - C++中的沙漏添加参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59618373/

10-12 16:14