我的代码在除第一列之外的所有位置都打印1。我希望它在某些特定位置(r,c)打印1,其中r是行,c是列。另外,有人可以告诉我如何在每个索引处将0初始化为二维数组吗?
我试图将r和c的值重置为零,但没有任何变化。
int main()
{
int T;
cin>>T;
while(T--)
{
vector <long long int>R;
vector <long long int>C;
long long int N, M, K, r, c, i, j, k; // N -> rows, M -> columns
cin>>N>>M>>K;
long long int arr[N][M];
cout<<K<<endl;
for(i=0; i<N; i++)
{
for(j=0; j<M; j++)
{
arr[i][j] = 0;
}
}
for(k=0; k<K; k++)
{
cin>>r>>c;
arr[r][c] = 2;
r = 0; c = 0;
}
for(i=0; i<N; i++)
{
for(j=0; j<M; j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}
输入:
1 4 4 9 1 4 2 1 2 2 2 3 3 1 3 3 4 1 4 2 4 3
答案 0 :(得分:3)
一些评论: 首先,对于标准C ++,必须在编译时就知道C样式数组的大小,因此您不能从cin(这是GCC扩展名)中读取它们。 因此,如果您需要一个仅在运行时知道大小的数组,则建议使用std :: vector。
此外,在C ++中,通常的做法是在for循环范围内定义循环变量,如下所示:
for (int i = 0; i < N ++i)
这可以使周围的示波器保持清洁。可以使用以下统一初始化语法在C ++中将数组或结构初始化为零:
SomeStruct x{}; // All members are default initialized (e. g. for built-in types: 0)
SomeType myArray[N][M]{}; // All elements are default initialized
像这样的评论
// N -> rows, M -> columns
只是在说您应该将变量命名为行/列,而不是N / M。使您的代码具有自我说明性;)
我不建议在需要换行时使用std :: endl,因为它还会刷新缓冲区,这在写入文件时可能 对性能有严重影响(对于控制台输出,这没有问题)。更好的做法是使用'\ n'作为换行符,并在需要时显式使用std :: flush。
为了简单起见,我省略了外部的while循环,并使Rows / Columns保持不变。使用std :: vector时,应将Rows * Cols作为大小 一维数组,然后使用以下公式将位置(i,j)映射到一维索引:
arr2D[i][j] = arr1D[i*Cols + j]
;
如果您选择让用户指定行/列并使用
std::vector<int> vec(rows*cols);
作为数组。
int main()
{
constexpr int rows{3};
constexpr int cols{3};
int numUserValues{};
cin >> numUserValues;
int arr[rows][cols]{};
cout << numUserValues << '\n';
for(int k=0; k<numUserValues; k++)
{
int r{};
int c{};
if (cin>>r>>c && r>=0 && r<rows && c>=0 && c<cols) {
arr[r][c] = 2;
}
}
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
cout<<arr[i][j]<<" ";
}
cout<<'\n';
}
return 0;
}
您的程序非常不友好,因为您根本没有任何提示(例如cout << "Enter number of rows: ";
,但这是我的测试运行,因为您可以看到除我指定的元素外所有元素均为零:< / p>
$ ./test
5
5
0 0
1 1
2 2
0 1
0 2
2 2 2
0 2 0
0 0 2
您的问题很难回答,因为您说“我想在位置...上打印1” ,而您的代码说arr[r][c] = 2;
;)
“我的代码在除第一列之外的所有位置都打印1” ,表示5x5:
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
这不是事实,因此是虚假信息。
答案 1 :(得分:1)
我希望它在某些特定位置(r,c)打印1,其中r是行,c是列
您正在这样做:
cin>>r>>c;
arr[r][c] = 2;
当输入为“ 1 4”时,它会调用未定义行为(UB),因为超出范围,因为您拥有的2D数组的尺寸为4x4,所以您需要执行以下操作:< / p>
arr[r - 1][c - 1] = 1;
因为数组的索引为零。我将2更改为1,因为这就是您要的。
我试图将r和c的值重置为零,但没有任何变化。
这没有实际效果,因为r
和c
在下一次输入时将被覆盖。