在过去的几个小时里,我一直在用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
并且您需要删除
backup2
和backup3
,height
和distance
的所有类似构造(也包括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/