c语言.for循环金字塔,这个C for循环如何打印文本艺术金字塔?

我将解释我将如何去理解这个代码的过程,我将舒适地使用它自己。我会假装我没有读你的描述,所以我从头开始。这个过程分为几个阶段,我会在我去的时候。我的目标是给一些一般的技术,这将使程序更容易阅读。

阶段1:了解粗糙的结构

第一步将是一般性地理解程序的作用,而不会陷入细节。让我们开始阅读main函数的正文。

int main(void) {

int user_i;

printf("Hello there and welcome to the pyramid creator program\n");

printf("Please enter a non negative INTEGER from 0 to 23\n");

scanf("%d", &user_i);

到目前为止,我们已经声明了整数,并且告诉用户输入一个数字,然后使用scanf函数设置整数等于用户输入的整数。不幸的是,从提示或代码不清楚整数的目的是什么。让我们继续阅读。

while (user_i < 0 || user_i > 23) {

scanf("%d", &user_i);

}

这里我们可能要求用户输入额外的整数。根据提示判断,似乎很好的猜测,这个语句的目的是确保我们的整数在适当的范围,这很容易通过检查代码检查。让我们看看下一行

for (int tall = 0; tall < user_i; tall++) {

这是外部for循环。我们的神秘整数user_i再次出现,我们有另一个整数高,它在0和user_i之间。让我们来看一些更多的代码。

for (int space = 0; space <= user_i - tall; space++) {

printf(" ");

}

这是第一个内部for循环。让我们不要在使用这个新的整数空间的细节上陷入困境,或者为什么我们有user_i-tall出现,但是让我们注意到foor循环的主体只是打印一个空格。所以这个for循环只是有打印一堆空间的效果。让我们看看下一个内循环。

for (int hash = 0; hash <= tall; hash++) {

printf("#");

}

这看起来相似。它只是打印一堆哈希。接下来我们有

printf("\n");

这将打印一个新行。接下来是

}

return 0;

}

这意味着外部for循环结束,并且在外部for循环结束之后,程序结束。

注意,我们已经找到代码的两个主要部分。第一部分是获取user_i的值的地方,第二部分(外部for循环)必须是使用该值绘制金字塔的地方。接下来,让我们尝试找出user_i的含义。

阶段2:发现user_i的含义

现在由于为外层循环的每次迭代打印一条新行,并且神秘user_i控制外层循环有多少次迭代,因此打印了多少个新行,似乎user_i控制了金字塔的高度即创建。为了获得确切的关系,我们假设user_i的值为3,那么tall将取值0,1和2,因此循环执行三次,金字塔的高度为三。还要注意,如果user_i将增加一,则循环将再次执行,金字塔将更高一个。这意味着user_i必须是金字塔的高度。让我们在我们忘记之前将变量重命名为pyramidHeight。我们的主要功能现在如下:

int main(void) {

int pyramidHeight;

printf("Hello there and welcome to the pyramid creator program\n");

printf("Please enter a non negative INTEGER from 0 to 23\n");

scanf("%d", &pyramidHeight);

while (pyramidHeight < 0 || pyramidHeight > 23) {

scanf("%d", &pyramidHeight);

}

for (int tall = 0; tall < pyramidHeight; tall++) {

for (int space = 0; space <= pyramidHeight - tall; space++) {

printf(" ");

}

for (int hash = 0; hash <= tall; hash++) {

printf("#");

}

printf("\n");

}

return 0;

}

阶段3:创建一个获取金字塔高度的函数

由于我们了解代码的第一部分,我们可以将它移动到一个函数,不再考虑它了。这将使代码更容易看。由于这部分代码负责获取有效的高度,让我们调用funcion getValidHeight。这样做后,注意金字塔的高度在main方法中不会改变,所以我们可以将它声明为const int。我们的代码现在看起来像这样:

#include

const int getValidHeight() {

int pyramidHeight;

printf("Hello there and welcome to the pyramid creator program\n");

printf("Please enter a non negative INTEGER from 0 to 23\n");

scanf("%d", &pyramidHeight);

while (pyramidHeight < 0 || pyramidHeight > 23) {

scanf("%d", &pyramidHeight);

}

return pyramidHeight;

}

int main(void) {

const int pyramidHeight = getValidHeight();

for (int tall = 0; tall < pyramidHeight; tall++) {

for (int space = 0; space <= pyramidHeight - tall; space++) {

printf(" ");

}

for (int hash = 0; hash <= tall; hash++) {

printf("#");

}

printf("\n");

}

return 0;

}

阶段4:了解内部for循环。

我们知道内部的for循环重复打印一个字符,但是多少次?让我们考虑第一个内部for循环。打印了多少个空格?你可能认为通过与外部for循环类比,有pyramidHeight – 高空间,但是在这里我们有空间<= pyramidHeight-高,其中真正的类似情况将是空间

#include

const int getValidHeight() {

int pyramidHeight;

printf("Hello there and welcome to the pyramid creator program\n");

printf("Please enter a non negative INTEGER from 0 to 23\n");

scanf("%d", &pyramidHeight);

while (pyramidHeight < 0 || pyramidHeight > 23) {

scanf("%d", &pyramidHeight);

}

return pyramidHeight;

}

void printSpaces(const int numSpaces) {

for (int i = 0; i < numSpaces; i++) {

printf(" ");

}

}

void printHashes(const int numHashes) {

for (int i = 0; i < numHashes; i++) {

printf("#");

}

}

int main(void) {

const int pyramidHeight = getValidHeight();

for (int tall = 0; tall < pyramidHeight; tall++) {

printSpaces(pyramidHeight - tall + 1);

printHashes(tall + 1);

printf("\n");

}

return 0;

}

现在,当我看看main函数,我不必担心printSpaces如何实际打印空格的细节。我已经忘记了它是使用for循环还是while循环。这让我的大脑去想想其他的事情。

阶段6:引入变量并为变量选择好名称

我们的主要功能现在很容易阅读。我们准备开始思考它实际上做了什么。 for循环的每次迭代都会打印一定数量的空格,后面跟着一定数量的哈希,后跟一个新行。因为空格首先被打印,它们都将在左边,这是我们想要得到它给我们的图片。

由于新行被打印在终端上的旧行之下,对于高的值为零对应于金字塔的顶行。

考虑到这些事情,让我们介绍两个新变量numSpaces和numHashes,用于在迭代中打印的空格和散列数。由于这些变量的值在单个迭代中不改变,我们可以使它们成为常量。另外,让我们将tall的名称(这是一个形容词,因此是整数的错误名称)更改为distanceFromTop。我们的新主方法看起来像这样

int main(void) {

const int pyramidHeight = getValidHeight();

for (int distanceFromTop = 0; distanceFromTop < pyramidHeight; distanceFromTop++) {

const int numSpaces = pyramidHeight - distanceFromTop + 1;

const int numHashes = distanceFromTop + 1;

printSpaces(numSpaces);

printHashes(numHashes);

printf("\n");

}

return 0;

}

第7阶段:为什么numSpaces和numHashes是什么?

一切都在一起现在。唯一需要明确的是给出numSpaces和numHash的公式。

让我们从numHash开始,因为它更容易理解。我们想要numHash是一个当距离顶部为零,我们希望numHash增加一,每当距离顶部,所以正确的公式是numHashes = distanceFromTop 1。

现在为numSpaces。我们知道,每当从顶部的距离增加,一个空间变成一个散列,所以有一个更少的空间。因此numSpaces的表达式应该有一个-distanceFromTop。但是顶行应该有多少个空格?因为顶行已经有一个散列,所以有pyramidHeight – 需要做1个散列,所以必须至少有pyramidHeight – 1个空格,所以它们可以变成哈希。在代码中,我们在顶行中选择了pyramidHeight 1个空格,它比pyramidHeight – 1多两个,因此具有将整个图片向右移动两个空格的效果。

结论

你只是问两个内循环如何工作,但我给了一个很长的答案。这是因为我认为真正的问题不是你不明白for循环如何工作足够好,而是你的代码很难阅读,所以很难说什么是做什么。所以我告诉你我将如何编写程序,希望你会认为它更容易阅读,所以你将能够看到更清楚的是什么,希望你可以学习自己编写更清晰的代码。

我如何更改代码?我改变了变量的名称,所以清楚每个变量的作用是什么;我引入了新的变量,并试图给他们好的名字;并且我移动了一些涉及输入和输出的低级代码以及将字符打印一定次数到他们自己的方法中的逻辑。这最后的变化大大减少了主函数中的行数,摆脱了在主函数中for循环的嵌套,并使程序的关键逻辑容易看到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值