如何使这个 C 三角数生成器的数字居中?

How do I center the numbers for this C triangular number generator?

我的任务是打印出一个三角形数字的数字,直到金字塔形状的最终值,但我终究无法让它均匀分布和居中,而且我不能只使用 %6i 之类的,因为它必须对我们输入的任何数字都有效。我试过证明,使用一个单独的变量根据用户定义的数字计算间距,但是 none 它起作用了。

以 15 为例,我们的结果应该如下图所示。

它在午夜前到期,我们已经为此忙了好几天了。我的代码有点长:

//Include the usual libraries
#include <stdio.h>

//Declare the main function
int main (void)

{

  //Declare variables
  int  space, n, triNum, ast, num, triDisplay = 0, number = 1;

  //Welcome the user to your program
  printf("Welcome to Phase 1!\nThis program will display a triangular number of your choosing in 'graphical' format.\n");

  //Prompt the user for the triangular number
  printf("Enter the triangular number: ");
   scanf("%i", &triNum);

   //This loop keeps track of how many times the nested loops have run.
   n = 1;
   while(n<=triNum)
   {

    //This loop prints the spaces before the asterisks, and decreases the amount printed after each line.
    space=n;
    while(space>0, space<triNum)
    {
     printf(" ");
     space++;
    }//End of second loop

    //This loop prints the asterisks and increases the amount printed by one for each line.
    ast=n;
    while(ast>0)
     {
      printf("* ");
      ast--;
     }//End of third loop

   printf("\n") ;
   n++;
   }//End of first loop

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------

   //This loop is identical to the first loop, but is used to display a different set of loops
   n = 1;
   while(n<=triNum)
   {


    space=n;
    while(space>0, space<triNum)
     {
      printf(" ");
      space++;
     } 

    //This loop prints the number associated with each asterisk in triangle format
     num = 1; 
    while(num>0, num<=n)
     {
     printf("%i ",number);
     number++;
     num++;
     }
    n++;
    printf("\n");
   }
    //This loop calculates the actual value of the triangular number
    n=1;
   while(n<=triNum)
   {    
    triDisplay += n;
    n++;
   }

  printf("\nThe triangular number of %i is %i.\n", triNum, triDisplay);
  //Thank the user for using your program
  printf("Thank you for using this program! Have a nice day.\n");

//End function
return 0;
}

这是我们目前的样子。

看起来你很接近,你离开的原因似乎是你的数字之间总是有一个 space。第一张图片在数字之间有多个 spaces,找出如何根据数字中的位数计算 spaces 的数量,你应该知道它。

问题说明是否说明应该包含多少 space,或者金字塔的最终对齐方式究竟应该是什么?

这非常接近您的需要,唯一的区别是每行的开头多了 2 spaces,因为开始底行的 3 位数字仍然使用 5 space秒。因此,您可能需要弄清楚如何为每行中的第一个数字准确使用 x 位数,其中 x 等于底行第一个数字的位数,在本例中为 3。

while (n <= triNum)
{


    space = n * 3;
    while (space>0, space<(triNum * 3))
    {
        printf(" ");
        space++;
    }

    //This loop prints the number associated with each asterisk in triangle format
    num = 1;
    while (num>0, num <= n)
    {
        printf("%5i ", number);
        number++;
        num++;
    }
    n++;
    printf("\n");
}

输出:

                                              1
                                           2     3
                                        4     5     6
                                     7     8     9    10
                                 11    12    13    14    15
                              16    17    18    19    20    21
                           22    23    24    25    26    27    28
                        29    30    31    32    33    34    35    36
                     37    38    39    40    41    42    43    44    45
                  46    47    48    49    50    51    52    53    54    55
               56    57    58    59    60    61    62    63    64    65    66
            67    68    69    70    71    72    73    74    75    76    77    78
         79    80    81    82    83    84    85    86    87    88    89    90    91
      92    93    94    95    96    97    98    99   100   101   102   103   104   105
  106   107   108   109   110   111   112   113   114   115   116   117   118   119   120

让我解释一下我改变了什么。我建议您在更新代码时遵循,这样您就可以理解并修复最后一点,并确保它适用于其他数字。

我注意到的第一件事是您一开始没有获得足够的 spaces。鉴于每个数字最多为 3 位数,我认为您应该添加 3 space 而不是 1,所以我更改了

while (space>0, space<triNum)

while (space>0, space<(triNum * 3))

这看起来好多了,但是现在底行的 space 太多了,所以我想我们在调整 [=45] 的数量时也应该减去 3 而不是 1 =]s,所以我改了

space = n;

space = n * 3;

前面的 space 数看起来确实是正确的,但事情似乎仍然不一致。所以看你正确的金字塔,我看到每个数字好像占了6spaces,所以我改了

printf("%i ", number);

printf("%5i ", number);

现在就是这样。它适用于我提出的许多不同示例,但绝不是详尽无遗。我认为只要您最终打印的数字不超过 5 位就可以了。如果 space 的数量真的无关紧要(即必须是最小的并且仍然有平衡的行),那么你可以将 printf() 的宽度增加到任何可以容纳你必须的最大数量的东西容纳。

也读一下printf() manual page again. (And again, and again, and again. When you've read twice a day for a week, you can read it just once a week for the next month, and then once a month for the next year, and thereafter once a year for life — and you'll still probably spot something new after 30 years, if only because the specification has changed over that time. The same is necessary for scanf(),只是比较难;您可能需要在一个月内每周阅读两次。)

您可以使用 int 变量(或值)指定宽度来告诉 printf() 打印多宽。

例如:

for (int i = 0; i < 10; i++)
    printf("[%*d%*s]\n", i + 3, 121, i, "");

将生成:

[121]
[ 121 ]
[  121  ]
[   121   ]
[    121    ]
[     121     ]
[      121      ]
[       121       ]
[        121        ]
[         121         ]

您可以使用 snprintf() 之类的东西来找出数字的宽度并适当地调整您的计算。