2013-04-29 4 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 yes Я хочу вызвать 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

ответ, который вы даете, не будет называть f с порядком, который OP предоставляет в своем вопросе – MOHAMED

+0

Спасибо, что указали это. Я сделал соответствующее редактирование. –

0

Все, что вам не хватает в внутрипартийной большинства петли f(A[i], A[j], A[k]);.

0

В приведенном примере, оказывается, что вы хотите, чтобы петли через три (3) перестановок A [0], A [1 ] и 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]); 
    } 

Кто-то, я считаю, уже перечислил алгоритм, используя оператор модуля «%», так что я буду пропустите это. Вы также можете использовать предопределенный массив. Рассмотрим ...

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]); 
     } 
    } 

Конечно, выше не дает вам тот же порядок вызова f(), что вы размещены в вашем вопросе, но это может быть полезным в предоставлении вам новые идеи о том, каким образом вы хотите продолжить.

Надеюсь, это поможет.

+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

Смежные вопросы