如果语句应该更改整数,但在 printf * 中使用时不会更改
If statement is supposed to change integer, but when used in printf * doesn't change
我已经使用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?
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);
这个构造设置了最左边的点的填充空间。所有其他点的宽度都为零,正如你在帖子中总结的那样。
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 换位表导致测试失败(但在游戏中运行良好)
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 我的代码运行良好,但在游戏循环中中断
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 点云库在VS 2019中不起作用,但在VS 2017中确实有效
- 为什么 if 语句在 Java 中"if(1)"给出错误,但在C++中成立?
- For 循环结束自身并终止正在运行的程序,但在删除斜率计算语句时正常运行
- 更改了bool值,但在while语句的下一个循环中它又变了回来
- 如果语句应该更改整数,但在 printf * 中使用时不会更改