我想画一个这样的图案:
567898765
4567654
34543
232
1
但是我似乎不能弄清楚,因为这是我目前得到的输出:
567898765
45678987654
3456789876543
234567898765432
12345678987654321
这是我的代码:
#include <stdio.h>
int main() {
int a, b, c, s;
for (a = 5; a >= 1; a--) {
for (s = a; s <= 4; s++) {
printf(" ");
}
for (b = a; b <= 9; b++) {
printf("%d", b);
}
for (c = 8; c >= a; c--) {
printf("%d", c);
}
printf("n");
}
return 0;
}
你基本上是对的,只有b
和c
循环中的恒定值9
和8
是不合适的,因为三角形的中心轴并不总是9
;取值为2*a-1
、2*a-2
。
始终尝试编写更通用的代码,而不要使用像5
和9
这样的神奇数字。对于某些幻数,无效代码可能会给出预期的结果,但对于其他幻数,它将不起作用。
也要在最小范围内声明变量。
程序输出不正确的主要原因是在这些for循环中使用了幻数9
和8
。
for (b = a; b <= 9; b++) {
printf("%d", b);
}
for (c = 8; c >= a; c--) {
printf("%d", c);
}
我可以提出以下的解决方案。
#include <stdio.h>
int main( void )
{
const unsigned int MAX_HEIGHT = 50;
while (1)
{
unsigned int n;
printf( "Enter the height of a triangle not greater than %u (0 - exit): " , MAX_HEIGHT );
if (scanf( "%u", &n ) != 1 || n == 0) break;
int width = 1 + snprintf( NULL, 0, "%d", 2 * n - 1 );
putchar( 'n' );
for (unsigned int i = n; i != 0; --i)
{
printf( "%*u", ( n - i + 1 ) * width, i );
size_t j = 1;
for (; j < i; j++)
{
printf( "%*u", width, i + j );
}
--j;
while (j-- != 0)
{
printf( "%*u", width, i + j );
}
putchar( 'n' );
}
putchar( 'n' );
}
}
程序输出可能看起来像
Enter the height of a triangle not greater than 50 (0 - exit): 10
10 11 12 13 14 15 16 17 18 19 18 17 16 15 14 13 12 11 10
9 10 11 12 13 14 15 16 17 16 15 14 13 12 11 10 9
8 9 10 11 12 13 14 15 14 13 12 11 10 9 8
7 8 9 10 11 12 13 12 11 10 9 8 7
6 7 8 9 10 11 10 9 8 7 6
5 6 7 8 9 8 7 6 5
4 5 6 7 6 5 4
3 4 5 4 3
2 3 2
1
Enter the height of a triangle not greater than 50 (0 - exit): 5
5 6 7 8 9 8 7 6 5
4 5 6 7 6 5 4
3 4 5 4 3
2 3 2
1
Enter the height of a triangle not greater than 50 (0 - exit): 1
1
Enter the height of a triangle not greater than 50 (0 - exit): 0