如何使这个 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()
之类的东西来找出数字的宽度并适当地调整您的计算。
我的任务是打印出一个三角形数字的数字,直到金字塔形状的最终值,但我终究无法让它均匀分布和居中,而且我不能只使用 %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()
之类的东西来找出数字的宽度并适当地调整您的计算。