C :: Aufgabe #163

3 Lösungen Lösungen öffentlich

Kleine Variablenspielerei

Anfänger - C von kjaenke - 03.07.2017 um 15:05 Uhr
Schreibe ein Programm das zwei Zahlen entgegen nimmt und jeweils in eine Variable speichert.
Tausche die Werte der Variablen ohne weitere Variablen zu definieren.
Es sind im ganzen Programm nur die zwei vorher definierten Variablen erlaubt!

Viel Spaß :)

Lösungen:

vote_ok
von devnull (8870 Punkte) - 04.07.2017 um 20:53 Uhr

Konsolenausgabe:

$ ./varswap 1234 5678
Input: a=1234, b=5678, swapped: a=5678, b=1234

Quellcode ausblenden C-Code
/***************************************
 * varswap.c  Variableninhalte tauschen
 ***************************************/
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) {
	int a, b;	

	if (argc != 3) {
	  printf("Usage: varswap <Zahl 1> <Zahl 2>\n");
	  return 0;
	}	
	a = atoi(argv[1]);
	b = atoi(argv[2]);		
	printf("Input: a=%d, b=%d, swapped: a=%d, b=%d\n",
	        a, b, a^(a^b), b^(a^b));
	return 0;
}
vote_ok
von devnull (8870 Punkte) - 05.07.2017 um 17:50 Uhr
In meiner Lösung 1 war die Idee gut, aber die Ausführung schlecht, da die Variablen-Zuweisungen fehlen.
Hier die verbesserte Version:
Quellcode ausblenden C-Code
/***************************************
 * varswap.c  Variableninhalte tauschen
 ***************************************/
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) {
	int a, b;	

	if (argc != 3) {
	  printf("Usage: varswap <Zahl 1> <Zahl 2>\n");
	  return 0;
	}	
	a = atoi(argv[1]);
	b = atoi(argv[2]);		

	printf("Input  : a=%d, b=%d\n", a, b);
	a = a^b;
	b = b^a;
	a = b^a;
	printf("swapped: a=%d, b=%d\n", a, b);
	return 0;
}
vote_ok
von devnull (8870 Punkte) - 06.07.2017 um 13:04 Uhr
Lösung mit Bitshifting:

Konsolenausgabe:

$ ./varswap2 2147483647 1234567890
Input : a=2147483647, b=1234567890
swapped: a=1234567890, b=2147483647

Quellcode ausblenden C-Code
/***************************************
 * varswap2.c  Variableninhalte tauschen
 ***************************************/
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>

int main(int argc, char **argv) {
	int32_t a;
	int64_t b; 

	if (sizeof(a) == sizeof(b)) {
		printf("int32 and int64 have same size on this machine.\n");
		return 1;
	}
	
	if (argc != 3) {
	  printf("Usage: varswap <Zahl 1> <Zahl 2>\n");
	  return 0;
	}	
	a = atoi(argv[1]);
	b = atoi(argv[2]);		

	printf("Input  : a=%d, b=%ld\n", a, b);
	b = b<<32|a;
	a = b>>32;
	b = b&UINT32_MAX;
	printf("swapped: a=%d, b=%ld\n", a, b);
	return 0;
}