其实并不需要定义一个数组来输出模式。
你只需要两个循环。
这是一个演示程序。
#include <iostream>
int main()
{
while ( true )
{
const unsigned int MAX_VALUE = 10;
std::cout << "Enter a non-negative number less than "
<< MAX_VALUE << " (0 - exit): ";
unsigned int n;
if ( not ( std::cin >> n ) or ( n == 0 ) ) break;
if ( MAX_VALUE - 1 < n ) n = MAX_VALUE - 1;
std::cout << '\n';
for ( unsigned int i = 0; i < n + 1; i++ )
{
for ( unsigned int j = 0; j < n; j++ )
{
if ( j == 0 || j == n - 1 )
{
std::cout << n;
}
else if ( i == 0 || i == n )
{
std::cout << n;
}
else
{
std::cout << i;
}
}
std::cout << '\n';
}
std::cout << '\n';
}
}
它的输出可能看起来像
Enter a non-negative number less than 10 (0 - exit): 1
1
1
Enter a non-negative number less than 10 (0 - exit): 2
22
22
22
Enter a non-negative number less than 10 (0 - exit): 3
333
313
323
333
Enter a non-negative number less than 10 (0 - exit): 4
4444
4114
4224
4334
4444
Enter a non-negative number less than 10 (0 - exit): 5
55555
51115
52225
53335
54445
55555
Enter a non-negative number less than 10 (0 - exit): 6
666666
611116
622226
633336
644446
655556
666666
Enter a non-negative number less than 10 (0 - exit): 7
7777777
7111117
7222227
7333337
7444447
7555557
7666667
7777777
Enter a non-negative number less than 10 (0 - exit): 8
88888888
81111118
82222228
83333338
84444448
85555558
86666668
87777778
88888888
Enter a non-negative number less than 10 (0 - exit): 9
999999999
911111119
922222229
933333339
944444449
955555559
966666669
977777779
988888889
999999999
Enter a non-negative number less than 10 (0 - exit): 0
也就是说,您可以将填充数组的所有循环替换为输出模式的一对循环中的 if 语句。
if 语句可以通过以下方式替换条件运算符
for ( unsigned int i = 0; i < n + 1; i++ )
{
for ( unsigned int j = 0; j < n; j++ )
{
std::cout << ( i % n == 0 || j % ( n - 1 ) == 0 ? n : i );
}
std::cout << '\n';
}
仅对数字[1, 9] 输出模式的限制是人为的。
将范围至少设置为[1, 255] 会更合理,其中255 是可以存储在unsigned char 类型的对象中的最大值。
可以通过表达式获取值
std::numeric_limits<unsigned char>::max()
要对齐输出的列,您可以使用标准函数std::setw 设置输出字段的宽度。
考虑到所有这些,程序可以如下所示。
#include <iostream>
#include <iomanip>
#include <limits>
int main()
{
while ( true )
{
const unsigned int Base = 10;
const unsigned int MAX_VALUE = std::numeric_limits<unsigned char>::max();
std::cout << "Enter a non-negative number less than or equal to "
<< MAX_VALUE << " (0 - exit): ";
unsigned int n = 0;
if ( not ( std::cin >> n ) || ( n == 0 ) ) break;
if ( MAX_VALUE < n ) n = MAX_VALUE;
// Calculating the width of numbers plus one space between them.
int number_width = 1;
unsigned int tmp = n;
do { ++number_width; } while ( tmp /= Base );
std::cout << '\n';
for ( unsigned int i = 0; i < n + 1; i++ )
{
for ( unsigned int j = 0; j < n; j++ )
{
std::cout << std::setw( number_width )
<< ( i % n == 0 || j % ( n - 1 ) == 0 ? n : i );
}
std::cout << '\n';
}
std::cout << '\n';
}
}
程序输出可能看起来像
Enter a non-negative number less than 255 (0 - exit): 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 20
20 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 20
20 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 20
20 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 20
20 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 20
20 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 20
20 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 20
20 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 20
20 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 20
20 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 20
20 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 20
20 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 20
20 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 20
20 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 20
20 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 20
20 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 20
20 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 20
20 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 20
20 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
Enter a non-negative number less than 255 (0 - exit): 0
至于您的代码,那么对于初学者,您应该检查用户输入的数字是否大于9
例如在这对循环中
for (i = 1;i < n - 1;i++)
{
for (j = 1;j < n - 2;j++)
{
pattern[i][j] = i;
}
}
条件至少应该看起来像
for (i = 1; i < n; i++)
{
for (j = 1; j < n - 1; j++ )
{
pattern[i][j] = i;
}
}
因为图案的高度等于n + 1,宽度等于n。因此,如果要排除最后一行和最后一列,则必须在循环条件中相应地使用表达式n 和n - 1。