我正在从事一项编程任务,并且停留在一部分上。这些说明要求为2d数组中的相等相邻元素创建一个计数。
我尝试设置2个for循环,然后使用“或”测试具有多个条件的if语句,以测试元素是否相等。问题是if语句只能用于数组内的元素。我尝试过的功能如下所示
int count(int** t, int r, int c) {
int i, j, count = 0;
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
if (t[i][j] == t[i - 1][j - 1] || t[i][j] == t[i - 1][j] || t[i][j] ==
t[i - 1][j + 1] || t[i][j] == t[i][j - 1] || t[i][j] == t[i][j + 1] ||
t[i][j] == t[i + 1][j - 1] || t[i][j] == t[i + 1][j] || t[i][j] == t[i +
1][j + 1])
count++; }
return count;
}
我是编程新手,请帮忙!
答案 0 :(得分:0)
您提供的代码几乎没有问题,我将一一介绍给您,
要将多维数组传递给函数,我将向您展示两种实现方法。
1)将多维数组作为一维数组传递 之所以有效,是因为我们知道数组是如何在内存中表示的,而我们对表示的了解就是使C / C ++中的指针成为强大工具的原因。 阅读此answer可以更好地了解内存中数组的表示形式。
数组在内存中线性且连续地表示,因此,如果将数组定义为arr[5][5]
,则告诉编译器我们需要一个具有足够空间的存储块,用于存储5 * 5 = 25 int数据类型。并且还应该知道数组以行主形式表示,请阅读this以了解有关行主形式的更多信息。
。
元素(此处为ints)以图片中之字形线所描述的方式填充。
因此,在我们的示例数组int arr[5][5]
中,
arr[0][1]
可以访问第一行(*(arr+0*5+1)
)的第二元素,因为arr
给出了数组的基地址,类似地,第五行(arr[4][3]
的第四元素)可以通过*(arr+4*5+3)
进行访问,这里我们将行索引乘以5,因为每行有5个元素(即列数),因此,考虑到这一点,我们可以编写代码来访问矩阵中的数组元素如下方式
void display(int *arr,int r,int c)
{
for(unsigned i=0;i<r;++i)
{
for(unsigned j=0;j<c;++j)
{
cout<<*(arr+i*c+j)<<ends;
}
cout<<endl;
}
}
const unsigned ROW=3,COL=3;
int main()
{
int arr[ROW][COL]={1,2,3,
4,5,6,
7,8,9
};
display((int *)arr,ROW,COL);
}
在调用函数时,必须将arr
强制转换为(int *)
,因为最初的arr类型是int (*)[3]
,即指向3个元素的int数组的指针。
2)将多维数组作为指针传递给函数参数中的数组。
const unsigned ROW=3,COL=3;
void display(int (*arr)[COL],int r,int c)
{
for(unsigned i=0;i<r;++i)
{
for(unsigned j=0;j<c;++j)
{
cout<<arr[i][j]<<ends;
}
cout<<endl;
}
}
int main()
{
int arr[ROW][COL]={1,2,3,
4,5,6,
7,8,9
};
display(arr,ROW,COL);
}
在此情况下,无需强制转换arr
在您的代码中,您并不需要注意数组索引是否超出范围,如果您的数组是int arr[5][5]
并尝试访问arr[-1][5]
或arr[5][3]
,则结果将是不确定的,这就是代码崩溃到系统崩溃(只是一个隐喻)而发生的一切。
牢记这些内容,可以满足您需求的有效代码
int count(int *t, int r, int c)
{
int i, j, result = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if(i!=r-1)
{
if(*(t+i*c+j)==*(t+(i+1)*c+j))
++result;
if(j!=r-1)
{
if(*(t+i*c+j)==*(t+(i+1)*c+j+1))
++result;
}
if(j!=0)
{
if(*(t+i*c+j)==*(t+(i+1)*c+j-1))
++result;
}
}
if(j!=c-1)
{
if(*(t+i*c+j)==*(t+i*c+j+1))
++result;
}
}
}
return result;
}
const unsigned ROW=3,COL=3;
int main()
{
int arr[ROW][COL]={1,1,2,
1,2,3,
4,5,2
};
cout<<count((int *)(arr),ROW,COL)<<endl;
}