如果语句应该更改整数,但在 printf * 中使用时不会更改

If statement is supposed to change integer, but when used in printf * doesn't change

本文关键字:但在 语句 整数 如果 printf      更新时间:2023-10-16

我已经使用printf*宽度说明符、for循环和if语句打印了一个金字塔:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(){
    int sizeOfPyramid, numberOfDots;
    char dots = '.';
     cout << "Enter size of Pyramid: n";
        cin >> sizeOfPyramid; //Gets the size of the pyramid

        for (int i = 0; i < sizeOfPyramid + 1; i++) {
            numberOfDots = i;
            cout << i;
            for (int r = 0; r < 2 * i + 1; r++) {
                if (r > 0) { numberOfDots = sizeOfPyramid + 1; }
                printf("%*c", sizeOfPyramid + 1 - numberOfDots, dots);
            }
            cout << endl;
        }
}

我想知道的是为什么你需要下面的行,以及它如何改变printf的宽度参数:

如果(r>0){numberOfDots=sizeOfPyramid+1;}

如果您输入3作为sizeOfPyramid,当您到达上面的行时,numberOfDots应该设置为4。如果在If语句后面有numberOfDots,则点数等于0,然后是1,然后是2,然后是3(i的值)

for (int r = 0; r < 2 * i + 1; r++) {
    if (r > 0) { numberOfDots = sizeOfPyramid + 1; }
        cout << numberOfDots;
        printf("%*c", sizeOfPyramid + 1 - numberOfDots, dots);
        }

为什么numberOfDots=sizeOfPyramid+1当它不改变点的数量时需要吗?宽度=3+1-4不应该打印吗?如果你删除了它,那么程序就不能正常工作。

这就是我向自己解释完整代码的方式-

  • 您输入3
  • for循环运行,numberOfDots设置为i(0)
  • 下一个for循环运行并且为true,因此它移到if语句上
  • if语句应该设置numberOfDots=sizeOfPyramid+1(如果我没有弄错的话,这应该意味着4=3+1)
  • 然后printf函数被称为(我列出了我认为每个变量的确切内容)("%*c",3+1-4,.)

这就是我感到困惑的地方。如果numberOfDots是4并且4-4=0,那么宽度整数不应该等于0吗?如果*为0,则点不应该在任何空格上移动?为什么即使在if语句中设置为不同的值,numberOfDots仍保持等于i?

if语句请求r > 0

代码实际上有点令人困惑。它可以用更清晰的方式重写。

if (r == 0) { // leftmost dot.
    printf("%*c", 1 + sizeOfPyramid - numberOfDots, dots);
}else{ // other dots.
    printf("%c", dots);
}

r == 0的第一次迭代中,添加了左填充。

所以在你的解释中,你犯了一个错误,你陈述了

  • 下一个for循环运行并且为true,因此它移到if语句上
  • if语句应该设置numberOfDots=sizeOfPyramid+1(如果我没有弄错的话,这应该意味着4=3+1)

if语句执行除第一次迭代之外的每一次迭代。在if语句中进行的赋值将反转printf中宽度指定的效果。这就是为什么我认为上面的结构更容易阅读。

很难简单地描述if语句

if (r > 0) { 
    // cancel width calculation.
    numberOfDots = sizeOfPyramid + 1; 
}

因为它只能与printf结构结合使用。

printf("%*c", sizeOfPyramid + 1 - numberOfDots, dots);

这个构造设置了最左边的点的填充空间。所有其他点的宽度都为零,正如你在帖子中总结的那样。

相关文章: