Methoden Mit Methode Zahlen umdrehen, und diese dann ausgeben

Aikuz

Mitglied
Hallo,

(a) ist schon erledigt (siehe Aufgabenstellung)
Aber ich habe keine Ahnung wie ich (bei (b) die Zahlen tausche. Ich könnte natürlich alle einzeln tauschen, aber das ist keine elegante Lösung. Wie geh ich da vor??

Aufgabenstellung:

(a) Schreiben Sie eine Methode invert, welche das Vorzeichen jeder Zahl des Arrays
umdreht. Rufen Sie diese Methode in ihrem Hauptprogramm auf.
(b) Schreiben Sie eine Methode umdrehen, welche die Reihenfolge der Elemente innerhalb
des Arrays vertauscht (das erste Element wird zum letzten Element, das zweite Element wird
zum Vorletzten, usw.). Achten Sie dabei darauf, dass das Ursprungsarray erhalten bleibt.
Rufen Sie diese Methode anschließend in ihrem Hauptprogramm auf.
(c) Schreiben Sie eine Methode ausgeben, welche das Array am Bildschirm anzeigt.
Erweitern Sie ihr Hauptprogramm so, dass die Ergebnisse aus (a) und (b) am Bildschirm
dargestellt werden.


Java:
public class rechteck {

	public static void main(String[] args) {
		double zahlenFeld[] = new double[] { 1.1, 2.3, 4.7, -3.6, 7.4, 6.5, -8.9, 8.32, -9.01, 3.12 };
		invert(zahlenFeld);
		
		
		for(int i=0; i<zahlenFeld.length; i++){
		System.out.print(zahlenFeld[i]+" ");
		}
		
		double []  copy = zahlenFeld;
		umdrehen(copy);
		
		ausgeben();


	}
	
		public static void invert(double a[]){
			for(int i=0; i<a.length; i++){
			if(a[i]>0){
				a[i] = a[i] * -1;
			} else{
				a[i] = a[i] * (-1);
			}
		}
		}
		

			
		public static void umdrehen(double c[]){
			

		}
		
		public static void ausgeben(){


		}
		
	
}
 

Gucky

Top Contributor
Für umdrehen würde ich mit einer for-Schleife arbeiten. Du zählst von 0 hoch bis array.length und schreibst die Elemente des alten Arrays vom Index i an den Index array.length - i des neuen Arrays. Ich habe die Möglichkeit nicht getestet, weshalb womöglich Änderungen vorgenommen werden müssen aber die Idee ist richtig.
Für ausgeben brauchst du keine Hilfe ;)
 

Khal Drogo

Bekanntes Mitglied
Java:
// So ganz grob umgesetzt
double array1 = new double[]{0.1, 0.2, 0.3, 0.4, 0.5};
double array2 = new double[array1.length];
for(int i = 0; i < array1.length; i++) {
   array2[i] = array1[(array1.length - i)];
}

Den Schnipsel musst du natürlich entsprechend anpassen und testen ;)

Mit freundlichen Grüßen
Xelsarion
 

Joose

Top Contributor
@Xelsarion: Das Ursprungsarray soll erhalten bleiben also nehme ich an soll wie Joel-Java sagt mit Bubblesort gearbeitet werden.
 

Khal Drogo

Bekanntes Mitglied
Für mich hört es sich so an, als solle die Methode einen double[] zurückliefern, der die gleichen Werte, aber in umgedrehter Reihenfolge enthält. Also wie folgt deklariert
Java:
public double[] umdrehen() {...}
Darauf, dass es eine Rückgabe des Arrays geben soll, komme ich, weil das ursprüngliche ja erhalten bleiben soll, dieses darf also nicht verändert werden.

Wieso bubblesort? Nirgends steht etwas von sortieren, oder übersehe ich da was?

Mit freundlichen Grüßen
Xelsarion
 

Joose

Top Contributor
Für mich hört es sich so an, als solle die Methode einen double[] zurückliefern, der die gleichen Werte, aber in umgedrehter Reihenfolge enthält. Also wie folgt deklariert
Darauf, dass es eine Rückgabe des Arrays geben soll, komme ich, weil das ursprüngliche ja erhalten bleiben soll, dieses darf also nicht verändert werden.

Ok hier könnte man diskutieren was "das ursprüngliche soll erhalten bleiben" genau heißt.
1) Es darf nicht verändert werden
2) Es soll nur mit diesem gearbeitet werden
Beantworten kann es nur der TO bzw. dessen Aufgabensteller

Wieso bubblesort? Nirgends steht etwas von sortieren, oder übersehe ich da was?

Stimmt da habe ich falsch gedacht, sortiert werden soll nicht sondern nur reversed.
 

Aikuz

Mitglied
Ich weiß auch leider nicht was ein "bubblesort" ist. Das haben wir nicht gelernt und somit sollten wir damit auch nicht unsere Aufgaben lösen :-(
 

Aikuz

Mitglied
Fehlermeldung :-( hier stimmt was bei der Methode "umdrehen" nicht. Muss ich da vielleicht nach der Schleife ein "while" setzen?
(Wie kann ich hier denn einzelne Leute die sich an diesem Beitrag beteiligt haben "markieren"?)

"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at ÜbungenKlausur.rechteck.umdrehen(rechteck.java:33)
at ÜbungenKlausur.rechteck.main(rechteck.java:11)"

Java:
public class rechteck {

	public static void main(String[] args) {
		double zahlenFeld[] = new double[] { 1.1, 2.3, 4.7, -3.6, 7.4, 6.5, -8.9, 8.32, -9.01, 3.12 };
		double zahlenFeld2[] = new double[zahlenFeld.length];
		invert(zahlenFeld);
		umdrehen(zahlenFeld2);
		ausgeben(zahlenFeld, zahlenFeld2);

	}
	
	
		public static void invert(double a[]){
			for(int i=0; i<a.length; i++){
			if(a[i]>0){
				a[i] = a[i] * -1;
			} else{
				a[i] = a[i] * (-1);
			}
		}
		}
		

			
		public static void umdrehen(double c[]){
			for(int i = 0; i < c.length; i++) {
				c[i] = c[c.length - i];
				}

		}
		
		public static void ausgeben(double zf[], double zf2 [] ){
			for(int i=0; i<zf.length; i++){
				System.out.print(zf[i]+" ");
				}
			
			System.out.println();
			
			for(int i=0; i<zf2.length; i++){
				System.out.print(zf2[i]+" ");
				}

		}
		
	
}
 
Zuletzt bearbeitet:

Khal Drogo

Bekanntes Mitglied
Es wäre nett von dir, wenn du uns mal unsere Fragen beantworten würdest, damit wir dir überhaupt helfen können.
Der Fehler, den du uns gepostet hast entspricht übrigens auch nicht dem Code, den du uns lieferst, es ist (für mich zumindest) daher schwer, eine Aussage zu treffen.
Deine Methode umdrehen wird so wie sie jetzt ist übrigens auf gar keinen Fall ordnungsgemäß funktionieren.

Mit freundlichen Grüßen
Xelsarion
 

Gucky

Top Contributor
Gar nicht. Wir bekommen eine Benachrichtigung, wenn jemand hier etwas postet. ;)

Doch. Der Fehler entspringt dem Code.
Genau genommen dieser Zeile: c = c[c.length - i];

Arrays sind 0 basiert, was bedeutet, dass das letzte Element den Index array.length - 1 hat.
c.length - i | i = 0 ist der erste behandelte Index.
Klingelts?
 

Khal Drogo

Bekanntes Mitglied
Die Zeilenangaben vom Compiler passen aber nicht, das meinte ich damit.
An welcher Methode es liegt, hab ich ja bereits erwähnt.

Mit freundlichen Grüßen
Xelsarion
 

Gucky

Top Contributor
Ach so. Ja das stimmt. Also nächstes Mal vielleicht die Zeilenangaben dazuschreiben. Also welche Zeile genau den Fehler hervorruft.
 

Aikuz

Mitglied
So. mit Zeilenangabe :) Die Ausgabe von zahlenFeld funktioniert. Bei zahlenFeld2 scheint etwas schief zu laufen :-D ich glaube bei mir hats "falsch geklingelt"...

-> und nein sortieren müssen wir nichts.

Ausgabe:
-1.1 -2.3 -4.7 3.6 -7.4 -6.5 8.9 -8.32 9.01 -3.12
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

Java:
package ÜbungenKlausur;



public class rechteck {

	public static void main(String[] args) {
		double zahlenFeld[] = new double[] { 1.1, 2.3, 4.7, -3.6, 7.4, 6.5, -8.9, 8.32, -9.01, 3.12 };
		double zahlenFeld2[] = new double[zahlenFeld.length];
		invert(zahlenFeld);
		umdrehen(zahlenFeld2); //Zeile 11
		ausgeben(zahlenFeld, zahlenFeld2);

	}
	
	
		public static void invert(double a[]){
			for(int i=0; i<a.length; i++){
			if(a[i]>0){
				a[i] = a[i] * -1;
			} else{
				a[i] = a[i] * (-1);
			}
		}
		}
		

			
		public static void umdrehen(double c[]){
			for(int i = 1; i<c.length; i++) {
				c[i] = c[c.length - i];    //Zeile 31
				}

		}
		
		public static void ausgeben(double zf[], double zf2 [] ){
			for(int i=0; i<zf.length; i++){
				System.out.print(zf[i]+" ");
				}
			
			System.out.println();
			
			for(int i=0; i<zf2.length; i++){
				System.out.print(zf2[i]+" ");
				}

		}
		
	
}
 
Zuletzt bearbeitet:

Khal Drogo

Bekanntes Mitglied
Kleiner Tipp, deinem zweiten Zahlenfeld reservierst du zwar Speicher, aber Daten stellst du keine zur Verfügung!
Deine Methode umdrehen ist immer noch komplett falsch.

Mit freundlichen Grüßen
Xelsarion
 

Gucky

Top Contributor
Wo reserviert er denn Speicher? :D

Noch was: Guck dir, wenn du dein aktuelles Problem gelöst hast, nochmal die Methode invert an. Die ist unnötig kompliziert.
 

Khal Drogo

Bekanntes Mitglied
Java:
double zahlenFeld2[] = new double[zahlenFeld.length];
Hier reserviert er Speicher!

Mit freundlichen Grüßen
Xelsarion
 

Aikuz

Mitglied
So. zahlenFeld2 ist gefüllt und die zahlen werden nicht getauscht sondern nur einseitig "ersetzt"... Weiß nicht wie ich das erkläre soll.

Ausgabe:
-1.1 -2.3 -4.7 3.6 -7.4 -6.5 8.9 -8.32 9.01 -3.12
3.12 -9.01 8.32 -8.9 6.5 6.5 -8.9 8.32 -9.01 3.12

Java:
package ÜbungenKlausur;



public class rechteck {

	public static void main(String[] args) {
		double zahlenFeld[] = new double[] { 1.1, 2.3, 4.7, -3.6, 7.4, 6.5, -8.9, 8.32, -9.01, 3.12 };
		
		double zahlenFeld2[] = new double[zahlenFeld.length];
		for(int i=0; i<zahlenFeld.length; i++){
			zahlenFeld2[i] = zahlenFeld[i];
		}
		
		invert(zahlenFeld);
		umdrehen(zahlenFeld2); //Zeile 11
		ausgeben(zahlenFeld, zahlenFeld2);

	}
	
	
		public static void invert(double a[]){
			for(int i=0; i<a.length; i++){
				a[i] = a[i] * -1; 
			}
		}
		

			
		public static void umdrehen(double c[]){
			int e = 1;
			for(int i = 0; i<c.length; i++) {
				c[i] = c[c.length - e];    //Zeile 31
				e++;
			}
		}
		
		
		
		public static void ausgeben(double zf[], double zf2 [] ){
			for(int i=0; i<zf.length; i++){
				System.out.print("zahlenFeld " +zf[i]+" ");
				}
			
			System.out.println();
			
			for(int i=0; i<zf2.length; i++){
				System.out.print("zahlenFeld2: "+zf2[i]+" ");
			}
		}
		
	
}
 

Khal Drogo

Bekanntes Mitglied
Das liegt daran, dass du grob gesagt die ersten Werte im Array änderst und anschließend die hinteren Werte auf die ersten Werte, die aber schon geändert wurden, setzt. Du brauchst also eine Hilfsvariable zum Tauschen, das ist gängige Praxis.

Die Lösung zu deinem Problem habe ich gestern schon gepostet, bis jetzt hast du sie gekonnt ignoriert..
Vielleicht denkst du jetzt nochmal darüber nach.

Mit freundlichen Grüßen
Xelsarion
 

Aikuz

Mitglied
Keine Verbesserung: Die erste und die letzt Zahl wurde getauscht, der Rest ist allerding gleich geblieben -.-

Ausgabe:
-1.1 -2.3 -4.7 3.6 -7.4 -6.5 8.9 -8.32 9.01 -3.12
3.12 2.3 4.7 -3.6 7.4 6.5 -8.9 8.32 -9.01 1.1

Java:
package ÜbungenKlausur;



public class rechteck {

	public static void main(String[] args) {
		double zahlenFeld[] = new double[] { 1.1, 2.3, 4.7, -3.6, 7.4, 6.5, -8.9, 8.32, -9.01, 3.12 };
		
		double zahlenFeld2[] = new double[zahlenFeld.length];
		for(int i=0; i<zahlenFeld.length; i++){
			zahlenFeld2[i] = zahlenFeld[i];
		}
		
		invert(zahlenFeld);
		umdrehen(zahlenFeld2); //Zeile 11
		ausgeben(zahlenFeld, zahlenFeld2);

	}
	
	
		public static void invert(double a[]){
			for(int i=0; i<a.length; i++){
				a[i] = a[i] * -1; 
			}
		}
		

			
		public static void umdrehen(double c[]){
			double s;
			int e = 1;
			for(int i = 0; i<c.length-1; i++) {
				s = c[i];							
				c[i] = c[c.length - e];    			//Zeile 35
				c[c.length - e] = s;				
				e++;
			}
		}
		
		
		
		public static void ausgeben(double zf[], double zf2 [] ){
			for(int i=0; i<zf.length; i++){
				System.out.print(zf[i]+" ");
				}
			
			System.out.println();
			
			for(int i=0; i<zf2.length; i++){
				System.out.print(zf2[i]+" ");
			}
		}
		
	
}
 

Khal Drogo

Bekanntes Mitglied
Schau dir bitte nochmal meinen Lösungsvorschlag von gestern Abend an.. Mehr kann ich dir auch nicht helfen, entweder du nimmst es an, oder du lässt es bleiben, in dem Fall bin ich an dieser Stelle raus.

Mit freundlichen Grüßen
Xelsarion
 

Gucky

Top Contributor
Sollte nicht das Ursprungsarray erhalten bleiben?
Also allokiert er einfach ein neues Array und wendet meinen Algorithmus eine Winzigkeit abgewandelt darauf an.

Ich (wir) bekomme(n) langsam das Gefühl, dass du dich nicht einmal bemühst unsere Lösungen umzusetzen sondern nur irgendeinen Murks machst und dich dann wunderst, warum es nicht funktioniert.

Wir können ein Pferd zum See bringen, wir können sogar seinen Kopf ins Wasser drücken aber trinken muss es selbst.
Und jetzt ist es an dir den ersten Schluck zu tun.
 

Aikuz

Mitglied
Nein so ist das nicht. Als ich "Kleine Verbesserung...." geantwortet habe, hab ich Xelsarion Antwort noch nicht gelesen.

Für mich ist es nunmal schwer eure Vorschläge zu verstehen und dann bei mir einzubauen...

Naja, ich lasse das hier jetzt an dieser Stelle, will niemanen nerven.

Schönes Wochenende Zusammen!
 

Khal Drogo

Bekanntes Mitglied
Java:
// So ganz grob umgesetzt
double array1 = new double[]{0.1, 0.2, 0.3, 0.4, 0.5};
double array2 = new double[array1.length];
for(int i = 0; i < array1.length; i++) {
   array2[i] = array1[(array1.length - i)];
}

Den Schnipsel musst du natürlich entsprechend anpassen und testen ;)

Mit freundlichen Grüßen
Xelsarion

Das war letzten Endes schon die Lösung für dein Problem. Da ist ein winziger Fehler drin, der mir gerade erst aufgefallen ist: es muss array1[(array1.length - i - 1)] heißen statt array1[(array1.length - i)].

Mit freundlichen Grüßen
Xelsarion
 

Oben