Richtlinien für die Übungsabgabe

Damit es kein Chaos beim Zuschicken der einzelnen Übungen gibt, bitte ich Euch folgende Regeln zu beachten:

Der Betreff sollte unbedingt:

[C++] Übung XX

lauten, also achtet auf das Präfix [C++]. Auch bei generellen Fragen, die keine Übungsabgabe sind. So kann ich meinen Mailfilter anpassen.

Anstatt die einzelnen Header- und Quelldateien in die Mail reinzukopieren - das geht bei C++ noch ganz nett, sollte aber nicht zur Gewohnheit werden, denn später müsst ihr auch mal Pythonprogramme schreiben, und da ist einfaches Reinkopieren in Mails nicht wirklich empfehlenswert - bitte ich Euch einfach den Eclipse-Projektordner der jeweiligen Aufgabe in ein Archiv zu packen und mir das Archiv zuzuschicken! Das Format des Archivs könnt ihr Euch aussuchen, xz dürfte am besten komprimieren :)

Als Alternative zur Übungsabgabe per Mail (Facebook, WhatsApp etc. kann ich leider nicht anbieten) kann auch gerne das CIP GitLab verwendet werden, sofern ihr mich für das entsprechende Repository freischaltet oder auch gerne ein Repository auf GitHub. Studenten bekommen im Rahmen des Educationprogrammes von GitHub auch kostenlos private, also nicht öffentliche Repositories. Aber das ist wie gesagt nur eine Alternative und kein MUSS!

Formatierung

Sofern ihr mit Eclipse arbeitet, kann dort wunderbar die Quelltexteinrückung vorgenommen werden. Wenn ihr ohne Eclipse arbeitet, dann achtet bitte auf eine einheitliche Einrückung - das erleichtert nicht nur das Programmieren, sondern hilft auch bei der Fehlersuche! Wenn ihr nicht unnötig viel Zeit bei diesem schönen Wetter mit manuellen Einrückungen vergeuden wollt, dann nehmt dafür am besten clang-format her. Dazu muss der Alternativcompiler clang installiert sein. Beispielaufruf:

clang-format -style=llvm -i datei.cpp

Achtung: Mit der -i Option wird gleich in der Quelltextdatei "eingerückt" bzw. inplace editiert.

Hinweise

Hier finden sich Hinweise zu den den jeweiligen Übungen!

Übung 8

Für die Übung 8 habe ich Euch hier ein kleines Beispielprogramm geschrieben, welches die Längenermittlung von einem wchar_t Array zeigt und wie man dieses Array dann mit Leerzeichen initialisieren kann.

Übung 5

Hier noch ein kleines Beispiel zum richtigen Umgang zum Einfärben des Ein- und Ausgabestroms. Ergänzend dazu drei Einzeiler, wie man mit Hilfe der C++-Standardbibliothek Buchstaben, Leerzeichen und Zeilenumbrüche ermitteln lassen kann:

#include <iostream>
#include <algorithm>

bool is_newline(wchar_t &current_char) { return current_char == '\n'; }

int main()
{
  std::setlocale(LC_ALL, "");

  std::wstring text(L"\tDas ist ein Testsatz!\nNächster Satz\n");

  /* Mehr Informationen zur std::count_if() Methode unter:
   * http://www.cplusplus.com/reference/algorithm/count_if/
   */
  int count_whitespaces = std::count_if(text.begin(), text.end(), std::iswspace);
  int count_chars = std::count_if(text.begin(), text.end(), std::iswalpha);
  int count_control = std::count_if(text.begin(), text.end(), is_newline);

  std::wcout << "Eingabetext:\n" << sentence << std::endl;
  std::wcout << "Anzahl der Leerzeichen: " << count_whitespaces << std::endl;
  std::wcout << "Anzahl der Buchstaben: " << count_chars << std::endl;
  std::wcout << "Anzahl der Controlzeichen: " << count_control << std::endl;
  return 0;
}

Hinweis: Bei der Ausgabe dürfen std::cout und std::wcout niemals zusammen/gemischt verwendet werden! Möchtet ihr Umlaute ausgeben, so denkt bitte an die Literalkennzeichnung:

std::wstring text = L"Ein Text";
std::wstring text2 = L"Über den Text mit Umlauten";
std::wcout << L"Überausgabe mit Umlauten" << std::endl;

Übung 4

So überprüft man, ob die heruntergeladene Datei auch wirklich in iso-8859-1 ist:

file -i der_idiot_100.txt
#der_idiot_100.txt: text/plain; charset=iso-8859-1

Bevor überhaupt ein Einfärben des Dateistromes mit der imbue() Methode möglich ist, sollte überprüft werden, ob auf dem System überhaupt eine iso-8859-1 locale installiert ist - das funktioniert mittels:

locale -a | grep iso

Das sollte so etwas wie de_DE.iso88591 zurückliefern. Diese locale kann dann beim imbue() Einfärbevorgang verwendet werden. Wie kann dann eigentlich diese iso-8859-1 Datei auf einem (utf-8 fähigen) Terminal dargestellt werden, ohne diese "kaputten" Umlaute? Das geht mit:

cat der_idiot_100.txt | recode l1..u8

Für die Übung 4 gibt es noch ein kleines Beispielprogramm, welches den Beispieltext direkt von der Webseite herunterlädt. Dazu wird die curl Bibliothek verwendet. Desweiteren ist in dem Beispielprogramm eine mögliche Variante gezeigt, wie man einen iso-8859-1 Zeichenkette in eine UTF-8 Zeichenkette umwandelt - dazu wird die Bibliothek Boost verwendet. Wenn ihr Lust und Laune habt, dann könnt ihr Euch das Beispielprogramm hier anschauen! Das Ganze kann man folgendermaßen kompilieren:

g++ -std=c++11 -Ofast -Wall -Wextra -Weffc++ -Wpedantic uebung4.cpp -lcurl -lboost_locale

Alternativ auch gerne mit clang mittels:

clang++ -std=c++11 -Ofast -Wall -Wextra -Weffc++ -Wpedantic uebung4.cpp -lcurl -lboost_locale

Hinweis: curl (je nachdem, welche Linux-Distribution ihr verwendet muss von curl auch das Entwicklerpaket installiert sein. Auf openSUSE beispielsweise libcurl-devel) und Boost Locale müssen installiert sein. Einfache Möglichkeit um das zu Testen:

/sbin/ldconfig -p | grep boost_locale
/sbin/ldconfig -p | grep libcurl

Auf den Rechner im CIP-Pool sind alle Abhängigkeiten installiert, sodass ihr das Beispielprogramm ohne Probleme kompilieren könnt!

Historie

Über die Übungsseite

Die Übungskorrekturseite wird von mir, Stefan, im Rahmen der Höheren Programmierung in der Computerlinguistik mit C++ im Sommersemester 2015 gepflegt. Für Fragen und dem Zuschicken der Übungsaufgaben stehe ich unter stefan at schweter dot eu gerne zur Verfügung! Auch gerne verschlüsselt mit 0x871722d0292e9427.