diff --git a/20151210/Makefile b/20151210/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3ff5a0d4adedf0426fa107eae07db3016505c394
--- /dev/null
+++ b/20151210/Makefile
@@ -0,0 +1,606 @@
+# Hey Emacs, this is a -*- makefile -*-
+###############################################################################
+# RP6 MAKEFILE FOR WinAVR
+# Based on WinAVR Sample makefile written by Eric B. Weddington,
+# J�rg Wunsch, et al.
+#
+#
+# YOU NEED TO EDIT SOME SMALL THINGS IN THIS FILE IF YOU WANT TO USE
+# IT FOR YOUR OWN PROJECTS!
+# THESE LINES ARE ALL AT THE TOP OF THIS FILE AND MARKED VERY CLEARLY !
+# BETTER DO NOT EDIT ANYTHING ELSE!
+#
+# To compile everything you can simply type "make all" on a command line in
+# this directory or simply use the supplied batch files!
+# To remove all the temporary files the compiler has generated you can use
+# "make clean"
+# See end of this file and "make" user manual for more details!
+#
+#
+# Note: Everything behind a '#' is interpreted as a comment in this file!
+#
+###############################################################################
+
+
+
+
+###############################################################################
+# Target file name (without extension).
+# This is the name of your main C source file! Do NOT append the ".c"!
+# Example: Let's assume your main source file is "RP6Base_MyProgram.c", then
+# you would write: TARGET = RP6Base_MyProgram
+
+TARGET = blink-5
+
+###############################################################################
+
+
+
+###############################################################################
+# Specify relative path to RP6 library files here.
+# This is "../lib" usually.
+
+RP6_LIB_PATH=../RP6Lib
+RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6base $(RP6_LIB_PATH)/RP6common
+
+###############################################################################
+
+
+#------------------------------------------------
+# Main Source file is _automatically_ added here:
+SRC = $(TARGET).c
+
+###############################################################################
+# If there is more than one source file, append them here separated by spaces.
+# Usually you have to add the Library files here! (ONLY add c files "*.c" here,
+# NO header files "*.h"!)
+# Don't forget to add relative paths!
+
+#SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
+#SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c
+##SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c
+
+# You can also wrap lines by appending a backslash to the end of the line
+# like this:
+#SRC += xyz.c \
+#abc.c \
+#asdf.c
+#
+###############################################################################
+
+
+###############################################################################
+# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
+# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+
+OPT = s
+
+###############################################################################
+
+
+
+
+
+
+
+
+
+
+
+#                                                                             #
+#-----------------------------------------------------------------------------#
+###############################################################################
+######-------------------------------------------------------------------######
+###### DO NOT EDIT ANYTHING BELOW IF YOU DO NOT KNOW WHAT YOU ARE DOING! ######
+######-------------------------------------------------------------------######
+###############################################################################
+#-----------------------------------------------------------------------------#
+#                                                                             #
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# MCU name - atmega32 for RP6 Base and Processor Expansion
+MCU = atmega32
+
+
+# Output format. (can be srec, ihex, binary)
+FORMAT = ihex
+
+
+# List Assembler source files here.
+#     Make them always end in a capital .S.  Files ending in a lowercase .s
+#     will not be considered source files but generated files (assembler
+#     output from the compiler), and will be deleted upon "make clean"!
+#     Even though the DOS/Win* filesystem matches both .s and .S the same,
+#     it will preserve the spelling of the filenames, and gcc itself does
+#     care about how the name is spelled on its command-line.
+ASRC =
+
+
+# Debugging format.
+#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
+#     AVR Studio 4.10 requires dwarf-2.
+#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
+DEBUG = dwarf-2
+
+
+# List any extra directories to look for include files here.
+#     Each directory must be seperated by a space.
+#     Use forward slashes for directory separators.
+#     For a directory that has spaces, enclose it in quotes.
+EXTRAINCDIRS = $(RP6_LIB_PATH) $(RP6_LIB_PATH_OTHERS)
+
+
+# Compiler flag to set the C Standard level.
+#     c89   = "ANSI" C
+#     gnu89 = c89 plus GCC extensions
+#     c99   = ISO C99 standard (not yet fully implemented)
+#     gnu99 = c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+
+
+
+# DO NOT USE THIS FOR RP6 PROJECTS!
+#
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+# F_CPU = 8000000
+
+# Place -D or -U options here
+CDEFS = -DDEBUG_MEASURE_DUTY_CYCLE 
+# -DF_CPU=$(F_CPU)UL
+# uncommented - caused a compile problem.
+
+
+
+
+# Place -I options here
+CINCS =
+
+
+
+#---------------- Compiler Options ----------------
+#  -g*:          generate debugging information
+#  -O*:          optimization level
+#  -f...:        tuning, see GCC manual and avr-libc documentation
+#  -Wall...:     warning level
+#  -Wa,...:      tell GCC to pass this to the assembler.
+#    -adhlns...: create assembler listing
+CFLAGS = -g$(DEBUG)
+CFLAGS += $(CDEFS) $(CINCS)
+CFLAGS += -O$(OPT)
+CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
+CFLAGS += -Wall -Wstrict-prototypes -Werror
+CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
+CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+CFLAGS += $(CSTANDARD)
+
+
+#---------------- Assembler Options ----------------
+#  -Wa,...:   tell GCC to pass this to the assembler.
+#  -ahlms:    create listing
+#  -gstabs:   have the assembler create line number information; note that
+#             for use in COFF files, additional information about filenames
+#             and function names needs to be present in the assembler source
+#             files -- see avr-libc docs [FIXME: not yet described there]
+#  -listing-cont-lines: Sets the maximum number of continuation lines of hex
+#       dump that will be displayed for a given single line of source input.
+ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs,--listing-cont-lines=100
+
+
+#---------------- Library Options ----------------
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+# If this is left blank, then it will use the Standard printf version.
+PRINTF_LIB =
+#PRINTF_LIB = $(PRINTF_LIB_MIN)
+#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
+
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+# If this is left blank, then it will use the Standard scanf version.
+SCANF_LIB =
+#SCANF_LIB = $(SCANF_LIB_MIN)
+#SCANF_LIB = $(SCANF_LIB_FLOAT)
+
+
+MATH_LIB = -lm
+
+
+
+#---------------- External Memory Options ----------------
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+
+
+#---------------- Linker Options ----------------
+#  -Wl,...:     tell GCC to pass this to linker.
+#    -Map:      create map file
+#    --cref:    add cross reference to  map file
+LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS += $(EXTMEMOPTS)
+LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+
+
+
+#---------------- Programming Options (avrdude) ----------------
+
+# Programming hardware: alf avr910 avrisp bascom bsd
+# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
+#
+# Type: avrdude -c ?
+# to get a full listing.
+#
+AVRDUDE_PROGRAMMER = stk500
+
+# com1 = serial port. Use lpt1 to connect to parallel port.
+AVRDUDE_PORT = com1    # programmer connected to serial device
+
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level.  Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
+AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
+AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
+
+
+
+#---------------- Debugging Options ----------------
+
+# For simulavr only - target MCU frequency.
+DEBUG_MFREQ = $(F_CPU)
+
+# Set the DEBUG_UI to either gdb or insight.
+# DEBUG_UI = gdb
+DEBUG_UI = insight
+
+# Set the debugging back-end to either avarice, simulavr.
+DEBUG_BACKEND = avarice
+#DEBUG_BACKEND = simulavr
+
+# GDB Init Filename.
+GDBINIT_FILE = __avr_gdbinit
+
+# When using avarice settings for the JTAG
+JTAG_DEV = /dev/com1
+
+# Debugging port used to communicate between GDB / avarice / simulavr.
+DEBUG_PORT = 4242
+
+# Debugging host used to communicate between GDB / avarice / simulavr, normally
+#     just set to localhost unless doing some sort of crazy debugging when
+#     avarice is running on a different computer.
+DEBUG_HOST = localhost
+
+
+
+#============================================================================
+
+
+# Define programs and commands.
+SHELL = sh
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+NM = avr-nm
+AVRDUDE = avrdude
+REMOVE = rm -f
+REMOVEDIR = rmdir
+COPY = cp
+WINSHELL = cmd
+
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_BEGIN = -------- begin --------
+MSG_END = --------  end  --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+
+
+
+
+# Define all object files.
+OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
+
+# Define all listing files.
+LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
+
+
+# Compiler flags to generate dependency files.
+GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
+
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+
+
+
+# Default target.
+all: begin gccversion sizebefore build sizeafter end
+
+build: elf hex eep lss sym
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+eep: $(TARGET).eep
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+
+
+
+# Eye candy.
+# AVR Studio 3.x does not check make's exit code but relies on
+# the following magic strings to be generated by the compile job.
+begin:
+	@echo
+	@echo $(MSG_BEGIN)
+
+end:
+	@echo $(MSG_END)
+	@echo
+
+
+# Display size of file.
+HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
+ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf
+
+sizebefore:
+	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
+	2>/dev/null; echo; fi
+
+sizeafter:
+	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
+	2>/dev/null; echo; fi
+
+
+
+# Display compiler version information.
+gccversion :
+	@$(CC) --version
+
+
+
+# Program the device.
+program: $(TARGET).hex $(TARGET).eep
+	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+
+# Generate avr-gdb config/init file which does the following:
+#     define the reset signal, load the target file, connect to target, and set
+#     a breakpoint at main().
+gdb-config:
+	@$(REMOVE) $(GDBINIT_FILE)
+	@echo define reset >> $(GDBINIT_FILE)
+	@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
+	@echo end >> $(GDBINIT_FILE)
+	@echo file $(TARGET).elf >> $(GDBINIT_FILE)
+	@echo target remote $(DEBUG_HOST):$(DEBUG_PORT)  >> $(GDBINIT_FILE)
+ifeq ($(DEBUG_BACKEND),simulavr)
+	@echo load  >> $(GDBINIT_FILE)
+endif
+	@echo break main >> $(GDBINIT_FILE)
+
+debug: gdb-config $(TARGET).elf
+ifeq ($(DEBUG_BACKEND), avarice)
+	@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
+	@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
+	$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
+	@$(WINSHELL) /c pause
+else
+	@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
+	$(DEBUG_MFREQ) --port $(DEBUG_PORT)
+endif
+	@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
+
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT=$(OBJCOPY) --debugging \
+--change-section-address .data-0x800000 \
+--change-section-address .bss-0x800000 \
+--change-section-address .noinit-0x800000 \
+--change-section-address .eeprom-0x810000
+
+
+coff: $(TARGET).elf
+	@echo
+	@echo $(MSG_COFF) $(TARGET).cof
+	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+	@echo
+	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
+	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
+
+
+
+# Create final output files (.hex, .eep) from ELF output file.
+%.hex: %.elf
+	@echo
+	@echo $(MSG_FLASH) $@
+	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
+
+%.eep: %.elf
+	@echo
+	@echo $(MSG_EEPROM) $@
+	-$(OBJCOPY) -j .eeprom --set-section-flags .eeprom=alloc,load \
+	--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
+
+# Create extended listing file from ELF output file.
+%.lss: %.elf
+	@echo
+	@echo $(MSG_EXTENDED_LISTING) $@
+	$(OBJDUMP) -h -S $< > $@
+
+# Create a symbol table from ELF output file.
+%.sym: %.elf
+	@echo
+	@echo $(MSG_SYMBOL_TABLE) $@
+	$(NM) -n $< > $@
+
+
+
+# Link: create ELF output file from object files.
+.SECONDARY : $(TARGET).elf
+.PRECIOUS : $(OBJ)
+%.elf: $(OBJ)
+	@echo
+	@echo $(MSG_LINKING) $@
+	$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+%.o : %.c
+	@echo
+	@echo $(MSG_COMPILING) $<
+	$(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+%.s : %.c
+	$(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+%.o : %.S
+	@echo
+	@echo $(MSG_ASSEMBLING) $<
+	$(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+# Create preprocessed source for use in sending a bug report.
+%.i : %.c
+	$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
+
+
+# Target: clean project.
+clean: begin clean_list end
+
+clean_list :
+	@echo
+	@echo $(MSG_CLEANING)
+
+# We want to keep the generated hexfiles:
+#	$(REMOVE) $(TARGET).hex
+
+	$(REMOVE) $(TARGET).eep
+	$(REMOVE) $(TARGET).cof
+	$(REMOVE) $(TARGET).elf
+	$(REMOVE) $(TARGET).map
+	$(REMOVE) $(TARGET).sym
+	$(REMOVE) $(TARGET).lss
+	$(REMOVE) $(OBJ)
+	$(REMOVE) $(LST)
+	$(REMOVE) $(SRC:.c=.s)
+	$(REMOVE) $(SRC:.c=.d)
+	$(REMOVE) $(SRC:.c=.i)
+	$(REMOVE) .dep/*
+	$(REMOVEDIR) .dep
+
+
+# Include the dependency files.
+include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
+
+
+# Listing of phony targets.
+.PHONY : all begin finish end sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff \
+clean clean_list program debug gdb-config
+
+
+###############################################################################
+# Based on WinAVR Sample makefile written by Eric B. Weddington,
+# J�rg Wunsch, et al.
+# Released to the Public Domain.
+# Please read the "make" user manual!
+#
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device, using avrdude.
+#                Please customize the avrdude settings first!
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#
+###############################################################################
diff --git a/20151210/ainf-uebung-20151210.pdf b/20151210/ainf-uebung-20151210.pdf
index a1f066174b1ab5bdbc5859faa48dfb7f130ce670..f887d177207dbe517ce42d1ac5831a821b84503b 100644
Binary files a/20151210/ainf-uebung-20151210.pdf and b/20151210/ainf-uebung-20151210.pdf differ
diff --git a/20151210/ainf-uebung-20151210.tex b/20151210/ainf-uebung-20151210.tex
index 10d9cdb58e9b4abee19bb41b5cc2c1d6d828ab5a..5a5b7e1dfdf7091434d9a0c6be4c5a037e8af935 100644
--- a/20151210/ainf-uebung-20151210.tex
+++ b/20151210/ainf-uebung-20151210.tex
@@ -46,7 +46,7 @@
 
   \section*{Angewandte Informatik\\Übungsaufgaben -- 10.\ Dezember 2015}
 
-  \exercise{Bit-Array}
+  \subsection*{Bit-Array}
 
   Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.:
 
@@ -75,6 +75,8 @@
       Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|).
   \end{itemize}
 
+\iffalse
+
   \exercise{Arrays mit Zahlen}
 
   \begin{minipage}[t]{0.5\textwidth}
@@ -148,4 +150,6 @@
     \end{enumerate}
   \end{minipage}
 
+\fi
+
 \end{document}
diff --git a/20151210/blink-4.c b/20151210/blink-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..4d98f159c7916de6a93510ad8f1451f05df5477e
--- /dev/null
+++ b/20151210/blink-4.c
@@ -0,0 +1,16 @@
+#include <avr/io.h>
+
+#define F_CPU 8000000
+#include <util/delay.h>
+
+int main (void)
+{
+  DDRC = 0x70;
+  PORTC &= ~0x70;
+  while (1)
+    {
+      PORTC ^= 0x70;
+      _delay_ms (500);
+    }
+  return 0;
+}
diff --git a/20151210/blink-5.c b/20151210/blink-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..84f15c14f2311600e8566373f886339499bb9a1c
--- /dev/null
+++ b/20151210/blink-5.c
@@ -0,0 +1,24 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+ISR (TIMER0_COMP_vect)
+{
+  static int counter = 0;
+  if (counter++ > 1000)
+    {
+      PORTB ^= 0x83;
+      counter = 0;
+    }
+}
+
+int main (void)
+{
+  cli ();
+  TCCR0 = (1 << CS01) | (0 << CS00);
+  TIMSK = 1 << OCIE0;
+  sei ();
+  DDRB = 0x83;
+  PORTB = 0;
+  while (1);
+  return 0;
+}
diff --git a/20151210/unions-4.c b/20151210/unions-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..a2e77170674f30d16ccb57a91f996d0422c9148a
--- /dev/null
+++ b/20151210/unions-4.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main (void)
+{
+  union {
+          uint8_t byte;
+          struct {
+                  unsigned LEDsR:3;
+                  unsigned LEDsL:3;
+                  unsigned reserved:2;
+          };
+          struct {
+                  unsigned LED1:1;
+                  unsigned LED2:1;
+                  unsigned LED3:1;
+                  unsigned LED4:1;
+                  unsigned LED5:1;
+                  unsigned LED6:1;
+                  unsigned reserved1:1;
+                  unsigned reserved2:1;
+          };
+  } statusLEDs;
+
+  printf ("%d %d %d %d %d %d\n", statusLEDs.LED1, statusLEDs.LED2, statusLEDs.LED3,
+                                 statusLEDs.LED4, statusLEDs.LED5, statusLEDs.LED6);
+  printf ("%d %d\n", statusLEDs.LEDsR, statusLEDs.LEDsL);
+  statusLEDs.byte = 0x38;
+  printf ("%d %d %d %d %d %d\n", statusLEDs.LED1, statusLEDs.LED2, statusLEDs.LED3,
+                                 statusLEDs.LED4, statusLEDs.LED5, statusLEDs.LED6);
+  printf ("%d %d\n", statusLEDs.LEDsR, statusLEDs.LEDsL);
+  return 0;
+}
diff --git a/20151217/ainf-20151217.pdf b/20151217/ainf-20151217.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a9e7b1dcb6173c69eb756b3bfe9ad58d1ed7d5a4
Binary files /dev/null and b/20151217/ainf-20151217.pdf differ
diff --git a/20151217/ainf-20151217.tex b/20151217/ainf-20151217.tex
new file mode 100644
index 0000000000000000000000000000000000000000..7ad562c17797df497dfbe9db2e915bf8b21c8c8e
--- /dev/null
+++ b/20151217/ainf-20151217.tex
@@ -0,0 +1,517 @@
+% ainf-20151217.pdf - Lecture Slides on Applied Computer Sciences
+% Copyright (C) 2012, 2013, 2015  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+\documentclass[10pt,t]{beamer}
+
+\usepackage{pgslides}
+\usepackage{pdftricks}
+\usepackage{rotating}
+
+\newrgbcolor{orange}{0.7 0.2 0.0}
+
+\begin{psinputs}
+  \usepackage[utf8]{inputenc}
+  \usepackage[german]{babel}
+  \usepackage[T1]{fontenc}
+  \usepackage{helvet}
+  \renewcommand*\familydefault{\sfdefault}
+  \usepackage{pstricks,pst-grad,pst-node,pst-plot}
+\end{psinputs}
+
+\lstdefinestyle{asm}{basicstyle=\color{structure},
+                     language={},
+                     gobble=4}
+
+\title{Angewandte Informatik}
+\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
+\date{17.\ Dezember 2015}
+
+\begin{document}
+
+\maketitleframe
+
+\sectionnonumber{\inserttitle}
+
+\begin{frame}
+
+  \showsectionnonumber
+
+  \begin{itemize}
+    \item[\textbf{1}] \textbf{Einführung}
+    \item[\textbf{2}] \textbf{Einführung in C}
+    \item[\textbf{3}] \textbf{Bibliotheken}
+    \item[\textbf{4}] \textbf{Algorithmen}
+      \begin{itemize}
+        \item[4.1] Differentialgleichungen
+        \item[4.2] Rekursion
+        \item[4.3] Stack und FIFO
+        \color{red}
+        \item[4.4] Aufwandsabschätzungen
+      \end{itemize}
+    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
+      \begin{itemize}
+        \color{medgreen}
+        \item[5.1] Bit-Operationen
+        \item[5.2] I/O-Ports
+        \item[5.3] Interrupts
+        \color{red}
+        \item[5.4] volatile-Variable
+        \color{black}
+        \item[5.5] Software-Interrupts
+        \item[\dots]
+      \end{itemize}
+    \color{gray}
+    \item[\makebox(0,0){\textbf{\raisebox{0.5ex}{\dots}}}]
+%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
+  \end{itemize}
+
+\end{frame}
+
+\section{Einführung}
+\section{Einführung in C}
+\section{Bibliotheken}
+\section{Algorithmen}
+
+\section{Hardwarenahe Programmierung}
+\subsection{Bit-Operationen}
+\subsubsection{Zahlensysteme}
+
+\begin{frame}[fragile]
+
+  \showsection
+  \vspace*{-\smallskipamount}
+  \showsubsection
+  \vspace*{-\medskipamount}
+  \showsubsubsection
+
+  Oktal- und Hexadezimal-Zahlen lassen sich ziffernweise\\
+  in Binär-Zahlen umrechnen:
+
+  \begin{verbatim}
+    000 0        0000 0  1000 8
+    001 1        0001 1  1001 9
+    010 2        0010 2  1010 A
+    011 3        0011 3  1011 B
+    100 4        0100 4  1100 C
+    101 5        0101 5  1101 D
+    110 6        0110 6  1110 E
+    111 7        0111 7  1111 F
+  \end{verbatim}
+
+  \begin{picture}(0,0)
+    \put(8,3){\begin{rotate}{15}
+                \color{red}\bf
+                Auswendig lernen!
+              \end{rotate}}
+  \end{picture}
+
+\end{frame}
+
+\subsubsection{Bit-Operationen in C}
+
+\begin{frame}[fragile]
+
+  \showsubsubsection
+
+  \begin{tabular}{lll}
+    C-Operator     & Verknüpfung              & Anwendung                \\[\smallskipamount]
+    \lstinline,&,  & Und                      & Bits gezielt löschen     \\
+    \lstinline,|,  & Oder                     & Bits gezielt setzen      \\
+    \lstinline,^,  & Exklusiv-Oder            & Bits gezielt invertieren \\
+    \lstinline,~,  & Nicht                    & Alle Bits invertieren    \\[\smallskipamount]
+    \lstinline,<<, & Verschiebung nach links  & Maske generieren         \\
+    \lstinline,>>, & Verschiebung nach rechts & Bits isolieren
+  \end{tabular}
+
+  \bigskip
+
+  Beispiele:
+  \begin{itemize}
+    \item
+      Bit Nr.\ 5 gezielt auf 1 setzen:
+      \lstinline{PORTB |= 1 << 5;}
+    \item
+      Bit Nr.\ 6 gezielt auf 0 setzen:
+      \lstinline{PORTA &= ~(1 << 6);}
+    \item
+      Ist Bit Nr.\ 4 gesetzt?
+      \lstinline{if (PINC & (1 << 4) ...}
+      \smallskip
+    \item
+      Umschalten zwischen Ein- und Ausgabe: \lstinline{DDR}\\
+      Bit = 1: Ausgabe; Bit = 0: Eingabe
+  \end{itemize}
+
+  \begin{picture}(0,0)
+    \put(8.4,1){\begin{rotate}{15}
+                  \color{red}\bf
+                  \shortstack{Details abhängig von\\Prozessor und Compiler!}
+                \end{rotate}}
+  \end{picture}
+
+\end{frame}
+
+\subsection{I/O-Ports}
+
+\begin{frame}[fragile]
+
+%  \showsection
+  \showsubsection
+  \vspace*{-1.5\medskipamount}
+  {\large\textbf{\color{structure}5.3\quad Interrupts}}
+
+  \bigskip
+
+  Kommunikation mit externen Geräten
+
+  \bigskip
+
+  \begin{center}
+    \begin{pdfpic}
+      \psset{unit=1cm}%
+      \begin{pspicture}(0,0)(10,6)
+        \rput(0,0){\psframe[framearc=0.25](2,5)}
+        \rput(1,4.5){\makebox(0,0)[t]{Prozessor}}
+        \rput(2.0,3.7){\pnode{p0}}
+        \rput(2.0,3.3){\pnode{q0}}
+        \rput(2.0,1.0){\pnode{i0}}
+        \rput(2.12,1.2){\pnode{j0}}
+        \rput(2.02,1.3){\pnode{k0}}
+        \rput(2.12,1.4){\pnode{l0}}
+        \rput(3.5,1.4){\pnode{m0}}
+        \rput(8,0){\psframe[framearc=0.25](2,5)}
+        \rput(9,4.5){\makebox(0,0)[t]{\shortstack{externes\\Gerät}}}
+        \rput(8.0,3.7){\pnode{p1}}
+        \rput(7.88,3.3){\pnode{q1}}
+        \rput(7.98,3.2){\pnode{r1}}
+        \rput(7.88,3.1){\pnode{s1}}
+        \rput(6.5,3.1){\pnode{t1}}
+        \rput(8.0,1.0){\pnode{i1}}
+        \rput(8.0,1.2){\pnode{j1}}
+        \ncline{->}{p0}{p1}
+        \ncline{q0}{q1}
+        \nccurve[angleB=90]{q1}{r1}
+        \nccurve[angleA=-90]{r1}{s1}
+        \ncline{->}{s1}{t1}
+        \rput(2.2,3.8){\makebox(0,0)[lb]{Prozessor schreibt in Output-Port}}
+        \rput(2.2,3.1){\makebox(0,0)[lt]{Prozessor liest Input-Port}}
+        \ncline{->}{i1}{i0}
+        \rput(7.8,1.1){\makebox(0,0)[rb]{externes Gerät ruft Interrupt auf}}
+      \end{pspicture}
+    \end{pdfpic}
+  \end{center}
+
+\end{frame}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  In Output-Port schreiben = Leitungen ansteuern
+  \begin{tabbing}
+    Datei: \= \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/}\\
+           \> \file{RP6Lib/RP6base/RP6RobotBaseLib.c}
+  \end{tabbing}
+  \begin{onlyenv}<1>
+    Suchbegriff: \lstinline{setMotorDir}
+
+    \medskip
+
+    \begin{lstlisting}[gobble=6]
+      void setMotorDir(uint8_t left_dir, uint8_t right_dir)
+      {
+        /* ... */
+        if(left_dir)
+          PORTC |= DIR_L;
+        else
+          PORTC &= ~DIR_L;
+        if(right_dir)
+          PORTC |= DIR_R;
+        else
+          PORTC &= ~DIR_R;
+      }
+    \end{lstlisting}
+    \begin{picture}(0,0)
+      \color{red}
+      \put(2.2,0.50){\vector(-2,1){0.5}}
+      \put(2.25,0.40){\makebox(0,0)[l]{Output-Port}}
+      \put(4.7,3.0){\vector(-2,1){0.75}}
+      \put(4.7,3.0){\vector(-2,-1){0.75}}
+      \put(4.8,3.0){\makebox(0,0)[l]{Manipulation einzelner Bits}}
+    \end{picture}
+
+    \vspace*{-1.5cm}
+    \strut\hfill\textarrow\ Steuerung der Motordrehrichtung
+  \end{onlyenv}
+  \begin{onlyenv}<2>
+    Suchbegriff: \lstinline{updateStatusLEDs}
+
+    \medskip
+
+    \begin{lstlisting}[gobble=6]
+      DDRB &= ~0x83;
+      PORTB &= ~0x83;
+      if(statusLEDs.LED4){ DDRB |= SL4; PORTB |= SL4; }
+      if(statusLEDs.LED5){ DDRB |= SL5; PORTB |= SL5; }
+      if(statusLEDs.LED6){ DDRB |= SL6; PORTB |= SL6; }
+      DDRC &= ~0x70;
+      PORTC &= ~0x70;
+      DDRC |= ((statusLEDs.byte << 4) & 0x70);
+      PORTC |= ((statusLEDs.byte << 4) & 0x70);
+    \end{lstlisting}
+    \begin{picture}(0,0)
+      \color{red}
+      \put(3.7,3.9){\vector(-1,0){0.5}}
+      \put(3.75,3.9){\makebox(0,0)[l]{Data Direction Register: auf Input(!) setzen}}
+      \put(3.7,3.5){\vector(-1,0){0.5}}
+      \put(3.75,3.5){\makebox(0,0)[l]{internen Pull-Up-Widerstand ausschalten}}
+      \put(8.7,2.7){\makebox(0,0)[l]{\shortstack{Manipulation\\einzelner Bits}}}
+      \put(7.2,1.0){\makebox(0,0)[l]{\shortstack{3 Bits\\gemeinsam}}}
+    \end{picture}
+
+    \lstinline{union statusLEDs}: Bit-Felder vs.\ Byte
+  \end{onlyenv}
+
+\end{frame}
+
+\subsection{Interrupts}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
+
+  Zeiger hinterlegen: "`Interrupt-Vektor"'
+
+  \medskip
+
+  Datei: \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/\\
+  RP6Lib/RP6base/RP6RobotBaseLib.c}
+
+  Suchbegriff: \lstinline{ISR}
+
+  \vspace{2.0cm}
+
+  \begin{lstlisting}
+    ISR (INT0_vect)
+    {
+      mleft_dist++;
+      mleft_counter++;
+      /* ... */
+    }
+  \end{lstlisting}
+  \begin{picture}(0,0)
+    \color{red}
+    \put(1.9,4.3){\vector(-1,-1){1.4}}
+    \put(2.0,4.4){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}}
+    \put(2.3,3.6){\vector(-1,-1){0.7}}
+    \put(2.4,3.6){\makebox(0,0)[l]{Interrupt-Vektor 0 darauf zeigen lassen}}
+    \put(3.7,2.9){\makebox(0,0)[l]{Schreibweise abhängig von Prozessor und Compiler!}}
+  \end{picture}
+
+  \vspace*{-1.5cm}
+  \strut\hfill Aufruf durch Sensor an Encoder-Scheibe\\
+  \strut\hfill\textarrow\ Entfernungsmessung
+
+\end{frame}
+
+\subsection{volatile-Variable}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  \begin{lstlisting}
+    volatile uint16_t mleft_counter;
+
+    /* ... */
+
+    volatile uint16_t mleft_dist;
+
+    /* ... */
+
+    ISR (INT0_vect)
+    {
+      mleft_dist++;
+      mleft_counter++;
+      /* ... */
+    }
+  \end{lstlisting}
+  \begin{picture}(0,0)
+    \color{red}
+    \put(1.6,5.2){\vector(-1,-1){0.55}}
+    \put(1.6,5.2){\vector(-1,1){0.55}}
+    \put(1.6,5.2){\makebox(0,0)[l]{"`Immer lesen und schreiben. Nicht wegoptimieren."'}}
+  \end{picture}
+  \vspace{-3cm}
+  \begin{lstlisting}
+                                        int main (void)
+                                        {
+                                          int prev_mleft_dist = mleft_dist;
+                                          while (mleft_dist == prev_mleft_dist)
+                                            /* just wait */;
+                                        }
+  \end{lstlisting}
+
+\end{frame}
+
+\iffalse
+
+\subsection{Software-Interrupts}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  \begin{lstlisting}[style=asm]
+    mov ax, 0012
+    int 10
+  \end{lstlisting}
+  \pause
+  \begin{picture}(0,0)
+    \color{red}
+    \put(2.8,0.95){\vector(-1,0){0.55}}
+    \put(2.9,0.95){\makebox(0,0)[l]{Parameter in Prozessorregister}}
+    \put(1.7,0.50){\vector(-1,0){0.55}}
+    \put(1.8,0.50){\makebox(0,0)[l]{Funktionsaufruf über Interrupt-Vektor}}
+  \end{picture}
+
+  \pause
+  Beispiel: VGA-Grafikkarte
+  \begin{itemize}
+    \item Modus setzen: \lstinline{mov ah, 00}
+    \item Grafikmodus: \lstinline{mov al, 12}
+    \item Textmodus: \lstinline{mov al, 03}
+  \end{itemize}
+
+  \pause
+  \bigskip
+  Verschiedene Farben: Output-Ports
+  \begin{itemize}
+    \item \newterm{Graphics Register\/}: Index \lstinline{03CE}, Daten \lstinline{03CF}
+    \item Index 0: \newterm{Set/Reset Register}
+    \item Index 1: \newterm{Enable Set/Reset Register}
+    \item Index 8: \newterm{Bit Mask Register}
+    \item Jedes Bit steht für Schreibzugriff auf eine Speicherbank.
+    \item 4 Speicherbänke \textarrow\ 16 Farben
+  \end{itemize}
+
+\end{frame}
+
+\fi
+
+\subsection{Aufwandsabschätzungen}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  Beispiel: Sortieralgorithmen
+
+  \begin{itemize}
+    \item
+      Maximum suchen\only<2->{: $\mathcal{O}(n)$}
+      \hfill
+      \begin{minipage}[t]{5.6cm}
+        \vspace*{-1.3cm}
+        \begin{pdfpic}
+          \psset{unit=0.5pt}
+          \begin{pspicture}(-20,-20)(250,200)
+            \psline[arrows=->](-10,0)(200,0)
+            \psline[arrows=->](0,-10)(0,200)
+            \psplot[plotpoints=200]{1}{125}{2 x 0.06 mul exp}
+            \put(70,190){\mbox{$g(n) \sim 2^n$}}
+            \psplot[plotpoints=200]{0}{190}{x x mul 0.005 mul}
+            \put(190,190){\mbox{$g(n) \sim n^2$}}
+            \psplot[plotpoints=200]{1}{190}{x ln x mul 0.1 mul}
+            \put(195,100){\mbox{$g(n) \sim n \log n$}}
+            \psplot[plotpoints=200]{0}{190}{x 0.4 mul}
+            \put(195,75){\mbox{$g(n) \sim n$}}
+            \psplot[plotpoints=200]{1}{190}{x ln 10 mul}
+            \put(195,50){\mbox{$g(n) \sim \log n$}}
+            \put(205,0){\makebox(0,0)[l]{$n$}}
+            \put(-10,210){\makebox(0,0)[l]{$g(n)$}}
+            \psplot[plotpoints=200]{1}{190}{30}
+            \put(195,25){\mbox{$g(n) \sim 1$}}
+          \end{pspicture}
+        \end{pdfpic}
+        \small
+        \begin{description}\itemsep0pt
+          \item[$n$:] Eingabedaten
+          \item[$g(n)$:] Rechenzeit
+        \end{description}
+        \vspace*{-10cm}\strut
+      \end{minipage}
+    \pause[3]
+    \item
+      Maximum ans Ende tauschen\\
+      \textarrow\ Selectionsort\pause: $\mathcal{O}(n^2)$
+    \pause
+    \item
+      Während Maximumsuche prüfen,\\abbrechen, falls schon sortiert\\
+      \textarrow\ Bubblesort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$
+    \pause
+    \item
+      Rekursiv sortieren\\
+      \textarrow\ Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$\hfill
+  \end{itemize}
+
+\end{frame}
+
+\sectionnonumber{\inserttitle}
+
+\begin{frame}
+
+  \showsectionnonumber
+
+  \begin{itemize}
+    \item[\textbf{1}] \textbf{Einführung}
+    \item[\textbf{2}] \textbf{Einführung in C}
+    \item[\textbf{3}] \textbf{Bibliotheken}
+    \item[\textbf{4}] \textbf{Algorithmen}
+      \begin{itemize}
+        \item[4.1] Differentialgleichungen
+        \item[4.2] Rekursion
+        \item[4.3] Stack und FIFO
+        \color{medgreen}
+        \item[4.4] Aufwandsabschätzungen
+      \end{itemize}
+    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
+      \begin{itemize}
+        \color{medgreen}
+        \item[5.1] Bit-Operationen
+        \item[5.2] I/O-Ports
+        \item[5.3] Interrupts
+        \item[5.4] volatile-Variable
+        \color{black}
+        \item[5.5] Software-Interrupts
+        \item[\dots]
+      \end{itemize}
+    \color{gray}
+    \item[\makebox(0,0){\textbf{\raisebox{0.5ex}{\dots}}}]
+%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
+  \end{itemize}
+
+\end{frame}
+
+\end{document}
diff --git a/20151217/ainf-uebung-20151217.pdf b/20151217/ainf-uebung-20151217.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a8720cbc931d8d767e3972bba1828b1b557c4175
Binary files /dev/null and b/20151217/ainf-uebung-20151217.pdf differ
diff --git a/20151217/ainf-uebung-20151217.tex b/20151217/ainf-uebung-20151217.tex
new file mode 100644
index 0000000000000000000000000000000000000000..e538b4f63582673e87d3427da86faa1f24586eb2
--- /dev/null
+++ b/20151217/ainf-uebung-20151217.tex
@@ -0,0 +1,122 @@
+% ainf-uebung-20151217.pdf - Exercises on Applied Computer Sciences
+% Copyright (C) 2013, 2015  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+\documentclass[a4paper]{article}
+
+\usepackage{pgscript}
+\usepackage{enumerate}
+\usepackage{pdftricks}
+\usepackage{sfmath}
+
+\begin{psinputs}
+  \usepackage{pgscript}
+%  \definecolor{PracticallyWhite}{rgb}{0.99 0.99 0.99}
+  \definecolor{verylightgray}{rgb}{0.95 0.95 0.95}
+\end{psinputs}
+
+\newcounter{exercise}
+\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}}
+
+\newcounter{points}
+\newcommand{\onepoint}{(1 Punkt)\addtocounter{points}{1}}
+\newcommand{\points}[1]{(#1 Punkte)\addtocounter{points}{#1}}
+
+\begin{document}
+
+  \thispagestyle{empty}
+
+  \section*{Angewandte Informatik\\Übungsaufgaben -- 17.\ Dezember 2015}
+
+  \subsection*{Arrays mit Zahlen}
+
+  \begin{minipage}[t]{0.5\textwidth}
+    Wir betrachten das folgende Programm:
+    \begin{lstlisting}[gobble=6]
+      #include <stdio.h>
+
+      void f (int *s0, int *s1)
+      {
+        while (*s0 >= 0)
+        {
+          int *s = s1;
+          while (*s >= 0)
+            if (*s0 == *s++)
+              printf ("%d ", *s0);
+          s0++;
+        }
+        printf ("\n");
+      }
+
+      int main (void)
+      {
+        int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 };
+        int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 };
+        f (a, b);
+        return 0;
+      }
+    \end{lstlisting}
+  \end{minipage}\hfill
+  \begin{minipage}[t]{0.5\textwidth}
+    \vspace*{-\bigskipamount}
+    \begin{enumerate}[\quad(a)]
+      \item
+        Was bewirkt die Funktion \lstinline{f} und warum?\\
+        \points{4}
+      \item
+        Von welcher Ordnung (Landau-Symbol) ist die Funktion und warum?
+
+        Wir beziehen uns hierbei auf die Anzahl der Vergleiche
+        in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}.
+        Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen,
+        obwohl sie normalerweise nicht gleich sind.
+        \points{2}
+      \item
+        Was passiert, wenn Sie beim Aufruf der Funktion für einen der
+        Parameter den Wert \lstinline{NULL} übergeben und warum?
+        \points{2}
+      \item
+        Was passiert, wenn Sie das Hauptprogramm wie folgt abändern
+        (\file{aufgabe-1d.c}) und warum?
+        \begin{lstlisting}[gobble=8]
+          int main (void)
+          {
+            int a[] = { 10, 4, 3, 7, 12, 0, 1 };
+            int b[] = { 7, 14, 0, 8, 9, 22, 10 };
+            f (a, b);
+            return 0;
+          }
+        \end{lstlisting}
+        \points{2}
+      \item
+        Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
+        sich die Funktion \lstinline{f} effizienter gestalten läßt,
+        wenn man die ihr übergebenen Arrays \lstinline{s0} und
+        \lstinline{s1} als sortiert voraussetzt.\\
+        \points{5}
+      \item
+        Von welcher
+        Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?\\
+        \points{2}
+    \end{enumerate}
+  \end{minipage}
+
+\end{document}
diff --git a/20151217/logo-hochschule-bochum-cvh-text.pdf b/20151217/logo-hochschule-bochum-cvh-text.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..a05946126bc0ce6a2818740da2893f59eb0c659c
--- /dev/null
+++ b/20151217/logo-hochschule-bochum-cvh-text.pdf
@@ -0,0 +1 @@
+../common/logo-hochschule-bochum-cvh-text.pdf
\ No newline at end of file
diff --git a/20151217/logo-hochschule-bochum.pdf b/20151217/logo-hochschule-bochum.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1
--- /dev/null
+++ b/20151217/logo-hochschule-bochum.pdf
@@ -0,0 +1 @@
+../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20151217/pgscript.sty b/20151217/pgscript.sty
new file mode 120000
index 0000000000000000000000000000000000000000..95c888478c99ea7fda0fd11ccf669ae91be7178b
--- /dev/null
+++ b/20151217/pgscript.sty
@@ -0,0 +1 @@
+../common/pgscript.sty
\ No newline at end of file
diff --git a/20151217/pgslides.sty b/20151217/pgslides.sty
new file mode 120000
index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64
--- /dev/null
+++ b/20151217/pgslides.sty
@@ -0,0 +1 @@
+../common/pgslides.sty
\ No newline at end of file