Dienstag, 10. Oktober 2017

 

4. Aufgabe 4BHIF - C# Threads

Abgabename: 2017_4bhif_aufgabe4_name_vorname.zip
Abgabetermin - 14.11.2017 - Abgabe auf edvossh

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

Labels: , ,


Dienstag, 3. Oktober 2017

 

3. Aufgabe 4BHIF

Abgabename: 2017_4bhif_aufgabe3_name_vorname.zip
Abgabetermin - 24.10.2017 - Abgabe auf edvossh

Erstellen Sie für den RPN-Rechner der letzten Aufgabe ein GUI!

Erweitern Sie die Funktionalität so, dass die Anzeige (oberstes Stack-Element C) und alternativ der gesamte Stack (CLS) gelöscht werden kann. Weiters soll ein Drop (oberstes Element entfernen), ein Swap (die beiden obersten Elemente vertauschen), ein +/- (Vorzeichenwechsel), ein 1/X, die Quadratwurzel (Sqrt) und das Quadrat (X^2) implementiert werden.


Der Rechner sollte etwa so funktionieren, wie dieser Online-Rechner.

Zusätzliche Features sind möglich und erwünscht.

Labels: , , ,


Sonntag, 24. September 2017

 

2. Aufgabe 4BHIF

Abgabename: 2017_4bhif_aufgabe2_name_vorname.zip
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 ^ 3
oder, 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.0001220703125
Hinweise:
^
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: , , ,


Dienstag, 12. September 2017

 

Automatische Header in C# (Visual Studio)

Eine Einfache Möglichkeit einen Header in jede Source-Datei eines Projekts einzufügen, ist die Verwendung des Plugins License Header Manager. Dort findet sich auch ein Hinweis zur Verwendung.

Labels: , , ,


 

1. Aufgabe 4BHIF

Abgabename: 2017_4bhif_aufgabe1_name_vorname.zip
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.

  1. 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).
    Aufruf
    hello.exe Toni Barbara Klaus
    
    Ausgabe
    Hello Toni und Barbara!
    Hello Klaus!
    
  2. 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:
    1. s = z1 + z2 * 2 + z3 * 3 + ... + z9 * 9
    2. p = s mod 11
    3. Falls p gleich 10, dann ist die Prüfziffer "X" sonst die Ziffer selbst.
    Schreiben Sie analoge Methoden für EAN, ISBN-13 und EAN-13. Informationen zur Berechnung finden Sie im Internet ;-)
  3. 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);
    
  4. Unit Tests
    Erstellen Sie für die obigen beiden Aufgaben Unit-Tests. Lesen Sie dazu Verifying Code by Using Unit Tests.
  5. Wörter suchen
    Laden Sie sich die gepackte Wortliste herunter. Die Datei enthält nur eine Textdatei deutsch.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 Methode GetWordList(string word), welche eine Liste von Worten liefert, die mit dem String word beginnen.
    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 Methode GetWordListEnding(string ending), welche eine Liste von Worten liefert, die mit ending endet. Ist hier binäre Suche möglich?
  6. Unit Tests
    Erstellen sie für die obige Aufgabe passende Unit Tests.
  7. Laufzeitmessungen
    Schreiben Sie ein Programm runtime, welches die Laufzeiten der unterschiedlichen Implementierungen von GetWordList(string word) und GetWordListEnding(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?
  8. 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).
    1. Ermitteln Sie eine Anordnung der Karten, sodass die Summe aller Karten einer Kante (4 Karten) jeweils den Wert 25 ergibt.
    2. Ermitteln Sie die Anzahl der Lösungen.
    3. Ermitteln Sie alle Lösungen (es sind sehr viele!).
    Hinweis: es gibt 12! (~480.000.000) Möglichkeiten, die Kärtchen anzuordnen. Dennoch sollte es in wenigen Minuten möglich sein.


Labels: , , ,


Mittwoch, 12. November 2014

 

Mini-Vergleich von Programmiersprachen

Dieser Artikel vergleicht ein paar Programmiersprachen (die in der Abteilung Informatik der HTL Wiener Neustadt unterrichtet werden) und dient nur zur Demonstration der "Optik" dieser Sprachen.

Als Beispiel kommt "99 bottles of beer" zum Einsatz. Die Programme stammen von http://99-bottles-of-beer.net/ und dienen eigentlich nur als Beispiele, um die Code-Struktur kleinerer Programme zu sehen.

Python

Python unterstützt mehrere Programmierparadigmen. So werden objektorientierte, aspektorientierte und funktionale Programmierung unterstützt. Wie andere dynamische Sprachen wird Python oft als Skriptsprache genutzt.
"""
99 bottles of beer in Python
"""
for quant in range(99, 0, -1):
    if quant > 1:
        print(quant, "bottles of beer on the wall,", quant, "bottles of beer.")
        if quant > 2:
            suffix = str(quant - 1) + " bottles of beer on the wall."
        else:
            suffix = "1 bottle of beer on the wall."
    elif quant == 1:
        print("1 bottle of beer on the wall, 1 bottle of beer.")
        suffix = "no more beer on the wall!"
    print("Take one down, pass it around,", suffix)
    print("--")
Hier die Python Lösung zum Ausführen

Java

Java ist eine objektorientierte Programmiersprache und eine eingetragene Marke des Unternehmens Sun Microsystems (seit 2010 Oracle). Die Programmiersprache ist ein Bestandteil der Java-Technologie – diese besteht grundsätzlich aus dem Java-Entwicklungswerkzeug (JDK) zum Erstellen von Java-Programmen und der Java-Laufzeitumgebung (JRE) zu deren Ausführung. Die Laufzeitumgebung besteht selbst aus der virtuellen Maschine (JVM) sowie den mitgelieferten Bibliotheken der Java-Laufzeitumgebung.
/*
 * 99 bottles of beer in Java
 */
class bottles {
    public static void main(String args[]) {
        String s = "s";
        for (int beers=99; beers>-1;) {
            System.out.print(beers + " bottle" + s + " of beer on the wall, ");
            System.out.println(beers + " bottle" + s + " of beer, ");
            if (beers==0) {
                System.out.print("Go to the store, buy some more, ");
                System.out.println("99 bottles of beer on the wall.\n");
                System.exit(0);
            } else
                System.out.print("Take one down, pass it around, ");
            s = (--beers == 1)?"":"s";
            System.out.println(beers + " bottle" + s + " of beer on the wall.\n");
        }
    }
}

C

C ist eine imperative Programmiersprache, die der Informatiker Dennis Ritchie in den frühen 1970er Jahren an den Bell Laboratories für die Systemprogrammierung des Betriebssystems Unix entwickelte. Seitdem ist sie auf vielen Computersystemen verbreitet. Die Anwendungsbereiche von C sind sehr verschieden. Sie wird zur System- und Anwendungsprogrammierung eingesetzt. Die grundlegenden Programme aller Unix-Systeme und die Systemkerne vieler Betriebssysteme sind in C programmiert. Zahlreiche Sprachen, wie C++, Objective-C, C#, Java, PHP, Vala oder Perl orientieren sich an der Syntax und anderen Eigenschaften von C.
/* 
 * 99 bottles of beer in C
 */
#define MAXBEER (99)

void chug(int beers);

main()
{
    register beers;

    for(beers = MAXBEER; beers; chug(beers--))
        puts("");

    puts("\nTime to buy more beer!\n");

    exit(0);
}

void chug(register beers)
{
    char howmany[8], *s;

    s = beers != 1 ? "s" : "";
    printf("%d bottle%s of beer on the wall,\n", beers, s);
    printf("%d bottle%s of beeeeer . . . ,\n", beers, s);
    printf("Take one down, pass it around,\n");

    if(--beers) sprintf(howmany, "%d", beers); else strcpy(howmany, "No more");
    s = beers != 1 ? "s" : "";
    printf("%s bottle%s of beer on the wall.\n", howmany, s);
}

C++

C++ ist eine von der ISO genormte Programmiersprache. Sie wurde ab 1979 von Bjarne Stroustrup bei AT&T als Erweiterung der Programmiersprache C entwickelt. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau.

C++ unterstützt mehrere Programmierparadigmen:
/*
 * 99 bottles of beer in C++
 */
#include <iostream>
using namespace std;

int main()
{
    int bottles = 99;
    while ( bottles > 0 )
    {
        cout << bottles << " bottle(s) of beer on the wall," << endl;
        cout << bottles << " bottle(s) of beer." << endl;
        cout << "Take one down, pass it around," << endl;
        cout << --bottles << " bottle(s) of beer on the wall." << endl;
    }
    return 0;
}

C#

C# (lies englisch c sharp, englische Aussprache [ˌsiːˈʃɑːp]) ist eine vom Softwarehersteller Microsoft im Rahmen seiner .NET-Strategie entwickelte Programmiersprache. C# ist bei ECMA und ISO als Standard registriert.

C# unterstützt mehrere Programmierparadigmen:
/*
 * 99 bottles of beer in C#
 */
using System;
using System.Linq;
using System.Text;

namespace NinetyNineBottles
{
  class Beer
  {
    static void Main(string[] args)
    {
        StringBuilder beerLyric = new StringBuilder();
        string nl = System.Environment.NewLine;

        var beers =
            (from n in Enumerable.Range(0, 100)
             select new { 
               Say =  n == 0 ? "No more bottles" : 
                     (n == 1 ? "1 bottle" : n.ToString() + " bottles"),
               Next = n == 1 ? "no more bottles" : 
                     (n == 0 ? "99 bottles" : 
                     (n == 2 ? "1 bottle" : n.ToString() + " bottles")),
               Action = n == 0 ? "Go to the store and buy some more" : 
                                 "Take one down and pass it around"
             }).Reverse();

        foreach (var beer in beers)
        {
            beerLyric.AppendFormat("{0} of beer on the wall, {1} of beer.{2}",
                                    beer.Say, beer.Say.ToLower(), nl);
            beerLyric.AppendFormat("{0}, {1} of beer on the wall.{2}", 
                                    beer.Action, beer.Next, nl);
            beerLyric.AppendLine();
        }
        Console.WriteLine(beerLyric.ToString());
        Console.ReadLine();
    }
  }
}

Labels: , , , ,


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:

  1. Bringen Sie eine Gesichtserkennung mit OpenCV unter C# zum Laufen.
  2. Finden Sie heraus, wie so eine Gesichtserkennung funktioniert.

Labels: , ,


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

Labels: , ,


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.

  1. 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).
    Aufruf
    hello.exe Toni Barbara Klaus
    
    Ausgabe
    Hello Toni und Barbara!
    Hello Klaus!
    
  2. 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:
    1. s = z1 + z2 * 2 + z3 * 3 + ... + z9 * 9
    2. p = s mod 11
    3. Falls p gleich 10, dann ist die Prüfziffer "X" sonst die Ziffer selbst.
    Schreiben Sie analoge Methoden für EAN, ISBN-13 und EAN-13. Informationen zur Berechnung finden Sie im Internet ;-)
  3. 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);
    
  4. Unit Tests
    Erstellen Sie für die obigen beiden Aufgaben Unit-Tests. Lesen Sie dazu Verifying Code by Using Unit Tests.
  5. Wörter suchen
    Laden Sie sich die gepackte Wortliste herunter. Die Datei enthält nur eine Textdatei deutsch.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 Methode GetWordList(string word), welche eine Liste von Worten liefert, die mit dem String word beginnen.
    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 Methode GetWordListEnding(string ending), welche eine Liste von Worten liefert, die mit ending endet. Ist hier binäre Suche möglich?
  6. Unit Tests
    Erstellen sie für die obige Aufgabe passende Unit Tests.
  7. Laufzeitmessungen
    Schreiben Sie ein Programm runtime, welches die Laufzeiten der unterschiedlichen Implementierungen von GetWordList(string word) und GetWordListEnding(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?
  8. 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).
    1. Ermitteln Sie eine Anordnung der Karten, sodass die Summe aller Karten einer Kante (4 Karten) jeweils den Wert 25 ergibt.
    2. Ermitteln Sie die Anzahl der Lösungen.
    3. Ermitteln Sie alle Lösungen (es sind sehr viele!).
    Hinweis: es gibt 12! (~480.000.000) Möglichkeiten, die Kärtchen anzuordnen. Dennoch sollte es in wenigen Minuten möglich sein.

Labels: , ,


Montag, 24. September 2012

 

Mini-Vergleich verschiedener Programmiersprachen

Dieser Artikel vergleicht ein paar Programmiersprachen (die in der Abteilung Informatik der HTL Wiener Neustadt unterrichtet werden) und dient nur zur Demonstration der "Optik" dieser Sprachen.

Als Beispiel kommt "99 bottles of beer" zum Einsatz. Die Programme stammen von http://99-bottles-of-beer.net/ und dienen eigentlich nur als Beispiele, um die Code-Struktur kleinerer Programme zu sehen.

Python

Python unterstützt mehrere Programmierparadigmen. So werden objektorientierte, aspektorientierte und funktionale Programmierung unterstützt. Wie andere dynamische Sprachen wird Python oft als Skriptsprache genutzt.
"""
99 bottles of beer in Python
"""
for quant in range(99, 0, -1):
    if quant > 1:
        print(quant, "bottles of beer on the wall,", quant, "bottles of beer.")
        if quant > 2:
            suffix = str(quant - 1) + " bottles of beer on the wall."
        else:
            suffix = "1 bottle of beer on the wall."
    elif quant == 1:
        print("1 bottle of beer on the wall, 1 bottle of beer.")
        suffix = "no more beer on the wall!"
    print("Take one down, pass it around,", suffix)
    print("--")
Hier die Python Lösung zum Ausführen

Java

Java ist eine objektorientierte Programmiersprache und eine eingetragene Marke des Unternehmens Sun Microsystems (seit 2010 Oracle). Die Programmiersprache ist ein Bestandteil der Java-Technologie – diese besteht grundsätzlich aus dem Java-Entwicklungswerkzeug (JDK) zum Erstellen von Java-Programmen und der Java-Laufzeitumgebung (JRE) zu deren Ausführung. Die Laufzeitumgebung besteht selbst aus der virtuellen Maschine (JVM) sowie den mitgelieferten Bibliotheken der Java-Laufzeitumgebung.
/*
 * 99 bottles of beer in Java
 */
class bottles {
    public static void main(String args[]) {
        String s = "s";
        for (int beers=99; beers>-1;) {
            System.out.print(beers + " bottle" + s + " of beer on the wall, ");
            System.out.println(beers + " bottle" + s + " of beer, ");
            if (beers==0) {
                System.out.print("Go to the store, buy some more, ");
                System.out.println("99 bottles of beer on the wall.\n");
                System.exit(0);
            } else
                System.out.print("Take one down, pass it around, ");
            s = (--beers == 1)?"":"s";
            System.out.println(beers + " bottle" + s + " of beer on the wall.\n");
        }
    }
}

C

C ist eine imperative Programmiersprache, die der Informatiker Dennis Ritchie in den frühen 1970er Jahren an den Bell Laboratories für die Systemprogrammierung des Betriebssystems Unix entwickelte. Seitdem ist sie auf vielen Computersystemen verbreitet. Die Anwendungsbereiche von C sind sehr verschieden. Sie wird zur System- und Anwendungsprogrammierung eingesetzt. Die grundlegenden Programme aller Unix-Systeme und die Systemkerne vieler Betriebssysteme sind in C programmiert. Zahlreiche Sprachen, wie C++, Objective-C, C#, Java, PHP, Vala oder Perl orientieren sich an der Syntax und anderen Eigenschaften von C.
/* 
 * 99 bottles of beer in C
 */
#define MAXBEER (99)

void chug(int beers);

main()
{
    register beers;

    for(beers = MAXBEER; beers; chug(beers--))
        puts("");

    puts("\nTime to buy more beer!\n");

    exit(0);
}

void chug(register beers)
{
    char howmany[8], *s;

    s = beers != 1 ? "s" : "";
    printf("%d bottle%s of beer on the wall,\n", beers, s);
    printf("%d bottle%s of beeeeer . . . ,\n", beers, s);
    printf("Take one down, pass it around,\n");

    if(--beers) sprintf(howmany, "%d", beers); else strcpy(howmany, "No more");
    s = beers != 1 ? "s" : "";
    printf("%s bottle%s of beer on the wall.\n", howmany, s);
}

C++

C++ ist eine von der ISO genormte Programmiersprache. Sie wurde ab 1979 von Bjarne Stroustrup bei AT&T als Erweiterung der Programmiersprache C entwickelt. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau.

C++ unterstützt mehrere Programmierparadigmen:
/*
 * 99 bottles of beer in C++
 */
#include <iostream>
using namespace std;

int main()
{
    int bottles = 99;
    while ( bottles > 0 )
    {
        cout << bottles << " bottle(s) of beer on the wall," << endl;
        cout << bottles << " bottle(s) of beer." << endl;
        cout << "Take one down, pass it around," << endl;
        cout << --bottles << " bottle(s) of beer on the wall." << endl;
    }
    return 0;
}

C#

C# (lies englisch c sharp, englische Aussprache [ˌsiːˈʃɑːp]) ist eine vom Softwarehersteller Microsoft im Rahmen seiner .NET-Strategie entwickelte Programmiersprache. C# ist bei ECMA und ISO als Standard registriert.

C# unterstützt mehrere Programmierparadigmen:
/*
 * 99 bottles of beer in C#
 */
using System;
using System.Linq;
using System.Text;

namespace NinetyNineBottles
{
  class Beer
  {
    static void Main(string[] args)
    {
        StringBuilder beerLyric = new StringBuilder();
        string nl = System.Environment.NewLine;

        var beers =
            (from n in Enumerable.Range(0, 100)
             select new { 
               Say =  n == 0 ? "No more bottles" : 
                     (n == 1 ? "1 bottle" : n.ToString() + " bottles"),
               Next = n == 1 ? "no more bottles" : 
                     (n == 0 ? "99 bottles" : 
                     (n == 2 ? "1 bottle" : n.ToString() + " bottles")),
               Action = n == 0 ? "Go to the store and buy some more" : 
                                 "Take one down and pass it around"
             }).Reverse();

        foreach (var beer in beers)
        {
            beerLyric.AppendFormat("{0} of beer on the wall, {1} of beer.{2}",
                                    beer.Say, beer.Say.ToLower(), nl);
            beerLyric.AppendFormat("{0}, {1} of beer on the wall.{2}", 
                                    beer.Action, beer.Next, nl);
            beerLyric.AppendLine();
        }
        Console.WriteLine(beerLyric.ToString());
        Console.ReadLine();
    }
  }
}

Labels: , , , ,


Montag, 10. Januar 2011

 

TIOBE-Index: Python ist Programmiersprache 2010

Die Programmiersprache Python konnte unter den im TIOBE-Index gelisteten Sprachen im vergangenen Jahr den größten Zuwachs verzeichnen. Den zweitgrößten Zuwachs hatte Objective-C wegen iPhone- und iPad-Entwicklung. Objective-C galt daher lange Zeit als Kandidat für die Sprache des Jahres 2010.
Detaillierte Informationen gibt es hier und hier.

Labels: , , , , , , ,


Donnerstag, 11. November 2010

 

Code-Kata

Beim Karate (z.B. Karatedo Doshinkan) gibt es Kata (dt. "Form", siehe auch Kata auf Wikipedia), eine spezielle Übungsform, bei der man als Training gegen einen oder mehrere (vorgestellte) Gegner kämpft. Dabei ist der Bewegungsablauf aber stilisiert und fix vorgegeben. Das oftmalige Wiederholen der Bewegungsabläufe in Form von Kata ist unerlässlich für den persönlichen Fortschritt. Denn nur Übung macht den Meister.

Auch Programmieren beherrscht man nur durch ständiges Training. Nur durch Üben wird man auch hier zum Meister. Aber nicht nur durch den Kampf (Programmieren für das Geschäft) sondern auch durch Katas. Diese Idee für's Programmieren hat Dave Thomas von den Pragmatischen Programmieren (meines Wissens) erstmalig aufgegriffen und publiziert: Code Kata

Sehr empfehlenswert für alle, die Programmieren meistern wollen.

Die Idee der Code Kata fasziniert und berührt mich besonders, da ich selber jahrelang trainiert habe.

Labels: , , , , , , ,


Montag, 11. Januar 2010

 

Googles Go ist TIOBEs Programmiersprache des Jahres 2009

TIOBE erstellt monatlich einen TIOBE Programming Community Index, in dem die populärsten Programmiersprachen ermittelt werden. Die Reihung erfolgt aufgrund der Anzahl der qualifizierten Ingenieure weltweit, Kursen und Drittanbietern. Die Suchmaschinen Google, MSN, Yahoo und YouTube werden zur Berechnung der Reihung herangezogen. In dieser Reihung geht es nicht um die beste Programmiersprache und auch nicht und jene Sprache in der diemeisten Zeilen geschrieben wurden.

Googles Go wurde von TIOBE deshalb als "Programmiersprache des Jahres 2009" gewählt, weil die Verbreitung dieser Sprache im Jahr 2009 am meisten gestiegen ist, von 0% auf 1,25%. Die am häufigsten verwendete Sprache nach diesem Index ist nach wie vor Java.

Hier die TOP 20 (Jänner 2010):
Position
Jan 2010
Position
Jan 2009
Delta in PositionProgramming LanguageRatings
Jan 2010
Delta
Jan 2009
Status
11Java17.482%-1.54% A
22C16.215%+0.28% A
35PHP10.071%+1.19% A
43C++9.709%-0.41% A
54(Visual)
Basic
7.354%-1.81%
A
66C#5.767%+0.16% A
77Python4.453%-0.28%
A
88Perl3.562%-0.74% A
99JavaScript2.707%-0.65%
A
1011Ruby2.474%-0.67% A
1110Delphi2.392%-0.91%
A
1237Objective-C1.379%+1.24%
A
13-Go1.247%+1.25% A--
1414SAS0.809%+0.01% A
1513PL/SQL0.718%-0.29%
A
1618ABAP0.641%+0.10% A--
1715Pascal0.624%-0.04%
B
1823Lisp/Scheme0.576%+0.14%
B
1920ActionScript0.566%+0.11%
B
2024MATLAB0.540%+0.11% B


(Status A...Mainstream, siehe Erklärungen von TIOBE).

Ich habe die Tabelle aus TIOBE Programming Community Index kopiert, da über diesen Link nur die aktuellen Daten verfügbar sind.

Ranking über die Jahre:


Labels: , , , , , ,


This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]