2016-10-20 3 views
-1

이 함수의 이름은 void rotateLeft(int *a, int *b, int *c, int *d)입니다. 이 함수에 변수 a, b, c 및 d를 제공하려고합니다. I 함수를 호출 할 다음 요구 B의 값 D 얻을 의 값이, CDBC 값의 값 . 함수가 호출되는 위치와 rotateLeft 함수의 코드 아래에 주요 코드를 추가했습니다. 작동 시키려면 rotateLeft 함수에 무엇을 넣어야합니까?C에서 변수 값 전환

#include <stdio.h> 
#include <stdlib.h> 


void rotateLeft (int*, int*, int*, int*); 

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

    int a,b,c,d,n; 

    while((n = scanf("%d%d%d%d",&a,&b,&c,&d)) == 4) 
    { 
     rotateLeft(&a,&b,&c,&d); 
     printf("%d %d %d %d\n",a,b,c,d); 
    } 

} 

rotateLeft 함수 여기

#include <stdio.h> 
#include <stdlib.h> 

void rotateLeft(int *a, int *b, int *c, int *d){ 




} 
+0

너무 어렵지 않습니다. 너 무슨 짓을 한거야? 어서! 우리가 당신을 위해 당신의 일을 할 것으로 기대하지 마십시오. 당신은 기본적으로 코드를 나열했지만 영어로 ... – unwind

+0

그것은 나를 위해 꽤 어렵습니다. 나는 단지 C 초보자입니다. – Teuntje

+1

문제는 특정 언어가 아니며, 알고리즘 수준에 있습니다. 원래 값 중 하나를 잃지 않고 값을 다른 변수로 이동할 수있는 알고리즘을 찾아야합니다. "a = b; b = a;"의 문제를 이해하십시오. 이를 수정 한 다음 두 변수 이상을 회전하도록 확장합니다. –

답변

1

좋아요, 어쩌면 저는 질문에 더 많은 코드가 필요하다고 생각합니다. 여기

내가 그것을 해결할 방법은 다음과 같습니다

void rotateLeft(int *a, int *b, int *c, int *d){ 
    const int tmp = *a; 
    *a = *b; 
    *b = *c; 
    *c = *d; 
    *d = tmp; /* Because we've overwritten 'a', use a copy. */ 
} 

매우 솔직, 나는 희망한다.

+0

도와 주셔서 감사합니다! 변수의 값을 다른 변수에 넣을 때 &를 사용해야합니까? – Teuntje

+0

@Teuntje 아니요, 제 코드는 정확합니다. '&'("address of") 연산자는 포인터로 작업 할 때 무언가의 주소를 취하는 데 사용됩니다. 그래서'scanf()'와'rotateLeft()'와 함께 사용하기 때문에, 변경해야하는 변수에 대한 포인터가 필요합니다. – unwind

2

2 개 변수를 교환하기위한 코드이다. 문제에 맞게 조정하십시오.

void swap(int *a, int *b) 
{ 
    int tmp = *a; 
    *a = *b; 
    *b = tmp 
} 
+0

나는 대답을 철저하게 제공하지 않고 이런 종류의 문제에 접근하는 방법에 대한 기초를 제공하므로이 대답을 좋아합니다. – callyalater

0

다른 임시 변수에 어떤 이유로 든 공간을 할당하지 않으려면 XOR 연산자를 사용하여 값을 스왑/회전 할 수 있습니다. XOR 연산자는 parity function이라고도합니다. 실용적인 응용 프로그램보다 흥미로운 사실입니다. 아래 코드의 rotate_left 함수는 3 개의 변수 만 사용하지만 원칙은 여러 변수에 적용될 수 있습니다 (변수 순서가 출력에 미치는 영향을 보려면 rotate_right 함수를 참조하십시오).

#include <stdio.h> 

void number_swap(int* a, int* b) { 
    *a ^= *b; 
    *b ^= *a; 
    *a ^= *b; 
} 

void rotate_left(int* a, int* b, int* c) { 
    *a ^= *b^*c; 
    *c ^= *a^*b; 
    *b ^= *a^*c; 
    *a ^= *b^*c; 
} 

void rotate_right(int* a, int* b, int* c, int* d) { 
    *a ^= *b^*c^*d; 
    *b ^= *a^*c^*d; 
    *c ^= *a^*b^*d; 
    *d ^= *a^*b^*c; 
    *a ^= *b^*c^*d; 
} 

int main() { 
    int a = 7894; 
    int b = 1989; 
    printf("a = %d, b = %d\n", a, b); 
    number_swap(&a, &b); 
    printf("a = %d, b = %d\n", a, b); 

    int aa = 5; 
    int bb = 8; 
    int cc = 3; 
    printf("aa = %d, bb = %d, cc = %d\n", aa, bb, cc); 
    rotate_left(&aa, &bb, &cc); 
    printf("aa = %d, bb = %d, cc = %d\n", aa, bb, cc); 

    int aaa = 1; 
    int bbb = 3; 
    int ccc = 5; 
    int ddd = 7; 
    printf("aaa = %d, bbb = %d, ccc = %d, ddd = %d\n", aaa, bbb, ccc, ddd); 
    rotate_right(&aaa, &bbb, &ccc, &ddd); 
    printf("aaa = %d, bbb = %d, ccc = %d, ddd = %d\n", aaa, bbb, ccc, ddd); 

    return 0; 
} 

이 다음과 같은 출력을 생성합니다

a = 7894, b = 1989 
a = 1989, b = 7894 
aa = 5, bb = 8, cc = 3 
aa = 8, bb = 3, cc = 5 
aaa = 1, bbb = 3, ccc = 5, ddd = 7 
aaa = 7, bbb = 1, ccc = 3, ddd = 5 

당신이 예 here를 실행할 수 있습니다.

XOR 스왑 알고리즘이 작동하는 이유에 대한 자세한 내용은 here을 참조하십시오.