int main(void) {
  printf("\nDas Prorgramm simuliert die folgende Situation wie folgt:\n");
  printf("\nEin Hersteller legt seinem Produkt jeweils ein Sammelbild bei "
         "(z.B. das Bild eines Spielers der\n"
         "deutschen Nationalmannschaft bei der Fußball-WM). Dabei ist er fair, "
         "d.h. die verschiedenen Sammelbilder\n"
         "werden gleich häufig beigelegt.\n\n"
         "Es gibt s verschiedene Sammelbilder. Folgende Fragestellungen "
         "drängen sich auf:\n\n"
         "1. Wie viele Exemplare des Produkts muß ein Kunde kaufen, bis er "
         "über eine vollständige Kollektion\n"
         "aller Sammelbilder verfügt? (Sammelbilderproblem)\n\n"
         "2. Eine Anzahl von k Kunden kaufen jeweils genau s Exemplare des "
         "Produktes. Wie viele\n"
         "verschiedene Sammelbilder wird jeder dieser Kunden haben?\n\n");
  char *ausgabetext = "";
  int sammelbilder = 0;
  int kunden = 0;
  char menue[][30] = {"Sammelbilderproblem", "Statistik der Treffer",
                      "Programm beenden"};
  switch (waehle_aus_menue(3, 30, menue)) {
  case 1:
    puts("\n\nEs soll ein Sammelbilderproblem-Statistik erzeugt werden:\n");
    ausgabetext = "Wie viele verschiedene Sammelbilder gibt es [1 – 1000] ?\t";
    sammelbilder = erfasse_ganze_zahl(ausgabetext, 1, 1000);
    ausgabetext = "Wie viele Kunden kaufen [1 – 100000] ?\t";
    kunden = erfasse_ganze_zahl(ausgabetext, 1, 100000);
    schreibe_statistik_sammelbilderproblem(sammelbilder, kunden);
    break;
  case 2:
    puts("\n\nEs soll die Häufigkeit, mit der die Anzahl vorkommt, "
         "d.h. die Anzahl Kunden, die genau AVS viele Sammelbilder haben, "
         "ausgegeben werden.\n");
    ausgabetext = "Wie viele verschiedene Sammelbilder gibt es [1 – 1000] ?\t";
    sammelbilder = erfasse_ganze_zahl(ausgabetext, 1, 1000);
    ausgabetext =
        "Wie viele Kunden kaufen genau 23 Sammelbilder [1 – 100000] ?\t";
    kunden = erfasse_ganze_zahl(ausgabetext, 1, 100000);
    schreibe_statistik_der_treffer(sammelbilder, kunden);
    break;
  default:
    puts("\nDas Programm wird beendet. See You!\n");
    break;
  }
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
movl   $0x0,-0x4(%rbp)
lea    0xe87(%rip),%rdi
xor    %eax,%eax
mov    %al,-0x85(%rbp)
call   1050 <printf@plt>
mov    -0x85(%rbp),%al
lea    0xea9(%rip),%rdi
call   1050 <printf@plt>
mov    -0x85(%rbp),%al
lea    0x11a4(%rip),%rcx
mov    %rcx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movups 0x12cc(%rip),%xmm0
movups %xmm0,-0x36(%rbp)
movaps 0x12b7(%rip),%xmm0
movaps %xmm0,-0x40(%rbp)
movaps 0x129c(%rip),%xmm0
movaps %xmm0,-0x50(%rbp)
movaps 0x1281(%rip),%xmm0
movaps %xmm0,-0x60(%rbp)
movaps 0x1266(%rip),%xmm0
movaps %xmm0,-0x70(%rbp)
movaps 0x124b(%rip),%xmm0
movaps %xmm0,-0x80(%rbp)
mov    $0x3,%edi
mov    $0x1e,%esi
lea    -0x80(%rbp),%rdx
call   1040 <waehle_aus_menue@plt>
mov    %eax,%ecx
mov    %ecx,-0x84(%rbp)
sub    $0x1,%eax
je     1236 <main+0xd6>
jmp    1222 <main+0xc2>
mov    -0x84(%rbp),%eax
sub    $0x2,%eax
je     129c <main+0x13c>
jmp    1302 <main+0x1a2>
lea    0x106a(%rip),%rdi
mov    $0x0,%al
call   1030 <puts@plt>
lea    0x1099(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%esi
mov    $0x3e8,%edx
mov    $0x0,%al
call   1080 <erfasse_ganze_zahl@plt>
mov    %eax,-0x14(%rbp)
lea    0x10b2(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%esi
mov    $0x186a0,%edx
mov    $0x0,%al
call   1080 <erfasse_ganze_zahl@plt>
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%edi
mov    -0x18(%rbp),%esi
mov    $0x0,%al
call   1070 <schreibe_statistik_sammelbilderproblem@plt>
jmp    1310 <main+0x1b0>
lea    0x10a7(%rip),%rdi
mov    $0x0,%al
call   1030 <puts@plt>
lea    0x1033(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%esi
mov    $0x3e8,%edx
mov    $0x0,%al
call   1080 <erfasse_ganze_zahl@plt>
mov    %eax,-0x14(%rbp)
lea    0x1102(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%esi
mov    $0x186a0,%edx
mov    $0x0,%al
call   1080 <erfasse_ganze_zahl@plt>
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%edi
mov    -0x18(%rbp),%esi
mov    $0x0,%al
call   1060 <schreibe_statistik_der_treffer@plt>
jmp    1310 <main+0x1b0>
lea    0x110d(%rip),%rdi
mov    $0x0,%al
call   1030 <puts@plt>
mov    -0x4(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
sub    $0x60,%rsp
lea    0x1093(%rip),%rdi
call   1030 <puts@plt>
lea    0x10c2(%rip),%rdi
call   1030 <puts@plt>
movups 0xed6(%rip),%xmm0
movups %xmm0,0x4a(%rsp)
movaps 0xec0(%rip),%xmm0
movaps %xmm0,0x40(%rsp)
movaps 0xea4(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
movaps 0xe88(%rip),%xmm0
movaps %xmm0,0x20(%rsp)
movaps 0xe6c(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movaps 0xe50(%rip),%xmm0
movaps %xmm0,(%rsp)
mov    %rsp,%rdx
mov    $0x3,%edi
mov    $0x1e,%esi
xor    %eax,%eax
call   1040 <waehle_aus_menue@plt>
cmp    $0x2,%eax
je     1223 <main+0xd3>
cmp    $0x1,%eax
jne    1270 <main+0x120>
lea    0xe7d(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xeac(%rip),%rdi
mov    $0x1,%esi
mov    $0x3e8,%edx
xor    %eax,%eax
call   1070 <erfasse_ganze_zahl@plt>
mov    %eax,%ebx
lea    0xece(%rip),%rdi
mov    $0x1,%esi
mov    $0x186a0,%edx
xor    %eax,%eax
call   1070 <erfasse_ganze_zahl@plt>
mov    %ebx,%edi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <schreibe_statistik_sammelbilderproblem@plt>
jmp    127e <main+0x12e>
lea    0xed3(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xe5f(%rip),%rdi
mov    $0x1,%esi
mov    $0x3e8,%edx
xor    %eax,%eax
call   1070 <erfasse_ganze_zahl@plt>
mov    %eax,%ebx
lea    0xf37(%rip),%rdi
mov    $0x1,%esi
mov    $0x186a0,%edx
xor    %eax,%eax
call   1070 <erfasse_ganze_zahl@plt>
mov    %ebx,%edi
mov    %eax,%esi
xor    %eax,%eax
call   1050 <schreibe_statistik_der_treffer@plt>
jmp    127e <main+0x12e>
lea    0xf52(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
xor    %eax,%eax
add    $0x60,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@.str = [60 x i8] c"\0ADas Prorgramm simuliert die folgende Situation wie folgt:\0A\00"
@.str.1 = [619 x i8] c"\0AEin Hersteller legt seinem Produkt jeweils ein Sammelbild bei (z.B. das Bild eines Spielers der\0Adeutschen Nationalmannschaft bei der Fu\C3\9Fball-WM). Dabei ist er fair, d.h. die verschiedenen Sammelbilder\0Awerden gleich h\C3\A4ufig beigelegt.\0A\0AEs gibt s verschiedene Sammelbilder. Folgende Fragestellungen dr\C3\A4ngen sich auf:\0A\0A1. Wie viele Exemplare des Produkts mu\C3\9F ein Kunde kaufen, bis er \C3\BCber eine vollst\C3\A4ndige Kollektion\0Aaller Sammelbilder verf\C3\BCgt? (Sammelbilderproblem)\0A\0A2. Eine Anzahl von k Kunden kaufen jeweils genau s Exemplare des Produktes. Wie viele\0Averschiedene Sammelbilder wird jeder dieser Kunden haben?\0A\0A\00"
@.str.2 = [1 x i8] zeroinitializer
@__const.main.menue = [3 x [30 x i8]] [[30 x i8] c"Sammelbilderproblem\00\00\00\00\00\00\00\00\00\00\00", [30 x i8] c"Statistik der Treffer\00\00\00\00\00\00\00\00\00", [30 x i8] c"Programm beenden\00\00\00\00\00\00\00\00\00\00\00\00\00\00"]
@.str.3 = [61 x i8] c"\0A\0AEs soll ein Sammelbilderproblem-Statistik erzeugt werden:\0A\00"
@.str.4 = [60 x i8] c"Wie viele verschiedene Sammelbilder gibt es [1 \E2\80\93 1000] ?\09\00"
@.str.5 = [42 x i8] c"Wie viele Kunden kaufen [1 \E2\80\93 100000] ?\09\00"
@.str.6 = [140 x i8] c"\0A\0AEs soll die H\C3\A4ufigkeit, mit der die Anzahl vorkommt, d.h. die Anzahl Kunden, die genau AVS viele Sammelbilder haben, ausgegeben werden.\0A\00"
@.str.7 = [64 x i8] c"Wie viele Kunden kaufen genau 23 Sammelbilder [1 \E2\80\93 100000] ?\09\00"
@.str.8 = [38 x i8] c"\0ADas Programm wird beendet. See You!\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i32
%5 = alloca [3 x [30 x i8]]
store i32 0, i32* %1
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str, i64 0, i64 0))
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([619 x i8], [619 x i8]* @.str.1, i64 0, i64 0))
store i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0), i8** %2
store i32 0, i32* %3
store i32 0, i32* %4
%8 = bitcast [3 x [30 x i8]]* %5 to i8*
%9 = getelementptr inbounds [3 x [30 x i8]], [3 x [30 x i8]]* %5, i64 0, i64 0
%10 = call i32 (i32, i32, [30 x i8]*, ...) bitcast (i32 (...)* @waehle_aus_menue to i32 (i32, i32, [30 x i8]*, ...)*)(i32 3, i32 30, [30 x i8]* %9)
switch i32 %10, label %29 [
i32 1, label %11
i32 2, label %20
]
11: ; preds = %0
%12 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.3, i64 0, i64 0))
store i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.4, i64 0, i64 0), i8** %2
%13 = load i8*, i8** %2
%14 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* %13, i32 1, i32 1000)
store i32 %14, i32* %3
store i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.5, i64 0, i64 0), i8** %2
%15 = load i8*, i8** %2
%16 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* %15, i32 1, i32 100000)
store i32 %16, i32* %4
%17 = load i32, i32* %3
%18 = load i32, i32* %4
%19 = call i32 (i32, i32, ...) bitcast (i32 (...)* @schreibe_statistik_sammelbilderproblem to i32 (i32, i32, ...)*)(i32 %17, i32 %18)
br label %31
20: ; preds = %0
%21 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([140 x i8], [140 x i8]* @.str.6, i64 0, i64 0))
store i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.4, i64 0, i64 0), i8** %2
%22 = load i8*, i8** %2
%23 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* %22, i32 1, i32 1000)
store i32 %23, i32* %3
store i8* getelementptr inbounds ([64 x i8], [64 x i8]* @.str.7, i64 0, i64 0), i8** %2
%24 = load i8*, i8** %2
%25 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* %24, i32 1, i32 100000)
store i32 %25, i32* %4
%26 = load i32, i32* %3
%27 = load i32, i32* %4
%28 = call i32 (i32, i32, ...) bitcast (i32 (...)* @schreibe_statistik_der_treffer to i32 (i32, i32, ...)*)(i32 %26, i32 %27)
br label %31
29: ; preds = %0
%30 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.8, i64 0, i64 0))
br label %31
31: ; preds = %29, %20, %11
%32 = load i32, i32* %1
ret i32 %32
}

LLVM IR (-O2):
@__const.main.menue = [3 x [30 x i8]] [[30 x i8] c"Sammelbilderproblem\00\00\00\00\00\00\00\00\00\00\00", [30 x i8] c"Statistik der Treffer\00\00\00\00\00\00\00\00\00", [30 x i8] c"Programm beenden\00\00\00\00\00\00\00\00\00\00\00\00\00\00"]
@.str.3 = [61 x i8] c"\0A\0AEs soll ein Sammelbilderproblem-Statistik erzeugt werden:\0A\00"
@.str.4 = [60 x i8] c"Wie viele verschiedene Sammelbilder gibt es [1 \E2\80\93 1000] ?\09\00"
@.str.5 = [42 x i8] c"Wie viele Kunden kaufen [1 \E2\80\93 100000] ?\09\00"
@.str.6 = [140 x i8] c"\0A\0AEs soll die H\C3\A4ufigkeit, mit der die Anzahl vorkommt, d.h. die Anzahl Kunden, die genau AVS viele Sammelbilder haben, ausgegeben werden.\0A\00"
@.str.7 = [64 x i8] c"Wie viele Kunden kaufen genau 23 Sammelbilder [1 \E2\80\93 100000] ?\09\00"
@.str.8 = [38 x i8] c"\0ADas Programm wird beendet. See You!\0A\00"
@str = [59 x i8] c"\0ADas Prorgramm simuliert die folgende Situation wie folgt:\00"
@str.9 = [618 x i8] c"\0AEin Hersteller legt seinem Produkt jeweils ein Sammelbild bei (z.B. das Bild eines Spielers der\0Adeutschen Nationalmannschaft bei der Fu\C3\9Fball-WM). Dabei ist er fair, d.h. die verschiedenen Sammelbilder\0Awerden gleich h\C3\A4ufig beigelegt.\0A\0AEs gibt s verschiedene Sammelbilder. Folgende Fragestellungen dr\C3\A4ngen sich auf:\0A\0A1. Wie viele Exemplare des Produkts mu\C3\9F ein Kunde kaufen, bis er \C3\BCber eine vollst\C3\A4ndige Kollektion\0Aaller Sammelbilder verf\C3\BCgt? (Sammelbilderproblem)\0A\0A2. Eine Anzahl von k Kunden kaufen jeweils genau s Exemplare des Produktes. Wie viele\0Averschiedene Sammelbilder wird jeder dieser Kunden haben?\0A\00"
define i32 @main() {
%1 = alloca [3 x [30 x i8]]
%2 = tail call i32 bitcast (i32 (...)* @puts to i32 (i8*)*)(i8* getelementptr inbounds ([59 x i8], [59 x i8]* @str, i64 0, i64 0))
%3 = tail call i32 bitcast (i32 (...)* @puts to i32 (i8*)*)(i8* getelementptr inbounds ([618 x i8], [618 x i8]* @str.9, i64 0, i64 0))
%4 = getelementptr inbounds [3 x [30 x i8]], [3 x [30 x i8]]* %1, i64 0, i64 0, i64 0
%5 = getelementptr inbounds [3 x [30 x i8]], [3 x [30 x i8]]* %1, i64 0, i64 0
%6 = call i32 (i32, i32, [30 x i8]*, ...) bitcast (i32 (...)* @waehle_aus_menue to i32 (i32, i32, [30 x i8]*, ...)*)(i32 3, i32 30, [30 x i8]* %5)
switch i32 %6, label %17 [
i32 1, label %7
i32 2, label %12
]
7: ; preds = %0
%8 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.3, i64 0, i64 0))
%9 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.4, i64 0, i64 0), i32 1, i32 1000)
%10 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.5, i64 0, i64 0), i32 1, i32 100000)
%11 = call i32 (i32, i32, ...) bitcast (i32 (...)* @schreibe_statistik_sammelbilderproblem to i32 (i32, i32, ...)*)(i32 %9, i32 %10)
br label %19
12: ; preds = %0
%13 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([140 x i8], [140 x i8]* @.str.6, i64 0, i64 0))
%14 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.4, i64 0, i64 0), i32 1, i32 1000)
%15 = call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @erfasse_ganze_zahl to i32 (i8*, i32, i32, ...)*)(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @.str.7, i64 0, i64 0), i32 1, i32 100000)
%16 = call i32 (i32, i32, ...) bitcast (i32 (...)* @schreibe_statistik_der_treffer to i32 (i32, i32, ...)*)(i32 %14, i32 %15)
br label %19
17: ; preds = %0
%18 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.8, i64 0, i64 0))
br label %19
19: ; preds = %17, %12, %7
ret i32 0
}