该程序应从用户处获取一个整数,并如下所示打印图案。 如果n = 3,则
333
313
323
333
如果n = 4,则
4444
4114
4224
4334
4444
如果n = 5,则
55555
51115
52225
53335
54445
55555
以此类推
这是尝试过的。
#include<iostream>
using namespace std;
int main()
{
int pattern[10][10], i, j, n;
cout << "Enter dimension of square matrix: ";
cin >> n;
for (i = 0;i <= n;i++)
{
pattern[i][0] = n;
pattern[i][n - 1] = n;
}
for (j = 1;j < n - 2;j++)
{
pattern[0][j] = n;
pattern[n][j] = n;
}
for (i = 1;i < n - 1;i++)
{
for (j = 1;j < n - 2;j++)
{
pattern[i][j] = i;
}
}
for (i = 0;i <=n;i++)
{
for (j = 0;j < n;j++)
{
cout << pattern[i][j];
cout << "\t";
}
cout << "\n";
}
return 0;
}
我得到了正确的模式,但是在某些地方,有一些垃圾值(或其他值)
答案 0 :(得分:1)
以清晰,简洁的方式做的非常简单:
#include<iostream>
int main()
{
int n = 0;
std::cout << "Enter dimension of square matrix: ";
std::cin >> n;
for (int i = 0; i < n + 1; ++i) {
for (int j = 0; j < n; ++j) {
// if on the first or last column/row: print n, else: print i
std::cout << ((i == 0 || j == 0 || i == n || j == n-1) ? n : i) << '\t';
}
std::cout << '\n';
}
return 0;
}
示例输出:
Enter dimension of square matrix: 5 5 5 5 5 5 5 1 1 1 5 5 2 2 2 5 5 3 3 3 5 5 4 4 4 5 5 5 5 5 5
答案 1 :(得分:0)
您的方法正确!一些简单的更改将给出正确的答案。
#include<iostream>
using namespace std;
int main()
{
int pattern[10][10], i, j, n;
cout << "Enter dimension of square matrix: ";
cin >> n;
for (i = 0;i <= n;i++)
{
pattern[i][0] = n;
pattern[i][n - 1] = n;
}
for (j = 1;j <n ;j++)
{
pattern[0][j] = n;
pattern[n][j] = n;
}
for (i = 1;i < n ;i++)
{
for (j = 1;j < n -1;j++)
{
pattern[i][j] = i;
}
}
for (i = 0;i <=n;i++)
{
for (j = 0;j < n;j++)
{
cout << pattern[i][j];
cout << "\t";
}
cout << "\n";
}
return 0;
}
答案 2 :(得分:-1)
我认为您正在使事情变得过于复杂-绝对不需要二维数组和所有循环。
您可以只使用基本的辅助函数printer
,它会打印带有嵌套数字i的版本,并从1到最后一个数字(例如5)循环执行。
#include <cstdio>
#include <iostream>
int main() {
unsigned user_input = 5; // change to ask for actual user input
// Helper function, i.e. for 3 it prints 53335
auto printer = [](unsigned i) {
for (unsigned n = 0; n < user_input; ++n) {
if (n == 0 || n + 1 == user_input) std::cout << user_input;
else std::cout << i;
}
std::cout << '\n';
};
printer(user_input); // print 55555
// print the rest 51115, 52225 ... up to 55555 again
for (unsigned i = 1; i <= user_input; ++i) printer(i);
}
如果您认为也需要在其他地方使用printer
函数或不想使用lambda,则当然可以将其移动并给它一个签名:
void printer(unsigned i, unsigned user_input) {
/* copy-paste the code from printer */
}
答案 3 :(得分:-1)
实际上,无需定义数组即可输出模式。
您需要的只是两个循环。
这是一个演示程序。
#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
。