funktion swap

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo mene Aufgabe heisst:

Für das folgende Problem soll eine Prozedur swap entworfen werden. Die Inhalte zweier ganzzahliger Variablen, die als Parameter zu übergeben sind, sollen vertauscht werden.Diskutieren Sie Implementierungen, wie sie in höheren Programmiersprachen möglich sind.Realisieren sie eine davon in java und erläutern sie in der Dokumentation ihre Vorgehensweise.

Wenn jemand dazu ein paar Ideen hätte wäre das echt lieb....
Danke schon im vorraus
 
also gut
habe für java
Code:
class CallByReferenceSimulation
{
    static void swap(int[] a, int[] b)
    {
        int h = a[0];
        a[0] = b[0];
        b[0] = h;
    }

    public static void main(String[] test)
    {
        int[] x = {1};
        int[] y = {2};
        swap(x,y);
        System.out.println("x = " + x[0] + ", y = " + y[0]);
    }
}

es geht ja wohl darum zu diskutieren das man bei java nur call by value benutzen kann oder???
 
Zunächst losgelöst von deinem Code, schau dir einmal folgenden Code an und beachte insbesondere den einkommentierten unteren Code-Teil. Wenn du nämlich diesen Code-Teil auskommentierst und ausführst, stellst du fest, dass das Ergebnis nicht so ist, wie gewünscht.

Ich denke, darum geht es bei diesem Beispiel.
Achtung - mein Code stellt keine vollständige Lösung deiner Aufgabenstellung dar!

Code:
public class Swap {
  private static int num1 = 12;
  private static int num2 = 56;

  public static void main(String args[]) {
    int buffer;   // Achtung - diese Variable ist wichtig, siehe auch unten!
  	System.out.println("Ausgangswerte lauten " 
           + num1 + " und " + num2); 
     buffer = num1;
     num1 = num2;
     num2 = buffer;
     System.out.println("Abschlusswerte lauten " 
           + num1 + " und " + num2); 
  }
}

/*
public class Swap {
private static int num1 = 12;
private static int num2 = 15;

public static void main(String args[]) {
   System.out.println("Ausgangswerte lauten " 
         + num1 + " und " + num2); 
   num1 = num2;
   num2 = num1;
   System.out.println("Abschlusswerte lauten " 
         + num1 + " und " + num2); 
}
}
*/
 
Ist doch richtig, brauchst die nur global zu machen. Du brauchst übrigens keine Arrays zu benutzen.

Liebe Grüße
Reality
 
AAAh ich verstehe also ich kann einer Variablen einen Wert zuweisen, kann aber dann nicht mehr auf den alten Wert dieser Variablen zurückgreifen, stimmts??? siehe code teil 2
 
Gast hat gesagt.:
AAAh ich verstehe also ich kann einer Variablen einen Wert zuweisen, kann aber dann nicht mehr auf den alten Wert dieser Variablen zurückgreifen, stimmts??? siehe code teil 2
Ja, kann man so sagen, weil du bei der unteren Variante eben die Ausgangswerte deiner Variablen so überschreibst, dass du keinen Tausch der beiden Werte hinbekommst. Das schaffst du nur mit einem Zwischenwert, wie in der oberen Code-Variante dargestellt.
 
Übrigens wird es interessant, wenn du mit Objekten Zuweisungen vornimmst. Dazu einmal folgendes Beispiel:
Code:
class MyNumber {
	int integer;
}

public class ObjektZuweisung {
	public static void main(String[] args) {
		MyNumber n1 = new MyNumber();
		MyNumber n2 = new MyNumber();
		n1.integer = 12;
		n2.integer = 15;
		System.out.println("Ausgangsstand                : n1.integer: " + n1.integer + ", n2.integer: " + n2.integer);
		n1 = n2;
		System.out.println("Nach Zuweisung n1=n2         : n1.integer: " + n1.integer + ", n2.integer: " + n2.integer);
		n1.integer = 27;
		System.out.println("Nach Zuweisung n1.integer=27 : n1.integer: " + n1.integer + ", n2.integer: " + n2.integer);
	}
}

Die Ausführung des Codes ergibt dann folgend Ausgabe:
Code:
Ausgangsstand                : n1.integer: 12, n2.integer: 15
Nach Zuweisung n1=n2         : n1.integer: 15, n2.integer: 15
Nach Zuweisung n1.integer=27 : n1.integer: 27, n2.integer: 27
 
soo alles klar herzlichen dank und wegen dem "Diskutieren sie" hab ich mir gedacht kann man ja sagen:

Java kennt (genauso wie C, aber im Gegensatz zu etwa Pascal) kein "Call by Reference". Wenn Objekte als Parameter verwendet werden, wird eben die Referenz "by Value" übergeben. Somit kann man zwar das Objekt (so es veränderbar ist) verändern, aber nicht die originale Variable, die als Parameter verwendet wurde. Ein Beispiel wie es nicht geht:
Bsp Turbo Pascal
Beispiel für Call by Reference:
(Pascal - [Syntax bestimmt nicht korrekt])
program ReferenzTest(input, output);

var
x, y : integer;

procedure swap (var a: integer; var b: integer);
var
h : Integer;

begin
h := a;
a := b;
b := h;
end;

begin
x := 1;
y := 2;
swap(x,y);
writeLn('x = ', x, ', y = ', y , '.');
end.

Das Programm gibt am Ende x = 2 und y = 1 aus. In Java geht das nicht:

[/code]
Zur Call-by-Reference-Simulation bietet sich die Verwendung von Arrays an - da diese Objekte sind, wird ja nur die Referenz übergeben.

Code:
class CallByReferenceSimulation
{
    static void swap(int[] a, int[] b)
    {
        int h = a[0];
        a[0] = b[0];
        b[0] = h;
    }

    public static void main(String[] test)
    {
        int[] x = {1};
        int[] y = {2};
        swap(x,y);
        System.out.println("x = " + x[0] + ", y = " + y[0]);
    }
}
is das so ihaltlich richtig?
 
Hier noch ein Tip für alle, die es interessiert.
Wenn man die Werte von 2 Variablen tauschen möchte, ohne eine Hilfsvariable zu nehmen, muss man beide Variablen mit XOR verknüpfen.

Code:
  int a=0,b=9;
  System.out.println("a="+a+" , b="+b);
  // Ausgabe ergibt "a=0 , b=9"

  a=a^b;  // hier werden die Werte getauscht
  b=a^b;
  a=a^b;  // Ende des Tausches

  System.out.println("a="+a+" , b="+b);
  // Ausgabe ergibt "a=9 , b=0"
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben