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(){


		}
		
	
}
 
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 😉
 
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
 
@Xelsarion: Das Ursprungsarray soll erhalten bleiben also nehme ich an soll wie Joel-Java sagt mit Bubblesort gearbeitet werden.
 
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
 
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.
 
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 :-(
 
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:
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
 
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?
 
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
 
Ach so. Ja das stimmt. Also nächstes Mal vielleicht die Zeilenangaben dazuschreiben. Also welche Zeile genau den Fehler hervorruft.
 
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:
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
 
Wo reserviert er denn Speicher? 😀

Noch was: Guck dir, wenn du dein aktuelles Problem gelöst hast, nochmal die Methode invert an. Die ist unnötig kompliziert.
 
Java:
double zahlenFeld2[] = new double[zahlenFeld.length];
Hier reserviert er Speicher!

Mit freundlichen Grüßen
Xelsarion
 
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]+" ");
			}
		}
		
	
}
 
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
 
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]+" ");
			}
		}
		
	
}
 
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
 
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.
 
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!
 
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
 

Zurück
Oben