2015-02-01 3 views
0

알고리즘을 생각해 봤는데 뭔가 물어보고 싶었습니다. 배열 내에 값의 범위를 설정하는 방법이 있습니까?C 배열 내의 범위

int N = 10; 
int array[N] = {2,6,5,9,4,3,5,9,4,9}; 

각 패스로 시작 값을 증가시키기 위해 루프를 사용.

for (int A = 1; A < N - 2; A++) { 
    for (int B = 1; B < N - 1; B++) { 
     int ProfitA = Sum(array[0...A-1]); 
     int ProfitB = Sum(array[A...A+B-1]); 
     int ProfitC = Sum(array[A+B...N-1]); 
    } 
} 

위의 C- 의사 코드를 사용하여 각 배열의 값 범위를 설정하는 방법은 무엇입니까?

+1

아니요, 자신 만의 합계 함수를 작성하고 배열 및 인덱스 범위를 제공해야합니다. – lared

+0

@lared가 말한 것처럼 의사 코드의 각 합계를 for 루프로 바꿔야합니다. –

+0

정확히 의미합니까? 다른 방법이 있습니까? 설명 해주십시오. –

답변

2

아니요, C에는 이러한 기능이 내장되어 있지 않습니다. 또한 배열에 함수를 전달하면 (즉 "포인터로 부식"이라고 함) 배열의 위쪽 경계를 가져 오는 기능이 없습니다.

  • 첫 번째 배열 요소 및 구성 요소의 수에 대한 포인터를 전달하거나
  • 초기에, 전체 어레이에 대한 인덱스를 포인터를 전달 :

    이 문제에 대한 두 개의 표준 용액이있다 첫 번째 방법은 다음과 같을 것이다

요소와 마지막 요소에 대한 인덱스 :

int sum_array(int* array, size_t len) { 
    int res = 0; 
    for (size_t i = 0 ; i != len ; i++) { 
     res += array[i]; 
    } 
    return res; 
} 
... 
int ProfitA = sum_array(array, A); 
int ProfitB = sum_array(array+A, B); 
int ProfitC = sum_array(array+A+B, N-A-B); 

두 번째 방법은 다음과 같이 보일 것이다 :

int sum_array(int* array, int first, int last) { 
    int res = 0; 
    for (int i = first ; i <= last ; i++) { 
     res += array[i]; 
    } 
    return res; 
} 
... 
int ProfitA = sum_array(array, 0, A-1); 
int ProfitB = sum_array(array, A, A+B-1); 
int ProfitC = sum_array(array, A+B, N-1); 
+0

그래서 sum_array 함수가 필요하다. 그리고 루프를 위해 더 많이 중첩됩니다. –

+0

@NikosKLon "더 많은 중첩 된 루프"가 무슨 뜻인지는 모르겠지만'sum_array '함수가이 트릭을 수행합니다. 합계를 계산할 때 루핑을 피할 수있는 방식으로 알고리즘을 다시 작성할 수는 있지만 알고리즘은 다를 수 있습니다. – dasblinkenlight

+0

@dasbblinklight 나에게 "다른 알고리즘"에 대한 아이디어를 줄 수 있습니까? –

1

당신이 계신 설명하는 데 사용되는 구문의 스타일을 사용하는 방법이 없습니다. 당신의 호출 코드가가를 제공하기 위해 필요,

두 확실한 방법은 배열을 제공하는 것입니다 및 지수 (언급 lared으로) 범위 또는 두 개의 포인터

사용 접근하든
int ProfitB = Sum(array + A, array + A+B-1); /* sum array[A] ... array[A+B-1] */ 

를 사용하여 범위를 지정 유효한 범위.