Problem mit Oberon-Prozedur

Post Reply
Message
Author
Kuesschen

Problem mit Oberon-Prozedur

#1 Post by Kuesschen »

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 :)

Descartes

Re: Problem mit Oberon-Prozedur

#2 Post by Descartes »

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.

O. Ptimizer

Re: Problem mit Oberon-Prozedur

#3 Post by O. Ptimizer »

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?

Descartes

Re: Problem mit Oberon-Prozedur

#4 Post by Descartes »

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>

Andreas B.

Re: Problem mit Oberon-Prozedur

#5 Post by Andreas B. »

..
Var
a : Char;

..

if (a in ['A'..'Z'])
..

oder
..
case a of
'A'..'Z' : ->...
End;
..

just a try

Blaise P.

Re: Problem mit Oberon-Prozedur

#6 Post by Blaise P. »

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.

bazik

Re: Problem mit Oberon-Prozedur

#7 Post by bazik »

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>

:D

bazik

Re: Problem mit Oberon-Prozedur

#8 Post by bazik »

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>

O. Ptimizer

Re: Problem mit Oberon-Prozedur

#9 Post by O. Ptimizer »

<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

Post Reply