# Verstehe den Code nicht



## Unbekannt2002 (24. Jan 2022)

Dieser Code wurde mir zur der beigefügten Aufgabe geschickt, jedoch verstehe ich den Code trotzdessen nicht. Könnte mir jemand dabei Helfen und und bitte hilfreiche Kommentare hinterlassen?
Wäre sehr nett danke : )


Die unendlich vielen Studierenden des autonomen Wohnheims Infinitiy mussen die Erle- ¨ digung bestimmter regelm¨aßiger Aufgaben organisieren, die jeden zweiten, jeden dritten, . . . , jeden k-ten Tag, jeden k+1-ten Tag, . . . anfallen. Anfangs wird eine Nummerierung 1, 2, 3, 4, . . . der Studierenden festgelegt. Dann wird jeder Zweite (Abz¨ahlen beim ersten Studierenden beginnen) Mullbeauftragter (das sind ¨ die Studierenden mit den Nummern 2, 4, 6, 8, . . . ), von den Ubrigen (Studierende 1, 3, ¨ 5, 7, . . . ) wird jeder Dritte Kuhlschrankbeauftragter (das sind die Studierenden 5, 11, 17, ¨ 23, . . . ), von den Ubrigen (Studierenden 1, 3, 7, 9, . . . ) jeder Vierte . . . , von den dann ¨ noch Ubrigen f ¨ ¨allt uns fur jeden k-ten auch noch irgendetwas ein und von den ¨ Ubrigen f ¨ ur ¨ jeden (k+1)-ten usw. Offenbar werden einige der Bewohner (z.B. die Studierenden 1, 3, 7) bei der Verteilung ausgelassen und mussen keine der anfallenden Aufgaben erledigen. Die ¨ Nummern dieser Studierenden nennt man Omitted Numbers. Programmieren Sie eine Applikation OmittedNumbers, die genau die Omitted Numbers eines Bereichs 1, . . . , N ermittelt und ausgibt, wobei N auf der Kommandozeile ubergeben ¨ 4 wird. Verwenden Sie nur Methoden, die iterativ, d.h. ohne sich selbst direkt oder indirekt aufzurufen, arbeiten.


----------



## mihe7 (24. Jan 2022)

Wenn Du mal in der Aufgabenstellung allen unnötigen Ballast weglässt, dann hast Du Zahlen 1 bis N. Die Zahlen werden nun in mehreren Wiederholungen derart bearbeitet, dass in der ersten Wiederholung jede zweite Zahl "gelöscht" wird, von den noch nicht gelöschten Zahlen in der zweiten Wiederholung jeder dritte Zahl gelöscht, dann jede vierte usw. Das wird so lange wiederholt, bis keine Zahl mehr gelöscht werden kann.

Und das findest Du auch im Code:
In Zeile 3 wird das N eingelesen und in den Zeilen 4-7 ein Array mit den Zahlen von 1 bis N eingerichtet.

In Zeile 9 starten die Wiederholungen (wiederholt wird alles bis Zeile 35). Das k gibt an, welche k-te Zahl gelöscht werden soll. Man startet also bei 2 und erhöht k in jeder Wiederholung um 1. Spätestens, wenn k == N gilt, kann es keine Zahl mehr geben, die gelöscht werden könnte. 

Jetzt kommt der tricky part: statt die Elemente tatsächlich zu löschen (was sehr aufwendig wäre), werden sie einfach mit einer 0 überschrieben. Das hat natürlich zur Folge, dass sich nicht mehr einfach über den Index die x-te noch vorhandene Zahl ermitteln lässt.

Daher werden in den Zeilen 10 und 11 zwei Variablen initialisiert, mit denen die betreffenden Zahlen gesucht werden. Das p gibt an, die wievielte noch nicht gelöschte Zahl als nächstes gelöscht werden soll und das f zählt noch nicht gelöschte Zahlen. In Zeile 12 wird ein Zähler initialisiert, der mitzählt, wie viele Zahlen in dieser Wiederholung gelöscht wurden.

Die Schleife in den Zeilen 13 bis 27 ist nun für das Suchen und Löschen zuständig. Man geht einfach durch alle Zahlen und f zählt mit, wie viele von 0 verschiedene bereits gefunden wurden. Wenn f == p, hat man die nächste zu löschende Zahl gefunden. In dem Fall wird in den Zeile 22 die Zahl gelöscht, in Zeile 23 die nächste zu löschende Zahl ermittelt, und in Zeile 25 der Zähler erhöht, weil nun ja eine Zahl mehr gelöscht wurde.

In Zeile 29 wird geprüt, ob in diesem Durchgang wenigstens eine Zahl gelöscht wurde. Ist dies nicht der Fall, erfolgt in den Zeilen 30 bis 34 die Ausgabe der noch nicht gelöschten Zahlen und in Zeile 35 wird das Programm beendet.


----------



## Unbekannt2002 (24. Jan 2022)

mihe7 hat gesagt.:


> Wenn Du mal in der Aufgabenstellung allen unnötigen Ballast weglässt, dann hast Du Zahlen 1 bis N. Die Zahlen werden nun in mehreren Wiederholungen derart bearbeitet, dass in der ersten Wiederholung jede zweite Zahl "gelöscht" wird, von den noch nicht gelöschten Zahlen in der zweiten Wiederholung jeder dritte Zahl gelöscht, dann jede vierte usw. Das wird so lange wiederholt, bis keine Zahl mehr gelöscht werden kann.
> 
> Und das findest Du auch im Code:
> In Zeile 3 wird das N eingelesen und in den Zeilen 4-7 ein Array mit den Zahlen von 1 bis N eingerichtet.
> ...


Danke für die Antwort. Hat mir sehr geholfen!


----------

