如何编写函数来搜索二维数组中的元素:if exists返回1,否则返回no?
#include <stdio.h>
int search(int a[3][3],int x);
int main ()
{
int Array[3][3]; // array of size 3*3
int i,j; //counters i,j
int result,number;
for(i=0;i<3;i++)
{
printf("\n");
for(j=0;j<3;j++)
{
printf(" Array[%d][%d]= ",i,j);
scanf("%d", &Array[i][j]); //Fill The 3*3 array
}
}
printf("Enter The number you want:>");
scanf("%d",&number);
result=search(Array,number);
if(search(Array,number))
printf("Number exists\n");
else
printf("Number does not exists\n");
return 0;
}
int search(int a[3][3],int x){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if (x==a[i][j])
return 1;
return 0;
}
}
}
这是对的吗?
答案 0 :(得分:3)
不,不是。您需要将return 0;
移出两个for
循环,并将其作为search
中的最后一个语句。
答案 1 :(得分:1)
没有。 return 0;
语句应放在最后一个右括号之前的行上。
答案 2 :(得分:1)
您的程序没有运行,因为当且仅当搜索元素在数组[0] [0]中时,搜索算法返回1,否则它返回零并且您认为该元素不存在。您需要做的就是在遍历完整的多维数组后返回0。
您可以查看以上答案。他们给出了很好的解决方案。
答案 3 :(得分:0)
不,因为你的return 0;
在for循环中。
答案 4 :(得分:0)
我认为你想要的是:
#include <stdio.h>
int search(int a[3][3],int x);
int main ()
{
int Array[3][3]; // array of size 3*3
int i,j; //counters i,j
int result,number;
for(i=0;i<3;i++)
{ printf("\n");
for(j=0;j<3;j++)
{
printf(" Array[%d][%d]= ",i,j);
scanf("%d", &Array[i][j]); //Fill The 3*3 array
}
}
printf("Enter The number you want:>");
scanf("%d",&number);
result=search(Array,number);
if(result)
printf("Number exists\n");
else
printf("Number does not exists\n");
return 0;
}
int search(int a[3][3],int x)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if (x==a[i][j])
return 1;
}
}
return 0;
}
答案 5 :(得分:0)
Jon为您提供了所需的答案,但有一些细节需要注意。
C对数组的处理使得search
函数不会收到int
的3x3数组;相反,它接收一个指针到int
的3元素数组。根据C语言标准,起草n1256:
6.3.2.1左值,数组和函数指示符
...
3除非它是sizeof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,否则将转换类型为''数组'类型的表达式到类型为''指向类型'的指针的表达式,它指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义。
因此,当您调用result = search(Array, number);
时,表达式Array
的类型将从int
的{3}元素的3元素数组中隐式转换(int [3][3]
)指向int
(int (*)[3]
)的3元素数组的指针。在函数参数声明的上下文中,T a[]
和T a[n]
与T *a
同义。您可以将函数原型更改为
int search(int (*a)[3], int x)
它的行为完全相同。
这样做的一个结果是search
不仅可以在3x3阵列上运行,而且可以在任何Nx3阵列上运行。你已经编写了函数来假设a
总是3x3;如果您希望能够处理不同行数的数组,则需要传入一个单独的参数来指定数组中的行数:
int search(int (*a)[3], size_t rows, int x)
{
size_t i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < 3; j++)
if (a[i][j] == x)
return 1;
return 0;
}
int main(void)
{
int fiveRowArray[5][3] = {{ 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9},
{10,11,12}, {13,14,15}};
int twoRowArray[2][3] = {{ 1, 2, 3}, { 4, 5, 6}};
int number;
printf("Gimme a number: ");
fflush(stdout);
scanf("%d", &number);
if (search(array, sizeof fiveRowArray / sizeof *fiveRowArray, number))
printf("Number exists in fiveRowArray\n");
else
printf("Number does not exist in fiveRowArray\n");
if (search(array, sizeof twoRowArray / sizeof *twoRowArray , number))
printf("Number exists in twoRowArray \n");
else
printf("Number does not exist in twoRowArray \n");
return 0;
}
sizeof arr / sizeof *arr
表达式通过获取总数组大小(以字节为单位(sizeof arr
)并将其除以单个数组元素中的字节数({{1}来计算数组中元素的数量}或sizeof *arr
)。请注意,这仅适用于数组类型的表达式;它不适用于被视为数组的指针(例如sizeof arr[0]
函数中的表达式a
)。
如果要处理不同数量的行和列,则必须采用不同的方法:
search
在这种情况下,我们显式地将指针传递给每个数组中的第一个元素,因此int search(int *a, size_t rows, size_t cols, int x)
{
size_t i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
if (a[i * cols + j] == x)
return 1;
return 0;
}
int main(void)
{
int fiveByThree[5][3] = {...};
int twoByFour[2][4] = {...};
...
if (search(&fiveByThree[0][0],
sizeof fiveByThree / sizeof *fiveByThree,
sizeof fiveByThree[0] / sizeof *fiveByThree[0],
number))
...
if (search(&twoByFour[0][0],
sizeof twoByFour / sizeof *twoByFour,
sizeof twoByFour[0] / sizeof *twoByFour[0],
number))
...
}
接收一个指向int
的简单指针,而不是接收指向search
数组的指针。 },我们将其视为一维数组,并手动计算偏移量为int
。此代码假定2D数组中的所有元素都是连续的。
修改强>
请注意,在C99中,您可以拥有所谓的可变长度数组(VLA),其中数组维度可以由运行时变量而不是常量表达式指定;这允许我们将原型编写为
i * cols + j
并没有弄乱指针。