ich hätte da eine frage zu der sprache oberon.
es geht um eine prozedur bei der man großbuchstaben in kleinbuchstaben umwandelt.
Hier das Programm:
VAR s: ARRAY 80 OF CHAR;
s:= "Ursula Engelen-Kiefer";
ToLower (s);
Write.String(s)
PROCEDURE ToLower (VAR s: ARRAY OF CHAR)
VAR i : INTEGER;
BEGIN
i:=0;
WHILE (i < LEN (s)) & (s<i> # OX ) DO
IF (s<i> >= "A") & (s<i> <= "Z") THEN
s<i> := CHR (ORD ("a") + ORD (s<i>) - ORD ("A") ) ;
END;
INC (i);
END;
END ToLower;
Meine Frage:
Ich verstehe die Zeile mit den Ordnungsnummern nicht
s<i>:= CHR (ORD ("a") + ORD (s<i>) - ORD ("A")
bedeutet hier CHR auch character oder etwas anderes und wieso muss ich a + s<i> - A rechnen?
Ich hoffe es kann mir jemand weiterhelfen !
Vielen lieben Dank schon mal!
Grüßle Kuesschen
Problem mit Oberon-Prozedur
Re: Problem mit Oberon-Prozedur
Lehrt man euch heutzutage denn keine ASCII Tabelle mehr?
Schau dir mal zur Hilfe eine ASCII Tabelle <a href="http://www.asciitable.com/" target="_blank"><!--auto-->http://www.asciitable.com/</a><!--auto--> an und spiel mal das ganze für z.B. 'd' durch:
Bei einem Aufruf von ToLower("D") wird dann folgendes gemacht:
s := CHR( ORD("a") + ORD("D") - ORD("A") );
jetzt setzen wir für ORD("...") die jeweilige ASCII Zeichennummer ein:
ORD("a") => 97
ORD("D") => 68
ORD("A") => 65
s := CHR( 97 + 68 - 65 );
s := CHR( 100 );
laut ASCII Tabelle ist das Zeichen mit der Nummer 100 ein "d"
Schlussendlich musst du noch den Integer wieder in einen Character umwandeln, also fluggs CHAR(100) aufrufen und in der Variable s steht dein Character als Kleinbuchstabe.
Schau dir mal zur Hilfe eine ASCII Tabelle <a href="http://www.asciitable.com/" target="_blank"><!--auto-->http://www.asciitable.com/</a><!--auto--> an und spiel mal das ganze für z.B. 'd' durch:
Bei einem Aufruf von ToLower("D") wird dann folgendes gemacht:
s := CHR( ORD("a") + ORD("D") - ORD("A") );
jetzt setzen wir für ORD("...") die jeweilige ASCII Zeichennummer ein:
ORD("a") => 97
ORD("D") => 68
ORD("A") => 65
s := CHR( 97 + 68 - 65 );
s := CHR( 100 );
laut ASCII Tabelle ist das Zeichen mit der Nummer 100 ein "d"
Schlussendlich musst du noch den Integer wieder in einen Character umwandeln, also fluggs CHAR(100) aufrufen und in der Variable s steht dein Character als Kleinbuchstabe.
Re: Problem mit Oberon-Prozedur
Auch wenn der Compiler die Konstantenarithmetik weg-optimiert, sollte man lehren, das solches nicht in Schleifen gehört!
ORD ("a") - ORD ("A")
... und übrigens das inc(i) sollte doch wohl auch zu irgend etwas gut sein oder?
ORD ("a") - ORD ("A")
... und übrigens das inc(i) sollte doch wohl auch zu irgend etwas gut sein oder?
Re: Problem mit Oberon-Prozedur
Das INC(i); wird als eine Art Schleifenzähler verwendet. So nach der Art for(int i=0;i<strlen(s);++i)
Ich habe den Code mal etwas schöner formatiert, damit mans besser sieht:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
MODULE LowerCase;
IMPORT Out;
PROCEDURE ToLower (VAR s: ARRAY OF CHAR)
VAR
i : INTEGER;
zeichen : INTEGER;
diff : INTEGER;
BEGIN
diff := ORD("a") - ORD("A");
i:=0;
WHILE (i < LEN(s)) & (s # OX ) DO
IF (s >= "A") & (s <= "Z") THEN
zeichen := ORD(s);
s := CHR(zeichen + diff) ;
END;
INC (i);
END;
END ToLower;
VAR
s: ARRAY 80 OF CHAR;
BEGIN
s := "Ursula Engelen-Kiefer";
ToLower (s);
Out.String(s)
END LowerCase.
</font><hr></pre></blockquote>
Ich habe den Code mal etwas schöner formatiert, damit mans besser sieht:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
MODULE LowerCase;
IMPORT Out;
PROCEDURE ToLower (VAR s: ARRAY OF CHAR)
VAR
i : INTEGER;
zeichen : INTEGER;
diff : INTEGER;
BEGIN
diff := ORD("a") - ORD("A");
i:=0;
WHILE (i < LEN(s)) & (s # OX ) DO
IF (s >= "A") & (s <= "Z") THEN
zeichen := ORD(s);
s := CHR(zeichen + diff) ;
END;
INC (i);
END;
END ToLower;
VAR
s: ARRAY 80 OF CHAR;
BEGIN
s := "Ursula Engelen-Kiefer";
ToLower (s);
Out.String(s)
END LowerCase.
</font><hr></pre></blockquote>
Re: Problem mit Oberon-Prozedur
..
Var
a : Char;
..
if (a in ['A'..'Z'])
..
oder
..
case a of
'A'..'Z' : ->...
End;
..
just a try
Var
a : Char;
..
if (a in ['A'..'Z'])
..
oder
..
case a of
'A'..'Z' : ->...
End;
..
just a try
Re: Problem mit Oberon-Prozedur
Der alte Niklaus hätte seine Freude! Schön, daß es Menschen gibt, die nicht nur Murks++ können. Na ja, ein Verschnitt wär mir wohl das liebere.
Re: Problem mit Oberon-Prozedur
Warum muessen es immer HLL sein?
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
; File: lowercase.asm
; Descrition: converts string to lowercase
; Autor: bazik <bazik@0x1337.net>
format ELF executable
entry start
section readable writeable
sTmp db "Ursula Engele-Kiefer", 0xA
nLen = $ - sTmp
section readable executable
start:
mov esi, sTmp
.loop:
mov al, byte [esi]
or al, al
jz .exit
cmp al, 'A'
jl .skip
cmp al, 'Z'
jg .skip
or al, 0x20
.skip:
mov byte [esi], al
inc esi
jmp .loop
.exit:
mov eax, 4
mov ebx, 1
mov ecx, sTmp
mov edx, nLen
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
; File: lowercase.asm
; Descrition: converts string to lowercase
; Autor: bazik <bazik@0x1337.net>
format ELF executable
entry start
section readable writeable
sTmp db "Ursula Engele-Kiefer", 0xA
nLen = $ - sTmp
section readable executable
start:
mov esi, sTmp
.loop:
mov al, byte [esi]
or al, al
jz .exit
cmp al, 'A'
jl .skip
cmp al, 'Z'
jg .skip
or al, 0x20
.skip:
mov byte [esi], al
inc esi
jmp .loop
.exit:
mov eax, 4
mov ebx, 1
mov ecx, sTmp
mov edx, nLen
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
; File: lowercase.asm
; Descrition: converts string to lowercase
; Autor: bazik <bazik@0x1337.net>
format ELF executable
entry start
section readable writeable
sTmp db "Ursula Engele-Kiefer", 0xA
nLen = $ - sTmp
section readable executable
start:
mov esi, sTmp
.loop:
mov al, byte [esi]
or al, al
jz .exit
cmp al, 'A'
jl .skip
cmp al, 'Z'
jg .skip
or al, 0x20
.skip:
mov byte [esi], al
inc esi
jmp .loop
.exit:
mov eax, 4
mov ebx, 1
mov ecx, sTmp
mov edx, nLen
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
; File: lowercase.asm
; Descrition: converts string to lowercase
; Autor: bazik <bazik@0x1337.net>
format ELF executable
entry start
section readable writeable
sTmp db "Ursula Engele-Kiefer", 0xA
nLen = $ - sTmp
section readable executable
start:
mov esi, sTmp
.loop:
mov al, byte [esi]
or al, al
jz .exit
cmp al, 'A'
jl .skip
cmp al, 'Z'
jg .skip
or al, 0x20
.skip:
mov byte [esi], al
inc esi
jmp .loop
.exit:
mov eax, 4
mov ebx, 1
mov ecx, sTmp
mov edx, nLen
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
</font><hr></pre></blockquote>
Re: Problem mit Oberon-Prozedur
Verdammt, im 2ten CODE Tag wollte ich eigentlich folgendes einfuegen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
bazik@exodus temp $ fasm lowercase.asm lowercase
flat assembler version 1.46
2 passes, 194 bytes.
bazik@exodus temp $ chmod +x lowercase
bazik@exodus temp $ ./lowercase
ursula engele-kiefer
bazik@exodus temp $
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
bazik@exodus temp $ fasm lowercase.asm lowercase
flat assembler version 1.46
2 passes, 194 bytes.
bazik@exodus temp $ chmod +x lowercase
bazik@exodus temp $ ./lowercase
ursula engele-kiefer
bazik@exodus temp $
</font><hr></pre></blockquote>
Re: Problem mit Oberon-Prozedur
<pre>(* Was wird denn nun mit dem Array-Index? *)
s[<!--no-->i<!--no-->]</pre>
HLL? Naja, halt mehr Code bei weniger Zeilen, aber es geht ja noch etwas kürzer:
Also wer bringt endlich die Variante mit der Bitmaske, das reicht doch bei dem bischen ascii a..z,A..Z
s[<!--no-->i<!--no-->]</pre>
HLL? Naja, halt mehr Code bei weniger Zeilen, aber es geht ja noch etwas kürzer:
Also wer bringt endlich die Variante mit der Bitmaske, das reicht doch bei dem bischen ascii a..z,A..Z