2013-04-29 5 views
0

인수를 루프로 변경하여 함수를 구현하려면 어떻게해야합니까? 나는 형태로 기능을 구현할 수 있도록하고 싶습니다 즉루프의 함수 인수 인수

:

f(A[0], A[1], A[2]); 
f(A[2], A[0], A[1]); 
f(A[1], A[2], A[0]); 
f(A[0], A[1], A[2]); 
f(A[2], A[0], A[1]); 
f(A[1], A[2], A[0]); 

나는 아래의 프로그램을 올바른 위치에 숫자를 만들 수있는 것으로까지 얻었다는의 printf를 사용하여 테스트() 함수 :

#include <stdio.h> 

int main() 
{ 
    int i, j, k, l; 

    for(i = 0; i < 2; i++) 
    { 
     for(j = 0; j < 3; j++) 
     { 
      for(k = 0; k < 3; k++) 
      { 
       l = k - j; 
       if(l < 0) 
        l += 3; 
       printf("%d", l); 
      } 
      printf("\n"); 
     } 
    } 
} 
+0

그것은 무엇을 묻고있는거야? 'f'를 구현하고 싶습니까? 아니면 인수를 순환 순열로 * f * 호출하는 코드를 원하십니까? –

+0

모듈러스 연산자 ('%')를 사용하여 순환 순열을 생성하는 것이 훨씬 쉽습니다. 즉, "* 형식으로 함수를 구현할 수 있어야합니다."라는 의미가 명확하지 않습니다. 주의를 기울여야겠습니까? – dmckee

+0

@ExP 예 순환 순열을 사용하여 f를 호출하고 싶습니다. 따라서 실제 코드에서 코드의 최상단 블록을 작성하는 것보다 (실제로는 6 줄 이상이됩니다) 루프로 작성할 수 있습니다. –

답변

3

, 당신이 필요로하는 모든입니다

주어진 예에서
int i; 
for (i = 0; i < NUM_CALLS; i++) 
    f(A[(2 * i) % 3], A[(2 * i + 1) % 3], A[(2 * i + 2) % 3]) 
+0

글쎄, 그는 순열을 거꾸로 원해. 주요 질문에 대한 내 의견을 참조하십시오. – dmckee

+1

당신이주는 대답은 그의 질문에 OP가 제공하는 순서로 f를 부르지 않을 것입니다. – MOHAMED

+0

그것을 지적 해 주셔서 감사합니다. 나는 해당 편집을했다. –

0

누락 된 부분은 가장 안쪽 루프에 f(A[i], A[j], A[k]);입니다. 내가 제대로 질문을 이해한다면

0

, 당신이 A [0], A [1 세 (3) 순열을 통해 루프 할 것으로 보인다 ] 및 A [2]. 다른

for (i = 0; i < NUM_ITERATIONS; i++) 
    { 
    f (A[0], A[1], A[2]); 
    f (A[2], A[0], A[1]); 
    f (A[1], A[2], A[0]); 
    } 

누군가가, 내가 이미 나머지 연산자 '%'그래서 나는 것를 사용하는 알고리즘을 나열 것으로 판단

당신이 할 것입니다 찾고되지 않을 수 있습니다 무엇을 가장 간단한 방법은 ... 그것을 건너 뜁니다. 사전 정의 된 배열을 사용할 수도 있습니다. 위에서 당신에게 당신이 당신의 질문에 게시 F()를 호출의 순서를 제공하지 않습니다 ...

ArgumentArray[6] = {A[0], A[1], A[2], A[0], A[1]}; 

for (i = 0; i < NUM_ITERATIONS; i++) 
    { 
    for (j = 0; j < 3; j++) 
     { 
     f (ArgumentArray[j], ArgumentArray[j+1], ArgumentArray[j+2]); 
     } 
    } 

부여, 고려하지만, 어떤 방법에 대해 당신이 원하는 당신에게 새로운 아이디어를 제공에 도움이 될 수 있습니다 발하다.

희망이 도움이됩니다.

+0

제안 해 주셔서 감사합니다. 주기적으로 사용되는 더 많은 기능이 있으므로 (제 생각에는 단순화했습니다 :)) 제 경우에는이 코드를 사용하지 않을 것입니다. :)). –

0

인덱스가 매번 오른쪽으로 순환 이동한다는 것을 알 수 있습니다. 그래서 여기에 내가 당신에게 제안 할 수있는 것 후

void indices_circular_right_shift(int *indices) { 
    // The indices are circular rught shifted 
    int k = indices[2]; 
    indices[2] = indices[1]; 
    indices[1] = indices[0]; 
    indices[0] = k; 
} 

int main (int argc, char *argv[]){ 

    int indices[3] = {0, 1, 2}; 
    int i = 0; 
    for (i=0; i<6; i++) { 
     f(A[indices[0]], A[indices[1]], A[indices[2]]); 
     indices_circular_right_shift(indices); 
    } 

} 
+0

이렇게하는 또 다른 불필요하게 복잡한 방법. – dmckee

+0

@dmckee 당신이 당신의 의견에 제공하는 솔루션이 내 것이 더 간단합니다. 대답으로 주시면 제 것을 삭제하겠습니다. – MOHAMED