2011-05-01 2 views
1

왜 결합을 사용할 수 없습니까? 그것은 세트 B에서 4 (e)를 가지지 않습니다 ... 왜?C - 배열을 결합하십시오.

 
#include <stdio.h> 

#define SIZEOF_A 6 
#define SIZEOF_B 6 

typedef enum { 
     a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 
} set; 

void dispSet(set numbers[], int size_numbers) { 
    int i; 
    printf("[ "); 
    for (i = 0; i < size_numbers-1; i++) { 
    printf("%d, ", numbers[i]); 
    } 
    printf("%d ]", numbers[size_numbers-1]); 
    printf("\n"); 
} 

int in_arr(int A, set B[], int B_size) { 
    int res = 0; 
    int counter; 
    for (counter = 0; counter < B_size; counter++) { 
     if (A == B[counter]) { 
      res = 1; 
      break; 
     } 
    } 
    return res; 
} 

int arr_in_arr(set smaller[], int smaller_size, set bigger[], int bigger_size) { 
    int res = 1; 
    int counter; 
    for (counter = 0; counter < smaller_size; counter++) { 
     if (in_arr(smaller[counter], bigger, bigger_size)) { 
      continue; 
     } 
     else { 
      res = 0; 
      break; 
     } 
    } 
    return res; 
} 

int size_c(set arr1[], int arr1_size, set arr2[], int arr2_size) { 
    int i; 
    int newsize = 0; 
    for (i = 0; i < arr1_size; i++) { 
     if (!in_arr(arr1[i], arr2, arr2_size)) { 
      newsize++; 
     } 
    } 
    for (i = 0; i < arr2_size; i++) newsize++; 
    printf("\nSIZE OF C: %d\n", newsize); 
    return newsize; 
} 

int Join(set arr1[], int arr1_size, set arr2[], int arr2_size, set arr3[], int arr3_size) { 
    int i, j; 
    for (i = 0; i < arr1_size; i++) { 
     arr3[i] = arr1[i]; 
    } 
    for (i = 0; i < arr2_size; i++) { 
     j = i+arr2_size; 
     if (!in_arr(arr2[i], arr3, arr3_size)) { 
      arr3[j] = arr2[i]; 
     } 
    } 
} 

int main() { 
    set A[SIZEOF_A] = {c, d, f, a, b, j}; 
    set B[SIZEOF_B] = {a, b, c, d, e, f}; 
    int SIZEOF_C = size_c(A, SIZEOF_A, B, SIZEOF_B); 
    int counter; 
    printf("For the sets,\n"); 
    printf("A: "); 
    dispSet(A, SIZEOF_A); 
    printf("B: "); 
    dispSet(B, SIZEOF_B); 
    printf("C: "); 
    set C[SIZEOF_C]; 
    Join(A, SIZEOF_A, B, SIZEOF_B, C, SIZEOF_C); 
    dispSet(C, SIZEOF_C); 
    printf("%s\n", (arr_in_arr(A, SIZEOF_A, B, SIZEOF_B) == 1)?"B contains A":"B does not contain A"); 
} 
+1

이 in_arr''보다 더 보이지 않았다. 'res'에 대한 초기화가 없습니다. – pmg

+0

괜찮습니다. 초기화를 컴파일하고, 변경된 모든 것은'0'을'C'에 추가했습니다. – tekknolagi

+1

컴파일러에서 경고를 켜고보고 내용을 수정하십시오. 값을 찾지 못하면'res'가'in_arr'에 초기화되지 않습니다. 예를 들어,'printf ("", 더 작은 [counter]);'가 유효하지 않습니다) – Mat

답변

2

가장 큰 문제는 두 번째에 할당 색인입니다 Join() 기능 루프 :

i 넌 제로로 리셋된다 (그리고 i 값의 일부를 첨가하지 않는) 경우에도 적절 arr3 배열을 통해 진행하는 카운터를 유지할 필요
int Join(set arr1[], int arr1_size, set arr2[], int arr2_size, set arr3[], int arr3_size) 
{ 
    int i; 
    for (i = 0; i < arr1_size; i++) 
     arr3[i] = arr1[i]; 
    for (i = 0; i < arr2_size; i++) 
    { 
     if (!in_arr(arr2[i], arr3, arr3_size)) 
      arr3[i+arr1_size] = arr2[i]; 
    } 
} 

. 이 함수는 값을 반환하도록 선언되었지만 그렇게하지는 않습니다 - 또 다른 버그입니다. 결과 배열 (아래 참조)의 실제 크기를 반환하거나 void을 반환하는 함수를 선언하십시오. 반환 값이 사용되지 않기 때문에 두 번째 옵션이 더 좋을 수 있습니다.

int Join(set arr1[], int arr1_size, set arr2[], int arr2_size, set arr3[], int arr3_size) 
{ 
    int i; 
    int k = 0; 
    for (i = 0; i < arr1_size; i++) 
     arr3[k++] = arr1[i]; 
    for (i = 0; i < arr2_size; i++) 
    { 
     if (!in_arr(arr2[i], arr3, arr3_size)) 
      arr3[k++] = arr2[i]; 
    } 
    assert(k <= arr3_size); 
    return k; 
} 

하나의 작은 (성능보다는 정확성) 문제 :이 일을 할 수

두 번째 루프는 다음과 같이 더 간결하게 쓸 수
int newsize = 0; 
for (i = 0; i < arr1_size; i++) 
{ 
    if (!in_arr(arr1[i], arr2, arr2_size)) 
     newsize++; 
} 
for (i = 0; i < arr2_size; i++) 
    newsize++; 

: 실제로

newsize += arr2_size; 

또는, newsize = arr2_size;을 초기화 한 다음 추가 기능을 계산할 수 있습니다.

int arr_in_arr(set smaller[], int smaller_size, set bigger[], int bigger_size) 
{ 
    int res = 1; 
    int counter; 
    for (counter = 0; counter < smaller_size; counter++) 
    { 
     if (in_arr(smaller[counter], bigger, bigger_size)) 
      printf("%d ", smaller[counter]); 
     else 
     { 
      res = 0; 
      break; 
     } 
    } 
    return res; 
} 

하나, 그것은 형식 문자열에 '%d'을해야하거나 조건이 반전되어야하고 전체 기능을 단순화 :

int arr_in_arr(set smaller[], int smaller_size, set bigger[], int bigger_size) 
{ 
    int counter; 
    for (counter = 0; counter < smaller_size; counter++) 
    { 
     if (!in_arr(smaller[counter], bigger, bigger_size)) 
      return 0; 
    } 
    return 1; 
} 

int newsize = arr2_size; 
for (i = 0; i < arr1_size; i++) 
{ 
    if (!in_arr(arr1[i], arr2, arr2_size)) 
     newsize++; 
} 

arr_in_arr()에서 의심스러운 printf() 문이있다

counter의 변수는 main()입니다.


구조적으로 보면 '설정'추상화는 좋지 않습니다. 함수를 호출 할 때마다 배열과 크기를 전달해야합니다. 또한 집합이 아닌 단일 요소가 포함 된 변수 set x;을 가질 수 있습니다. 구조로이 점을 향상시킬 수는 있지만 당분간 너무 많은 메모리를 할당 할 수 있습니다.

중복이없는 세트를 보장하는 코드도 없습니다. 즉, 집합을 정의하는 경우이다

set D[] = { a, c, a, d }; 

이 좌측 (제) 오퍼랜드는 출력에서 ​​두 개의 요소를 포함 할 a이었다 Join() 연산의 결과 세트. 덧붙여 말하면, Join() 작업은 집합 노조로 간주 될 수도 있습니다 (a ∪ b).


는이 코드로 끝났다을 선언 그들도 어떤 헤더를 사용하는 다른 파일이 없기 때문에 기능은 정적 만들어

#include <stdio.h> 
#include <assert.h> 

#define SIZEOF_A 6 
#define SIZEOF_B 6 

typedef enum 
{ 
     a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 
} set; 

static void dispSet(set numbers[], int size_numbers) 
{ 
    int i; 
    printf("[ "); 
    for (i = 0; i < size_numbers-1; i++) 
     printf("%d, ", numbers[i]); 
    printf("%d ]", numbers[size_numbers-1]); 
    printf("\n"); 
} 

static int in_arr(set A, set B[], int B_size) 
{ 
    int res = 0; // XXX: uninitialized 
    int counter; 
    for (counter = 0; counter < B_size; counter++) 
    { 
     if (A == B[counter]) 
     { 
      res = 1; 
      break; 
     } 
    } 
    return res; 
} 

static int arr_in_arr(set smaller[], int smaller_size, set bigger[], int bigger_size) 
{ 
    int counter; // XXX: simplified 
    for (counter = 0; counter < smaller_size; counter++) 
    { 
     if (!in_arr(smaller[counter], bigger, bigger_size)) 
      return 0; 
    } 
    return 1; 
} 

static int size_c(set arr1[], int arr1_size, set arr2[], int arr2_size) 
{ 
    int i; 
    int newsize = arr2_size; // XXX: compacted 
    for (i = 0; i < arr1_size; i++) 
    { 
     if (!in_arr(arr1[i], arr2, arr2_size)) 
      newsize++; 
    } 
    printf("\nSIZE OF C: %d\n", newsize); 
    return newsize; 
} 

static int Join(set arr1[], int arr1_size, set arr2[], int arr2_size, set arr3[], int arr3_size) 
{ 
    int i; 
    int k; // XXX: fixed 
    for (i = 0; i < arr1_size; i++) 
     arr3[k++] = arr1[i]; 
    for (i = 0; i < arr2_size; i++) 
    { 
     if (!in_arr(arr2[i], arr3, arr3_size)) 
      arr3[k++] = arr2[i]; 
    } 
    assert(k <= arr3_size); 
    return k; 
} 

int main(void) 
{ 
    set A[SIZEOF_A] = {c, d, f, a, b, j}; 
    set B[SIZEOF_B] = {a, b, c, d, e, f}; 
    int SIZEOF_C = size_c(A, SIZEOF_A, B, SIZEOF_B); 
    printf("For the sets,\n"); 
    printf("A: "); 
    dispSet(A, SIZEOF_A); 
    printf("B: "); 
    dispSet(B, SIZEOF_B); 
    printf("C: "); 
    set C[SIZEOF_C]; 
    Join(A, SIZEOF_A, B, SIZEOF_B, C, SIZEOF_C); 
    dispSet(C, SIZEOF_C); 
    printf("%s\n", (arr_in_arr(A, SIZEOF_A, B, SIZEOF_B) == 1)?"B contains A":"B does not contain A"); 
} 

(그리고 그 -Wmissing-prototypes에서 컴파일러 경고를 종료) . 내가 사용 (애플의 GCC 4.2.1를 사용하여 맥 OS X 10.6.7에) 그것을 컴파일 :

gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes join.c -o join 

출력은 다음과 같습니다

SIZE OF C: 7 
For the sets, 
A: [ 2, 3, 5, 0, 1, 9 ] 
B: [ 0, 1, 2, 3, 4, 5 ] 
C: [ 2, 3, 5, 0, 1, 9, 4 ] 
B does not contain A 
3

문제는 새로운 변수를 확인 말할 배열 3에 새로운 요소를 배치하고 배열 2의 요소를 액세스하기 위해를 사용하는 것입니다 배열에서 요소에 액세스하는 데 사용되는 J 3.

이것은 나를 위해 일했습니다.

int Join(set arr1[], int arr1_size, set arr2[], int arr2_size, set arr3[], int arr3_size) { 
    int i; 
    int j = 0; /*NEW VARIABLE*/ 
    for (i = 0; i < arr1_size; i++) { 
     arr3[i] = arr1[i]; 
    } 

    for (i = 0; i < arr2_size; i++) { 
     if (!in_arr(arr2[i], arr3, arr3_size)) { 
      arr3[j+arr1_size] = arr2[i]; /*USE j TO ADD ELEMENT TO arr3*/ 
     j++; /*INCREMENT EACH TIME THIS IS DONE*/ 
     } 
    } 
}
+0

정말 고마워. ! – tekknolagi

0

의 노조에 시도뿐만 e에 합류 지점에서 코드를 실행하자 :이 경우

for (i = 0; i < arr2_size; i++) { 
    if (!in_arr(arr2[i], arr3, arr3_size)) { 
     arr3[i+arr1_size] = arr2[i]; 
    } 
} 

, arr2에서 e의 인덱스 4. 동일이 글은 아니다 arr3이므로 arr3i+arr1_size에 넣으려고합니다. 여기서 문제가있어 - 그래서 코드 e가 아니라고 인식이다

- (> 7 10 미만) i+arr1_sizesize_c가 올 바르면 6 + 4, 10, 그래서 arr3_size 7.이되어야한다 arr3에 있고 이며, arr3에 넣으려고 시도하지만이 위치에있는 색인이 배열의 경계를 벗어 났으므로이 점에서 실패합니다.

arr3의 요소 수를 별도로 추적해야합니다.

[편집] 아, 나는이 꽤 많이 요엘에 대해 말하고 있었는지 추측, 나는 그것을 아주 잘 읽어 보지 않았 처음으로 [/ 편집]

관련 문제