C# :: Aufgabe #400 :: Lösung #1
Ziffern durch Kleinbuchstaben ersetzen (right-shifting)
Die Buchstaben stehen an den geraden und die Ziffern an den ungeraden Stellen (zero-based).
Ziel soll es sein, jede Ziffer durch einen Buchstaben zu ersetzen, indem der vorangestellte Buchstabe
um den Wert der Ziffer gemäß Alphabet nach rechts verschoben wird (right-shifting).
Die Buchstaben bleiben dabei erhalten.
Bei der Erstellung des Ausgangs-Strings soll darauf geachtet werden, dass das Verschieben nicht über 'z' hinausgeht.
Beispiele:
s = "a1c1e1"
Lösung: "abcdef", denn
a >> 1 -> b
c >> 1 -> d
e >> 1 -> f
s = "a4b2c1d5"
Lösung: "aebdcddi", denn
a >> 4 -> e
b >> 2 -> d
c >> 1 -> d
d >> 5 -> i
Erstelle eine Methode/Funktion, die obige Aufgabenstellung umsetzt.
Wer möchte kann die Aufgabe dahingehend erweitern, dass über 'z' hinaus
verschoben wird und das Alphabet von vorne beginnt.
Viel Spaß
System.Console.WriteLine(ReplaceDigits("a4b2c1d5")); static string ReplaceDigits(string s) { var t = s.ToCharArray(); for (int i = 1; i < t.Length; i+=2) t[i] = (char)(t[i - 1] + t[i] - '0'); return new string(t); }
Kommentare:
BaumHaus
Punkte: 0
2 Kommentare
JKooP
Punkte: 18090
680 Aufgaben
227 Lösungen
19 Kommentare
Was gibt es hier zu erklären? Arrays und der Umgang mit ASCII sind elementare Bestandteile der Programmierung.
Wie wäre es mit "debuggen"!? Den Inhalt der Schleife in Teile zerlegen und dann die Teilergebnisse vergleichen. So lernt es sich am besten.
BaumHaus
Punkte: 0
2 Kommentare
ich entschuldige mich für die Formulierung meines erstrigen Kommentars.
Mit Arrays kenne ich mich bedingt aus, allerdings mit ASCII weniger.
Welche Relevanz hat die Null hier in diesem Code.
Lässt man " - '0'" weg, ist im Ergebnis eine Zeichenfolge ('\u0092' [Unicode?]) fest zu stellen.
Wieso ?
Danke im voraus
JKooP
Punkte: 18090
680 Aufgaben
227 Lösungen
19 Kommentare
Alle auf der Tastatur befindlichen Zeichen, so auch die Ziffern 0-9, sind im ASCII-Zeichensatz verankert.
Leider steht die Ziffer 0 nicht an erster respektive nullter Stelle, sondern sie
beginnen bei 48 und enden bei 57.
"a4b2c1d5"
Im ersten Schleifendurchlauf hat t[i] den Wert 52, da sich die Ziffer '4' vom Datentyp "Char" an der 52. Stelle im ASCII-Zeichensatz befindet.
Achtung: Array ist nullbasiert, d.h. die nullte Stelle ist 'a' und die erste '4'.
Will man daraus eine Integer-Zahl, also 4 erzeugen, muss man 48 von 52 abziehen.
In C-basierten Sprachen, zu der auch C# gehört, kann man statt -48 auch -'0' schreiben.
Der Compiler erkennt das und rechnet intern mit 48.
Am Ende wird 'a' + 4 gerechnet, was bedeutet, dass im ASCII-Zeichensatz um 4 Stellen nach rechts gegangen wird, was dem Zeichen 'e' entspricht.
Das funktioniert auch mit jedem anderen Zeichen, z.B. kann man zum Prüfen auf Kleinbuchstaben schreiben:
if(i > 97 && i < 122)
if(i > 'a' && i < 'z')
if(i is > 'a' and < 'z')
Gruß JKooP