对于初学者请注意,根据 C 标准,不带参数的函数 main 应声明为
int main( void )
小写字母没有必要连续无间隔。例如,这对于 EBCDIC 表不正确。
这是一个演示程序,展示了如何获得所需的输出。
#include <stdio.h>
int main(void)
{
const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
const size_t N = sizeof( alphabet ) - 1;
while ( 1 )
{
size_t n = 0;
printf( "Enter a non-negative number not greater than %zu (0 - exit ): ", N );
if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
n %= N + 1;
putchar( '\n' );
for ( size_t i = 0; i < n; i++ )
{
const char *p = alphabet;
do { printf( "%c ", *p++ ); } while ( p != alphabet + i + 1 );
if ( --p != alphabet )
{
do { printf( "%c ", *--p ); } while ( p != alphabet );
}
putchar( '\n' );
}
putchar( '\n' );
}
return 0;
}
程序输出可能看起来像
Enter a non-negative number not greater than 26 (0 - exit ): 26
a
a b a
a b c b a
a b c d c b a
a b c d e d c b a
a b c d e f e d c b a
a b c d e f g f e d c b a
a b c d e f g h g f e d c b a
a b c d e f g h i h g f e d c b a
a b c d e f g h i j i h g f e d c b a
a b c d e f g h i j k j i h g f e d c b a
a b c d e f g h i j k l k j i h g f e d c b a
a b c d e f g h i j k l m l k j i h g f e d c b a
a b c d e f g h i j k l m n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t u t s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t u v u t s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t u v w v u t s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t u v w x w v u t s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t u v w x y x w v u t s r q p o n m l k j i h g f e d c b a
a b c d e f g h i j k l m n o p q r s t u v w x y z y x w v u t s r q p o n m l k j i h g f e d c b a
Enter a non-negative number not greater than 26 (0 - exit ): 10
a
a b a
a b c b a
a b c d c b a
a b c d e d c b a
a b c d e f e d c b a
a b c d e f g f e d c b a
a b c d e f g h g f e d c b a
a b c d e f g h i h g f e d c b a
a b c d e f g h i j i h g f e d c b a
Enter a non-negative number not greater than 26 (0 - exit ): 4
a
a b a
a b c b a
a b c d c b a
Enter a non-negative number not greater than 26 (0 - exit ): 3
a
a b a
a b c b a
Enter a non-negative number not greater than 26 (0 - exit ): 2
a
a b a
Enter a non-negative number not greater than 26 (0 - exit ): 1
a
Enter a non-negative number not greater than 26 (0 - exit ): 0
程序中输出模式的部分可以放在一个单独的函数中,这样模式就可以在任何文件中输出。
你来了。
#include <stdio.h>
FILE * display_pattern( size_t n, FILE *fp )
{
static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
static const size_t N = sizeof( alphabet ) - 1;
n %= N + 1;
for ( size_t i = 0; i < n; i++ )
{
const char *p = alphabet;
do { fprintf( fp, "%c ", *p++ ); } while ( p != alphabet + i + 1 );
if ( --p != alphabet )
{
do { fprintf( fp, "%c ", *--p ); } while ( p != alphabet );
}
fputc( '\n', fp );
}
return fp;
}
int main(void)
{
while ( 1 )
{
size_t n = 0;
printf( "Enter a non-negative number (0 - exit ): " );
if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
putchar( '\n' );
display_pattern( n, stdout );
putchar( '\n' );
}
return 0;
}
同样,程序输出可能看起来像
Enter a non-negative number (0 - exit ): 5
a
a b a
a b c b a
a b c d c b a
a b c d e d c b a
Enter a non-negative number (0 - exit ): 4
a
a b a
a b c b a
a b c d c b a
Enter a non-negative number (0 - exit ): 3
a
a b a
a b c b a
Enter a non-negative number (0 - exit ): 2
a
a b a
Enter a non-negative number (0 - exit ): 1
a
Enter a non-negative number (0 - exit ): 0
如果你真的想输出一个金字塔,那么函数可以看起来像下一个演示程序中显示的那样。
#include <stdio.h>
FILE * display_pattern( size_t n, FILE *fp )
{
static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
static const size_t N = sizeof( alphabet ) - 1;
n %= N + 1;
for ( size_t i = 0; i < n; i++ )
{
const char *p = alphabet;
fprintf( fp, "%*c ", ( int )( 2 * ( n - i) - 1 ), *p++ );
while ( p != alphabet + i + 1 ) fprintf( fp, "%c ", *p++ );
if ( --p != alphabet )
{
do { fprintf( fp, "%c ", *--p ); } while ( p != alphabet );
}
fputc( '\n', fp );
}
return fp;
}
int main(void)
{
while ( 1 )
{
size_t n = 0;
printf( "Enter a non-negative number (0 - exit ): " );
if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
putchar( '\n' );
display_pattern( n, stdout );
putchar( '\n' );
}
return 0;
}
现在程序输出可能看起来像
Enter a non-negative number (0 - exit ): 5
a
a b a
a b c b a
a b c d c b a
a b c d e d c b a
Enter a non-negative number (0 - exit ): 4
a
a b a
a b c b a
a b c d c b a
Enter a non-negative number (0 - exit ): 3
a
a b a
a b c b a
Enter a non-negative number (0 - exit ): 2
a
a b a
Enter a non-negative number (0 - exit ): 1
a
Enter a non-negative number (0 - exit ): 0