\documentclass[12pt,a4paper,ngerman]{scrartcl} \usepackage[ngerman]{babel} \usepackage{amsfonts,amssymb,amsmath,listings,color} \pagestyle{plain} \subject{\vspace{-3cm}The GAME} \title{Übungsaufgaben 3} \subtitle{Komplemente und Kontrollstrukturen - Lösung} \date{} \definecolor{pblue}{rgb}{0.13,0.13,1} \definecolor{pgreen}{rgb}{0,0.5,0} \definecolor{pred}{rgb}{0.9,0,0} \definecolor{pgrey}{rgb}{0.46,0.45,0.48} \lstset{language=Java, showspaces=false, showtabs=false, breaklines=true, showstringspaces=false, breakatwhitespace=true, commentstyle=\color{pgreen}, keywordstyle=\color{pblue}, stringstyle=\color{pred}, basicstyle=\ttfamily, tabsize=4, moredelim=[il][\textcolor{pgrey}]{$$}, moredelim=[is][\textcolor{pgrey}]{\%\%}{\%\%} } \begin{document} \maketitle \paragraph{Aufgabe 1}\mbox{}\\ Führe für folgende Binärzahlen die bitweise Negation durch: \begin{itemize} \item[a)] $0_2$ \item[b)] $0000_2$ \item[c)] $1111_2$ \item[d)] $1010_2$ \item[e)] $1100\ 0011\ 1001\ 1011\ 0111_2$ \end{itemize} \subparagraph{Lösung:} \begin{itemize} \item[a)] $\sim 0_2 = 1_2$ \item[b)] $\sim 0000_2 = 1111_2$ \item[c)] $\sim 1111_2 = 0000_2$ \item[d)] $\sim 1010_2 = 0101_2$ \item[e)] $\sim 1100\ 0011\ 1001\ 1011\ 0111_2 = 0011\ 1100\ 0110\ 0100\ 1000_2$ \end{itemize} \paragraph{Aufgabe 2}\mbox{}\\ Wie lautet das Einskomplement folgender Zahlen bei 8 Bit (Man gebe zudem die Dezimalzahlen der unten stehenden Binärzahlen und ihres Einskomplements an): \begin{itemize} \item[a)] $0000\ 0101_2$ \item[b)] $0000\ 1111_2$ \item[c)] $0010\ 0000_2$ \item[d)] $0111\ 1111_2$ \end{itemize} \subparagraph{Lösung:} \begin{itemize} \item[a)] $\sim 5_{10} = \sim 0000\ 0101_2 = 1111\ 1010_2 = -5_{10}$ \item[b)] $\sim 15_{10} = \sim 0000\ 1111_2 = 1111\ 0000_2 = -15_{10}$ \item[c)] $\sim 32_{10} = \sim 0010\ 0000_2 = 1101\ 1111_2 = -32_{10}$ \item[d)] $\sim 127_{10} = \sim 0111\ 1111_2 = 1000\ 0000_2 = -127_{10}$ \end{itemize} \paragraph{Aufgabe 3}\mbox{}\\ Man gebe die Dezimalzahl zu den unten stehenden Einskomplementen an (8 Bit): \begin{itemize} \item[a)] $1000\ 0101_2$ \item[b)] $1000\ 1111_2$ \item[c)] $1010\ 0000_2$ \item[d)] $1111\ 1111_2$ \end{itemize} \subparagraph{Lösung:} \begin{itemize} \item[a)] $1000\ 0101_2 = -122_{10}$ \item[b)] $1000\ 1111_2 = -112_{10}$ \item[c)] $1010\ 0000_2 = -95_{10}$ \item[d)] $1111\ 1111_2 = -0_{10}$ \end{itemize} \paragraph{Aufgabe 4}\mbox{}\\ Was stört bei der Einskomplement-Darstellung? \subparagraph{Lösung:} Für die $0$ gibt es eine doppelte Darstellung, nämlich $00 \dots 00_2 = +0_{10}$ und $11 \dots 11_2 = -0_{10}$. Außerdem ist der Wertebereich um eins verkleinert. \paragraph{Aufgabe 5}\mbox{}\\ Ermittelt zu folgenden Zahlen die Zweikomplement-Darstellung bei 8 Bit (Binärzahlen und Dezimalzahlen angeben). \begin{itemize} \item[a)] $5$ \item[b)] $15$ \item[c)] $32$ \item[d)] $127$ \end{itemize} \subparagraph{Lösung:} \begin{itemize} \item[a)] $5_{10} = 0000\ 0101_2\\ \Rightarrow \sim 0000\ 0101_2 + 1_2 = 1111\ 1010_2 + 1_2 = 1111\ 1011_2 = -5_{10}$ \item[b)] $15_{10} = 0000\ 1111_2\\ \Rightarrow \sim 0000\ 1111_2 + 1_2 = 1111\ 0000_2 + 1_2 = 1111\ 0001_2 = -15_{10}$ \item[c)] $32_{10} = 0010\ 0000_2\\ \Rightarrow \sim 0010\ 0000_2 + 1_2 = 1101\ 1111_2 + 1_2 = 1110\ 0000_2 = -32_{10}$ \item[d)] $127_{10} = 0111\ 1111_2\\ \Rightarrow \sim 0111\ 1111_2 + 1_2 = 1000\ 0000_2 + 1_2 = 1000\ 0001_2 = -127_{10}$ \end{itemize} \paragraph{Aufgabe 6}\mbox{}\\ Rechnet folgende Ausdrücke aus. Die Zahlen sind dabei alle in der Zweikomplement-Darstellung gegeben (8 Bit). \begin{itemize} \item[a)] $5 + (-21)$ \item[b)] $15 + (-5)$ \item[c)] $32 + 4$ \item[d)] $127 + -(127)$ \end{itemize} \subparagraph{Lösung:} \begin{itemize} \item[a)] $5_{10} = 0000\ 0101_2,\ -21_{10} = 1110\ 1011_2\\ \Rightarrow 0000\ 0101_2 + 1110\ 1011_2 = 1111\ 0000_2 = -16_{10}$ \item[b)] $15_{10} = 0000\ 1111_2,\ -5_{10} = 1111\ 1011_2\\ \Rightarrow 0000\ 1111_2 + 1111\ 1011_2 = 0000\ 1010_2 = 10_{10}$ \item[c)] $32_{10} = 0010\ 0000_2,\ 4_{10} = 0000\ 0100_2\\ \Rightarrow 0010\ 0000_2 + 0000\ 0100_2 = 0010\ 0100_2 = 36_{10}$ \item[d)] $127_{10} = 0111\ 1111_2,\ -127_{10} = 1000\ 0001_2\\ \Rightarrow 0111\ 1111_2 + 1000\ 0001_2 = 0000\ 0000_2 = 0_{10}$ \end{itemize} \paragraph{Aufgabe 7}\mbox{}\\ Rechnet folgende Ausdrücke aus. Die Zahlen sind dabei alle \emph{nicht} in der Zweikomplement-Darstellung gegeben, d.h. die Zahlen (die nach dem Minus) sind umzurechnen (8 Bit). \begin{itemize} \item[a)] $19 - 28$ \item[b)] $56 - 9$ \item[c)] $1 - 2$ \item[d)] $3 - 127$ \end{itemize} \subparagraph{Lösung:} \begin{itemize} \item[a)] $19_{10} = 0001\ 0011_2,\ 28_{10} = 0001\ 1100_2\\ \Rightarrow \sim 0001\ 1100_2 + 1_2 = 1110\ 0011_2 + 1_2 = 1110\ 0100_2 = -28_{10}\\ \Rightarrow 19_{10} + (-28_{10}) = 0001\ 0011_2 + 1110\ 0100_2 = 1111\ 0111 = -9_{10}$ \item[b)] $56_{10} = 0011\ 1000_2,\ 9_{10} = 0000\ 1001_2\\ \Rightarrow \sim 0000\ 1001_2 + 1_2 = 1111\ 0110_2 + 1_2 = 1111\ 0111_2 = -9_{10}\\ \Rightarrow 56_{10} + (-9_{10}) = 0011\ 1000_2 + 1111\ 0111_2 = 0010\ 1111_2 = 47_{10}$ \item[c)] $1_{10} = 0000\ 0001_2,\ 2_{10} = 0000\ 0010_2\\ \Rightarrow \sim 0000\ 0010_2 + 1_2 = 1111\ 1101_2 + 1_2 = 1111\ 1110_2 = -2_{10}\\ \Rightarrow 1_{10} + (-2_{10}) = 0000\ 0001_2 + 1111\ 1110_2 = 1111\ 1111_2 = -1_{10}$ \item[d)] $3_{10} = 0000\ 0011_2,\ 127_{10} = 01111\ 1111_2\\ \Rightarrow \sim 0111\ 1111_2 + 1_2 = 1000\ 0000_2 + 1_2 = 1000\ 0001_2 = -127_{10}\\ \Rightarrow 3_{10} + (-127_{10}) = 0000\ 0011_2 + 1000\ 0001_2 = 1000\ 0100_2 = -124_{10}$ \end{itemize} \newpage \paragraph{Aufgabe 8}\mbox{}\\ Schreibe ein einfaches Java-Programm, welches einem Monat vom Benutzer einliest (mithilfe des „java.util.Scanner“). Verwende dafür die Zahlen 1 bis 12 (1 = Januar, 2 = Februar, ..., 12 = Dezember). Für jeden Monat soll nun die Anzahl der Tage ausgegeben werden. Nutze hierzu die \emph{einfache Verzweigung}. \subparagraph{Lösung:} Eine mögliche Lösung: \begin{lstlisting} import java.util.Scanner; public class Nr8 { public static void main(String [] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter a month (Number between 1 and 12) an I tell you the number of days"); int month = scanner.nextInt(); if (month == 2) { System.out.println("28 Tage"); } if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 9) || (month == 11)) { System.out.println("31 Tage"); } if ((month == 4) || (month == 6) || (month == 8) || (month == 10) || (month == 12)) { System.out.println("30 Tage"); } } } \end{lstlisting} \newpage \paragraph{Aufgabe 9}\mbox{}\\ Schreibe ein einfaches Java-Programm, welches einem Monat vom Benutzer einliest (mithilfe des „java.util.Scanner“). Verwende dafür die Zahlen 1 bis 12 (1 = Januar, 2 = Februar, ..., 12 = Dezember). Für jeden Monat soll nun die Anzahl der Tage ausgegeben werden. Nutze hierzu die \emph{Mehrfachverzweigung}. \subparagraph{Lösung:} Eine mögliche Lösung: \begin{lstlisting} import java.util.Scanner; public class Nr9 { public static void main(String [] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter a month (Number between 1 and 12) an I tell you the number of days"); int month = scanner.nextInt(); switch(month) { case 1: System.out.println("31 Tage"); break; case 2: System.out.println("28 Tage"); break; case 3: System.out.println("31 Tage"); break; case 4: System.out.println("30 Tage"); break; case 5: System.out.println("31 Tage"); break; case 6: System.out.println("30 Tage"); break; case 7: System.out.println("31 Tage"); break; case 8: System.out.println("30 Tage"); break; case 9: System.out.println("31 Tage"); break; case 10: System.out.println("30 Tage"); break; case 11: System.out.println("31 Tage"); break; case 12: System.out.println("30 Tage"); break; default: System.out.println("Please enter a viable number between 1 and 12 (Your number: " + month + ")"); } } } \end{lstlisting} \newpage \paragraph{Aufgabe 10}\mbox{}\\ Kann Aufgabe 8 mit 3 oder weniger If-Statements gelöst werden? Wenn ja wie? Wenn nein warum nicht? \subparagraph{Lösung:} Ja. \begin{lstlisting} import java.util.Scanner; public class Nr10 { public static void main(String [] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter a month (Number between 1 and 12) an I tell you the number of days"); int month = scanner.nextInt(); if(month == 2) { System.out.println("28 Tage"); if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 9) || (month == 11)) { System.out.println("31 Tage"); } if((month == 4) || (month == 6) || (month == 8) || (month == 10) || (month == 12)) { System.out.println("30 Tage"); } } } } \end{lstlisting} \newpage \paragraph{Aufgabe 11}\mbox{}\\ Wie oft wird die folgende Schleife ausgeführt und warum? \begin{lstlisting} int i = 10; do { i = i - 3; } while (i > 5); \end{lstlisting} \subparagraph{Lösung:} Zwei mal, da danach die Bedingung am Ende des zweiten Durchlaufes "4 > 5" lautet und somit die Schleife beendet wird. \paragraph{Aufgabe 12}\mbox{}\\ Welche Zahlen werden bei diesen Schleifen ausgegeben? Und wie oft werden diese Ausgeführt? \\\\ a) \begin{lstlisting} for( int i=1; i <= 10; i++ ){ System.out.println( i ); } \end{lstlisting} b) \begin{lstlisting} for( int i=1; i <= 10; i = i+2 ){ System.out.println( i ); } \end{lstlisting} c) \begin{lstlisting} for( int i=1; i <= 10; i = i*2 ){ System.out.println( i ); } \end{lstlisting} d) \begin{lstlisting} for( int i=1; i < 10; i = i+2 ){ if (i >= 5) { System.out.println( i ); i--; } else { System.out.println( i ); } } \end{lstlisting} \newpage e) \begin{lstlisting} int i = 0; do { if (i < 4) { System.out.println( i ); } if (i > 4) { System.out.println( i ); } else { i--; } i = i+2; } while (i < 10); \end{lstlisting} \subparagraph{Lösung:} \begin{itemize} \item[a)] $\begin{array}{c|c} \text{Durchlauf} & \text{Ausgabe}\\ \hline 1 & 1\\ 2 & 2\\ 3 & 3\\ 4 & 4\\ 5 & 5\\ 6 & 6\\ 7 & 7\\ 8 & 8\\ 9 & 9\\ 10 & 10\\ \end{array}$ \item[b)] $\begin{array}{c|c} \text{Durchlauf} & \text{Ausgabe}\\ \hline 1 & 1\\ 2 & 3\\ 3 & 5\\ 4 & 7\\ 5 & 9 \end{array}$ \item[c)] $\begin{array}{c|c} \text{Durchlauf} & \text{Ausgabe}\\ \hline 1 & 1\\ 2 & 2\\ 3 & 4\\ 4 & 8 \end{array}$ \item[d)] $\begin{array}{c|c} \text{Durchlauf} & \text{Ausgabe}\\ \hline 1 & 1\\ 2 & 3\\ 3 & 5\\ 4 & 6\\ 5 & 7\\ 6 & 8\\ 7 & 9 \end{array}$ \item[e)] $\begin{array}{c|c} \text{Durchlauf} & \text{Ausgabe}\\ \hline 1 & 0\\ 2 & 1\\ 3 & 2\\ 4 & 3\\ 5 & 5\\ 6 & 7\\ 7 & 9 \end{array}$ \end{itemize} \end{document}