Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Roemische Zahlen zu Arabischen Zahlen


mak1991 - Di 01.11.11 02:05
Titel: Roemische Zahlen zu Arabischen Zahlen
Hallo,
also ich soll ein programm entwickeln das das kann.

hier mal meine function:

Delphi-Quelltext
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:
function zahlrtoa(zahl1: string): string;
var
  buchstaben: array [1 .. 13of string;
  zahlen: array [1 .. 13of integer;
  x, y: byte;
  zahl: cardinal;
begin
  zahlen[1] := 1000;
  zahlen[2] := 900;
  zahlen[3] := 500;
  zahlen[4] := 400;
  zahlen[5] := 100;
  zahlen[6] := 90;
  zahlen[7] := 50;
  zahlen[8] := 40;
  zahlen[9] := 10;
  zahlen[10] := 9;
  zahlen[11] := 5;
  zahlen[12] := 4;
  zahlen[13] := 1;
  buchstaben[1] := 'M';
  buchstaben[2] := 'CM';
  buchstaben[3] := 'D';
  buchstaben[4] := 'CD';
  buchstaben[5] := 'C';
  buchstaben[6] := 'XC';
  buchstaben[7] := 'L';
  buchstaben[8] := 'XL';
  buchstaben[9] := 'X';
  buchstaben[10] := 'IX';
  buchstaben[11] := 'V';
  buchstaben[12] := 'IV';
  buchstaben[13] := 'I';
  x := 0;
  zahl := 0;
  repeat
    inc(x);
    repeat
      if (pos(buchstaben[x], zahl1) <> 0and (pos(buchstaben[x + 1], zahl1) = 0)
      then
      begin
        y := pos(buchstaben[x], zahl1);
        zahl := zahl + zahlen[x];
        delete(zahl1, y, 1);
      end
      else
      begin
        repeat
          inc(x);
          y := pos(buchstaben[x], zahl1);
          zahl := zahl + zahlen[x];
          delete(zahl1, y, length(buchstaben[x]));
          dec(x)
        until pos(buchstaben[x], zahl1) = 0;
      end;
    until pos(buchstaben[x], zahl1) = 0;
  until zahl1 = '';
  zahlrtoa := inttostr(zahl);
end;

nehmen wir einfach die zahl: MCMLXII sollte 1962 raus kommen doch es kommt 3110 raus :(


Moderiert von user profile iconMartok: Topic aus VCL (Visual Component Library) verschoben am Di 01.11.2011 um 07:04
Moderiert von user profile iconNarses: Zusätzliche Quote-Tags entfernt.


Teekeks - Di 01.11.11 09:20

Das liegt daran dass du nicht auswertest ob nach einem Buchstaben (bei dir z.B. C) nicht noch ein höherwertiger kommt (also M) wodurch das C und M nicht einfach hinzu addiert werden dürfen, sondern du den wert von M-C dazu addieren musst.


Jann1k - Di 01.11.11 12:56

Die Umwandlung kannst du gut mit einer Schleife lösen: Dazu gehst du die römische Zahl von rechts nach links durch. Ist an der aktuellen Stelle ein Zeichen mit Wert größer oder gleich dem zuletzt gelesenen, wird der Wert zur Gesamtsumme hinzuaddiert, andernfalls subtrahiert. Versteht sich von selbst, dass die Zahl ganz rechts immer hinzuaddiert wird ;)