Notfall Methoden

wer_bin_ich

Mitglied
Hallo, ich habe einen Notfall ich muss zu morgen eine Aufgabe fertig haben. Wär echt super, wenn ihr mir ein bisschen helfen könntet :)

Also ich soll 4 Methoden verlgeichen die zwei Zahlen vertauschen.
a) Dabei soll ich mir ein gültiges Java-Fragment als Aufruf der Methoden überlegen.
b) Ich soll erklären aus welchen Gründen einige Methoden die Zahlen korrekt vertauschen und andere nicht. Und warum manche nur bei bestimmte Zahlen richtig vertauschen(bei angenommern korreketer methode)
c) Bei tausche3 soll ich einen allgemenen Nachweis, machen dass ich eine korrekte Arbeitsweise habe.

Java:
public static void tausche1(int a, int b) {
int c = a;
a = b;
b = c;
}

Java:
public static void tausche2(int[] a) {
int c = a[0];
a[0] = a[1];
a[1] = c;
}

Java:
public static void tausche3(int[] a) {
a[0] = a[1] - a[0];
a[1] = a[1] - a[0];
a[0] = a[1] + a[0];
}

Java:
public static void tausche4(int[] a) {
int[] c = new int[a.length];
c[0] = a[1];
c[1] = a[0];
for (int i=2; i<a.length; i++) {
c[i] = a[i];
}
a = c;
}

SOOO
a)
also als erstes weiß ich garnicht, was die mit java-Fragment meinen? Soll ich einfach nen Programm schreiben, wo die Methode dann aufgerufen wird???

b)
Erstmal tauschen alle methoden natürlch nur bestimmte zahlen, da alle vom typ Integer sind:
Tausche1 und tausche2 sollte funktionieren.
Tausche3 iwie nicht. bin es mal mit nem beispiel durchgegangen und irgendwie kommt dann was anderes raus :/
tausche 4 leuchtet mir iwie nicht ein
was besagt denn diese hier:

for (int i=2; i<a.length; i++) {
c = a;
}
a = c;
dass er felder erzeugt bis a.length, aber warum soll dann c=a sein?

c)tja einen allgemeinen nachweis woll die? bestimmt so richtig mit x und y...

Java:
public static void tausche3(int[] a) {
//lese zahlen x und y
//sei dabei a[0]=x und a[1]=y
a[0] = a[1] - a[0];
//x = y-x
a[1] = a[1] - a[0];
//y = y - (y-x) 
a[0] = a[1] + a[0];
//(y-x) = (y-(y-x)) + (y-x)
// dann folgt (y-x) = y- 2x
// rauskommen sollte jetzt x=y und y=x durch umformen erhält man aber
//y=y-x und x=2x
}

ich hoffe das reicht so.
Wie gesagt ich muss das abgebn und bin nich so der Überflieger :/
 

Xeonkryptos

Bekanntes Mitglied
Tausche3 iwie nicht. bin es mal mit nem beispiel durchgegangen und irgendwie kommt dann was anderes raus :/

Vielleicht, weil du in der ersten Zeile innerhalb der Methode den Wert an der Stelle 0 im Array änderst, aber wohl mit dem alten Wert aus der Übergabe rechnen willst, dies jedoch nicht mehr möglich ist, weil dieser mit einem anderen "ausgetauscht" bzw ersetzt wurde und in der zweiten Zeile verwendest du nun den neuen int-Wert in a[0] und nicht den zuvor übergebenen alten. Möglicherweise ist das fehlerhaft.

was besagt denn diese hier:

for (int i=2; i<a.length; i++) {
c = a;
}
a = c;
dass er felder erzeugt bis a.length, aber warum soll dann c=a sein?


Das besagt aus, dass die Schleife bei 2 beginnt zu zählen, solange i kleiner als die Länge von a ist und nach jedem Durchlauf zählt er um 1 weiter (das i natürlich!). In der Schleife werden dann alle passenden a-Stellen in die passenden c-Stellen geschrieben.
 

Kiri

Bekanntes Mitglied
Java:
    public static void tausche3(int[] a) 
    {
        a[0] = a[1] - a[0];
        a[1] = a[1] - a[0];
        a[0] = a[1] + a[0];
    }

funktioniert einwandfrei
 
Zuletzt bearbeitet:

Xeonkryptos

Bekanntes Mitglied
funktioniert zum Beispiel bei a[0] = 1; a[1] = 2;

Ich gehe mal davon aus, dass es nur funktioniert, wenn im ersten Feld des Arrays die kleinere Zahl von beiden vorhanden ist, denn sonst rutscht es ganz schnell in den negativen Bereich rein und das Ergebnis wird verfälscht.

Ist jetzt mein Gedankengang, worin der Fehler liegen könnte.
 

Kiri

Bekanntes Mitglied
bei mir läuft tausche3 einwandfrei egal ob der erste oder zweite Wert kleiner ist, selbst bei negativen Zahlen funktioniert es
 

wer_bin_ich

Mitglied
Viel Dank für eure Antworten!:toll:

@FinalStriker
ich habe mal tausche2 versucht:)

Java:
public class bsp {

	public static void tausche2(int[] a) {
		int c = a[0];
		a[0] = a[1];
		a[1] = c;
		
	}
	
	public static void main (String[] args){
	
	if (args.length!=2)
		System.out.println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
	else{
		try{
			System.out.println(String.valueOf(tausche2(Integer.parseInt(args[0]),Integer.parseInt(args[1]))));
		} catch (NumberFormatException error){
			System.out.println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
		}
	} 
    }
}
mh nur leider bekomm ich dann die fehlermeldung, bei

System.out.println(String.valueOf(tausche2(Integer.parseInt(args[0]),Integer.parseInt(args[1]))));

dass tausche2 nicht "applicable for the argument" ist
hm gibt die methode denn was zurück? oder muss ich noch iwie
return a[0], a[1] oder sowas schrieben?
hm vllt auch ien bisschen zu kompliziert:/


@Xeonkryptos und Kiri
also funktioniert die Methode taushce 3 nicht, und Kiris Beispiel wäre nur ein zufall? ich glaube, dass die Methode nicht funktioniet, wenn a[0]> a[1] ist.
kann das sein?

Ber echt super von euch, dass ihr so schnell antwortet :]
 

Xeonkryptos

Bekanntes Mitglied
bei mir läuft tausche3 einwandfrei egal ob der erste oder zweite Wert kleiner ist, selbst bei negativen Zahlen funktioniert es

Kann gut möglich sein. Hab es nicht ausgetestet, aber wenn der TO irgendwelche Probleme hat, bin ich von einer zu Anfang falschen Logik ausgegangen bzw. von einer nur eingeschränkt möglichen Überprüfung, aber anscheinend liegt es nicht am Code, wohl eher am TO selbst. :)
 

Kiri

Bekanntes Mitglied
Implementiere sie und probiere es aus. Ich habe einige Varianten versucht, alle haben geklappt.

Edit: Zu Beginn dachte ich, diese Methode tausche3 funktioniert nur in bestimmten fällen. Habe aber keinen Fall gefunden, der nicht funktioniert!
 
Zuletzt bearbeitet:

Xeonkryptos

Bekanntes Mitglied
Hier mal eine Überarbeitung, damit dein Code wunderbar funktioniert: deine Bsp-Klasse:

Java:
public class Bsp {

	public static int[] tausche2(int... a) {
		int c = a[0];
		a[0] = a[1];
		a[1] = c;
		return a;
	}

	public static void main(String[] args) {

		if (args.length != 2)
			System.out
					.println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
		else {
			try {				
				int[] a = tausche2(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
				for (int b : a) {
					System.out.println(b);
				}
			} catch (NumberFormatException error) {
				System.out
						.println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
			}
		}
	}
}

Du hast den Fehler gemacht, dass du in deiner Parameterliste nach einem Array verlangst. Nun musst du auch ein Array übergeben, du versuchst aber zwei Int-Werte zu übergeben und das ist bei deinem Beispiel nicht möglich. 2 einzelne Werte sind kein Array!!
 

wer_bin_ich

Mitglied
hm... aber laut aufgabestellung hört es sich so an, als ob nicht alle methoden die zahlen richtig vertauschen und manche nur bei bestimmten zahlen :/ jetzt bin ich verwirrt, wenn alle gehen

demnach wäre aber auch mein allgemeiner nachweis bei tausche3 verkehrt... hm muss ich wohl nochmal drüberschauen.

OHH viel Dank Xeonkryptos. jetzt wo du das sagst is es logisch:toll:
dann versuch ich schnell noch alle anderen
 

Xeonkryptos

Bekanntes Mitglied
Gehe aber nicht zu 100% davon aus, dass irgendwo ein Fehler sein muss. Teste es einfach aus, ob du irgendeinen Fehler findest und wenn nicht, dann gibt es keinen und sie wollten dich mit der Aufgabe nur verwirren!

BTW: Die tasuche4-Methode kann GAR NICHT funktionieren, denn du hast eine Schleife, die mit ihrem Zähler auf 2 steht und das schon die max Größe der Arrays ist und dann noch hochzählt! Dir fliegt hier eine ArrayIndexOutOfBoundsException um die Ohren, weswegen diese wohl nicht funktioniert! Mal von der restlichen Logik abgesehen.
 

Kiri

Bekanntes Mitglied
BTW: Die tasuche4-Methode kann GAR NICHT funktionieren, denn du hast eine Schleife, die mit ihrem Zähler auf 2 steht und das schon die max Größe der Arrays ist und dann noch hochzählt! Dir fliegt hier eine ArrayIndexOutOfBoundsException um die Ohren, weswegen diese wohl nicht funktioniert! Mal von der restlichen Logik abgesehen.

Jein - die Methode funktioniert, der Inhalt der for-Schleife wird einfach nicht ausgeführt und das ist auch gut so, da sonst zweimal getauscht wir und wieder alles beim alten ist!
 

wer_bin_ich

Mitglied
so tausche3 funzt also auch als aufruf

Java:
Tausche3
public class bsp {
 
  
	public static int[] tausche3(int... a) {
		a[0] = a[1] - a[0];
		a[1] = a[1] - a[0];
		a[0] = a[1] + a[0];
	return a;	
	}
	
 
    public static void main(String[] args) {
 
        if (args.length != 2)
            System.out
                    .println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
        else {
            try {               
                int[] a = tausche3(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
                for (int b : a) {
                    System.out.println(b);
                }
            } catch (NumberFormatException error) {
                System.out
                        .println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
          }
        }
      }
   }

nur tausche 1 macht mir noch schwierigkeiten
Java:
public class bsp {

	public static int tausche1(int a, int b) {
	int c = a;
	a = b;
	b = c;
	return a;
	}
 
 
    public static void main(String[] args) {
 
        if (args.length != 2)
            System.out
                    .println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
        else {
            try {               
                int[] a = tausche1(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
                for (int b : a) {
                    System.out.println(b);
                }
            } catch (NumberFormatException error) {
                System.out
                        .println("Bitte geben Sie 2 ganze Zahlen als Kommandozeilenparamenter an!");
          }
        }
      }
   }

bei
int[] a = tausche1(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
muss ich wohl etwas anderes machen, wei ich ja in der methode keine Felder habe... oder muss ich in der methode die variablen als felder angeben?


und bei tausche4
Java:
public static void tausche4(int[] a) {
int[] c = new int[a.length];
c[0] = a[1];
c[1] = a[0];
for (int i=2; i<a.length; i++) {
c[i] = a[i];
}
a = c;
}
heißt das Xeonkryptos, dass ich den zähler höher setzen muss, als 2 damit es funktionert?

entschuldigt die vielen fragen :oops:
 

Kiri

Bekanntes Mitglied
die 4 Methoden funktionieren alle so wie sie sind, also lass die Finger davon.

hier das Beispiel, wie getestet habe:

Java:
public class Tauschen {
    public static void main(String[] args) {
        
        int[] arr = new int[2];
        int a=0, b=0;
        arr[0] = -33;
        arr[1] = -233;
        a = arr[0]; 
        b = arr[1];
        tausche1(a, b);
        tausche2(arr);
        tausche3(arr);
        tausche4(arr);
    }
    
    public static void tausche1(int a, int b) 
    {
        System.out.println("********************************************");
        System.out.println("**************tausche1 vorher:**************");
        System.out.println("a:" + a);
        System.out.println("b:" + b);
        int c = a;
        a = b;
        b = c;
        System.out.println("**************tausche1 nacher:**************");
        
        System.out.println("a:" + a);
        System.out.println("b:" + b);
        System.out.println("********************************************");
    }
    
    public static void tausche2(int[] a) 
    {
        System.out.println("********************************************");
        System.out.println("**************tausche2 vorher:**************");
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        int c = a[0];
        a[0] = a[1];
        a[1] = c;
        System.out.println("**************tausche2 nacher:**************");
        
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        System.out.println("********************************************");
    }
    
    public static void tausche3(int[] a) 
    {
        System.out.println("********************************************");
        System.out.println("**************tausche3 vorher:**************");
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        
        a[0] = a[1] - a[0];
        a[1] = a[1] - a[0];
        a[0] = a[1] + a[0];
        
        System.out.println("**************tausche3 nacher:**************");
        
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        System.out.println("********************************************");
    }
    
    public static void tausche4(int[] a) 
    {
        System.out.println("********************************************");
        System.out.println("**************tausche4 vorher:**************");
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        int[] c = new int[a.length];
        c[0] = a[1];
        c[1] = a[0];
        for (int i=2; i<a.length; i++) 
        {
            c[i] = a[i];
        }
        a = c;
        System.out.println("**************tausche4 nacher:**************");
        
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        System.out.println("********************************************");
    }
}

EDIT:
Wenn du die Werte eingeben willst, dann kommentiere 6 und 7 aus!
 
Zuletzt bearbeitet:

Xeonkryptos

Bekanntes Mitglied
bei
int[] a = tausche1(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
muss ich wohl etwas anderes machen, wei ich ja in der methode keine Felder habe... oder muss ich in der methode die variablen als felder angeben?

Du müsstest hier entweder mit einer Array intern in der Methode arbeiten, indem du die geänderten Werte speicherst oder du verwendest Instanzvariablen, die dann den Wert übergeben bekommen und du dir damit das return sparst.

und bei tausche4 heißt das Xeonkryptos, dass ich den zähler höher setzen muss, als 2 damit es funktionert?

Nein. Du musst den Zähler auf 0 setzen, damit du keine Exception bekommst.

entschuldigt die vielen fragen :oops:

"Wer nicht fragt bleibt dumm!" Ein wohl bekannter Spruch mit einem wahren Gehalt! Man kann nie zu viel, sondern nur zu wenig fragen!
 

Xeonkryptos

Bekanntes Mitglied
die 4 Methoden funktionieren alle so wie sie sind, also lass die Finger davon.

Java:
public class Tauschen {
    public static void main(String[] args) {
        
        int[] arr = new int[2];
        int a=0, b=0;
        arr[0] = -33;
        arr[1] = -233;
        a = arr[0]; 
        b = arr[1];
        tausche4(arr);
    }
    
    public static void tausche4(int[] a) 
    {
        System.out.println("********************************************");
        System.out.println("**************tausche4 vorher:**************");
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        int[] c = new int[a.length];
        c[0] = a[1];
        c[1] = a[0];
        for (int i=0; i<a.length; i++) 
        {
            c[i] = a[i];
        }
        a = c;
        System.out.println("**************tausche4 nacher:**************");
        
        System.out.println("a[0]:" + a[0]);
        System.out.println("a[1]:" + a[1]);
        System.out.println("********************************************");
    }
}

Stimmt ja wohl nicht ganz! Du hast in der Methode tausche4 den Schleifenzähler geändert, was bedeutet, dass du die von mir erwähnte Exception umgehst! In der Logik sind die Methoden richtig, aber das hast du nicht mit einer Exception getestet!!!

Edit: Okay, mich wundert es gerade, dass die Schleife gar nicht ausgeführt wird. ich bekomme keine Exception, aber die Schleife wird auch nicht betreten, also ist die eigentlich unnötig oder man ändert den Zähler auf 0 und entfernt die Zuweisung "a = c;".
 
Zuletzt bearbeitet:

Kiri

Bekanntes Mitglied
Sorry, habe es zum testen geändert und nicht wieder Rückgängig gemacht. 0 ist falsch!!! Es muss i = 2 heißen.


Java:
for (int i=2; i<a.length; i++)

Wenn i nicht 2 werden dürfte, wann wird deiner Meinung nach dann eine Schleife beendet?
 
Zuletzt bearbeitet:

Xeonkryptos

Bekanntes Mitglied
Sorry, habe es zum testen geändert und nicht wieder Rückgängig gemacht. 0 ist falsch!!! Es muss i = 2 heißen.

Oder gar die Schleife entfernen, weil diese keinen Sinn macht.

Außerdem ist in so einem Fall normalerweise davon auszugeben, dass wenn man auf ein Array zugreifen will, welches in einem Wertebereich geschieht, der nicht definiert ist, sei es, weil dieser zu groß oder zu klein gewählt wurde, ist es normal davon auszugehen, dass du eine IndexOufOfBoundsException bekommst und davon bin ich ausgegangen!

Edit: Okay... jetzt hab ich nen Fehler gemacht. Ich hab vollkommen ignoriert, dass die Bedingung zu Beginn der Schleife nicht erfüllt wird und deshalb kein Tritt in die Schleife selbst gemacht wird. Da hab ich mal kurz nicht aufgepasst, dennoch macht es keinen Sinn, dort solch eine Schleife einzubauen!
 

wer_bin_ich

Mitglied
oh man ich kann echt kaum glauben, wieviel mühe ihr euch hier gebt. Dickes Dankeschön an euch:toll:
Dann weiß ich was ich zu tun habe.
ok und bei tausche4 ist die ausgangsmethode nun richtig oder nun nicht?:bahnhof:
die methode von kiri mit i=2 ist richtig :)



Eine Frage, kann man einen allgemeinen Nachweis von tausche3 denn so mit x und y machen?
 

Xeonkryptos

Bekanntes Mitglied
Es macht ja auch keinen Sinn, 4 Methoden zu haben, die alle das gleiche Ergebnis liefern ;-)

Das ist wieder relativ zu sehen. :) Anfänger in der Programmierung sollen mehrere Möglichkeiten vor die Nase bekommen, die dasselbe Ergebnis liefern, aber eine andere Herangehensweise aufzeigen, doch auch nur Code, der Sinn macht, ist meiner Meinung nach zu verwenden. Codeschnispel/-fragmente die nicht einmal eine Funktion erfüllen (siehe die Schleife, die diesbezüglich keinen Sinn gemacht hat und ich den Punkt übersah. :) ) gar wegzulassen, sonst denken die, das man dies damit löst, es aber falsch ist. :)
 

wer_bin_ich

Mitglied
achso ok also bei tausche4 die methode völlig überflüssig


edit: man was schreib ich denn für einen Müll.
Ich meinte, dass die schleife unnötig ist...?
 
Zuletzt bearbeitet:

Kiri

Bekanntes Mitglied
Das ist wieder relativ zu sehen. :) Anfänger in der Programmierung sollen mehrere Möglichkeiten vor die Nase bekommen, die dasselbe Ergebnis liefern, aber eine andere Herangehensweise aufzeigen, doch auch nur Code, der Sinn macht, ist meiner Meinung nach zu verwenden. Codeschnispel/-fragmente die nicht einmal eine Funktion erfüllen (siehe die Schleife, die diesbezüglich keinen Sinn gemacht hat und ich den Punkt übersah. :) ) gar wegzulassen, sonst denken die, das man dies damit löst, es aber falsch ist. :)

Klar zum Lernen ist das gut! Nimmt man diese Schleife und setzt i = 0, dann wird ja auch getauscht, nur halt einmal zu viel.

Alle Methoden funktionieren korrekt auch tausche4!
 

Xeonkryptos

Bekanntes Mitglied
ok und bei tausche4 ist die ausgangsmethode nun richtig oder nun nicht?:bahnhof:
die methode von kiri mit i=2 ist richtig :)

Die Methode ist richtig! Nur kannst du die Schleife entfernen, da diese erst gar nicht zum Einsatz kommt. Der Schleifenrumpf wird schon durch die nicht erfüllte Bedingung (Zähler 2 ist nicht mehr kleiner als Größe des Arrays (auch 2)) betreten und unnötiger Code, den man ohne Probleme löschen kann, aber auch drin behalten, wie man es mag. Nur darf die Schleife niemals ausgeführt werden, denn sonst verfälscht es durch die untere Zuweisung das Ergebnis.
Aber das ist in deinem Beispiel egal. =)

Eine Frage, kann man einen allgemeinen Nachweis von tausche3 denn so mit x und y machen?

Wenn ich jetzt wüsste, wie du das meinst? x und y sind oftmals Platzhalter: in der Programmierung Variablen. Und ein Beispiel aus reinen Variablen hast du in tausche1.

Weiß nicht, was du damit willst. :bahnhof:
 

wer_bin_ich

Mitglied
genau kiri. ich meinte die Schleife...:)

nun ja ich glaube ich soll einen allgemeinen Mathematischen Beweis liefern, dass die Methode richtig ist.
aber auch nicht weiter schlimm, mit dem was ihr geschrieben habt, bin ich erstmal gut dran :)
 

Xeonkryptos

Bekanntes Mitglied
Klar zum Lernen ist das gut! Nimmt man diese Schleife und setzt i = 0, dann wird ja auch getauscht, nur halt einmal zu viel.

Alle Methoden funktionieren korrekt auch tausche4!

Ich habe gegen Ende auch nicht behauptet, dass keiner der Methoden nicht korrekt funktioniert!

Klar ist das vlt für das Lernen gut, aber welcher Anfänger schaut sich so genau die for-Schleife an, wenn er den Code vorgelegt bekommt und in einem Testdurchlauf alles super läuft? Ich hätte das früher bestimmt nicht getan!

Wenn man die for-Schleife in eine andere Methode gesteckt hätte: tausche5 oder so, finde ich das als lehrreicher als weiteres Beispiel, aber das ist wohl geschmackssache. Ich spreche hier nur aus eigener Erfahrung.
 

Neue Themen


Oben