가장 큰 문제는 두 번째에 할당 색인입니다 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
이 in_arr''보다 더 보이지 않았다. 'res'에 대한 초기화가 없습니다. – pmg
괜찮습니다. 초기화를 컴파일하고, 변경된 모든 것은'0'을'C'에 추가했습니다. – tekknolagi
컴파일러에서 경고를 켜고보고 내용을 수정하십시오. 값을 찾지 못하면'res'가'in_arr'에 초기화되지 않습니다. 예를 들어,'printf ("", 더 작은 [counter]);'가 유효하지 않습니다) – Mat