当前位置: 首页 > 知识库问答 >
问题:

试图理解为什么这个For循环有这个输出

督冠玉
2023-03-14

因此,作为学校的一部分,我正在使用For循环,我有一些代码可以工作,但我很难理解为什么它可以工作。对我来说,重要的是要真正理解为什么一块代码能做它不能做的事情,而不仅仅是它能工作。

所以有一点背景。这个小程序利用for循环,根据用户输入打印一系列#字符。其思想是用户输入一个介于1和8之间的数字,程序将打印一个#字符,然后移动到下一行再打印两个,移动到下一行再打印三个等等,并打印用户输入的行数。

Output:
#
##
###
####
#####

程序在这里:

#include <stdio.h>

int main(void) {

  int rows = 1, height, hash = 1;

  printf("Enter a number between 1-8: ");
  scanf("%i", &height);

  if (height >= 1 || height <= 8) {

    for (rows; rows <= height; rows++) {
      for (hash; hash <= rows; hash++) {
        printf("#");
      }
      printf("\n");
    }
  }
  return 0;
}

我已经写下了循环,并试图理解它如下。如果有人能澄清,我了解这些嵌套循环是如何工作的,我将不胜感激:

  1. 行=1;如果行数小于或等于高度(5)

因此,这里是我的主要问题:我很难理解程序在转到新行时如何以及为什么能够使用printf语句打印多个。由于嵌套for循环中包含的变量,我认为printf语句正在打印两个字符。

我假设当我将嵌套for循环中的代码更改为(hash; hash==row; hash)时,每行只打印一个#字符。就像我将代码更改为(hash; hash)的一样

如能澄清,并对我的学业有所帮助,我将不胜感激。我提前感谢大家!


共有3个答案

锺功
2023-03-14

语句中的第一个参数"rows"表示您正在迭代行的整数

对于furst循环,它迭代5次,如下所示:

 rows = 1
 rows = 2
 rows = 3
 rows = 4
 rows = 5

第二个循环根据行数打印哈希。当riws为1时,只打印一个哈希。在每个循环之后,打印一条新的线。

蒯翰墨
2023-03-14

变量应该在使用它们的地方声明。

当变量声明和使用之间存在大量代码时,这是导致各种错误的原因。

变量rowhash仅在循环中使用。所以它们应该在这些循环中声明。在这种情况下,您可以避免忘记在内部循环中重新初始化变量hash的错误。

如果假设变量的值不应该为负,则声明该变量具有无符号整数类型,而不是有符号整数类型。

不清楚为什么在你的程序中使用了神奇的数字8。为什么图形的高度不能大于8呢?

程序可以看起来如下。

#include <stdio.h>

int main(void) 
{
    while ( 1 )
    {
        const char c = '#';

        unsigned int height;

        printf( "Enter the height of a pyramid (0 - exit): " );

        if ( scanf( "%u", &height ) != 1 || height == 0 ) break;

        putchar( '\n' );

        for ( unsigned int i = 0; i < height; i++ )
        {
            for ( unsigned int j = 0; j < i + 1; j++ )
            {
                putchar( c );
            }
            putchar( '\n' );
        }

        putchar( '\n' );
    }

    return 0;
}

它的输出可能看起来像

Enter the height of a pyramid (0 - exit): 1

#

Enter the height of a pyramid (0 - exit): 2

#
##

Enter the height of a pyramid (0 - exit): 3

#
##
###

Enter the height of a pyramid (0 - exit): 4

#
##
###
####

Enter the height of a pyramid (0 - exit): 5

#
##
###
####
#####

Enter the height of a pyramid (0 - exit): 6

#
##
###
####
#####
######

Enter the height of a pyramid (0 - exit): 7

#
##
###
####
#####
######
#######

Enter the height of a pyramid (0 - exit): 8

#
##
###
####
#####
######
#######
########

Enter the height of a pyramid (0 - exit): 9

#
##
###
####
#####
######
#######
########
#########

Enter the height of a pyramid (0 - exit): 10

#
##
###
####
#####
######
#######
########
#########
##########

Enter the height of a pyramid (0 - exit): 0

现在让我们考虑一下程序是如何工作的。

外环

while ( 1 )
{
    //...
}

是一个无限循环,因为它的条件是永远不能等于0。

当用户输入无效数据或输入0时,循环中断。

if ( scanf( "%u", &height ) != 1 || height == 0 ) break;

现在一切都准备好输出金字塔了。

这个环路

    for ( unsigned int i = 0; i < height; i++ )
    {
        //...
        putchar( '\n' );
    }

事实上,他是直线经理。通过注释内部循环尝试该程序,您将看到输出的空行数与i 1的值相对应

内部循环输出与表达式i 1的值相对应的符号“#”的编号。即当i等于0时,输出一个符号“#”。当i=1时,当输出两个(i 1)符号“#”时,依此类推。

因此,内部循环输出一行i1符号“#”,外部循环转到下一行。。

王才英
2023-03-14

您的问题是hash变量。当内部for循环再次启动时,它不会重置为1

下面是正确的代码:

int main(void) {

  int rows = 1, height, hash = 1;

  printf("Enter a number between 1-8: ");
  scanf("%i", &height);

  if (height >= 1 || height <= 8) {

    for (rows; rows <= height; rows++) {
      for (hash = 1; hash <= rows; hash++) {
        printf("#");
      }
      printf("\n");
    }
  }
  return 0;
}

在你的代码作用域中,哈希在两个循环之外,所以在下一次运行内部循环时,你实际上是用等于23哈希开始的45

您已设置hash=1 在代码的开头,当程序启动时将其设置为1。但在内部循环完成后,您从未重置过散列变量。

以下是代码中值的更改方式:

iteration     row      hash
--------------------------------
1             1        1 -> #
              1        2 -> inner loop end
2             2        2 -> #
              2        3 -> inner loop end
3             3        3 -> #
              3        4 -> inner loop end
4             4        4 -> #
              4        5 -> inner loop end
5             5        5 -> #
              5        6 -> inner loop end
6             6        6 -> outer loop end

 类似资料:
  • 问题内容: 我想做的是请用户输入一些字符串以读入数组,然后要求用户输入该数量的字符串并将其读入数组。当我运行此代码时,它从不要求我在第一个for循环的第一个循环中输入内容,只打印出“字符串#0:字符串#1:”,然后我就可以输入文本了。为什么会这样,我做错了什么? 问题答案: 缓冲。 输入输入数量时,不会在输入缓冲区中占用换行符的位置。在for循环的迭代0中,缓冲区中已经有一行输入,并且可以立即完成

  • 然而,Antlr似乎不喜欢我在两个不同的地方使用“函数”。据我所知,语法甚至没有歧义。 在下面的语法中,如果我删除第1行,生成的解析器解析示例输入没有问题。另外,如果我更改第2行或第3行中的令牌字符串,使它们不相等,解析器就会工作。 我得到的语法错误是: 测试生成的解析器的程序:

  • 考虑这个简单的C++函数来计算数组的前缀和: 它是4个融合的UOP1,这个CPU可以支持4个融合的OPs/周期。 有通过和携带的依赖链,每个都是一个循环,但是这些UOP可以到4个ALU端口中的任何一个,所以似乎不太可能冲突。融合的需要转到p6,这是一个更令人担忧的问题,但我只测量到p6的1.1 UOPS/迭代。这将解释每次迭代1.1个循环,但不是1.4个循环。如果我将循环展开2倍,端口压力会低得多

  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

  • 问题内容: boolean r = false ; int s = 0 ; while (r == false) ; { s = getInt() ; if (!(s>=0 && s<=2)) System.out.println (“try again not a valid response”) ; else r = true ; } 即使输入3或123,循环也不会终止,文本也不会显示。怎么了

  • 问题内容: 我在程序中看到了与程序中此特定循环相关的不同行为,但我不确定我为什么理解它的行为方式。 的输出是 的输出是 我去网上看了以下内容 在切片上进行测距时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处的元素的副本 它说一个副本,这是否意味着它返回了字符串的副本,但这实际上是指向变量的指针?在这种情况下,在循环结束时对will的任何引用都实际上引用了数组中的最后一个元素,例如?这是否