Kurzes Gedankenspiel in der Informatik

Guten Mittag wer-weiss-was-freunde!

Ich habe gerade mit meinem Mitbewohner über einem Informatikblatt für ihn gesessen und schon bei der Aufgabeninterpretation sind wir uns etwas uneinig. Da meine Erklärungsversuche gescheitert sind und ich Mittlerweile selbst etwas verunsichert bin ein Aufruf an Euch :smile:

Die Aufgabe im Allgemeinen:

„In dieser Aufgabe sollen Sie ein einfaches Java Programm (Einkaufszettel.java) zur Verwaltung Ihres perso ̈nlichen Einkaufszettels entwerfen. Ihr “elektronischer Einkaufszettel” soll Platz fu ̈r mindestens 10 Posten haben.“

Der Knackpunkt liegt bei ‚mindestens 10‘. Ich sage, das Array muss mit einer Größe von 10 initialisiert werden, kann aber im weiteren Gebrauch auch größer werden.

Mein Mitbewohner sagt, das Array darf zwar mehr als 10 Elemente haben, muss es aber nicht. Deswegen braucht sein Programm den Fall ein 11 Element hinzu zu fügen auch nicht abdecken.

Was meint Ihr?

Vielen Dank für Eure Meinung!

Liebe Grüße,
Chrizzldi

Hi Chrizzidi,
die Fragestellung ist wirklich komisch formuliert - Ich würde es so interpretieren wie du es getan hast. Das Programm soll mit Einkaufslisten der Anzahl größer-gleich 10 auskommen.

Am einfachsten wäre sowas mit einer Liste zu lösen, ich würde also direkt empfehlen, das Programm so zu schreiben, dass es mit allen Längen des Einkaufszettels (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, …) auskommt - Es sollte aber auch reichen, wenn du von einer Zahl, die mindestens 10 ist, ausgeht.

Gruß, destro

Hallo,

schwierige Frage! Ich würde es rein sprachlich ebenso interpretieren wie dein Mitbewohner, wobei man das Wort „mindestens“ dann auch streichen könnte. Vielleicht soll es ja konfigurierbar sein!?

Auf der anderen Seite ist ein Einkaufszettel mit 10 Einträgen wenig sinnvoll. Eine App ließe sich so nicht so toll verkaufen :smile: Daher würde ich es gleich erweiterbar machen. Ist doch auch eine gute Übung, oder?

gruss, mofte

Danke für deine Meinung!

Ich war gerade beim Penny, habe sogar 13 Produkte gekauft. Und dabei ist mir klar geworden, dass die Methode ein Produkt auf den Einkaufszettel zu bekommen (im praktischen Fall das Einscannen des Barcodes) in jedem Fall ja prüfen muss, wie viel schon auf dem Einkaufszettel steht. Sprich - das Erweitern des Einkaufszettels müsste einen Fehler abfangen, wenn der Zettel schon 10 Element hat. Das ist also in jedem Fall nötig, und um einen brauchbaren Einkaufzettel zu behalten wäre durch das erstellen eines Hilfarrays mit einer Länge mehr ja einfach möglich! :smile:

Ich werde das mal so weiter geben!

Vielen Dank für Eure Hilfe!

Danke für deine Meinung!

Ich denke auch das die Übung in einem Übungsblatt überwiegen sollte! (Haha, was ein Wortspiel)!

Liebe Grüße!

Der Begriff „mindestens“ ist meiner Meinung nach eindeutig (mathematisch: größer gleich). Da die Obergrenze unbekannt ist, solltet ihr aber eine Liste (bevorzugt: ArrayList) anstatt eines statischen Arrays verwenden.

Hi!

Wenn ich die Aufgabenstellung lese, würde ich das Programm nach Möglichkeit 1 implementieren:
dein Array mit Größe 10 initialisieren und ab dem 11. ten Element ein neues, größeres Array anlegen, dieses mit den Werten des ursprünglichen initialisieren und das ursprüngliche Array ersetzen.

Wenn ich mich nicht täusche, initialisiert Java jedes Element im Array mit NULL, sodass die nicht benutzten Plätze bei der Ausgabe und bei Berechnungen weggelassen werden können.

Das Wort „mindestens“ sagt aus, dass die 10 Plätze auf jedenfall vorhanden sein müssen und bei Bedarf mehr da sein müssen.
Der Fall „ein 11.tes“ Element hinzufügen muss dementsprechend auch abgedeckt werden, sonst würde die Aufgabenstellung heißen: „Die Einkaufsliste hat genau 10 Plätze“ oder „Die Einkaufsliste hat nicht mehr als 10 Plätze“.

Der Knackpunkt liegt bei ‚mindestens 10‘. Ich sage, das Array
muss mit einer Größe von 10 initialisiert werden, kann aber im
weiteren Gebrauch auch größer werden.

Mein Mitbewohner sagt, das Array darf zwar mehr als 10
Elemente haben, muss es aber nicht. Deswegen braucht sein
Programm den Fall ein 11 Element hinzu zu fügen auch nicht
abdecken.

Was meint Ihr?

Guten Abend Ju_Ri,

sehr schöne Erklärung! Im Prinzip stimmt sie mit meiner überein. Ich bin gerade noch ab überlegen, ob ich ArrayList wirklich verwenden sollte, da es zu der Übungsblattausgabe zum Thema ArrayList noch nichts in den Folien gab (arbeite mich da auch gerade erst noch so durch um besser helfen zu können). Es müsste aber im Prinzip doch auch mit String[] funktionieren. Ich definiere eine Klasse und über den Konstruktor muss ich dann die StartStringLänge mit 10 definieren. Wird meine Liste größer als 10 erstelle ich in der Methode ein neues Objekt der Klasse mit StringLängeAltesObjekt + 1 als übergabe. Kopiere alle alten Elemente rüber und setzte zum Schluss das 11te Produkt ein. Danach weise ich dem alten Objekt in der Methode via this das neue Objekt zu. Mal sehen ob das funktioniert. Danach schau ich mir mal die Implementation von ArrayList an. Ich vermute das es „flapsig gesagt nach dem gleichen Prinzip“ - nur eben schon integriert - funktionieren könnte.

Vielen Dank für deine Mithilfe/Meinung,

Liebe Grüße,
Chrizzldi

Wenn du bei dem statischen Array bleibst, z.B. weil du dich mit den Listen nicht auskennst, würde ich aber empfehlen die Liste um mehr als nur um 1 Element zu erweitern, wenn ein 11tes Element auf die Liste soll.
Das liegt daran, dass es rechenaufwändig ist, jedes mal ein neues Array anzulegen und dann jedes Element zu kopieren. Besser wäre es, du nimmst den höheren Speicherbedarf hin und reservierst beim Einfügen eines 11.ten Elements gleich den doppelten Speicher.

Es wäre auch empfehlenswert eine private Variable anzulegen, die speichert, wieviele Elemente sich im Array bereits befinden. Das wäre jedenfalls besser als jedes mal das Array durchzugehen und zu gucken, ob ein Listenplatz mit NULL belegt ist.

Bei jedem Einfügen müsstest du dann abfragen, ob diese Hilfvariable kleiner als die Arraygröße ist. Falls ja, dann Element einfügen, ansonsten Array vergrößern.

Ich schreibe schon wieder zu viel. Du weißt sicherlich selbst, wie das geht.

Huhu Ju_Ri,

nein - du schreibst gar nicht zuviel! Das ist echt super, vielen Dank für deine Denkansätze. Besonders leuchtet mir ein, dass es Sinn macht ein neues Array dann mit +10 neuen möglichen Flächen zu erstellen. Ursprünglich dachte ich bei der Erweiterung eher an möglichst wenig Speicherverbrauch. Aber Rechenpower ist natürlich wesentlich wichtiger!

Ich setzt mich jetzt eben noch mal dran und bastel noch ein Wenig daran rum. Wenn es dich interessiert kann ich auch gerne meine Ergebnisse hier posten :smile:!

Liebe Grüße,

Chrizzldi

Oh oh, ich glaube da habe ich mich jetzt verzettelt!

Anbei eben mal mein Code:

// Fügt ein neues Element mit Produktname und Menge zum Einkaufszettel hinzu.
void eingabeEinkaufszettel(String name, int anzahl)
{
//einkaufszettelVoll() prüft ob alle Elemente auf dem Zettel schon genutzt sind
if( einkaufszettelVoll() == false ){
for(int i = 0; i

this = hilfsEinkaufzettel;

du ersetzt nicht den ganzen Einkaufszettel sondern nur das Array darin:

Also this.elemente = groesseresArray;

hilfsEinkaufszettel.produkte[i] = this.produkte[i];
hilfsEinkaufszettel.produktAnzahl[i] = :this.produktAnzahl[i];

ich verstehe nicht ganz, was du hier machst.

ich habe hier mal einen eigenen code geschrieben.
falls du fragen hast, schieß los: http://paste2.org/p/3064643

Zurzeit im Flugzeug unterweg,keine Teit tut mir Leid.

Das ist denke ich ohne weiteres nicht zu beantworten.
Hier müsste man die Intention des Autors kennen, ob er es dem Entwickler freistellen will oder zwingend davon ausgeht, dass mehr Elemente hinzufügbar sind.
Geht der Autor der Frage also von der Sicht des Endanwenders aus oder von der Sicht des Entwicklers?

Der einfachere Weg ist bei Verwendung von Arrays sicherlich die feste Größe, denn Arrays sind in Java meines Wissens nach nicht in der Größe veränderbar - man müsste also zum „erweitern“ des Arrays eine Funktion schreiben, die den Inhalt des einen Arrays in ein neues, größeres Array kopiert.

Guten Vormittag Ju_Ri!

Erstmal: vielen vielen Dank! Das bringt mich wirklich weiter!

Ich habe so lange schon kein Java mehr geschrieben bzw. bisher eh nur als Hobby programmiert, dass ich Funktionen wie System.arraycopy() gar nicht im Kopf hatte! GENIAL.

Die Idee mit der „private static int“ Deklaration finde ich sehr gut, habe sie direkt eingebaut. Mein Programm funktioniert jetzt auch soweit sehr gut. Ich verstehe nicht, wieso ich nicht gleich auf die Idee gekommen bin einfach this.elemente = groesseresArray; zu verwenden. Total dämlich :frowning:. Funktioniert natürlich super!

Ein kleines Missverständnis gab es noch mit der „Anzahl“ diese soll immer die Menge zum jeweiligen Produkt ausgeben. Ist also ein int[] und wird neben dem String[] hochgezogen.

Mein Code kannst du dir jetzt auch hier ansehen: http://paste2.org/p/3069262

Super sache dieses paste2.org! Vielen Dank auch für diesen stillen Tip!

Beste Grüße,

Chrizzldi

private static int minArrayLength = 10;

Den solltest du final machen. Das verhindert, dass minArrayLength während des Programms verändert werden kann.

Ansonsten sieht das doch gut aus.