mirror of
https://github.com/jneug/zeichenmaschine.git
synced 2026-04-14 14:43:33 +02:00
Überflüssige Beispiel entfernt
This commit is contained in:
@@ -1,148 +0,0 @@
|
|||||||
import java.sql.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Klasse DatabaseConnector
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Ein Objekt der Klasse DatabaseConnector ermoeglicht die Abfrage und Manipulation
|
|
||||||
* einer SQLite-Datenbank.
|
|
||||||
* Beim Erzeugen des Objekts wird eine Datenbankverbindung aufgebaut, so dass
|
|
||||||
* anschließend SQL-Anweisungen an diese Datenbank gerichtet werden koennen.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule
|
|
||||||
* @version 2016-01-24
|
|
||||||
*/
|
|
||||||
public class DatabaseConnector{
|
|
||||||
private Connection connection;
|
|
||||||
private QueryResult currentQueryResult = null;
|
|
||||||
private String message = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ein Objekt vom Typ DatabaseConnector wird erstellt, und eine Verbindung zur Datenbank
|
|
||||||
* wird aufgebaut. Mit den Parametern pIP und pPort werden die IP-Adresse und die
|
|
||||||
* Port-Nummer uebergeben, unter denen die Datenbank mit Namen pDatabase zu erreichen ist.
|
|
||||||
* Mit den Parametern pUsername und pPassword werden Benutzername und Passwort fuer die
|
|
||||||
* Datenbank uebergeben.
|
|
||||||
*/
|
|
||||||
public DatabaseConnector(String pIP, int pPort, String pDatabase, String pUsername, String pPassword){
|
|
||||||
//Eine Impementierung dieser Schnittstelle fuer SQLite ignoriert pID und pPort, da die Datenbank immer lokal ist.
|
|
||||||
//Auch pUsername und pPassword werden nicht verwendet, da SQLite sie nicht unterstuetzt.
|
|
||||||
try {
|
|
||||||
//Laden der Treiberklasse
|
|
||||||
Class.forName("org.sqlite.JDBC");
|
|
||||||
|
|
||||||
//Verbindung herstellen
|
|
||||||
connection = DriverManager.getConnection("jdbc:sqlite:"+pDatabase);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
message = e.getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Der Auftrag schickt den im Parameter pSQLStatement enthaltenen SQL-Befehl an die
|
|
||||||
* Datenbank ab.
|
|
||||||
* Handelt es sich bei pSQLStatement um einen SQL-Befehl, der eine Ergebnismenge
|
|
||||||
* liefert, so kann dieses Ergebnis anschließend mit der Methode getCurrentQueryResult
|
|
||||||
* abgerufen werden.
|
|
||||||
*/
|
|
||||||
public void executeStatement(String pSQLStatement){
|
|
||||||
//Altes Ergebnis loeschen
|
|
||||||
currentQueryResult = null;
|
|
||||||
message = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
//Neues Statement erstellen
|
|
||||||
Statement statement = connection.createStatement();
|
|
||||||
|
|
||||||
//SQL Anweisung an die DB schicken.
|
|
||||||
if (statement.execute(pSQLStatement)) { //Fall 1: Es gibt ein Ergebnis
|
|
||||||
|
|
||||||
//Resultset auslesen
|
|
||||||
ResultSet resultset = statement.getResultSet();
|
|
||||||
|
|
||||||
//Spaltenanzahl ermitteln
|
|
||||||
int columnCount = resultset.getMetaData().getColumnCount();
|
|
||||||
|
|
||||||
//Spaltennamen und Spaltentypen in Felder uebertragen
|
|
||||||
String[] resultColumnNames = new String[columnCount];
|
|
||||||
String[] resultColumnTypes = new String[columnCount];
|
|
||||||
for (int i = 0; i < columnCount; i++){
|
|
||||||
resultColumnNames[i] = resultset.getMetaData().getColumnLabel(i+1);
|
|
||||||
resultColumnTypes[i] = resultset.getMetaData().getColumnTypeName(i+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Queue fuer die Zeilen der Ergebnistabelle erstellen
|
|
||||||
Queue<String[]> rows = new Queue<String[]>();
|
|
||||||
|
|
||||||
//Daten in Queue uebertragen und Zeilen zaehlen
|
|
||||||
int rowCount = 0;
|
|
||||||
while (resultset.next()){
|
|
||||||
String[] resultrow = new String[columnCount];
|
|
||||||
for (int s = 0; s < columnCount; s++){
|
|
||||||
resultrow[s] = resultset.getString(s+1);
|
|
||||||
}
|
|
||||||
rows.enqueue(resultrow);
|
|
||||||
rowCount = rowCount + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Ergebnisfeld erstellen und Zeilen aus Queue uebertragen
|
|
||||||
String[][] resultData = new String[rowCount][columnCount];
|
|
||||||
int j = 0;
|
|
||||||
while (!rows.isEmpty()){
|
|
||||||
resultData[j] = rows.front();
|
|
||||||
rows.dequeue();
|
|
||||||
j = j + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Statement schließen und Ergebnisobjekt erstellen
|
|
||||||
statement.close();
|
|
||||||
currentQueryResult = new QueryResult(resultData, resultColumnNames, resultColumnTypes);
|
|
||||||
|
|
||||||
} else { //Fall 2: Es gibt kein Ergebnis.
|
|
||||||
//Statement ohne Ergebnisobjekt schliessen
|
|
||||||
statement.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
//Fehlermeldung speichern
|
|
||||||
message = e.getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert das Ergebnis des letzten mit der Methode executeStatement an
|
|
||||||
* die Datenbank geschickten SQL-Befehls als Ob-jekt vom Typ QueryResult zurueck.
|
|
||||||
* Wurde bisher kein SQL-Befehl abgeschickt oder ergab der letzte Aufruf von
|
|
||||||
* executeStatement keine Ergebnismenge (z.B. bei einem INSERT-Befehl oder einem
|
|
||||||
* Syntaxfehler), so wird null geliefert.
|
|
||||||
*/
|
|
||||||
public QueryResult getCurrentQueryResult(){
|
|
||||||
return currentQueryResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert null oder eine Fehlermeldung, die sich jeweils auf die letzte zuvor ausgefuehrte
|
|
||||||
* Datenbankoperation bezieht.
|
|
||||||
*/
|
|
||||||
public String getErrorMessage(){
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Datenbankverbindung wird geschlossen.
|
|
||||||
*/
|
|
||||||
public void close(){
|
|
||||||
try{
|
|
||||||
connection.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
message = e.getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Klasse QueryResult
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Ein Objekt der Klasse QueryResult stellt die Ergebnistabelle einer Datenbankanfrage mit Hilfe
|
|
||||||
* der Klasse DatabaseConnector dar. Objekte dieser Klasse werden nur von der Klasse DatabaseConnector erstellt.
|
|
||||||
* Die Klasse verfuegt ueber keinen oeffentlichen Konstruktor.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule
|
|
||||||
* @version 2015-01-31
|
|
||||||
*/
|
|
||||||
public class QueryResult{
|
|
||||||
private String[][] data;
|
|
||||||
private String[] columnNames;
|
|
||||||
private String[] columnTypes;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Paketinterner Konstruktor.
|
|
||||||
*/
|
|
||||||
QueryResult(String[][] pData, String[] pColumnNames, String[] pColumnTypes){
|
|
||||||
data = pData;
|
|
||||||
columnNames = pColumnNames;
|
|
||||||
columnTypes = pColumnTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert die Eintraege der Ergebnistabelle als zweidimensionales Feld
|
|
||||||
* vom Typ String. Der erste Index des Feldes stellt die Zeile und der zweite die
|
|
||||||
* Spalte dar (d.h. Object[zeile][spalte]).
|
|
||||||
*/
|
|
||||||
public String[][] getData(){
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert die Bezeichner der Spalten der Ergebnistabelle als Feld vom
|
|
||||||
* Typ String zurueck.
|
|
||||||
*/
|
|
||||||
public String[] getColumnNames(){
|
|
||||||
return columnNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert die Typenbezeichnung der Spalten der Ergebnistabelle als Feld
|
|
||||||
* vom Typ String zurueck. Die Bezeichnungen entsprechen den Angaben in der MySQL-Datenbank.
|
|
||||||
*/
|
|
||||||
public String[] getColumnTypes(){
|
|
||||||
return columnTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert die Anzahl der Zeilen der Ergebnistabelle als Integer.
|
|
||||||
*/
|
|
||||||
public int getRowCount(){
|
|
||||||
if (data != null )
|
|
||||||
return data.length;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert die Anzahl der Spalten der Ergebnistabelle als Integer.
|
|
||||||
*/
|
|
||||||
public int getColumnCount(){
|
|
||||||
if (data != null && data.length > 0 && data[0] != null)
|
|
||||||
return data[0].length;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Generische Klasse Queue<ContentType>
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Objekte der generischen Klasse Queue (Warteschlange) verwalten beliebige
|
|
||||||
* Objekte vom Typ ContentType nach dem First-In-First-Out-Prinzip, d.h., das
|
|
||||||
* zuerst abgelegte Objekt wird als erstes wieder entnommen. Alle Methoden haben
|
|
||||||
* eine konstante Laufzeit, unabhaengig von der Anzahl der verwalteten Objekte.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule
|
|
||||||
* @version Generisch_02 2014-02-21
|
|
||||||
*/
|
|
||||||
public class Queue<ContentType> {
|
|
||||||
|
|
||||||
/* --------- Anfang der privaten inneren Klasse -------------- */
|
|
||||||
|
|
||||||
private class QueueNode {
|
|
||||||
|
|
||||||
private ContentType content = null;
|
|
||||||
private QueueNode nextNode = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ein neues Objekt vom Typ QueueNode<ContentType> wird erschaffen.
|
|
||||||
* Der Inhalt wird per Parameter gesetzt. Der Verweis ist leer.
|
|
||||||
*
|
|
||||||
* @param pContent das Inhaltselement des Knotens vom Typ ContentType
|
|
||||||
*/
|
|
||||||
public QueueNode(ContentType pContent) {
|
|
||||||
content = pContent;
|
|
||||||
nextNode = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Der Verweis wird auf das Objekt, das als Parameter uebergeben wird,
|
|
||||||
* gesetzt.
|
|
||||||
*
|
|
||||||
* @param pNext der Nachfolger des Knotens
|
|
||||||
*/
|
|
||||||
public void setNext(QueueNode pNext) {
|
|
||||||
nextNode = pNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Liefert das naechste Element des aktuellen Knotens.
|
|
||||||
*
|
|
||||||
* @return das Objekt vom Typ QueueNode, auf das der aktuelle Verweis zeigt
|
|
||||||
*/
|
|
||||||
public QueueNode getNext() {
|
|
||||||
return nextNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Liefert das Inhaltsobjekt des Knotens vom Typ ContentType.
|
|
||||||
*
|
|
||||||
* @return das Inhaltsobjekt des Knotens
|
|
||||||
*/
|
|
||||||
public ContentType getContent() {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------- Ende der privaten inneren Klasse -------------- */
|
|
||||||
|
|
||||||
private QueueNode head;
|
|
||||||
private QueueNode tail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eine leere Schlange wird erzeugt.
|
|
||||||
* Objekte, die in dieser Schlange verwaltet werden, muessen vom Typ
|
|
||||||
* ContentType sein.
|
|
||||||
*/
|
|
||||||
public Queue() {
|
|
||||||
head = null;
|
|
||||||
tail = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert den Wert true, wenn die Schlange keine Objekte enthaelt,
|
|
||||||
* sonst liefert sie den Wert false.
|
|
||||||
*
|
|
||||||
* @return true, falls die Schlange leer ist, sonst false
|
|
||||||
*/
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return head == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Das Objekt pContentType wird an die Schlange angehaengt.
|
|
||||||
* Falls pContentType gleich null ist, bleibt die Schlange unveraendert.
|
|
||||||
*
|
|
||||||
* @param pContent
|
|
||||||
* das anzuhaengende Objekt vom Typ ContentType
|
|
||||||
*/
|
|
||||||
public void enqueue(ContentType pContent) {
|
|
||||||
if (pContent != null) {
|
|
||||||
QueueNode newNode = new QueueNode(pContent);
|
|
||||||
if (this.isEmpty()) {
|
|
||||||
head = newNode;
|
|
||||||
tail = newNode;
|
|
||||||
} else {
|
|
||||||
tail.setNext(newNode);
|
|
||||||
tail = newNode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Das erste Objekt wird aus der Schlange entfernt.
|
|
||||||
* Falls die Schlange leer ist, wird sie nicht veraendert.
|
|
||||||
*/
|
|
||||||
public void dequeue() {
|
|
||||||
if (!this.isEmpty()) {
|
|
||||||
head = head.getNext();
|
|
||||||
if (this.isEmpty()) {
|
|
||||||
head = null;
|
|
||||||
tail = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Anfrage liefert das erste Objekt der Schlange.
|
|
||||||
* Die Schlange bleibt unveraendert.
|
|
||||||
* Falls die Schlange leer ist, wird null zurueckgegeben.
|
|
||||||
*
|
|
||||||
* @return das erste Objekt der Schlange vom Typ ContentType oder null,
|
|
||||||
* falls die Schlange leer ist
|
|
||||||
*/
|
|
||||||
public ContentType front() {
|
|
||||||
if (this.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return head.getContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
import schule.ngb.zm.Color;
|
|
||||||
import schule.ngb.zm.Zeichenmaschine;
|
|
||||||
import schule.ngb.zm.charts.*;
|
|
||||||
|
|
||||||
public class Wahlkampf extends Zeichenmaschine {
|
|
||||||
|
|
||||||
public static void main( String[] args ) {
|
|
||||||
new Wahlkampf();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Wahlkampf() {
|
|
||||||
super(800, 800, "Landtagswahl 2022 in Bielefeld");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void draw() {
|
|
||||||
background.setColor(240);
|
|
||||||
|
|
||||||
DatabaseConnector dbc = new DatabaseConnector("", 0, "wahlergebnisse.db", "", "");
|
|
||||||
QueryResult res;
|
|
||||||
|
|
||||||
String[] parteien = new String[]{"CDU", "SPD", "FDP", "AfD", "GRÜNE", "DIELINKE", "PIRATEN"};
|
|
||||||
Color[] farben = new Color[]{BLACK, RED, YELLOW, BLUE, GREEN, MAGENTA, ORANGE};
|
|
||||||
|
|
||||||
// Erststimmen im Bezirk
|
|
||||||
StringBuilder sb = new StringBuilder("SELECT ");
|
|
||||||
for( int i = 0; i < parteien.length; i++ ) {
|
|
||||||
sb.append("SUM(");
|
|
||||||
sb.append('"');
|
|
||||||
sb.append('D');
|
|
||||||
sb.append(i+1);
|
|
||||||
sb.append('-');
|
|
||||||
sb.append(parteien[i]);
|
|
||||||
sb.append("Erstimmen");
|
|
||||||
sb.append('"');
|
|
||||||
sb.append(')');
|
|
||||||
if( i < parteien.length-1 ) {
|
|
||||||
sb.append(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sb.append(" FROM \"2022_Landtagswahl\"");
|
|
||||||
|
|
||||||
dbc.executeStatement(sb.toString());
|
|
||||||
res = dbc.getCurrentQueryResult();
|
|
||||||
if( res != null ) {
|
|
||||||
String[] data = res.getData()[0];
|
|
||||||
|
|
||||||
double[] values = new double[parteien.length];
|
|
||||||
for( int i = 0; i < data.length; i++ ) {
|
|
||||||
values[i] = Double.parseDouble(data[i]);
|
|
||||||
}
|
|
||||||
RingChart chart1 = new RingChart(200, 200, 100, parteien.length);
|
|
||||||
RingChart chart2 = new RingChart(600, 200, 100, parteien.length);
|
|
||||||
RingChart chart3 = new RingChart(200, 600, 100, parteien.length);
|
|
||||||
RingChart chart4 = new RingChart(600, 600, 100, parteien.length);
|
|
||||||
|
|
||||||
double s = sum(values);
|
|
||||||
for( int i = 0; i < values.length; i++ ) {
|
|
||||||
double value = values[i];
|
|
||||||
chart1.setValue(i, value, s, parteien[i], farben[i]);
|
|
||||||
chart2.setValue(i, value, s, parteien[i], farben[i]);
|
|
||||||
chart3.setValue(i, value, s, parteien[i], farben[i]);
|
|
||||||
chart4.setValue(i, value, s, parteien[i], farben[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
chart4.setStrokeColor(200);
|
|
||||||
|
|
||||||
shapes.add(chart1, chart2, chart3, chart4);
|
|
||||||
} else {
|
|
||||||
System.err.println(dbc.getErrorMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
#BlueJ package file
|
|
||||||
dependency1.from=Attractor
|
|
||||||
dependency1.to=Gravity
|
|
||||||
dependency1.type=UsesDependency
|
|
||||||
dependency2.from=Gravity
|
|
||||||
dependency2.to=Mover
|
|
||||||
dependency2.type=UsesDependency
|
|
||||||
dependency3.from=Gravity
|
|
||||||
dependency3.to=Attractor
|
|
||||||
dependency3.type=UsesDependency
|
|
||||||
editor.fx.0.height=728
|
|
||||||
editor.fx.0.width=1037
|
|
||||||
editor.fx.0.x=95
|
|
||||||
editor.fx.0.y=53
|
|
||||||
objectbench.height=94
|
|
||||||
objectbench.width=776
|
|
||||||
package.divider.horizontal=0.6
|
|
||||||
package.divider.vertical=0.8305369127516778
|
|
||||||
package.editor.height=488
|
|
||||||
package.editor.width=661
|
|
||||||
package.editor.x=374
|
|
||||||
package.editor.y=158
|
|
||||||
package.frame.height=660
|
|
||||||
package.frame.width=800
|
|
||||||
package.numDependencies=3
|
|
||||||
package.numTargets=3
|
|
||||||
package.showExtends=true
|
|
||||||
package.showUses=true
|
|
||||||
project.charset=UTF-8
|
|
||||||
readme.height=60
|
|
||||||
readme.name=@README
|
|
||||||
readme.width=48
|
|
||||||
readme.x=10
|
|
||||||
readme.y=10
|
|
||||||
target1.height=70
|
|
||||||
target1.name=Mover
|
|
||||||
target1.showInterface=false
|
|
||||||
target1.type=ClassTarget
|
|
||||||
target1.width=120
|
|
||||||
target1.x=380
|
|
||||||
target1.y=220
|
|
||||||
target2.height=70
|
|
||||||
target2.name=Attractor
|
|
||||||
target2.showInterface=false
|
|
||||||
target2.type=ClassTarget
|
|
||||||
target2.width=120
|
|
||||||
target2.x=380
|
|
||||||
target2.y=350
|
|
||||||
target3.height=70
|
|
||||||
target3.name=Gravity
|
|
||||||
target3.showInterface=false
|
|
||||||
target3.type=ClassTarget
|
|
||||||
target3.width=120
|
|
||||||
target3.x=120
|
|
||||||
target3.y=120
|
|
||||||
Binary file not shown.
Reference in New Issue
Block a user