2016-10-20 53 views
-1

我有這個函數叫做void rotateLeft(int *a, int *b, int *c, int *d)。我想給變量a,b,c和d這個函數。我要調用的函數,然後一個需要得到b值,d的價值Çdbç值的值。我在函數被調用的地方添加了我的主代碼,並添加了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

感謝您的幫助!當把一個變量的值放入另一個變量時,你需要使用一個&right? – 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