Bearbeitetes TODO

This commit is contained in:
Maxim Derksen 2021-01-20 09:57:09 +01:00
parent fe59c35d59
commit bd556c4ce2
16 changed files with 468 additions and 167 deletions

BIN
Breitensuche.class Normal file

Binary file not shown.

22
Breitensuche.ctxt Normal file
View File

@ -0,0 +1,22 @@
#BlueJ class context
comment0.target=Breitensuche
comment0.text=\r\n\ Implementierung\ der\ Tiefensuche\ auf\ einem\ ungereichteten,\ gewichteten\r\n\ Graphen.\r\n
comment1.params=
comment1.target=Breitensuche()
comment2.params=pVertexID
comment2.target=boolean\ findVertex(java.lang.String)
comment2.text=\r\n\ Suche\ nach\ einem\ Vertex\ mit\ der\ angegebenen\ ID\ mittels\ der\ Breitensuche.\r\n\ \r\n\ @param\ pVertexID\r\n\ @return\r\n
comment3.params=
comment3.target=List\ getNeighbours()
comment4.params=pVertexID
comment4.target=boolean\ findVertexByID(java.lang.String)
comment4.text=\r\n\r\n\ @param\ pVertexID\r\n\ @return\r\n
comment5.params=pVertexID
comment5.target=boolean\ findVertexByWeight(java.lang.String)
comment6.params=pVertices
comment6.target=Vertex\ getVertexFromListByID(List)
comment6.text=\r\n\ Sucht\ aus\ einer\ Liste\ von\ Knoten\ denjenigen,\ dessen\ ID\ alphabetisch\ ale\r\n\ erstes\ kommt.\ Der\ Knoten\ wird\ aus\ der\ Liste\ gel\u00F6scht\ und\ dann\ zur\u00FCck\r\n\ gegeben.\r\n\ \r\n\ @param\ pVertices\r\n\ @return\r\n
comment7.params=pCurrentVertex\ pVertices
comment7.target=Vertex\ getVertexFromListByWeight(Vertex,\ List)
comment7.text=\r\n\ Sucht\ aus\ einer\ Liste\ von\ Knoten\ denjenigen,\ dessen\ Kantengewicht\ zum\ Konten\r\n\ <code>pCurrentVertex</code>\ am\ geringsten\ ist.\ Der\ Knoten\ wird\ aus\ der\ Liste\r\n\ gel\u00F6scht\ und\ dann\ zur\u00FCck\ gegeben.\r\n\ \r\n\ @param\ pVertices\r\n\ @return\r\n
numComments=8

View File

@ -1,153 +1,235 @@
/** /**
* Implementierung der Tiefensuche auf einem ungereichteten, * Implementierung der Tiefensuche auf einem ungereichteten, gewichteten
* gewichteten Graphen. * Graphen.
*/ */
public class Breitensuche { public class Breitensuche {
private Graph g; private Graph g;
Vertex bi;
public Breitensuche() { public Breitensuche() {
g = new Graph(); g = new Graph();
// Aufbau des Graphen // Aufbau des Graphen
// Erstellen der Knoten (Vertices) // Erstellen der Knoten (Vertices)
Vertex koe = new Vertex("Köln"); Vertex koe = new Vertex("Köln");
g.addVertex(koe); g.addVertex(koe);
Vertex dues = new Vertex("Düsseldorf"); Vertex dues = new Vertex("Düsseldorf");
g.addVertex(dues); g.addVertex(dues);
Vertex dor = new Vertex("Dortmund"); Vertex dor = new Vertex("Dortmund");
g.addVertex(dor); g.addVertex(dor);
Vertex bi = new Vertex("Bielefeld"); bi = new Vertex("Bielefeld");
g.addVertex(bi); g.addVertex(bi);
Vertex hnv = new Vertex("Hannover"); Vertex hnv = new Vertex("Hannover");
g.addVertex(hnv); g.addVertex(hnv);
Vertex bo = new Vertex("Bochum"); Vertex bo = new Vertex("Bochum");
g.addVertex(bo); g.addVertex(bo);
// Erstellen der Kanten (Edges) // Erstellen der Kanten (Edges)
g.addEdge(new Edge(koe, dor, 96.0)); g.addEdge(new Edge(koe, dor, 96.0));
g.addEdge(new Edge(dues, dor, 70.0)); g.addEdge(new Edge(dues, dor, 70.0));
g.addEdge(new Edge(dor, bo, 22.0)); g.addEdge(new Edge(dor, bo, 22.0));
g.addEdge(new Edge(bi, hnv, 113.0)); g.addEdge(new Edge(bi, hnv, 113.0));
g.addEdge(new Edge(bi, dor, 112.0)); g.addEdge(new Edge(bi, dor, 112.0));
g.addEdge(new Edge(bi, dues, 178.0)); g.addEdge(new Edge(bi, dues, 178.0));
g.addEdge(new Edge(bo, dues, 52.0)); g.addEdge(new Edge(bo, dues, 52.0));
} }
/** /**
* Suche nach einem Vertex mit der angegebenen ID mittels der Breitensuche. * Suche nach einem Vertex mit der angegebenen ID mittels der Breitensuche.
* @param pVertexID *
* @return * @param pVertexID
*/ * @return
public boolean findVertex( String pVertexID ) { */
g.setAllVertexMarks(false); // Markierungen zurücksetzen public boolean findVertex(String pVertexID) {
Queue<Vertex> searchQueue = new Queue<>(); // Speicher für zu bearbeitende Knoten erstellen List<Vertex> neighboursList = new List<>();
Vertex searchedVertex = g.getVertex(pVertexID);
Vertex firstVertex = bi;
g.setAllVertexMarks(false); // Markierungen zurücksetzen
Queue<Vertex> searchQueue = new Queue<>(); // Speicher für zu bearbeitende Knoten erstellen
firstVertex.setMark(true);
searchQueue.enqueue(firstVertex);
System.out.println("Beginne die Suche");
while (!searchQueue.isEmpty()) {
Vertex RootVertex = searchQueue.front();
System.out.println("Gehe zu den Nachbarn von" + RootVertex);
neighboursList = g.getNeighbours(RootVertex);
neighboursList.toFirst();
searchQueue.dequeue();
while (!neighboursList.isEmpty()) {
Vertex currentVertex = neighboursList.getContent();
if (!currentVertex.isMarked()) {
System.out.println(currentVertex + "Wird überprüft");
if (currentVertex.equals(searchedVertex)) {
System.out.println("Vertex wurde gefunden!");
return true;
}
System.out.println("Vertex wird als besucht markiert, Suche wird fortgesetzt");
currentVertex.setMark(true);
neighboursList.remove();
}
}
}
System.out.println("Der Vertex wurde nicht gefunden!");
// TODO: Implementiere die Breitensuche als iterativen Algorithmus:
// Reihe dazu die noch nicht markierten Nachbarknoten in die
// searchQueue ein und arbeite die Knoten in ihr der Reihe nach
// ab, bis die Queue leer ist, oder der gesuchte Knoten
// gefunden wurde.
// TODO: Ergänze deine Methode um Ausgaben, anhand derer die Abarbeitung
// deutlich wird.
// TODO: Wenn dein Algorithmus funnktioniert, kopiere die Methode und
// Erstelle Varianten, bei denen die Reihenfolge der Nachbarknoten
// modifiziert ist. Dazu
return false;
}
// TODO: Implementiere die Breitensuche als iterativen Algorithmus: private List<Vertex> getNeighbours() {
// Reihe dazu die noch nicht markierten Nachbarknoten in die // TODO Auto-generated method stub
// searchQueue ein und arbeite die Knoten in ihr der Reihe nach return null;
// ab, bis die Queue leer ist, oder der gesuchte Knoten }
// gefunden wurde.
// TODO: Ergänze deine Methode um Ausgaben, anhand derer die Abarbeitung
// deutlich wird.
// TODO: Wenn dein Algorithmus funnktioniert, kopiere die Methode und
// Erstelle Varianten, bei denen die Reihenfolge der Nachbarknoten
// modifiziert ist. Dazu
return false;
}
/** /**
* *
* @param pVertexID * @param pVertexID
* @return * @return
*/ */
public boolean findVertexByID( String pVertexID ) { public boolean findVertexByID(String pVertexID) {
g.setAllVertexMarks(false); // Markierungen zurücksetzen List<Vertex> neighboursList = new List<>();
Queue<Vertex> searchQueue = new Queue<>(); // Speicher für zu bearbeitende Knoten erstellen Vertex searchedVertex = g.getVertex(pVertexID);
Vertex firstVertex = bi;
g.setAllVertexMarks(false); // Markierungen zurücksetzen
Queue<Vertex> searchQueue = new Queue<>(); // Speicher für zu bearbeitende Knoten erstellen
firstVertex.setMark(true);
searchQueue.enqueue(firstVertex);
System.out.println("Beginne die Suche");
while (!searchQueue.isEmpty()) {
Vertex RootVertex = searchQueue.front();
System.out.println("Gehe zu den Nachbarn von" + RootVertex);
neighboursList = g.getNeighbours(RootVertex);
searchQueue.dequeue();
while (!neighboursList.isEmpty()) {
Vertex currentVertex = getVertexFromListByID(neighboursList);
if (!currentVertex.isMarked()) {
System.out.println(currentVertex + "Wird überprüft");
if (currentVertex.equals(searchedVertex)) {
System.out.println("Vertex wurde gefunden!");
return true;
}
System.out.println("Vertex wird als besucht markiert, Suche wird fortgesetzt");
currentVertex.setMark(true);
neighboursList.remove();
}
}
}
// TODO: Ändere die Breitensuche so ab, dass die Knoten so abgearbeitet
// werden, dass die Nachbarknoten in alphabetischer Reihenfolge
// besucht werden.
// Nutze dazu die Hilfsmethode getVertexFromListByID, um aus
// Liste der Nachbarknoten denjenigen, der alphabetisch als
// erstes kommt herauszusuchen.
return false;
}
// TODO: Ändere die Breitensuche so ab, dass die Knoten so abgearbeitet public boolean findVertexByWeight(String pVertexID) {
// werden, dass die Nachbarknoten in alphabetischer Reihenfolge List<Vertex> neighboursList = new List<>();
// besucht werden. Vertex searchedVertex = g.getVertex(pVertexID);
// Nutze dazu die Hilfsmethode getVertexFromListByID, um aus Vertex firstVertex = bi;
// Liste der Nachbarknoten denjenigen, der alphabetisch als g.setAllVertexMarks(false); // Markierungen zurücksetzen
// erstes kommt herauszusuchen. Queue<Vertex> searchQueue = new Queue<>(); // Speicher für zu bearbeitende Knoten erstellen
return false; firstVertex.setMark(true);
} searchQueue.enqueue(firstVertex);
if(firstVertex.equals(searchedVertex)) {
return true;
}
System.out.println("Beginne die Suche");
while (!searchQueue.isEmpty()) {
Vertex RootVertex = searchQueue.front();
System.out.println("Gehe zu den Nachbarn von" + RootVertex);
neighboursList = g.getNeighbours(RootVertex);
searchQueue.dequeue();
while (!neighboursList.isEmpty()) {
Vertex currentVertex = getVertexFromListByWeight(RootVertex, neighboursList);
if (!currentVertex.isMarked()) {
System.out.println(currentVertex + "Wird überprüft...");
if (currentVertex.equals(searchedVertex)) {
System.out.println("Vertex wurde gefunden!");
return true;
}
System.out.println("Vertex wird als besucht markiert, Suche wird fortgesetzt");
currentVertex.setMark(true);
neighboursList.remove();
}
}
}
return false;
// TODO: Ändere die Breitensuche so ab, dass die Knoten so abgearbeitet
// werden, dass der Nachbarknoten mit der Kante mit dem geringsten
// Gewicht zuerst besucht wird.
// Nutze dazu die Hilfsmethode getVertexFromListByWeight, um aus
// Liste der Nachbarknoten denjenigen mit dem geringsten Gewicht
// herauszusuchen.
}
public boolean findVertexByWeight( String pVertexID ) { /**
g.setAllVertexMarks(false); // Markierungen zurücksetzen * Sucht aus einer Liste von Knoten denjenigen, dessen ID alphabetisch ale
Queue<Vertex> searchQueue = new Queue<>(); // Speicher für zu bearbeitende Knoten erstellen * erstes kommt. Der Knoten wird aus der Liste gelöscht und dann zurück
* gegeben.
*
* @param pVertices
* @return
*/
private Vertex getVertexFromListByID(List<Vertex> pVertices) {
pVertices.toFirst();
Vertex v = pVertices.getContent();
do {
pVertices.next();
// TODO: Ändere die Breitensuche so ab, dass die Knoten so abgearbeitet if (pVertices.hasAccess() && pVertices.getContent().getID().compareToIgnoreCase(v.getID()) < 0) {
// werden, dass der Nachbarknoten mit der Kante mit dem geringsten v = pVertices.getContent();
// Gewicht zuerst besucht wird. }
// Nutze dazu die Hilfsmethode getVertexFromListByWeight, um aus } while (pVertices.hasAccess());
// Liste der Nachbarknoten denjenigen mit dem geringsten Gewicht
// herauszusuchen.
return false;
}
pVertices.toFirst();
while (pVertices.hasAccess()) {
if (pVertices.getContent().getID().equals(v.getID())) {
break;
}
pVertices.next();
}
pVertices.remove();
return v;
}
/** /**
* Sucht aus einer Liste von Knoten denjenigen, dessen ID alphabetisch ale * Sucht aus einer Liste von Knoten denjenigen, dessen Kantengewicht zum Konten
* erstes kommt. Der Knoten wird aus der Liste gelöscht und dann zurück * <code>pCurrentVertex</code> am geringsten ist. Der Knoten wird aus der Liste
* gegeben. * gelöscht und dann zurück gegeben.
* @param pVertices *
* @return * @param pVertices
*/ * @return
private Vertex getVertexFromListByID( List<Vertex> pVertices ) { */
pVertices.toFirst(); private Vertex getVertexFromListByWeight(Vertex pCurrentVertex, List<Vertex> pVertices) {
Vertex v = pVertices.getContent(); pVertices.toFirst();
do { Vertex v = pVertices.getContent();
pVertices.next(); double weight = g.getEdge(pCurrentVertex, v).getWeight();
do {
pVertices.next();
if( pVertices.hasAccess() && if (pVertices.hasAccess() && g.getEdge(pCurrentVertex, pVertices.getContent()).getWeight() < weight) {
pVertices.getContent().getID().compareToIgnoreCase(v.getID()) < 0 ) { v = pVertices.getContent();
v = pVertices.getContent(); }
} } while (pVertices.hasAccess());
} while( pVertices.hasAccess() );
pVertices.toFirst(); pVertices.toFirst();
while( pVertices.hasAccess() ) { while (pVertices.hasAccess()) {
if( pVertices.getContent().getID().equals(v.getID()) ) { if (pVertices.getContent().getID().equals(v.getID())) {
break; break;
} }
pVertices.next(); pVertices.next();
} }
pVertices.remove(); pVertices.remove();
return v; return v;
} }
/**
* Sucht aus einer Liste von Knoten denjenigen, dessen Kantengewicht zum
* Konten <code>pCurrentVertex</code> am geringsten ist. Der Knoten wird
* aus der Liste gelöscht und dann zurück
* gegeben.
* @param pVertices
* @return
*/
private Vertex getVertexFromListByWeight( Vertex pCurrentVertex, List<Vertex> pVertices ) {
pVertices.toFirst();
Vertex v = pVertices.getContent();
double weight = g.getEdge(pCurrentVertex, v).getWeight();
do {
pVertices.next();
if( pVertices.hasAccess() &&
g.getEdge(pCurrentVertex, pVertices.getContent()).getWeight() < weight ) {
v = pVertices.getContent();
}
} while( pVertices.hasAccess() );
pVertices.toFirst();
while( pVertices.hasAccess() ) {
if( pVertices.getContent().getID().equals(v.getID()) ) {
break;
}
pVertices.next();
}
pVertices.remove();
return v;
}
} }

BIN
Edge.class Normal file

Binary file not shown.

22
Edge.ctxt Normal file
View File

@ -0,0 +1,22 @@
#BlueJ class context
comment0.target=Edge
comment0.text=\r\n\ <p>\r\n\ Materialien\ zu\ den\ zentralen\ NRW-Abiturpruefungen\ im\ Fach\ Informatik\ ab\ 2018\r\n\ </p>\r\n\ <p>\r\n\ Klasse\ Edge\r\n\ </p>\r\n\ <p>\r\n\ Die\ Klasse\ Edge\ stellt\ eine\ einzelne,\ ungerichtete\ Kante\ eines\ Graphen\ dar.\ \r\n\ Beim\ Erstellen\ werden\ die\ beiden\ durch\ sie\ zu\ verbindenden\ Knotenobjekte\ und\ eine\ \r\n\ Gewichtung\ als\ double\ uebergeben.\ Beide\ Knotenobjekte\ koennen\ abgefragt\ werden.\ \r\n\ Des\ Weiteren\ koennen\ die\ Gewichtung\ und\ eine\ Markierung\ gesetzt\ und\ abgefragt\ werden.\r\n\ </p>\r\n\ \r\n\ @author\ Qualitaets-\ und\ UnterstuetzungsAgentur\ -\ Landesinstitut\ fuer\ Schule\r\n\ @version\ Oktober\ 2015\r\n
comment1.params=pVertex\ pAnotherVertex\ pWeight
comment1.target=Edge(Vertex,\ Vertex,\ double)
comment1.text=\r\n\ Ein\ neues\ Objekt\ vom\ Typ\ Edge\ wird\ erstellt.\ Die\ von\ diesem\ Objekt\ \r\n\ repraesentierte\ Kante\ verbindet\ die\ Knoten\ pVertex\ und\ pAnotherVertex\ mit\ der\ \r\n\ Gewichtung\ pWeight.\ Ihre\ Markierung\ hat\ den\ Wert\ false.\r\n
comment2.params=
comment2.target=Vertex[]\ getVertices()
comment2.text=\r\n\ Die\ Anfrage\ gibt\ die\ beiden\ Knoten,\ die\ durch\ die\ Kante\ verbunden\ werden,\ als\ neues\ Feld\ vom\ Typ\ Vertex\ zurueck.\ Das\ Feld\ hat\ \r\n\ genau\ zwei\ Eintraege\ mit\ den\ Indexwerten\ 0\ und\ 1.\r\n
comment3.params=pWeight
comment3.target=void\ setWeight(double)
comment3.text=\r\n\ Der\ Auftrag\ setzt\ das\ Gewicht\ der\ Kante\ auf\ pWeight.\r\n
comment4.params=
comment4.target=double\ getWeight()
comment4.text=\r\n\ Die\ Anfrage\ liefert\ das\ Gewicht\ der\ Kante\ als\ double.\r\n
comment5.params=pMark
comment5.target=void\ setMark(boolean)
comment5.text=\r\n\ Der\ Auftrag\ setzt\ die\ Markierung\ der\ Kante\ auf\ den\ Wert\ pMark.\r\n
comment6.params=
comment6.target=boolean\ isMarked()
comment6.text=\r\n\ Die\ Anfrage\ liefert\ true,\ wenn\ die\ Markierung\ der\ Kante\ den\ Wert\ true\ hat,\ ansonsten\ false.\r\n
numComments=7

BIN
Graph.class Normal file

Binary file not shown.

52
Graph.ctxt Normal file
View File

@ -0,0 +1,52 @@
#BlueJ class context
comment0.target=Graph
comment0.text=\r\n\ <p>\r\n\ Materialien\ zu\ den\ zentralen\ NRW-Abiturpruefungen\ im\ Fach\ Informatik\ ab\ 2018\r\n\ </p>\r\n\ <p>\r\n\ Klasse\ Graph\r\n\ </p>\r\n\ <p>\r\n\ Die\ Klasse\ Graph\ stellt\ einen\ ungerichteten,\ kantengewichteten\ Graphen\ dar.\ Es\ koennen\ \r\n\ Knoten-\ und\ Kantenobjekte\ hinzugefuegt\ und\ entfernt,\ flache\ Kopien\ der\ Knoten-\ und\ Kantenlisten\ \r\n\ des\ Graphen\ angefragt\ und\ Markierungen\ von\ Knoten\ und\ Kanten\ gesetzt\ und\ ueberprueft\ werden.\r\n\ Des\ Weiteren\ kann\ eine\ Liste\ der\ Nachbarn\ eines\ bestimmten\ Knoten,\ eine\ Liste\ der\ inzidenten\ \r\n\ Kanten\ eines\ bestimmten\ Knoten\ und\ die\ Kante\ von\ einem\ bestimmten\ Knoten\ zu\ einem\ \r\n\ anderen\ bestimmten\ Knoten\ angefragt\ werden.\ Abgesehen\ davon\ kann\ abgefragt\ werden,\ welches\ \r\n\ Knotenobjekt\ zu\ einer\ bestimmten\ ID\ gehoert\ und\ ob\ der\ Graph\ leer\ ist.\r\n\ </p>\r\n\ \r\n\ @author\ Qualitaets-\ und\ UnterstuetzungsAgentur\ -\ Landesinstitut\ fuer\ Schule\r\n\ @version\ Oktober\ 2015\r\n
comment1.params=
comment1.target=Graph()
comment1.text=\r\n\ Ein\ Objekt\ vom\ Typ\ Graph\ wird\ erstellt.\ Der\ von\ diesem\ Objekt\ \r\n\ repraesentierte\ Graph\ ist\ leer.\r\n
comment10.params=pMark
comment10.target=void\ setAllEdgeMarks(boolean)
comment10.text=\r\n\ Der\ Auftrag\ setzt\ die\ Markierungen\ aller\ Kanten\ des\ Graphen\ auf\ pMark.\r\n
comment11.params=
comment11.target=boolean\ allVerticesMarked()
comment11.text=\r\n\ Die\ Anfrage\ liefert\ true,\ wenn\ alle\ Knoten\ des\ Graphen\ mit\ true\ markiert\ sind,\ ansonsten\ false.\r\n
comment12.params=
comment12.target=boolean\ allEdgesMarked()
comment12.text=\r\n\ Die\ Anfrage\ liefert\ true,\ wenn\ alle\ Kanten\ des\ Graphen\ mit\ true\ markiert\ sind,\ ansonsten\ false.\r\n
comment13.params=pVertex
comment13.target=List\ getNeighbours(Vertex)
comment13.text=\r\n\ Die\ Anfrage\ liefert\ alle\ Nachbarn\ des\ Knotens\ pVertex\ als\ neue\ Liste\ vom\ Typ\ List<Vertex>.\ Hat\ der\ Knoten\r\n\ pVertex\ keine\ Nachbarn\ in\ diesem\ Graphen\ oder\ ist\ gar\ nicht\ in\ diesem\ Graphen\ enthalten,\ so\ \r\n\ wird\ eine\ leere\ Liste\ zurueckgeliefert.\r\n
comment14.params=pVertex
comment14.target=List\ getEdges(Vertex)
comment14.text=\r\n\ Die\ Anfrage\ liefert\ eine\ neue\ Liste\ alle\ inzidenten\ Kanten\ zum\ Knoten\ pVertex.\ Hat\ der\ Knoten\r\n\ pVertex\ keine\ inzidenten\ Kanten\ in\ diesem\ Graphen\ oder\ ist\ gar\ nicht\ in\ diesem\ Graphen\ enthalten,\ so\ \r\n\ wird\ eine\ leere\ Liste\ zurueckgeliefert.\r\n
comment15.params=pVertex\ pAnotherVertex
comment15.target=Edge\ getEdge(Vertex,\ Vertex)
comment15.text=\r\n\ Die\ Anfrage\ liefert\ die\ Kante,\ welche\ die\ Knoten\ pVertex\ und\ pAnotherVertex\ verbindet,\ \r\n\ als\ Objekt\ vom\ Typ\ Edge.\ Ist\ der\ Knoten\ pVertex\ oder\ der\ Knoten\ pAnotherVertex\ nicht\ \r\n\ im\ Graphen\ enthalten\ oder\ gibt\ es\ keine\ Kante,\ die\ beide\ Knoten\ verbindet,\ so\ wird\ null\ \r\n\ zurueckgeliefert.\r\n
comment16.params=
comment16.target=boolean\ isEmpty()
comment16.text=\r\n\ Die\ Anfrage\ liefert\ true,\ wenn\ der\ Graph\ keine\ Knoten\ enthaelt,\ ansonsten\ false.\r\n
comment2.params=
comment2.target=List\ getVertices()
comment2.text=\r\n\ Die\ Anfrage\ liefert\ eine\ neue\ Liste\ aller\ Knotenobjekte\ vom\ Typ\ List<Vertex>.\r\n
comment3.params=
comment3.target=List\ getEdges()
comment3.text=\r\n\ Die\ Anfrage\ liefert\ eine\ neue\ Liste\ aller\ Kantenobjekte\ vom\ Typ\ List<Edge>.\r\n
comment4.params=pID
comment4.target=Vertex\ getVertex(java.lang.String)
comment4.text=\r\n\ Die\ Anfrage\ liefert\ das\ Knotenobjekt\ mit\ pID\ als\ ID.\ Ist\ ein\ solchen\ Knotenobjekt\ nicht\ im\ Graphen\ enthalten,\r\n\ wird\ null\ zurueckgeliefert.\r\n
comment5.params=pVertex
comment5.target=void\ addVertex(Vertex)
comment5.text=\r\n\ Der\ Auftrag\ fuegt\ den\ Knoten\ pVertex\ in\ den\ Graphen\ ein,\ sofern\ es\ noch\ keinen\r\n\ Knoten\ mit\ demselben\ ID-Eintrag\ wie\ pVertex\ im\ Graphen\ gibt\ und\ pVertex\ eine\ ID\ ungleich\ null\ hat.\ \r\n\ Ansonsten\ passiert\ nichts.\r\n
comment6.params=pEdge
comment6.target=void\ addEdge(Edge)
comment6.text=\r\n\ Der\ Auftrag\ fuegt\ die\ Kante\ pEdge\ in\ den\ Graphen\ ein,\ sofern\ beide\ durch\ die\ Kante\ verbundenen\ Knoten\r\n\ im\ Graphen\ enthalten\ sind,\ nicht\ identisch\ sind\ und\ noch\ keine\ Kante\ zwischen\ den\ Knoten\ existiert.\ Ansonsten\ passiert\ nichts.\r\n
comment7.params=pVertex
comment7.target=void\ removeVertex(Vertex)
comment7.text=\r\n\ Der\ Auftrag\ entfernt\ den\ Knoten\ pVertex\ aus\ dem\ Graphen\ und\ loescht\ alle\ Kanten,\ die\ mit\ ihm\ inzident\ sind.\r\n\ Ist\ der\ Knoten\ pVertex\ nicht\ im\ Graphen\ enthalten,\ passiert\ nichts.\r\n
comment8.params=pEdge
comment8.target=void\ removeEdge(Edge)
comment8.text=\r\n\ Der\ Auftrag\ entfernt\ die\ Kante\ pEdge\ aus\ dem\ Graphen.\ Ist\ die\ Kante\ pEdge\ nicht\ \r\n\ im\ Graphen\ enthalten,\ passiert\ nichts.\r\n
comment9.params=pMark
comment9.target=void\ setAllVertexMarks(boolean)
comment9.text=\r\n\ Der\ Auftrag\ setzt\ die\ Markierungen\ aller\ Knoten\ des\ Graphen\ auf\ pMark.\r\n
numComments=17

BIN
List$ListNode.class Normal file

Binary file not shown.

BIN
List.class Normal file

Binary file not shown.

43
List.ctxt Normal file
View File

@ -0,0 +1,43 @@
#BlueJ class context
comment0.target=List
comment0.text=\r\n\ <p>\r\n\ Materialien\ zu\ den\ zentralen\ NRW-Abiturpruefungen\ im\ Fach\ Informatik\ ab\ 2018\r\n\ </p>\r\n\ <p>\r\n\ Generische\ Klasse\ List<ContentType>\r\n\ </p>\r\n\ <p>\r\n\ Objekt\ der\ generischen\ Klasse\ List\ verwalten\ beliebig\ viele\ linear\r\n\ angeordnete\ Objekte\ vom\ Typ\ ContentType.\ Auf\ hoechstens\ ein\ Listenobjekt,\r\n\ aktuellesObjekt\ genannt,\ kann\ jeweils\ zugegriffen\ werden.<br\ />\r\n\ Wenn\ eine\ Liste\ leer\ ist,\ vollstaendig\ durchlaufen\ wurde\ oder\ das\ aktuelle\r\n\ Objekt\ am\ Ende\ der\ Liste\ geloescht\ wurde,\ gibt\ es\ kein\ aktuelles\ Objekt.<br\ />\r\n\ Das\ erste\ oder\ das\ letzte\ Objekt\ einer\ Liste\ koennen\ durch\ einen\ Auftrag\ zum\r\n\ aktuellen\ Objekt\ gemacht\ werden.\ Ausserdem\ kann\ das\ dem\ aktuellen\ Objekt\r\n\ folgende\ Listenobjekt\ zum\ neuen\ aktuellen\ Objekt\ werden.\ <br\ />\r\n\ Das\ aktuelle\ Objekt\ kann\ gelesen,\ veraendert\ oder\ geloescht\ werden.\ Ausserdem\r\n\ kann\ vor\ dem\ aktuellen\ Objekt\ ein\ Listenobjekt\ eingefuegt\ werden.\r\n\ </p>\r\n\ \r\n\ @author\ Qualitaets-\ und\ UnterstuetzungsAgentur\ -\ Landesinstitut\ fuer\ Schule\r\n\ @version\ Generisch_06\ 2015-10-25\r\n
comment1.params=
comment1.target=List()
comment1.text=\r\n\ Eine\ leere\ Liste\ wird\ erzeugt.\r\n
comment10.params=pContent
comment10.target=void\ append(java.lang.Object)
comment10.text=\r\n\ Falls\ pContent\ gleich\ null\ ist,\ geschieht\ nichts.<br\ />\r\n\ Ansonsten\ wird\ ein\ neues\ Objekt\ pContent\ am\ Ende\ der\ Liste\ eingefuegt.\r\n\ Das\ aktuelle\ Objekt\ bleibt\ unveraendert.\ <br\ />\r\n\ Wenn\ die\ Liste\ leer\ ist,\ wird\ das\ Objekt\ pContent\ in\ die\ Liste\ eingefuegt\r\n\ und\ es\ gibt\ weiterhin\ kein\ aktuelles\ Objekt\ (hasAccess()\ \=\=\ false).\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ das\ anzuhaengende\ Objekt\ vom\ Typ\ ContentType\r\n
comment11.params=pList
comment11.target=void\ concat(List)
comment11.text=\r\n\ Falls\ es\ sich\ bei\ der\ Liste\ und\ pList\ um\ dasselbe\ Objekt\ handelt,\r\n\ pList\ null\ oder\ eine\ leere\ Liste\ ist,\ geschieht\ nichts.<br\ />\r\n\ Ansonsten\ wird\ die\ Liste\ pList\ an\ die\ aktuelle\ Liste\ angehaengt.\r\n\ Anschliessend\ wird\ pList\ eine\ leere\ Liste.\ Das\ aktuelle\ Objekt\ bleibt\r\n\ unveraendert.\ Insbesondere\ bleibt\ hasAccess\ identisch.\r\n\ \r\n\ @param\ pList\r\n\ \ \ \ \ \ \ \ \ \ \ \ die\ am\ Ende\ anzuhaengende\ Liste\ vom\ Typ\ List<ContentType>\r\n
comment12.params=
comment12.target=void\ remove()
comment12.text=\r\n\ Wenn\ die\ Liste\ leer\ ist\ oder\ es\ kein\ aktuelles\ Objekt\ gibt\ (hasAccess()\r\n\ \=\=\ false),\ geschieht\ nichts.<br\ />\r\n\ Falls\ es\ ein\ aktuelles\ Objekt\ gibt\ (hasAccess()\ \=\=\ true),\ wird\ das\r\n\ aktuelle\ Objekt\ geloescht\ und\ das\ Objekt\ hinter\ dem\ geloeschten\ Objekt\r\n\ wird\ zum\ aktuellen\ Objekt.\ <br\ />\r\n\ Wird\ das\ Objekt,\ das\ am\ Ende\ der\ Liste\ steht,\ geloescht,\ gibt\ es\ kein\r\n\ aktuelles\ Objekt\ mehr.\r\n
comment13.params=pNode
comment13.target=List.ListNode\ getPrevious(List.ListNode)
comment13.text=\r\n\ Liefert\ den\ Vorgaengerknoten\ des\ Knotens\ pNode.\ Ist\ die\ Liste\ leer,\ pNode\r\n\ \=\=\ null,\ pNode\ nicht\ in\ der\ Liste\ oder\ pNode\ der\ erste\ Knoten\ der\ Liste,\r\n\ wird\ null\ zurueckgegeben.\r\n\r\n\ @param\ pNode\r\n\ \ \ \ \ \ \ \ \ der\ Knoten,\ dessen\ Vorgaenger\ zurueckgegeben\ werden\ soll\r\n\ @return\ der\ Vorgaenger\ des\ Knotens\ pNode\ oder\ null,\ falls\ die\ Liste\ leer\ ist,\r\n\ \ \ \ \ \ \ \ \ pNode\ \=\=\ null\ ist,\ pNode\ nicht\ in\ der\ Liste\ ist\ oder\ pNode\ der\ erste\ Knoten\r\n\ \ \ \ \ \ \ \ \ der\ Liste\ ist\r\n
comment2.params=
comment2.target=boolean\ isEmpty()
comment2.text=\r\n\ Die\ Anfrage\ liefert\ den\ Wert\ true,\ wenn\ die\ Liste\ keine\ Objekte\ enthaelt,\r\n\ sonst\ liefert\ sie\ den\ Wert\ false.\r\n\ \r\n\ @return\ true,\ wenn\ die\ Liste\ leer\ ist,\ sonst\ false\r\n
comment3.params=
comment3.target=boolean\ hasAccess()
comment3.text=\r\n\ Die\ Anfrage\ liefert\ den\ Wert\ true,\ wenn\ es\ ein\ aktuelles\ Objekt\ gibt,\r\n\ sonst\ liefert\ sie\ den\ Wert\ false.\r\n\ \r\n\ @return\ true,\ falls\ Zugriff\ moeglich,\ sonst\ false\r\n
comment4.params=
comment4.target=void\ next()
comment4.text=\r\n\ Falls\ die\ Liste\ nicht\ leer\ ist,\ es\ ein\ aktuelles\ Objekt\ gibt\ und\ dieses\r\n\ nicht\ das\ letzte\ Objekt\ der\ Liste\ ist,\ wird\ das\ dem\ aktuellen\ Objekt\ in\r\n\ der\ Liste\ folgende\ Objekt\ zum\ aktuellen\ Objekt,\ andernfalls\ gibt\ es\ nach\r\n\ Ausfuehrung\ des\ Auftrags\ kein\ aktuelles\ Objekt,\ d.h.\ hasAccess()\ liefert\r\n\ den\ Wert\ false.\r\n
comment5.params=
comment5.target=void\ toFirst()
comment5.text=\r\n\ Falls\ die\ Liste\ nicht\ leer\ ist,\ wird\ das\ erste\ Objekt\ der\ Liste\ aktuelles\r\n\ Objekt.\ Ist\ die\ Liste\ leer,\ geschieht\ nichts.\r\n
comment6.params=
comment6.target=void\ toLast()
comment6.text=\r\n\ Falls\ die\ Liste\ nicht\ leer\ ist,\ wird\ das\ letzte\ Objekt\ der\ Liste\r\n\ aktuelles\ Objekt.\ Ist\ die\ Liste\ leer,\ geschieht\ nichts.\r\n
comment7.params=
comment7.target=java.lang.Object\ getContent()
comment7.text=\r\n\ Falls\ es\ ein\ aktuelles\ Objekt\ gibt\ (hasAccess()\ \=\=\ true),\ wird\ das\r\n\ aktuelle\ Objekt\ zurueckgegeben,\ andernfalls\ (hasAccess()\ \=\=\ false)\ gibt\r\n\ die\ Anfrage\ den\ Wert\ null\ zurueck.\r\n\ \r\n\ @return\ das\ aktuelle\ Objekt\ (vom\ Typ\ ContentType)\ oder\ null,\ wenn\ es\r\n\ \ \ \ \ \ \ \ \ kein\ aktuelles\ Objekt\ gibt\r\n
comment8.params=pContent
comment8.target=void\ setContent(java.lang.Object)
comment8.text=\r\n\ Falls\ es\ ein\ aktuelles\ Objekt\ gibt\ (hasAccess()\ \=\=\ true)\ und\ pContent\r\n\ ungleich\ null\ ist,\ wird\ das\ aktuelle\ Objekt\ durch\ pContent\ ersetzt.\ Sonst\r\n\ geschieht\ nichts.\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ das\ zu\ schreibende\ Objekt\ vom\ Typ\ ContentType\r\n
comment9.params=pContent
comment9.target=void\ insert(java.lang.Object)
comment9.text=\r\n\ Falls\ es\ ein\ aktuelles\ Objekt\ gibt\ (hasAccess()\ \=\=\ true),\ wird\ ein\ neues\r\n\ Objekt\ vor\ dem\ aktuellen\ Objekt\ in\ die\ Liste\ eingefuegt.\ Das\ aktuelle\r\n\ Objekt\ bleibt\ unveraendert.\ <br\ />\r\n\ Wenn\ die\ Liste\ leer\ ist,\ wird\ pContent\ in\ die\ Liste\ eingefuegt\ und\ es\r\n\ gibt\ weiterhin\ kein\ aktuelles\ Objekt\ (hasAccess()\ \=\=\ false).\ <br\ />\r\n\ Falls\ es\ kein\ aktuelles\ Objekt\ gibt\ (hasAccess()\ \=\=\ false)\ und\ die\ Liste\r\n\ nicht\ leer\ ist\ oder\ pContent\ gleich\ null\ ist,\ geschieht\ nichts.\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ das\ einzufuegende\ Objekt\ vom\ Typ\ ContentType\r\n
numComments=14

BIN
Queue$QueueNode.class Normal file

Binary file not shown.

BIN
Queue.class Normal file

Binary file not shown.

19
Queue.ctxt Normal file
View File

@ -0,0 +1,19 @@
#BlueJ class context
comment0.target=Queue
comment0.text=\r\n\ <p>\r\n\ Materialien\ zu\ den\ zentralen\ NRW-Abiturpruefungen\ im\ Fach\ Informatik\ ab\ 2018\r\n\ </p>\r\n\ <p>\r\n\ Generische\ Klasse\ Queue<ContentType>\r\n\ </p>\r\n\ <p>\r\n\ Objekte\ der\ generischen\ Klasse\ Queue\ (Warteschlange)\ verwalten\ beliebige\r\n\ Objekte\ vom\ Typ\ ContentType\ nach\ dem\ First-In-First-Out-Prinzip,\ d.h.,\ das\r\n\ zuerst\ abgelegte\ Objekt\ wird\ als\ erstes\ wieder\ entnommen.\ Alle\ Methoden\ haben\r\n\ eine\ konstante\ Laufzeit,\ unabhaengig\ von\ der\ Anzahl\ der\ verwalteten\ Objekte.\r\n\ </p>\r\n\ \r\n\ @author\ Qualitaets-\ und\ UnterstuetzungsAgentur\ -\ Landesinstitut\ fuer\ Schule\r\n\ @version\ Generisch_02\ 2014-02-21\r\n
comment1.params=
comment1.target=Queue()
comment1.text=\r\n\ Eine\ leere\ Schlange\ wird\ erzeugt.\ \r\n\ Objekte,\ die\ in\ dieser\ Schlange\ verwaltet\ werden,\ muessen\ vom\ Typ\r\n\ ContentType\ sein.\r\n
comment2.params=
comment2.target=boolean\ isEmpty()
comment2.text=\r\n\ Die\ Anfrage\ liefert\ den\ Wert\ true,\ wenn\ die\ Schlange\ keine\ Objekte\ enthaelt,\ \r\n\ sonst\ liefert\ sie\ den\ Wert\ false.\r\n\ \r\n\ @return\ true,\ falls\ die\ Schlange\ leer\ ist,\ sonst\ false\r\n
comment3.params=pContent
comment3.target=void\ enqueue(java.lang.Object)
comment3.text=\r\n\ Das\ Objekt\ pContentType\ wird\ an\ die\ Schlange\ angehaengt.\ \r\n\ Falls\ pContentType\ gleich\ null\ ist,\ bleibt\ die\ Schlange\ unveraendert.\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ das\ anzuhaengende\ Objekt\ vom\ Typ\ ContentType\r\n
comment4.params=
comment4.target=void\ dequeue()
comment4.text=\r\n\ Das\ erste\ Objekt\ wird\ aus\ der\ Schlange\ entfernt.\ \r\n\ Falls\ die\ Schlange\ leer\ ist,\ wird\ sie\ nicht\ veraendert.\r\n
comment5.params=
comment5.target=java.lang.Object\ front()
comment5.text=\r\n\ Die\ Anfrage\ liefert\ das\ erste\ Objekt\ der\ Schlange.\ \r\n\ Die\ Schlange\ bleibt\ unveraendert.\ \r\n\ Falls\ die\ Schlange\ leer\ ist,\ wird\ null\ zurueckgegeben.\r\n\r\n\ @return\ das\ erste\ Objekt\ der\ Schlange\ vom\ Typ\ ContentType\ oder\ null,\r\n\ \ \ \ \ \ \ \ \ falls\ die\ Schlange\ leer\ ist\r\n
numComments=6

BIN
Vertex.class Normal file

Binary file not shown.

16
Vertex.ctxt Normal file
View File

@ -0,0 +1,16 @@
#BlueJ class context
comment0.target=Vertex
comment0.text=\r\n\ <p>\r\n\ Materialien\ zu\ den\ zentralen\ NRW-Abiturpruefungen\ im\ Fach\ Informatik\ ab\ 2018\r\n\ </p>\r\n\ <p>\r\n\ Klasse\ Vertex\r\n\ </p>\r\n\ <p>\r\n\ Die\ Klasse\ Vertex\ stellt\ einen\ einzelnen\ Knoten\ eines\ Graphen\ dar.\ Jedes\ Objekt\ \r\n\ dieser\ Klasse\ verfuegt\ ueber\ eine\ im\ Graphen\ eindeutige\ ID\ als\ String\ und\ kann\ diese\ \r\n\ ID\ zurueckliefern.\ Darueber\ hinaus\ kann\ eine\ Markierung\ gesetzt\ und\ abgefragt\ werden.\r\n\ </p>\r\n\ \r\n\ @author\ Qualitaets-\ und\ UnterstuetzungsAgentur\ -\ Landesinstitut\ fuer\ Schule\r\n\ @version\ Oktober\ 2015\r\n
comment1.params=pID
comment1.target=Vertex(java.lang.String)
comment1.text=\r\n\ Ein\ neues\ Objekt\ vom\ Typ\ Vertex\ wird\ erstellt.\ Seine\ Markierung\ hat\ den\ Wert\ false.\r\n
comment2.params=
comment2.target=java.lang.String\ getID()
comment2.text=\r\n\ Die\ Anfrage\ liefert\ die\ ID\ des\ Knotens\ als\ String.\r\n
comment3.params=pMark
comment3.target=void\ setMark(boolean)
comment3.text=\r\n\ Der\ Auftrag\ setzt\ die\ Markierung\ des\ Knotens\ auf\ den\ Wert\ pMark.\r\n
comment4.params=
comment4.target=boolean\ isMarked()
comment4.text=\r\n\ Die\ Anfrage\ liefert\ true,\ wenn\ die\ Markierung\ des\ Knotens\ den\ Wert\ true\ hat,\ ansonsten\ false.\r\n
numComments=5

View File

@ -1,26 +1,50 @@
#BlueJ package file #BlueJ package file
dependency1.from=BinarySearchTree dependency1.from=BreitensucheTest
dependency1.to=ComparableContent dependency1.to=Breitensuche
dependency1.type=UsesDependency dependency1.type=UsesDependency
dependency2.from=Racingsimulator dependency10.from=Breitensuche
dependency2.to=Athlete dependency10.to=Queue
dependency10.type=UsesDependency
dependency2.from=Graph
dependency2.to=List
dependency2.type=UsesDependency dependency2.type=UsesDependency
editor.fx.0.height=738 dependency3.from=Graph
editor.fx.0.width=816 dependency3.to=Vertex
editor.fx.0.x=466 dependency3.type=UsesDependency
editor.fx.0.y=146 dependency4.from=Graph
objectbench.height=100 dependency4.to=Edge
objectbench.width=1256 dependency4.type=UsesDependency
dependency5.from=Edge
dependency5.to=Vertex
dependency5.type=UsesDependency
dependency6.from=Breitensuche
dependency6.to=Graph
dependency6.type=UsesDependency
dependency7.from=Breitensuche
dependency7.to=Vertex
dependency7.type=UsesDependency
dependency8.from=Breitensuche
dependency8.to=Edge
dependency8.type=UsesDependency
dependency9.from=Breitensuche
dependency9.to=List
dependency9.type=UsesDependency
editor.fx.0.height=1416
editor.fx.0.width=2576
editor.fx.0.x=-8
editor.fx.0.y=-8
objectbench.height=193
objectbench.width=2536
package.divider.horizontal=0.6 package.divider.horizontal=0.6
package.divider.vertical=0.881243063263041 package.divider.vertical=0.8480243161094225
package.editor.height=787 package.editor.height=1109
package.editor.width=1145 package.editor.width=2425
package.editor.x=0 package.editor.x=0
package.editor.y=0 package.editor.y=0
package.frame.height=1000 package.frame.height=1416
package.frame.width=1296 package.frame.width=2576
package.numDependencies=2 package.numDependencies=10
package.numTargets=4 package.numTargets=7
package.showExtends=true package.showExtends=true
package.showUses=true package.showUses=true
project.charset=UTF-8 project.charset=UTF-8
@ -30,30 +54,51 @@ readme.width=47
readme.x=10 readme.x=10
readme.y=10 readme.y=10
target1.height=50 target1.height=50
target1.name=Racingsimulator target1.name=BreitensucheTest
target1.showInterface=false target1.showInterface=false
target1.type=ClassTarget target1.type=ClassTarget
target1.width=130 target1.width=130
target1.x=450 target1.x=1060
target1.y=472 target1.y=520
target2.height=50 target2.height=50
target2.name=ComparableContent target2.name=Vertex
target2.showInterface=false target2.showInterface=false
target2.type=InterfaceTarget target2.type=ClassTarget
target2.width=250 target2.width=80
target2.x=160 target2.x=500
target2.y=270 target2.y=550
target3.height=50 target3.height=50
target3.name=Athlete target3.name=Graph
target3.showInterface=false target3.showInterface=false
target3.type=ClassTarget target3.type=ClassTarget
target3.width=90 target3.width=80
target3.x=280 target3.x=740
target3.y=550 target3.y=120
target4.height=50 target4.height=50
target4.name=BinarySearchTree target4.name=Breitensuche
target4.showInterface=false target4.showInterface=false
target4.type=ClassTarget target4.type=ClassTarget
target4.width=230 target4.width=100
target4.x=370 target4.x=110
target4.y=90 target4.y=430
target5.height=50
target5.name=List
target5.showInterface=false
target5.type=ClassTarget
target5.width=150
target5.x=840
target5.y=220
target6.height=50
target6.name=Edge
target6.showInterface=false
target6.type=ClassTarget
target6.width=80
target6.x=330
target6.y=640
target7.height=50
target7.name=Queue
target7.showInterface=false
target7.type=ClassTarget
target7.width=160
target7.x=850
target7.y=360