Prüfungsvorbereitung Arrays

Flutscho

Mitglied
Hallo alle miteinander

Ich schreibe am Freitag eine Zwischenprüfung in Softwareentwicklung 1 (Grundkurs).
Wir haben 2 Vorbereitungsbeispiele bekommen.

Aufgabe 1: In einem 1dim Array soll ich eine beliebige Zahl um n Stellen verrücken. Die leerwerdenden Felder soll ich mit einem zweiten Wert val ersetzen.

Aufgabe 2. Ich soll eine Magic Square Matrix schreiben. Eine Magic Square Matrix sieht wie folgt aus

bsp:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

Ich habe die Aufgaben folgendermaßen gelöst: Ich poste nur den wichtigen Teil 🙂
aufgabe 1:

Java:
for (int i = 0; i < a.length; i++)
		{
			if ( i < n )
			{
				a[i] = val;
			}
			else
			{
				a[i] = x;
			}
		}

aufgabe2:
Java:
for (int i = 0; i < a.length; i++)
		{
			b++;
			c = b;
			for (int j = 0; j < a[i].length; j++)
			{
				if ( c > a[i].length )
				{
					c = 1;
				}
				a[i][j] = c;
				c++;
			}
		}

Meine 1. Frage lautet jetzt, wie macht man es ordentlich bzw. besser 🙂

Meine 2. Frage ist, wie geht man vor, wenn gezielt ein feld eines arrays ausgewählt wird, der inhalt des feldes auf einen neuen Platz gesteckt werden soll.
Ich habe z.B. ein char[][] chessfield = new char[3][3];
chessfield[0][0] bis chessfield[1][1] sind belegt.
der inhalt v. chessfield[0][1] soll auf chessfield[2][0] verschoben werden. Bedingungen wie Platz muss frei sein, damit verschoben werden kann ignoriere ich erstmal. darf ich zum ansprechen eines feldes sowas machen?:
chessfield[input1][input2]
wenn das gemacht wurde, muss das Programm schauen was in diesem feld drin steckt und verschieben, hier komme ich nicht weiter. Ich kann ja nicht 1mio Bedingungen aufschreiben, wann was gemacht werden soll... ???:L

Könntet ihr mir vllt. einen Schubs in die richtige Richtung geben?
Falls ihr meine 2. Frage nicht ganz nachvollziehen könnt, schildere ich das Prob nochmal genauer

LG
 
Zuletzt bearbeitet:
Deine Lösung zu Aufgabe 1 passt nicht zur Aufgabenstellung:
für alle Indizes kleiner n setzt Du die Werte auf val und für alle Indizes >= n setzt Du die Werte auf n

Lösung zur Aufgabe 2 habe ich mir aus diesem Grund nicht angeschaut.
 
Nein, Du sollt den Inhalt eines Feldes um n Stellen verschieben, "die leerwerdenden Felder" was auch immer genau damit gemeint ist sollst Du mit einem festen Wert füllen.

Was ich jetzt nicht genau deuten kann ist: ist "mit leerwerdenden Felder" das Feld, das verschoben werden soll gemeint oder alle Felder bis zur Verschiebung x + n?
 
check ich auch net ganz. hät fast sogar gesagt beides 🙂

sieht die Aufgabenstellung wirklich so aus??? Aufgabe 2 ist ja ok aber 1 ist nicht ganz eindeutig..
 
Die Angabe lautet folgendermaßen:

In einem 1dim int - Feld a sollen die Elemente um n Stellen nach hinten gerückt werden. Die freiwerdenden Elemente am Anfang des Feldes sollen mit dem Wert val besetzt werden.

Ich interpretiere das ganze so:
{1,1,1,1,1,1,1,1}
um 2 Stellen verrücken, val = 4
{4,4,1,1,1,1,1,1}
 
Es soll also der gesamte Inhalt des Arrays um n Stellen verrückt werden.

Dazu passt Dein Code aber immer noch nicht. ;-) Das mag bei einem Array {1, 1, 1, 1, 1} nicht auffallen, aber probiere mal {1, 2, 3, 4, 5} um zwei Stellen zu verrücken.

Zum Verrücken würde hinten am Array anfangen.
 
Hallo

Ihr habt es ja schon bemerkt, es soll eine Klassenmethode shift werden

static void shift (int[] a, int n, int val)

Weil ich mich bei Methoden noch nicht auskenne, dachte ich, ich kann erstmal nen Grundcode schreiben, auf dem ich dann aufbauen kann, aber das klappt so nicht...
 
Wo hast Du jetzt Probleme?

Wenn Du ein Array {1, 2, 3, 4, 5} hast und dieses um zwei Stellen verschieben sollst,
dann musst Du den Wert in Index 4 durch den Wert in Index 2, Index 3 durch Index 1... ersetzen und Index 1 und 0 mit dem neuen Wert befüllen.
 
Hallo

Es hapert wohl beim Verständnis 🙁

Darf man in einer for Schleife int i = einer Konsolenangabe setzen?

Java:
int[] b = a;
for ( int i = n; i < a.length; i++ ) <= int i = n
		{
			a[i] = b[i];
		}
for ( int i = 0; i < a[n]; i++ )
{
	a[i] = val;
}
 
Zuletzt bearbeitet:
Java:
for ( int i = n; i < a.length; i++ ) <= int i = n {
	a[i] = a[i];
}
for ( int i = 0; i < a[n]; i++ ) {
	a[i] = val;
}

Erklär mir bitte mal was die 2. Codezeile bewirken soll ???:L ???:L ???:L
(Ich glaub ich habe heute meinen "blonden" Tag und begreife rein gar nichts ;( )

Programmieren beginnt auf dem Papier mit einem Stift!
 
Zuletzt bearbeitet:
Hallo

Ist wohl eher mein "Stumpfsinnigen" Tag 🙂

Ich wollte es jetzt so machen wie XHelp es angeboten hat.

In der ersten for Schleife alle Werte im array um n verschieben
In der 2.ten for Schleife dann alle Werte die leer werden, mit val ersetzen.
 
Probier es mal so wenn du überhaupt nicht weiterkommst:

Java:
	public static void main(String[] args) {
		
          int[] ints = new int[]{1,2,3,4,5};
          
          int val = 9;
          int n = 2;
          ints = shiftArray(ints, 9, 2);
          System.out.println(Arrays.toString(ints));
          
	}
	
	public static int[] shiftArray(int[] array, int paddingValue, int shiftIndex){
	
        int[] tmpArray = new int[array.length];
      
        for( int i = 0; i < array.length; i++){
      	  if(i < shiftIndex){
      		  tmpArray[i] = paddingValue;
      	  } else {
      		  tmpArray[i] = array[i-shiftIndex];
      	  }
        }
        return tmpArray;
	}

Ist nur eine Möglichkeit von vielen... Das ganze über einen zweiten array zu machen ist eigentlich immer ganz gut verständlich.
 
Verschiebt
Java:
a[i] = a[i]
denn irgenendwas???????????????

Verschieben heisst doch dass der Wert an einen ANDERE Position kommen muss oder nicht?

PAPIER und STIFT in die Hand nehmen und aufzeichnen was im Array wohin geht
 
Verschiebt
Java:
a[i] = a[i]
denn irgenendwas???????????????

Verschieben heisst doch dass der Wert an einen ANDERE Position kommen muss oder nicht?

PAPIER und STIFT in die Hand nehmen und aufzeichnen was im Array wohin geht

Bleib mal auf dem Boden... Er hatte den Tipfehler schon korrigiert 😉
 
Wenn du meinen Beitrag gelesen hast wäre das die volle Lösung über einen temporären Array. Aber probier es ersteinmal selber...

Man könnte es noch ein Tacken schöner machen indem man ungültige Argumente abweist:

Java:
	public static int[] shiftArray(int[] array, int paddingValue, int shiftIndex)
			throws IllegalArgumentException {

		if (shiftIndex > array.length) {
			throw new IllegalArgumentException("Cannot shift " + shiftIndex
					+ " postitions to right, Array has only "
					+ array.length+" positions");
		}
                // und der Rest...
 
Das geht in einem Array wesentlich effizienter und kompakter
Ich befürchte zwar dass es den TO nicht mehr interesisert, weil er jetzt ja die fertige Lösung bekommen hat :-(

Aufgrund des outputes unten solltest du dir vorstellen können wann was wohin verschoben werden muss (Das ist eben das zuerst auf dem Papier gemacht werden sollte!)

Java:
private static void shift(int[] pArr, int pOffset, int pVal) {
  // nö nö - den gibts bei mir noch nicht!
  // über den returnwert müsste man auch noch nachdenken
}

public static void main(String[] args) {
	int[] mArr = {5,4,3,2,1};
	shift(mArr, 2, 1);
}
Code:
5 4 3 2 1 
5 4 3 2 3 
5 4 3 4 3 
5 4 5 4 3 
5 1 5 4 3 
1 1 5 4 3

SCNR! Lösungen posten bringt unendlich viel :-( nun hat wieder hat einer nichts dazugelernt nur weil er gut jammern konnte
 
Hallo

Ich habe die gepostete Antwort gesehen, ! Allerdings kommen sehr viele Dinge in der antwort vor, von denen ich NOCH NIE was gehört habe, z.B. tmp, also habe ich sie nicht angenommen.. Es muss ja auch irgendwie mit den Mitteln gehen, die ich bereits kenne.. ansonsten wäre ja die ganze Übung ein Witz...
Wozu ne Übung machen in der man vorher schon alles wissen muss, damit es einem nachdem man es ja schon kennt beigebracht wird :bahnhof:

Meine Idee, macht wie ihr sicher auf einen Blick erkennen konntet nicht das was gefordert ist..

Ich mache mir jetzt Gedanken wie ich an der Stelle a[n]=b[0].....a[n,n]=b[n] einfüllen kann.

MfG
 
@Andi_CH
Was hast du eigentlich für ein Problem? Es kann dir doch egal sein - und ehrlich gesagt:
1) hat er nicht rumgeheult
2) wirkt es eher als ob er es ehrlich selber probieren will

Über Effizienz sage ich jetzt mal nichts weiter...
 
Hallo

Ich habe die gepostete Antwort gesehen, ! Allerdings kommen sehr viele Dinge in der antwort vor, von denen ich NOCH NIE was gehört habe, z.B. tmp, also habe ich sie nicht angenommen..

Wie [c]tmp[/c]? Das ist doch einfach nur ein Variablenname... Überhaupt nichts Java spezifisches. Und auch kein neues Sprachmittel.
Es muss ja auch irgendwie mit den Mitteln gehen, die ich bereits kenne.. ansonsten wäre ja die ganze Übung ein Witz...
Wozu ne Übung machen in der man vorher schon alles wissen muss, damit es einem nachdem man es ja schon kennt beigebracht wird :bahnhof:
Ich glaube nicht das meine Lösung in irgendeiner Weise deinen Horizont übersteigt. Ich verwende auch nur einen int Array, eine for-Schleife und einmal if...

Meine Idee, macht wie ihr sicher auf einen Blick erkennen konntet nicht das was gefordert ist..

Ich mache mir jetzt Gedanken wie ich an der Stelle a[n]=b[0].....a[n,n]=b[n] einfüllen kann.

MfG

Dann mal los 😉
 
ch habe die gepostete Antwort gesehen, ! Allerdings kommen sehr viele Dinge in der antwort vor, von denen ich NOCH NIE was gehört habe, z.B. tmp, also habe ich sie nicht angenommen.. Es muss ja auch irgendwie mit den Mitteln gehen, die ich bereits kenne.. ansonsten wäre ja die ganze Übung ein Witz...

wenn du sie gesehen hast, wäre es halt nett den leuten, die dir helfen möchten, auch zu informieren, daß du die antwort zwar gelesen hast, aber mit ihr nix anfangen kannst. dann weiß jeder bescheid :toll:
 
1. Es steht imer noch a = a dort oben
2. Ein Problem habe ich, weil ich helfen will

Hier geht es nicht darum etwas zu erstellen oder ein Programm fertig zu schreiben, sondern darum etwas zu lernen.

Wir werden ja sehen wie lange die zweite Aufgabe dauert, welche ja nur eine minimale änderung der ersten ist - da zeigt es sich dann ob verstanden oder kopiert
 
1. Es steht imer noch a = a dort oben
2. Ein Problem habe ich, weil ich helfen will

Hier geht es nicht darum etwas zu erstellen oder ein Programm fertig zu schreiben, sondern darum etwas zu lernen.

Wir werden ja sehen wie lange die zweite Aufgabe dauert, welche ja nur eine minimale änderung der ersten ist - da zeigt es sich dann ob verstanden oder kopiert


1. steht a = a in deinem kopierten Codestück, nicht in meinem.
2. Brauchst du mir nicht unterstellen ich würde etwas kopieren, du kennst mich nicht einmal
3. habe ich die 2te Aufgabe bereits gelöst, sie funktioniert für 2dim arrays variabler Länge...
4. ist es mir echt zu blöd weiter zu diskutieren ob ich abschreibe, auch wenn sich andere sicher köstlich darüber amüsieren
5. tuts mir leid das ich kein feedback zu meiner möglichen "Abschreibquelle" gegeben habe.

MfG
 
Hallo nochmal

Aaaalso, ich habe jetzt Aufgabe 1 gelöst. Ich denke es passt jetzt für alle möglichen Fälle. Ich habe getestet, ob es bei aufsteigender Sortiertung funktioniert: {0,1,2,3,4,....}, wenn alle Elemente gleich sind {9,9,.....,9} und wenn die Elemente unterschiedlich sind {3,3,3,3,.....,5,5,5,5}
In allen 3 Fällen hat die Konsole das gewünschte Ergebnis geliefert. Michael hat mir die Lösung übrigens verraten mit seinem Satz, Aufgabe 2 ist nur ne kleine Mod v. Aufgabe 1 🙂
So, jetzt sehe ich mir die gepostete Antwort mal GENAU an.

Java:
int[] b = a;
int c = (-1);
for ( int i = n; i < a.length; i++ )  
{
        c++;
	a[i] = b[c];
}
for ( int i = 0; i < n; i++ ) 
{
	a[i] = val;
}

MfG
 
1. Es steht imer noch a = a dort oben

Nö - nur bei dir 😉

2. Ein Problem habe ich, weil ich helfen will

Hier geht es nicht darum etwas zu erstellen oder ein Programm fertig zu schreiben, sondern darum etwas zu lernen.

Dir geht es nicht darum etwas zu erstellen oder ein Programm fertig zu schreiben, sondern darum etwas zu lernen.

Wir werden ja sehen wie lange die zweite Aufgabe dauert, welche ja nur eine minimale änderung der ersten ist - da zeigt es sich dann ob verstanden oder kopiert

Richtig - selbst wenn man EINE Lösung vor Augen hat heißt es nicht das man dabei nicht lernt. Die Aufgabe mal mit einem temporären Array anzugehen zeigt das es mehrere Wege gibt. Und wenn er bei dem internen verschieben festhängt mal einen anderen Weg zu probieren schaded nicht.

Ich hab während meines Studiums auch eine Menge Lösungen zu aufgaben gehabt. Und sie auch das ein oder andere Mal mir angesehn um davon zu lernen. Solange man es nicht einfach abschreibt sehe ich da kein Problem. Und selbst dann ist das einzig und alleine die Verantwortung von dem Lernenden.

Nichts ist ätzender als wenn man eine Frage stellt, überhaupt nicht weiterkommt und in Foren wie ein Trottel hingestellt (man siehe z.B. hilfreife Kommentare wie: "SUFU" oder "RTFM" - gerne in gesehn in Unix Foren) wird weil man nicht weiterkommt. Aber das führt jetzt zu weit.

Oftmals hilft es auch eine konkrete Lösung zu sehn.
 
Auf diesem Niveau muss ich definitv nichts mehr lernen, aber ich bin in diesem Forum um auf dem diesem Niveau zu helfen und auf einem anderen zu lernen.

Nichts ist deprimierender als wenn man zur Erklärung Pseudocode hinstellt und merkt, dass da einer eh nur auf die Lösung wartet ..... Nein die kommt sicher nicht von mir!

no further comment!
 
Hallo nochmal

Ich habe jetzt statt a = b[c], b = a[c] geschrieben, aus a = val wurde b = val. Ich gebe b in einer for Schleife aus und es funktioniert, zumindest für meine Handvoll Testfälle...
Ich hab wohl echt clever getestet vorhin, ich hab den Fehler vor mir selbst verschleiert ???:L

Ich brauche jetzt erstmal ne Pause

Danke euch für die Hilfe & die Geduld die ihr mit mir hattet / haben musstet.
 
So auf den ersten Blick funktioniert es nicht, weil du von Vorne verschiebst. Bei n=1 schiebst du immer die 1. Stelle nach rechts.
Der Teil zum verschieben könnte so aussehen:
Java:
int[] a = new int[] { 1, 2, 3, 4, 5, 6 };
int n = 1;
for (int i = a.length - 1; i >= n; i--) {
  a[i] = a[i - n];
}

Darüber hinaus lohnt sich die Parameter zu überprüfen, damit keine Exception fliegt:
Java:
if (n > a.length) {
  n = a.length;
}
if (n<0) {
  n = 0;
}
 

Zurück
Oben