-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAufgabenblatt6.tex
134 lines (113 loc) · 7.37 KB
/
Aufgabenblatt6.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
\documentclass[paper=a4, fontsize=11pt, twoside]{scrartcl}
\usepackage{geometry} \geometry{a4paper, bottom=33mm}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage[osf,sc]{mathpazo}
\usepackage{courier}
\renewcommand{\sfdefault}{uop} % ---> URW Classico Optima Clone
\renewcommand{\rmdefault}{pplj} % ---> Mathpazo Palatino
\linespread{1.05}
\usepackage{amsmath,amsfonts,amsthm} % Math packages
\usepackage{booktabs}
\usepackage{url}
\usepackage{siunitx}
\sisetup{locale = DE}
\usepackage{titlesec}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{changepage}
\usepackage{caption}
\usepackage{enumitem}
\usepackage{minted}
\usepackage{fancyhdr}
\usepackage{multicol}
\usepackage{xspace}
\expandafter\def\expandafter\grqq\expandafter{\grqq\xspace}
% break \texttt{}
\newcommand*\justify{%
\fontdimen2\font=0.4em% interword space
\fontdimen3\font=0.2em% interword stretch
\fontdimen4\font=0.1em% interword shrink
\fontdimen7\font=0.1em% extra space
\hyphenchar\font=`\-% allowing hyphenation
}
\pagestyle{fancy} %eigener Seitenstil
\fancyhf{} %alle Kopf- und Fußzeilenfelder bereinigen
\fancyhead[OL]{Programmieren in C++ (Tutorium)} %Kopfzeile links
\fancyhead[OC]{} %zentrierte Kopfzeile
\fancyhead[OR]{Simon Fromme, Florian Rinke, Lars Franke} %Kopfzeile rechts
\renewcommand{\headrulewidth}{0.4pt} %obere Trennlinie
\fancyfoot[C]{\thepage} %Seitennummer
% DRAFT mode
% \usepackage{draftwatermark}
\setlength\parindent{0pt}
\title{Programmieraufgaben 6}
\author{Simon Fromme}
\date{\normalsize\today}
\begin{document}
\vspace*{0.75\baselineskip}
\begin{center}
\Large 6. Aufgabenblatt \\\vspace{0.5em} \large Programmieren in C++ (Tutorium)
\end{center}
\section*{Pointer}
\begin{enumerate}
%Adresse und Inhalt von Elementen
\item Legen Sie je eine Variable vom Typ \mintinline{c++}{int, char, float, string} an und weisen Sie diesen jeweils einen beliebigen Wert aus dem jeweils zulässigen Wertebereich zu. Lassen Sie nun jeweils einen Pointer auf die eben deklarierten Variablen zeigen. Welche Ausgabe erhalten Sie, wenn Sie die Pointer-Variable mit bzw. ohne den Stern (Dereferenzierungsoperator) ausgeben lassen?
\item
Betrachten Sie folgende Situation, in der insgesamt drei Pointer deklariert wurden.
\begin{minted}{c++}
char c = 'A';
const char * c_p1 = &c;
char * const c_p2 = &c;
const char * const c_p3 = &c;
\end{minted}
Versuchen Sie nun für jeden der Pointer \mintinline{c++}{c_p1, c_p2, c_p3} sowohl die Speicheradresse des Pointers, als auch den Wert, auf den der jeweilige Pointer zeigt, zu verändern. Was schließen Sie daraus hinsichtlich der Bedeutung des Schlüsselwortes \mintinline{c++}{const} in jedem der drei Fälle?
%RFC: Pointer-Arithmethik?
\item Pointer können nicht nur mit dem \mintinline{c++}{*}-Operator dereferenziert werden, sondern es sind auch weitere Operationen zulässig.
Deklarieren Sie je einen Pointer auf eine \mintinline{c++}{bool}- und eine \mintinline{c++}{short}-Variable und führen Sie nacheinander jeweils folgende Operationen aus:
\begin{itemize}
\item Inkrementieren des Pointers,
\item Addition von 5 auf den Pointer,
\item Dekrementieren des Pointers,
\item Substraktion von 4 von dem Pointer.
\end{itemize}
Lassen Sie ihr Programm den anfänglichen Wert und den Wert des Pointers nach jeder dieser Operationen ausgeben. Welchen Unteschied beobachten Sie hinsichtlich der verschiedenen Datentypen? Versuchen Sie vor einer Operation den Namen der resultierenden Speicheradresse vorherzusagen.
\end{enumerate}
\section*{Arrays}
\begin{enumerate}[resume]
%Initialisierung und Zugriff
\item Legen Sie ein Array \mintinline{c++}{int data[5];} an und lassen Sie sich den Inhalt der Elemente (ohne das Array zuvor zu befüllen) ausgeben. Testen und vergleichen Sie die Ausgabe im Debug- und Release-Modus. Vergleichen Sie Ihre Ergebnisse mit denen Ihrer Kommilitonen. Was stellen Sie fest?
\item Zur Erfassung von 1000 Messwerten (Fließkommazahlen) wird ein Datenspeicher benötigt. Legen Sie ein geeignetes Array an und stellen Sie sicher, dass es jedes Element den Wert 0 enthält. Wie können Sie dies am einfachsten erreichen?
%Adressierung per [] und *
\item Legen Sie ein \mintinline{c++}{int[]}-Feld mit einigen Werten an. Geben Sie den Inhalt des Feldes zwei Mal aus, wobei Sie auf verschiedene Arten auf die Elemente zugreifen: Als Array mit dem Indizierungs-Operator \mintinline{c++}{[]} und als Pointer mit dem Dereferenzierungsoperator \mintinline{c++}{*}
%Arrays als Parameter für Funktionen
\item Legen Sie ein \mintinline{c++}{int[]}-Feld mit einigen Werten an. Geben Sie den Inhalt und die Größe des Feldes \footnote{hierbei hilft der \mintinline{c++}{sizeof}-Operator} aus. Anschließend übergeben Sie das Array an eine Funktion \\\mintinline{c++}{checkArray(int[] data)} und lassen diese das gleiche machen. Welches Problem stellen Sie fest? Wie müssen die die Funktionsdeklaration erweitern um dieses Problem zu lösen?
\end{enumerate}
\section*{C-Strings}
\begin{enumerate}[resume]
%ToDo: Initialisierung und Elementweiser Zugriff
\item Auf Übungsblatt 3 (Aufgabe 5) wurde geprüft, ob ein Text ein Palindrom ist (also von vorne und hinten gelesen identisch ist). \\
Schreiben Sie erneut ein Programm, das für ein eingegebenes Wort überprüft, ob es sich um ein Palindrom handelt. Verwenden Sie diesmal statt strings aber \mintinline{c++}{char[]} zum Speichern der Zeichenkette. Um den Testablauf zu beschleunigen, kann ein geeigneter Text (z.B. \glqq Lagerregal\grqq) im Programmcode abgelegt werden, anstatt ihn jedesmal von der Tastatus einzulesen.
\item Um Texte zu vergleichen, wird in der Programmierung üblicherweise ein lexikalischer Vergleich angewendet. Implementieren Sie eine Funktion \\\mintinline{c++}{int compare(const char* a, const char* b}, die einen derartigen Vergleich durchführt. Das heißt, sie soll folgende Werte zurückgeben:
\begin{description}
\item[0] Beide Parameter sind exakt gleich (z.B. \mintinline{c++}{compare("abc", "abc")})
\item[-1] Der erste ungleiche Buchstabe in \mintinline{c++}{a} hat einen niedrigeren Wert als in \mintinline{c++}{b} (z.B. \mintinline{c++}{compare("aad", "abc")})
\item[1] Der erste ungleiche Buchstabe in \mintinline{c++}{a} hat einen höheren Wert als in \mintinline{c++}{b} (z.B. \mintinline{c++}{compare("acb", "abc")})
\end{description}
%kopieren
\item Um Texte case-insensitive (also ohne Berücksichtigung der Groß-/Kleinschreibung) zu vergleichen, ist es zweckmäßig alle Texte intern in Kleinschreibung umzuwandeln. Erstellen Sie eine Funktion \mintinline{c++}{void strToLower(const char* src, char* dest)}, die einen Text \mintinline{c++}{src} in Kleinschreibung\footnote{Zur Umwandlung einzelner Zeichen können Sie die Ascii-Werte verwenden, oder z.B. die Funktion \mintinline{c++}{char tolower (char c)} aus der locale-Bibliothek nutzen} nach \mintinline{c++}{dest} kopiert.\\
Zusatzfrage: warum ist es nicht so einfach möglich, die Kopie in der Funktion zu erstellen und per return zurückzugeben?
%RFC: Sicherheitsprobleme durch Längenverletzung?
\end{enumerate}
\end{document}
% neue Konzepte seit dem letzten Aufgabenblatt:
% - Pointer
% * Adresse und Inhalt (done)
% * const pointer und pointer auf const
% - Arrays
% * Adressierung als Array und per Pointer
% * Intialisierung (Liste, Anzahl)
% - C-Strings
% * Intialisierung (done)
% * Elementweiser Zugriff (done)
% * Kopieren