【问题标题】:C programming nested for loop print half pyramidC编程嵌套for循环打印半金字塔
【发布时间】:2015-08-17 12:11:55
【问题描述】:

尝试在 C 编程中打印半金字塔时遇到了一些问题。当我将高度设置为 7 时的输出应该是这样的:

       1
      22
     333
    1111
   22222
  333333
 1111111

我的代码为:

int main()
{
int height, i, row, j;

printf("Enter the height: ");
scanf("%d", &height);

for (i = height; i >= 0; i--) //print the number of rows based on input
{
    for (row = 0; row < i-1; row++) {
        printf(" ");   // print spaces for each rows
        //Edited as I just realized that I did it in the Java way. So sorry
        /*for (j = row-1; j < row; j++) {
            printf("%d", j);
        }*/
    }
    printf("\n");
}

return 0;
}

我现在设法打印出每行的倒置空格。但是我有点坚持如何打印出每一行的数字,因为我注释掉的那个会使我的 exe 停止工作。

【问题讨论】:

  • 您是否阅读了printf() 的文档?
  • 您不希望 j 循环嵌套在 row 循环内;您想在打印所有空格之后打印数字。而且,是的,printf(row) 不会做任何有用的事情。
  • 选民介意解释?我不确定第三个 for 循环,这就是为什么我将它注释掉并且错误只发生在第三个 for 循环这就是为什么我从不显示错误消息。
  • 你有没有看清楚printf函数的使用方法
  • 对已评论的第三个 printf 函数投反对票

标签: c for-loop nested


【解决方案1】:

抓住!:)

#include <stdio.h>

int main( void )
{
    while ( 1 )
    {
        printf( "Enter a non-negative number (0-exit): " );

        unsigned int n = 0;
        scanf( "%u", &n );

        if ( !n ) break;

        printf( "\n" );

        for ( unsigned int i = 0; i < n; i++ )
        {
            const unsigned int k = i % 3 + 1;
            printf( "%*d", n - i, k );
            for ( unsigned int j = 0; j < i; j++ ) printf( "%d", k );
            printf( "\n" );
        }
        printf( "\n" );
    }        
}

如果按顺序输入

10 7 0

输出将是

Enter a non-negative number (0-exit): 10

         1
        22
       333
      1111
     22222
    333333
   1111111
  22222222
 333333333
1111111111

Enter a non-negative number (0-exit): 7

      1
     22
    333
   1111
  22222
 333333
1111111

Enter a non-negative number (0-exit): 0

【讨论】:

  • 您好,很抱歉,这条线是做什么用的? printf("%*d", n - i, k);据我了解,在您获取用户输入的第一个循环中,您正在获取模块并将其分配给 k。然后对于带有 j 的 for 循环,您将显示 k。
  • @Denise 不使用循环输出 n - i - 1 个空格并输出数字。
  • 所以基本上 *d 对间距和 mod 起到了神奇的作用?因为我试图删除 * 并且返回的结果不同。您介意解释一下 * 的作用吗?
  • @Denise * 允许使用存储所需值并作为参数传递给 printf 的变量来指定输出字段的长度。
  • @Denise 这是这里介绍的最好的代码。:)
【解决方案2】:

这是一个简单的问题,正确的代码是:

int main()
{
int height, i, row, j,no=1;    
printf("Enter the height: ");
scanf("%d", &height);    
for (i = height; i > 0; i--) //print the number of rows based on input
{
    if(no>3)
        no=1;//so that numbers never exceed 3
    for (row = 0; row < i-1; row++)
        printf(" ");   // print spaces for each rows    
    for(j=height+1;j>i;--j)
        printf("%d",no);//print the numbers
    no++;
    printf("\n");
}    
return 0;
}

【讨论】:

  • 非常感谢!但是你介意解释一下第三个 for 循环吗?我很困惑。
  • @Denise j 有 height+1 作为初始值的原因是因为 i 有 height 作为初始值,所以很明显,当我们遇到相同的情况时,第一种情况只会打印 1 个数字第二次循环,我必须减 1,这意味着第三次循环现在将从高度 + 1 运行到 2 倍的高度,这是我们想要的,其余的很容易看到。
  • 我明白了。非常感谢您的帮助!
【解决方案3】:

另一个代码。

#include <stdio.h>

int main()
{
    int i, j;
    int width = 7;
    int height = 7;
    int b = 3;

    for(i = 1; height >= i; ++i) {
        for(j = 1; width >= j; ++j) {
            if(width - i < j) {
                int x = (i % b);
                printf("%d", x ? x : b);
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }

    return 0;
}

【讨论】:

  • 好的,非常感谢!你的也可以,但是有点复杂
【解决方案4】:

您注释的 for 循环不应嵌套,您只需要获取 i 的值并从那里一直到 height。

另外,顶层for循环中的条件应该是i &gt; 0。

int main()
{
    int height, i, row, j;

    printf("Enter the height: ");
    scanf("%d", &height);

    for (i = height; i > 0; i--) //print the number of rows based on input
    {
        for (row = 0; row < i; row++) {
            printf(" ");
        }
        for (j = i; j <= height; j++) {
            printf("%d", (height - i) % 3 + 1);
        }
        printf("\n");
    }

    return 0;
}

这个输出:

Enter the height: 7
       1
      22
     333
    1111
   22222
  333333
 1111111

【讨论】:

  • @Denise 没问题 :-)
【解决方案5】:

只是为了表明您可以在printf 中使用宽度参数。

#include <stdio.h>

int main() {
    int height, j, n = 0;

    printf("Enter the height: ");
    scanf("%d", &height);

    for (j = 0; j < height; n *= 10)
    {
        printf("%*d\n", height+1, ++n * (1 + j++ % 3));
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多