6tes Aufgabenblatt

Es geht hier um Ausdrücke und Funktionen.

Präliminärien:

Wir verwenden das bisherige Programm (wie in den Präliminarien der letzten Aufgabe beschrieben) und erweitern es im Folgenden.

Rechenaufgabe R1:

Evaluieren Sie von Hand auf dem Papier folgende Ausdrücke und überprüfen Sie programmatisch das Ergebnis (z.B. in einer weiteren Prozedur):

  • 1+2*3
  • 2*(4-3) == 5/10 + 1
  • 1 == 2 || 3 == 10/3 && ! 1 == 10
  • --50 (Vorsicht: Fangfrage)

Machen Sie ein Foto Ihrer Auswertungen, die Sie von Hand gemacht haben!

Programmieraufgabe P2:

Schreiben Sie die folgenden drei Funktionen:

1) Schreiben Sie eine Funktion draw_circle(), die einen Kreis wie in der letzten Aufgabe mit einem bestimmten Durchmesser z zeichnet. Um das Ei zu entzerren benötigen Sie lediglich den Faktor 2 bei der Breite. Der Kreis soll auch an einer bestimmten Stelle (py, px) gezeichnet werden. Dies wird durch Positionsverschiebung erreicht (Addition des Verschiebevektors). Die ersten drei Parameter der Funktion sind also z, py und px. Ein weiterer Parameter gibt das Füllzeichen (char c) an, d.h. mit welchem Zeichen der Kreis gefüllt werden soll.

2) Schreiben Sie nach dem selben Schema eine Funktion draw_box(), die ein Quadrat zeichnet. Dies ist eine Abwandlung der obigen Funktion, wo die Breite jeder Zeile der Höhe entspricht. Ein Parameter gibt das Füllzeichen an, d.h. mit welchem Zeichen das Quadrat gefüllt werden soll.

3) Schreiben Sie nach dem selben Schema eine weitere Funktion draw_rect(), die einen rechteckigen Rahmen zeichnet (mit Höhe h und Breite w). Ein Parameter gibt das Füllzeichen an, d.h. mit welchem Zeichen der Rahmen gefüllt werden soll und ein weiterer Parameter gibt das Füllzeichen an, mit dem der innere Bereich des Rechtecks gefüllt werden soll.

Programmieraufgabe P3:

Zeichnen Sie damit eine schematisierte Dampflok mit zwei Rädern, einem Kessel, einem Schlot und einem Führerhaus. Das Führerhaus soll ein Fenster mit Rahmen besitzen.

     oochoo
   ch  _         ___   ___   ___
  _V__|o|  xxx  |###| |###| |# #|
 |____|_|.|___|.|_1_|.|_2_|.|_H_|
   O O     O O   O O   O O   O O
---------------------------------

Optional: Graphische Sonderzeichen

Verwenden Sie graphische Sonderzeichen, wie z.B. ACS_CKBOARD aus dem sog. Alternate Char Set, um Ihre Dampflok aufzuhübschen. Das Zeichen ACS_CKBOARD entspricht einem einzelnen grauen Quadrat.

Tipp: Hier ist ein Programm, mit dem Sie Sich gängige Sonderzeichen ausgeben lassen können.

#include <ncurses.h>
int main()
{
        initscr();
        attron(A_UNDERLINE);
        mvprintw(0,7,"NCURSES EXTENDED CHARACTERS\n");
        attroff(A_UNDERLINE);
        printw("Upper left corner         "); addch(ACS_ULCORNER); printw("  ACS_ULCORNER\n");
        printw("Lower left corner         "); addch(ACS_LLCORNER); printw("  ACS_LLCORNER\n");
        printw("Upper right corner        "); addch(ACS_URCORNER); printw("  ACS_URCORNER\n");
        printw("Lower right corner        "); addch(ACS_LRCORNER); printw("  ACS_LRCORNER\n");
        printw("Tee pointing right        "); addch(ACS_LTEE); printw("  ACS_LTEE\n");
        printw("Tee pointing left         "); addch(ACS_RTEE); printw("  ACS_RTEE\n");
        printw("Tee pointing up           "); addch(ACS_BTEE); printw("  ACS_BTEE\n");
        printw("Tee pointing down         "); addch(ACS_TTEE); printw("  ACS_TTEE\n");
        printw("Horizontal line           "); addch(ACS_HLINE); printw("  ACS_HLINE\n");
        printw("Vertical line             "); addch(ACS_VLINE); printw("  ACS_VLINE\n");
        printw("Large Plus or cross over  "); addch(ACS_PLUS); printw("  ACS_PLUS\n");
        printw("Scan Line 1               "); addch(ACS_S1); printw("  ACS_S1\n");
        printw("Scan Line 3               "); addch(ACS_S3); printw("  ACS_S3\n");
        printw("Scan Line 7               "); addch(ACS_S7); printw("  ACS_S7\n");
        printw("Scan Line 9               "); addch(ACS_S9); printw("  ACS_S9\n");
        printw("Diamond                   "); addch(ACS_DIAMOND); printw("  ACS_DIAMOND\n");
        printw("Checker board (stipple)   "); addch(ACS_CKBOARD); printw("  ACS_CKBOARD\n");
        printw("Degree Symbol             "); addch(ACS_DEGREE); printw("  ACS_DEGREE\n");
        printw("Plus/Minus Symbol         "); addch(ACS_PLMINUS); printw("  ACS_PLMINUS\n");
        printw("Bullet                    "); addch(ACS_BULLET); printw("  ACS_BULLET\n");
        printw("Arrow Pointing Left       "); addch(ACS_LARROW); printw("  ACS_LARROW\n");
        printw("Arrow Pointing Right      "); addch(ACS_RARROW); printw("  ACS_RARROW\n");
        printw("Arrow Pointing Down       "); addch(ACS_DARROW); printw("  ACS_DARROW\n");
        printw("Arrow Pointing Up         "); addch(ACS_UARROW); printw("  ACS_UARROW\n");
        printw("Board of squares          "); addch(ACS_BOARD); printw("  ACS_BOARD\n");
        printw("Lantern Symbol            "); addch(ACS_LANTERN); printw("  ACS_LANTERN\n");
        printw("Solid Square Block        "); addch(ACS_BLOCK); printw("  ACS_BLOCK\n");
        printw("Less/Equal sign           "); addch(ACS_LEQUAL); printw("  ACS_LEQUAL\n");
        printw("Greater/Equal sign        "); addch(ACS_GEQUAL); printw("  ACS_GEQUAL\n");
        printw("Pi                        "); addch(ACS_PI); printw("  ACS_PI\n");
        printw("Not equal                 "); addch(ACS_NEQUAL); printw("  ACS_NEQUAL\n");
        printw("UK pound sign             "); addch(ACS_STERLING); printw("  ACS_STERLING\n\n");
        refresh();
        getch();
        endwin();
        return(0);
}

Dies ist die Ausgabe des obigen Programms:

Programmieraufgabe P4:

Teilen Sie die Funktionen so auf, dass alle Funktionen, die Zeichencode enthalten, in einem separaten Modul zeichnen.cpp/.h zu liegen kommen.

Zeichnen Sie in main() drei Dampfloks mit jeweils drei Funktionsaufrufen!

Machen Sie einen Screenshot davon!

Optionale Programmieraufgabe P5:

Verwenden Sie einen Parameter zur Bestimmung der Größe der Dampflok und machen Sie die Zeichenbefehle davon abhängig. Es bietet sich hier eine Prozentangabe an.

Zeichnen Sie in main() drei unterschiedliche große Dampfloks!

Checkliste

  • Welchen Wert repräsentiert 'A'?
  • Was für einen Wert repräsentieren 0×1f und 01?
  • Wie heisst das Standardaufrufschema?
  • Was passiert hier beim Aufruf (Stichwort)?
  • Was ist der unterschied zwischen Argument und Parameter?
  • Nennen Sie einen binären Operator
  • Nennen Sie einen unären Operator
  • Was ist der Unterschied zwischen einem Operator und einem Operanden?
  • In welcher Reihenfolge wird bei gleicher Operatorpriorität ausgewertet?
  • Welcher Operator hat eine abweichende Auswertungsreihenfolge? Zu welchem Zweck?
  • Was ist der Unterschied zwischen einem L-Value und einem R-Value?
  • Wieviele Prototypen befinden sich bei Ihnen in zeichnen.h?
  • Wieviele Parameter hat die C-Funktion draw_box()?
  • Ist letzere C-Funktion eine Funktion oder Prozedur?


Options: