2016-10-20 136 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