2011-01-04 3 views
0

2 차원 배열에서 요소를 검색하는 함수를 작성하려면 어떻게해야합니까? if exists가 1을 반환하면, 그렇지 않으면 no를 반환합니다.2 차원 배열에서 요소를 검색하는 함수는 어떻게 작성합니까?

#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

시도해 보셨습니까? – aschepler

+0

말하기 어렵습니다. 오류 및 경고없이 컴파일 되었습니까? 사용한 테스트 데이터로 작동하는 것으로 보입니까? – paxdiablo

+0

예. 출력이 올바르지 않습니다. – BinaryLife

답변

3

아니요, 그렇지 않습니다. 두 개의 for 루프 중 return 0;을 이동해야하며 마지막 문은 search이어야합니다.

+0

과 그의 컴파일러는 이것에 대해 경고해야합니다; 그렇지 않은 경우 경고 수준을 더 높게 설정해야합니다. –

+0

@Philip : 경고해야하는 이유는 무엇입니까? (경고는 "항상 1 줄 블록에 대해서도 괄호를 사용합니다"경고)? 컴파일러 작가의 시간을 소비하는 것을 정당화하는 것은 정말 좁은 시나리오가 아닌가? – Jon

+0

그래, 그게 내가 필요한 건, 고마워, 많은 친구 :) – BinaryLife

0

return 0;이 for 루프 안에 있기 때문에 가능하지 않습니다.

1

No. 마지막 문 닫기 전에 줄에 return 0; 문을 입력해야합니다.

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; 
} 
1
검색 요소가 배열 인 경우는 [0] [0], 그렇지 않으면 반환하는 경우 검색 알고리즘 1을 반환하기 때문에 프로그램이 실행되지

그 요소가 존재하지 않는다고 생각하면됩니다. 전체 다차원 배열을 가로 지른 후에 0을 반환하면됩니다.

위의 답변을 살펴볼 수 있습니다. 그들은 좋은 해결책을 제시해 왔습니다.

0

존 (Jon)이 필요한 답변을 주셨지만 알고 있어야 할 몇 가지 세부 사항이 있습니다.

배열의 C 처리는 search 함수가 int의 3x3 배열을받지 못하도록합니다. 대신 포인터를 3 요소 배열 int으로 수신합니다. C 언어에서 표준 초안 n1256 :

6.3.2.1 Lvalues, 배열 및 기능 부호
...가 sizeof 운영자 또는 단항 & 연산자의 오퍼랜드 인 경우를 제외
3 또는 배열을 초기화하는 데 사용되는 문자열 리터럴 인 경우 형식이 ''유형의 배열 ''인 식은 배열 개체의 초기 요소를 가리키는 유형 ''포인터 ''유형의 식으로 변환됩니다. lvalue. 배열 객체에 레지스터 저장 클래스가 있으면 비헤이비어가 정의되지 않습니다. 만약 result = search(Array, number);를 호출 할 때

따라서, 식 Array 유형은 암시 int의 3 소자 어레이 (int (*)[3] 포인터에 int (int [3][3])의 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)로 가져 와서이를 개별 배열 요소 (sizeof *arr 또는 sizeof arr[0])의 바이트 수로 나눠서 배열을 만듭니다. 이것은 배열 타입의 표현식에 대해서만 작동합니다; 배열로 처리되는 포인터 (예 : search 함수의 a)에는 작동하지 않습니다. 당신이 행 열의 다른 숫자를 처리하는 경우

, 다른 접근 방식 걸릴해야합니다 :이 경우

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의 배열에 대한 포인터를받는 대신 searchint에 대한 간단한 포인터를받습니다.이 포인터는 1D 배열로 처리되며 오프셋은 수동으로 i * cols + j으로 계산됩니다. 이 코드에서는 2D 배열의 모든 요소가 연속되어 있다고 가정합니다. C99에서, 당신은 배열 차원이 아니라 상수 표현식보다 런타임 변수로 지정할 수있는 가변 길이 배열 (블라스를) 호출 무엇을 가질 수

편집

참고; 이것은 우리가 프로토 타입을 쓸 수있게 해줍니다.

int search(size_t rows, size_t cols, int arr[rows][cols], int x) 

그리고 포인터가 엉망이 아닙니다.

관련 문제