Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Problem mit Oberon-Prozedur

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Kuesschen
Gast





BeitragVerfasst am: 10. Apr 2003 11:35   Titel: Problem mit Oberon-Prozedur

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 # OX ) DO
IF (s >= "A") & (s <= "Z") THEN
s := CHR (ORD ("a") + ORD (s) - ORD ("A") ) ;
END;
INC (i);
END;
END ToLower;

Meine Frage:
Ich verstehe die Zeile mit den Ordnungsnummern nicht
s:= CHR (ORD ("a") + ORD (s) - ORD ("A")
bedeutet hier CHR auch character oder etwas anderes und wieso muss ich a + s - A rechnen?
Ich hoffe es kann mir jemand weiterhelfen !
Vielen lieben Dank schon mal!
Grüßle Kuesschen Smile
 

Descartes
Gast





BeitragVerfasst am: 11. Apr 2003 20:10   Titel: Re: Problem mit Oberon-Prozedur

Lehrt man euch heutzutage denn keine ASCII Tabelle mehr?

Schau dir mal zur Hilfe eine ASCII Tabelle http://www.asciitable.com/ 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
Gast





BeitragVerfasst am: 13. Apr 2003 3:20   Titel: 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?
 

Descartes
Gast





BeitragVerfasst am: 13. Apr 2003 8:42   Titel: 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:

code:

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.

 

Andreas B.
Gast





BeitragVerfasst am: 15. Apr 2003 1:38   Titel: Re: Problem mit Oberon-Prozedur

..
Var
a : Char;

..

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

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

just a try
 

Blaise P.
Gast





BeitragVerfasst am: 18. Apr 2003 13:11   Titel: 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.
 

bazik
Gast





BeitragVerfasst am: 18. Apr 2003 17:41   Titel: Re: Problem mit Oberon-Prozedur

Warum muessen es immer HLL sein? ;)

code:

; 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



code:

; 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



:D
 

bazik
Gast





BeitragVerfasst am: 18. Apr 2003 17:42   Titel: Re: Problem mit Oberon-Prozedur

Verdammt, im 2ten CODE Tag wollte ich eigentlich folgendes einfuegen:

code:

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 $

 

O. Ptimizer
Gast





BeitragVerfasst am: 18. Apr 2003 18:39   Titel: Re: Problem mit Oberon-Prozedur

(* Was wird denn nun mit dem Array-Index? *)

s[i]


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
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy