aboutsummaryrefslogtreecommitdiff
path: root/Info/11/NTG/2/Caesar-Implementierung/schwer.md
blob: e7c79b6a798e1e31eadc6d3256aaf21302190732 (plain)
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
---
  author: Florian Fischer
  lang: de
  title: Cesar Implementierung schwer
---

<details>
<summary>
**Wie bekomme ich jedes Zeichen in einem Text?**
</summary>

Java bietet die Methode [`char String.charAt(int pos)`{.java}](), um auf ein einzelnes Zeichen (`char`{.java}) in einem String an der 0-indizierten Stelle `pos`{.java} zuzugreifen.

Mit einer `for`{.java} Schleife und der Länge des Strings ([`String.length()`{.java}]()) hast du alles was du brauchst.
</details>

<details>
<summary>
**Wie erkenne ich schreibbare ASCII Zeichen?**
</summary>

* Alle nichtschreibbaren ASCII Zeichen kommen vor dem Leerzeichen.
* Siehe: ASCII-Tabelle ([Wikipedia](https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-Tabelle))
</details>

<details>
<summary>
**Wie schaffe ich es, den Zeichenbereich nicht zu verlasse?**
</summary>

* Mit dem [Modulo-Operator `%`](https://de.wikipedia.org/wiki/Modulo)
* oder mit geeigneten `if`{.java} Bedingungen kannst du dafür sorgen, dass dein neues Zeichen immer noch im Zeichenbereich liegt. <!-- Find easier modulo explanation -->
</details>

<details>
<summary>
**Wie kann ich einen neuen `String`{.java} zusammenbauen?**
</summary>

Du kannst einzelne Zeichen zu einem `String`{.java} einfach mit dem Plus-Operator `+` hinzufügen.
</details>

<details>
<summary>
**Wie kann ich `int`{.java} in `char`{.java} umwandeln?**
</summary>

In Java können Daten vom Typ `int`{.java} mit einem [Type-Cast]() zum Typ `char`{.java} umgewandelt werden.
Auch das Ergebnis einer Rechnungen kann umgewandelt werden.

* `char c = (char)27; // Umwandlung einer Zahl`{.java}
* `char c = (char)("a".charAt(0) + 27); // Umwandlung eines Ergebnisses`{.java}
</details>

<details>
<summary>
**Lösung**
</summary>
Sicher dass du die Lösung sehen willst?
<details>
<summary>
**Ja!**
</summary>
<details>
<summary>
`String caesar(String eingabe, int verschiebung)`{.java}
</summary>
```java
/**
 * Das gesamte schreibbare Alphabet der ASCII Tabelle
 */
static final String ALPHABET = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

static String caesar(String eingabe, int verschiebung) {
    String ausgabe = "";
    for (int i = 0; i < eingabe.length(); i++) {
        // Das erste schreibbare Zeichen hat den Zahlenwert 33
        int pos = eingabe.charAt(i) - 33;
        // Uebernehme nicht schreibbare Zeichen direkt
        if(pos < 0) {
            ausgabe += eingabe.charAt(i);
            continue;
        }

        // Berechne die neue Position im Alphabet
        int newPos = (pos + verschiebung);
        // Positiver Ueberlauf
        if(newPos >= ALPHABET.length()) {
            newPos = newPos - ALPHABET.length();
        } // Negativer Ueberlauf
        else if(newPos < 0) {
            newPos = newPos + ALPHABET.length();
        }

        ausgabe += ALPHABET.charAt(newPos);
    }
    return ausgabe;
}
```
</details>

<details>
<summary>
`String entschluesseln(String geheimtext, int schluessel)`{.java}
</summary>
```java
static String entschluesseln(String geheimtext, int schluessel) {
    // Um die selbe Anzahl an Stellen in die entgegengesetze Richtung
    // verschieben, erzeugt wieder den Klartext.
    return caesar(geheimtext, -schluessel);
}
```
</details>
</details>
</details>