Sonntag, 24. September 2017
2. Aufgabe 4BHIF
Abgabetermin - 10.10.2017 - Abgabe auf edvossh
Schreiben Sie einen Stack-basierten Rechner für einen Ausdruck in umgekehrter polnischer Notation (RPN), der auch die Änderungen im Stack zeigt.
Nehmen Sie zunächst an, dass nur korrekte, durch Leerzeichen (Tabs oder Zeilenumbrüche, also White Space) getrennte, Strings von Token eines RPN-Ausdrucks übergeben werden.
Testen Sie mit dem folgenden RPN-Ausdruck:
3 4 2 * 1 5 - 2 3 ^ ^ / +Obiger Ausdruck in Infix-Notation sieht folgendermaßen aus:
3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3oder, weil
^ vor den anderen Operationen ausgewertet werden muss:
3 + 4 * 2 / ( ( 1 - 5 ) ^ 2 ^ 3 )Die Ausgabe soll so aussehen:
3 4 2 * 1 5 - 2 3 ^ ^ / + Input Operation Stack after 3 Push [3.0] 4 Push [4.0, 3.0] 2 Push [2.0, 4.0, 3.0] * Operate [8.0, 3.0] 1 Push [1.0, 8.0, 3.0] 5 Push [5.0, 1.0, 8.0, 3.0] - Operate [-4.0, 8.0, 3.0] 2 Push [2.0, -4.0, 8.0, 3.0] 3 Push [3.0, 2.0, -4.0, 8.0, 3.0] ^ Operate [8.0, -4.0, 8.0, 3.0] ^ Operate [65536.0, 8.0, 3.0] / Operate [1.220703125E-4, 3.0] + Operate [3.0001220703125] Final answer: 3.0001220703125Hinweise:
- ^
- bedeutet Exponent im obigen Ausdruck.
- ⁄
- bedeutet Division.
Testen Sie den Rechner auch mit anderen Ausdrücken!
Entwurf:
Entwerfen Sie das Programm so, dass die Auswertung auch ohne die textuelle Ausgabe des Stacks erfolgt kann.
Weiters sollen auch
double-Zahlen (zB -314.15927E-2) verwendet werden können.
Was passiert bei ungültigen Ausdrücken?
Erweiterung:
Wie müssten die Klassen geändert/erweitert werden, sodass man den Rechner mit so einem GUI verwenden kann?
Der Rechner sollte etwa so funktionieren, wie dieser Online-Rechner.
Bei dieser Version brauchen Sie kein GUI entwickeln, Sie sollen nur die Klassen so gestalten, dass es dann leicht ist, ein GUI dazu zu programmieren.
Labels: 4BHIF, Aufgabe, C#, POS1-4
Dienstag, 12. September 2017
1. Aufgabe 4BHIF
Abgabetermin - 26.9.2017 - Abgabe auf edvossh
Verwenden Sie eine Projektmappe und teilen Sie die Aufgaben in Projekte oder machen Sie ein einziges Projekt, bei dem man aber irgendwie auswählen kann, welche Teilaufgabe gestartet wird.
Sie haben nun schon zwei Jahre Java und ein Jahr Python programmiert. Nun geht es darum das bereits erworbene Können möglichst schnell auf die Sprache C# zu übertragen. Dazu sind kurze einfache Aufgabenstellungen gut geeignet. Es folgt nun eine Liste von Aufgabenstellungen für Konsolenprogramme. Sie dürfen Ihre Progrämmchen auch mit einer GUI versehen, gefordert ist das jedoch nicht.
- Hello World
Richten Sie Ihr Visual Studio so ein, dass alle Ihre Dateien automatisch einen Header mit Ihrem Namen, Klasse usw. enthalten.
Erstellen Sie dann ein "Hello World"-Programm. Dieses Programm soll "Hello World!" ausgeben, wenn keine Kommandozeilenparameter angegeben wurden, anderenfalls sollen die Parameter als Namen interpretiert werden, die dann gegrüßt werden. Dabei sollen immer zwei Namen paarweise ausgegeben werden (siehe Beispiel).
Aufrufhello.exe Toni Barbara Klaus
AusgabeHello Toni und Barbara! Hello Klaus!
- ISBN/EAN
Schreiben Sie eine Methode, welche die Prüfziffern von ISBN (Internationale Standardbuchnummer) bzw. EAN (European Article Number) prüfen kann. Dabei wird die Prüfziffer (als String) eingegeben, von welcher die Prüfziffer als Rückgabewert ausgegeben wird.int GetCheckDigit(string isbnWithoutCheckDigit);
Daraus leitet sich eine zweite Methode ab, welche einen String inklusive Prüfziffer prüft:bool CheckISBN(string isbn);
Diese Methode entfernt alle Trennzeichen (Leerzeichen, Bindestriche).
Algorithmus:s = z1 + z2 * 2 + z3 * 3 + ... + z9 * 9p = s mod 11- Falls p gleich 10, dann ist die Prüfziffer "X" sonst die Ziffer selbst.
- Römische Zahlen
Schreiben Sie Methoden zum Umrechnen von ganzen Zahlen (1 bis 3000) in Römische Zahlen und umgekehrt. Die römischen Ziffern haben folgende Bedeutung:I ... 1 V ... 5 X ... 10 L ... 50 C ... 100 D ... 500 M ... 1000
Beachten Sie, dass nur jeweils drei gleiche Ziffern hintereinander geschrieben werden. Stattdessen wird die nächst größere Einheit benutzt und eine Einheit abgezogen (XC = 90, XCIX = 99, IX = 9, VIII = 8).
Die Prototypen sollen sein:string IntToRoman(int number); int RomanToInt(string romanNumber);
- Unit Tests
Erstellen Sie für die obigen beiden Aufgaben Unit-Tests. Lesen Sie dazu Verifying Code by Using Unit Tests. - Wörter suchen
Laden Sie sich die gepackte Wortliste herunter. Die Datei enthält nur eine Textdateideutsch.txt, welche eine sortierte Liste von Wörtern, jeweils ein Wort in einer Zeile enthält (stammt von Firefox). Achtung: der Zeilenumbruch besteht nur aus'\n'(Unix) und die Kodierung ist UTF-8.
Schreiben Sie eine MethodeGetWordList(string word), welche eine Liste von Worten liefert, die mit dem Stringwordbeginnen.
Implementieren Sie sowohl lineare als auch binäre Suche und vergleichen Sie diese.
Verwenden Sie unterschiedliche Datenstrukturen (die zwei Typen von C#-Arrays und Collections) und vergleichen Sie die Lösungen punkto Laufzeit und Speicherbedarf.
Schreiben Sie eine weitere MethodeGetWordListEnding(string ending), welche eine Liste von Worten liefert, die mitendingendet. Ist hier binäre Suche möglich? - Unit Tests
Erstellen sie für die obige Aufgabe passende Unit Tests. - Laufzeitmessungen
Schreiben Sie ein Programmruntime, welches die Laufzeiten der unterschiedlichen Implementierungen vonGetWordList(string word)undGetWordListEnding(string ending)ermittelt. Verwenden Sie die Wortanfänge "Distanz", "Erdbi" und "Finanzind" und die Endungen "gulierung", "dcomputer" und "chsdor".
Das Programm soll bei jedem Test folgende Informationen ausgeben:
Anzahl der gefundenen Worte und die Laufzeit.
Bilden Sie die Mittelwerte für die einzelnen Methoden (binäre/sequentielle Suche) bzw. die Implementierungen mit Arrays oder Collections.
Wie sind die Ergebnisse zu interpretieren? - 25 im Quadrat
Auf zwölf quadratischen Kärtchen sind die Zahlen 1 bis 12 gedruckt. Diese Kärtchen sollen so in einem Quadrat angeordnet werden, sodass ein 2x2-Quadrat in der Mitte frei bleibt (die Kantenlänge beträgt insgesamt also 4).
- Ermitteln Sie eine Anordnung der Karten, sodass die Summe aller Karten einer Kante (4 Karten) jeweils den Wert 25 ergibt.
- Ermitteln Sie die Anzahl der Lösungen.
- Ermitteln Sie alle Lösungen (es sind sehr viele!).
Labels: 4BHIF, Aufgabe, C#, POS1-4
Donnerstag, 13. Februar 2014
OpenCV mit C# (POS1: 4BHIF)
Installieren Sie OpenCV für C# nach der Anleitung in dem Tutorial OpenCV tutorial 5: Emgu CV with C#.
Tatsächlich wird in diesem Tutorial Emgu CV installiert, ein .Net-Wrapper für diese Bibliothek.
Im Tutorial wird gezeigt, wie Visual Studio für die Verwendung von OpenCV eingerichtet werden muss. Als Beispielanwendung wird eine "Ball-Erkennung" programmiert.
Probleme gibt es eventuell mit der Kamera bzw. eigentlich mit dem Treiber der Kamera. Im Installationsverzeichnis von Emgu CV gibt es aber weitere Beispiele, bei denen die Kamera auch funktioniert.
Aufgabe:
- Bringen Sie eine Gesichtserkennung mit OpenCV unter C# zum Laufen.
- Finden Sie heraus, wie so eine Gesichtserkennung funktioniert.
Labels: algorithmen, C#, POS1-4
Mittwoch, 4. Dezember 2013
Java Console mit eclipse
Java bietet seit Version 1.6 eine einfachere Methode (als java.io.BufferedReader) von der Konsole zu lesen: java.io.Console. Leider kann Console nicht innerhalb von eclipse verwendet werden, da sich diese Entwicklungsumgebung direkt mit der Ein- und Ausgabe verbindet.
Es gibt eine - etwas umständliche - Lösung dieses Problems, die hier auf stackoverflow.com beschrieben wird.
Hier eine für eclipse unter Linux adaptierte Variante. Nehmen wir an, die folgende Klasse, soll mit dem Debugger getestet werden:
import java.io.Console;
public class TestDebugging {
public static void main(String[] args) {
Console console = System.console();
if (console != null) {
String line = console.readLine(">>> ");
System.out.println(line);
} else {
System.err.println("sorry, no console available!");
}
}
}
Startet man diese Klasse in eclipse (egal ob "Run" oder "Debug"), dann wird immer "sorry, no console available!" angezeigt. Startet man die Klasse in einem Terminal, so funktioniert sie problemlos:
hp@if211l $ java TestDebugging >>> test test hp@if211l $
Das Prinzip
Man muss das Java-Programm in einem Terminal starten und sich mit eclipse "remote" verbinden. Dazu verwendet man für den Start der Klasse folgenden Aufruf:
hp@if211l $ java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y TestDebugging Listening for transport dt_socket at address: 8787
suspend=y) nun darauf, dass man sich mit dem Debugger über Port 8787 (address=8787) hin verbindet. Im eclipse ruft man dann bei geöffnetem Sourcecode der Klasse "Run>Debug Configurations" auf und legt eine neue "Remote Java Application" an.
Nachdem man (sinnvollerweise) einen Breakpoint gesetzt hat, kann man diese Debug-Konfiguration aufrufen und die Klasse debuggen. Die Ein- und Ausgabe erfolgt dann im Terminal:
Umsetzung
Um die Sache etwas komfortabler zu machen, sollte man folgendes Shell-Script erstellen:
#!/bin/bash
# launch java for external debugging
export D_PORT=8787
export D_DBG="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,\
address=${D_PORT},server=y,suspend=y"
x-terminal-emulator -x java ${D_DBG} -cp ./bin/ $1 &
Dieses Script kann nun unter "Run>External Tools Configuration" eingerichtet werden:
Das Script startet ein Terminal-Fenster (x-terminal-emulator -x) mit dem entsprechenden Java-Aufruf (java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y).
Debugging funktioniert wie oben beschrieben, indem man "Remote Java Application" verwendet.
Labels: eclipse, Java, POS1-2, POS1-3, POS1-4
Donnerstag, 24. Oktober 2013
C# Threads (POS1: 4BHIF)
Abgabename: 2013_4bhif_aufgabe3_name_vorname.zip
Im folgenden Code werden Primzahlen berechnet. Ihre Aufgabe ist es aus diesem Code eine Multithreaded Version zu entwickeln. Die Anzahl der Threads und der Höchstwert der Primzahlen soll über Befehlszeilenargumente einstellbar sein. Testen Sie das Programm mit verschiedenen Höchstwerten und Threadanzahlen. (Zumindestens einmal mit einer Anzahl die den Prozessoren des Systems entsprechen) Erzeugen Sie mit den Ergebnissen eine Tabelle die die Zeiten gegen die der Single-Thread-Version vergleicht. (manuell z.B. in Excel oder auch im Programm)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Diagnostics;
namespace Primzahlen
{
class Program
{
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
int maxPrim = 0;
int number = 0;
int tests = 0;
watch.Start();
Prim(1600000, out maxPrim, out number, out tests);
watch.Stop();
Console.WriteLine("Es wurden {0} Primzahlen gefunden", number);
Console.WriteLine("Die höchste gefundene Primzahl ist {0}", maxPrim);
Console.WriteLine("Die Laufzeit betrug {0:F0} Millisekungen",
watch.ElapsedMilliseconds);
Console.WriteLine("Es wurden {0} Vergleiche durchgeführt", tests);
}
private static void Prim(int max, out int maxPrim, out int number, out int tests)
{
List<int> prims = new List<int>();
int i = 5;
tests = 0;
prims.Add(2);
prims.Add(3);
while (i < max)
{
int maxTeiler = (int)Math.Sqrt(i) + 1;
int j = 0;
while (true)
{
int n = prims[j];
int rest = (i % n);
++tests;
if (rest == 0)
break; //keine Primzahl
if(n >= maxTeiler)
{
prims.Add(i);
break;
}
++j;
}
i += 2;
}
number = prims.Count;
maxPrim = prims[number - 1];
}
}
}
Beispieltabelle für Ausgabe:
max Primzahl nr. Primzahlen ein Thread zwei Threads vier Threads 100000 9592 44ms 60ms 80ms 200000 17984 95ms 98ms 104ms 400000 33860 223ms 227ms 230ms ... 51200000 3068712 106000ms 61300ms 32940ms
Dienstag, 8. Oktober 2013
C# programmieren (POS1: 4BHIF)
Abgabename: 2013_4bhif_aufgabe2_name_vorname.zip
Verwenden Sie eine Projektmappe und teilen Sie die Aufgaben in Projekte oder machen Sie ein einziges Projekt, bei dem man aber irgendwie auswählen kann, welche Teilaufgabe gestartet wird.
Sie haben nun schon zwei Jahre Java und ein Jahr Python programmiert. Nun geht es darum das bereits erworbene Können möglichst schnell auf die Sprache C# zu übertragen. Dazu sind kurze einfache Aufgabenstellungen gut geeignet. Es folgt nun eine Liste von Aufgabenstellungen für Konsolenprogramme. Sie dürfen Ihre Progrämmchen auch mit einer GUI versehen, gefordert ist das jedoch nicht.
- Hello World
Richten Sie Ihr Visual Studio so ein, dass alle Ihre Dateien automatisch einen Header mit Ihrem Namen, Klasse usw. enthalten.
Erstellen Sie dann ein "Hello World"-Programm. Dieses Programm soll "Hello World!" ausgeben, wenn keine Kommandozeilenparameter angegeben wurden, anderenfalls sollen die Parameter als Namen interpretiert werden, die dann gegrüßt werden. Dabei sollen immer zwei Namen paarweise ausgegeben werden (siehe Beispiel).
Aufrufhello.exe Toni Barbara Klaus
AusgabeHello Toni und Barbara! Hello Klaus!
- ISBN/EAN
Schreiben Sie eine Methode, welche die Prüfziffern von ISBN (Internationale Standardbuchnummer) bzw. EAN (European Article Number) prüfen kann. Dabei wird die Prüfziffer (als String) eingegeben, von welcher die Prüfziffer als Rückgabewert ausgegeben wird.int GetCheckDigit(string isbnWithoutCheckDigit);
Daraus leitet sich eine zweite Methode ab, welche einen String inklusive Prüfziffer prüft:bool CheckISBN(string isbn);
Diese Methode entfernt alle Trennzeichen (Leerzeichen, Bindestriche).
Algorithmus:s = z1 + z2 * 2 + z3 * 3 + ... + z9 * 9p = s mod 11- Falls p gleich 10, dann ist die Prüfziffer "X" sonst die Ziffer selbst.
- Römische Zahlen
Schreiben Sie Methoden zum Umrechnen von ganzen Zahlen (1 bis 3000) in Römische Zahlen und umgekehrt. Die römischen Ziffern haben folgende Bedeutung:I ... 1 V ... 5 X ... 10 L ... 50 C ... 100 D ... 500 M ... 1000
Beachten Sie, dass nur jeweils drei gleiche Ziffern hintereinander geschrieben werden. Stattdessen wird die nächst größere Einheit benutzt und eine Einheit abgezogen (XC = 90, XCIX = 99, IX = 9, VIII = 8).
Die Prototypen sollen sein:string IntToRoman(int number); int RomanToInt(string romanNumber);
- Unit Tests
Erstellen Sie für die obigen beiden Aufgaben Unit-Tests. Lesen Sie dazu Verifying Code by Using Unit Tests. - Wörter suchen
Laden Sie sich die gepackte Wortliste herunter. Die Datei enthält nur eine Textdateideutsch.txt, welche eine sortierte Liste von Wörtern, jeweils ein Wort in einer Zeile enthält (stammt von Firefox). Achtung: der Zeilenumbruch besteht nur aus'\n'(Unix) und die Kodierung ist UTF-8.
Schreiben Sie eine MethodeGetWordList(string word), welche eine Liste von Worten liefert, die mit dem Stringwordbeginnen.
Implementieren Sie sowohl lineare als auch binäre Suche und vergleichen Sie diese.
Verwenden Sie unterschiedliche Datenstrukturen (die zwei Typen von C#-Arrays und Collections) und vergleichen Sie die Lösungen punkto Laufzeit und Speicherbedarf.
Schreiben Sie eine weitere MethodeGetWordListEnding(string ending), welche eine Liste von Worten liefert, die mitendingendet. Ist hier binäre Suche möglich? - Unit Tests
Erstellen sie für die obige Aufgabe passende Unit Tests. - Laufzeitmessungen
Schreiben Sie ein Programmruntime, welches die Laufzeiten der unterschiedlichen Implementierungen vonGetWordList(string word)undGetWordListEnding(string ending)ermittelt. Verwenden Sie die Wortanfänge "Distanz", "Erdbi" und "Finanzind" und die Endungen "gulierung", "dcomputer" und "chsdor".
Das Programm soll bei jedem Test folgende Informationen ausgeben:
Anzahl der gefundenen Worte und die Laufzeit.
Bilden Sie die Mittelwerte für die einzelnen Methoden (binäre/sequentielle Suche) bzw. die Implementierungen mit Arrays oder Collections.
Wie sind die Ergebnisse zu interpretieren? - 25 im Quadrat
Auf zwölf quadratischen Kärtchen sind die Zahlen 1 bis 12 gedruckt. Diese Kärtchen sollen so in einem Quadrat angeordnet werden, sodass ein 4x4-Quadrat in der Mitte frei bleibt (die Kantenlänge beträgt also 4).
- Ermitteln Sie eine Anordnung der Karten, sodass die Summe aller Karten einer Kante (4 Karten) jeweils den Wert 25 ergibt.
- Ermitteln Sie die Anzahl der Lösungen.
- Ermitteln Sie alle Lösungen (es sind sehr viele!).
Mittwoch, 11. September 2013
Android Sudoku (POS1: 4BHIF)
Programmieren Sie ein einfaches Sudoku, welches etwa wie folgt aussieht: Im einfachsten Fall soll eine fixe Anzahl von Sudokus angeboten werden. Im schwierigsten Fall sollen Sudokus generiert werden oder von einer Webseite geladen werden können.
Labels: android, Aufgabe, Java, POS1-4
Abonnieren Posts [Atom]
