Danke Danke:  0
Gefällt mir Gefällt mir:  0
Dislikes Dislikes:  0
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 15 von 47

Thema: Römische Zahlen

  1. #1

    Registriert seit
    23.05.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard Römische Zahlen

    Anzeige
    Hi,
    die folgende Aufgabe stammt von lagalopex (Danke dir) :

    Dezimale Zahlen in Römische Zahlen umwandeln

    Bei Wikipedia ( http://de.wikipedia.org/wiki/Römische_Zahlen ) werden mehrere Arten der
    Umwandlung beschrieben, daher wird die Aufgabe wie folgt eingeschränkt:

    1. Es werden nur die unter "Darstellung" genannten Werte I ... A benutzt.
    2.1 einfache Variante: Es wird die "Einfachen Umrechnung" genutzt.
    2.2 erweiterte Variante: Anwendung der "Subtraktionsregel" (wobei 39 == XXXIX)

    Es ist ein Programm zu schreiben das eine eingegebene Zahl in römischen Ziffern ausgibt.


    Happy Coding,
    Xalon

  2. #2
    Member of Honour Avatar von ivegotmail
    Registriert seit
    28.05.03
    Danke (erhalten)
    1
    Gefällt mir (erhalten)
    4

    Standard

    LISP Version   

    Code:
    #!/usr/bin/clisp
    (format t "Zahl eingeben: ")
    (write (format nil "~@R" (read)))
    :P
    http://livehabo.hackerboard.de | http://livebb.sourceforge.net

  3. #3

    Registriert seit
    01.11.03
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Im Grunde kam diese Aufgabe (als Anfrage, da er es selber nicht hinbekam^^) mal vorm Jahr oder so von einem Klassenkamerad, daher hab ich natürlich auchschon eine Lösung (in C++). Werde aber wohl noch etwas warten, da es eine noch recht einfache Übung ist, von der man aber durch aus lernen kann (sofern man es selber implentiert und es nicht von der Programmiersprache erledigen lässt... *zu-ivegotmail-schiel*)


    btw... Xalon... überprüf mal deine links in der Signatur...

  4. #4

    Registriert seit
    22.11.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    @ivegotmail wie wärs den code in spoilertags zu verschachteln? falls einer das noch nicht sehen will oder so

  5. #5

    Registriert seit
    09.12.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    So ich hab mich ma rangesetzt.

    Ich weiß ist nicht so das gelbe vom Ei, aber es sollte alles funzen^^.

    Die eine Zeile ist natürlich nur fürs debuggen gedacht... es gab - wie immer - logische Denkfehler. Sollte da immer noch ein Fehler drin sein, schieb ichs einfach mal auf die Uhrzeit.

    mfg,
    crack

    //edit:
    aso 2 Sachen die ich grad noch vergessen hab.

    1. -> Alles in Delphi mitm Borland Compiler
    2. -> Der erste Anhang ist die .exe und der zweite der Source.

    So und nun gn8, hat aber Spaß gemacht !

    //edit2:
    grml doch nochn Fehler gefunden. Ne 9 ist bei mir kein IX sondern ein VIIII... egal^^, mach ich Morgen weiter. Ma sehn vielleicht hat mich bis dahin ja schon jemand verbessert.
    Angehängte Dateien Angehängte Dateien

  6. #6
    Avatar von BasicAvid
    Registriert seit
    17.03.04
    Danke (erhalten)
    3
    Gefällt mir (erhalten)
    7

    Standard

    Hier mal eine Additionsversion in PHP.

    PHP Version   

    PHP-Code:
    <?php
    $romZahl 
    1984;
    $arrRoemisch = array('I' => 1,
                         
    'V' => 5,
                         
    'X' => 10,
                         
    'L' => 50,
                         
    'C' => 100,
                         
    'D' => 500,
                         
    'M' => 1000,
                         
    'A' => 5000
                        
    );
                        
    $arrTypen = array();
    $arrRom array_keys($arrRoemisch);
    $j 7;
    $check true;

    while(
    $check) {
        if (
    $romZahl >= $arrRoemisch[$arrRom[$j]]) {
            
    $romZahl-= $arrRoemisch[$arrRom[$j]];
            
    $arrTypen[$arrRom[$j]]+=1;
            
    $strRom.=$arrRom[$j];    
        }
        
        if (
    $romZahl $arrRoemisch[$arrRom[$j]]) {
                
    $j--;
        }        
          
        if (
    $romZahl == 0) {
                
    $check false;
            }
    }

    print_r($arrTypen);                    
    echo 
    '<br />'.$strRom;

    ?>
    Mfg Basic Avid
    - Use it or be used! -

  7. #7

    Registriert seit
    09.12.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    @ BasicAvid:
    Ist bei dir genau das selbe Problem.
    Dein Script spuckt nämlich
    MDCCCCLXXXIIII

    statt
    MDCCCCLXXXIV
    aus.

    Genau wie bei mir^^
    Naja hab noch nicht weitergemacht, bin jetzt erstmal bis zum Abend weg. Man sieht sich!

    mfg,
    crack

  8. #8

    Registriert seit
    01.11.03
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Daher gibt es ja die einfache Version!
    Tipp für Punkt 2.2 "Subtraktionsregel"   
    Wenn die einfache funktioniert muss man nur etwas weiterdenken und man hat die schwere auch recht schnell!
    genauer Tipp   
    Man kann dies mit der Einführung von Ziffern für 4, 40, 400 (IV, XL, CD) und 9, 90, 900 (IX, XC, CM) vergleichen

  9. #9
    Avatar von BasicAvid
    Registriert seit
    17.03.04
    Danke (erhalten)
    3
    Gefällt mir (erhalten)
    7

    Standard

    Warum? Das passt doch! Ich hab die Additionsmethode sprich die einfache genommen.
    Mfg Basic Avid
    - Use it or be used! -

  10. #10
    Moderator Avatar von CDW
    Registriert seit
    20.07.05
    Danke (erhalten)
    26
    Gefällt mir (erhalten)
    823

    Standard

    MASM (sollte in NASM nicht anders aussehen ), 16-Bit DOSe kompatibel. Assemblierbar mit einer älteren MASM Version per "ml rom.asm /AT". Bei den neueren müsste man tricksen.
    Code   

    Subtraktionsregel. Umrechnung von String zum Integer gleich mitbegriffen. Maximale Eingabe ist 0xFFFF bzw 65535 ;).
    Code:
    CSEG segment
    org 100h
    MAX_INPUT equ 10
    Begin:
       ;//Einlesen
        mov ah,0ah
        mov dx,offset input
        int 21h
        ;gleich einen Zeilenumbruch nachschieben
         mov ah,06
         mov dl,10
         int 21h
    
        ;umrechenen Ascii2Number
         mov bx,offset input
         xor cx,cx
         mov cl,byte ptr[bx+1] ;wieviele Zeichen eingelesen
        
         add bx,1 ;offset in position bringen
         add bx,cx
    
         xor ax,ax
         mov di,1
         xor si,si
         
         ASCII2WORD_LOOP:
            xor ax,ax
            mov al,byte ptr [bx]
            sub al,'0' 
            mul di
            add si,ax
            mov ax,di
            mov di,10
            mul di
            mov di,ax      
            dec bx
            dec cx       
          jnz ASCII2WORD_LOOP
    ;in SI ist jetzt die umgerechnete Eingabe
    ;jetzt römisch ausgeben (subtraktionsform)    
    
    
    mov ax,si
    mov si,offset rom
    mov di, offset dez
    mov cx,14 ;anzahl der Zahlen
    
    WORD2ROM_LOOP:
       mov bx,di
       mov dx,[bx] ;zahl
       mov bx,dx
       xor dx,dx
       div bx
       ;ergebnis: in AX Anzahl der Buchstaben zum Ausgeben, DX ist der Rest, der verbleibt
       test ax,ax
       push dx
       jz @f ;wenn 0, dann nichts ausgeben
       
       push cx
       mov cx,ax
       
       OUT_LOOP:
        mov ah,9
        mov dx,si
        int 21h
       loop OUT_LOOP   
       pop cx
       
       @@:
       pop ax  ;werte tauschen
       add si,3
       add di,2
       loop WORD2ROM_LOOP
       ;konsole nciht gleich schließen
       int 20h
    
    rom db "A$",0,"M$",0,"CM$","D$",0,"CD$","C$",0,"XC$","L$",0,"XL$","X$",0,"IX$","V$",0,"IV$","I$"
    dez dw 5000,1000,900,500,400,  100, 90,  50,  40, 10, 9,         5,   4, 1
    input db MAX_INPUT
    CSEG ends
    end Begin
    Wem der Code etwas seltsam erscheint: es gelten die 8086 Einschränkungen (zumindest laut dem Assembler :rolleyes: ). Und wenn man bedenkt, dass hier auch gleich die String2Int routine mit drinsteckt, ist es auch nicht so viell Code ;)

    Im Anhang die fertige Binary, die rund 10 mal kleiner ist, als der Quellcode (das fesselt mich so an dieses format - nichts überflüssiges ). Nach dem Download die Endung "TXT" abschneiden.

    Und wer sich gar nciht für sowas begeistern kann:Ja, ich jage gerne meinen Elefanten auf Händen und Knien *fg*
    Angehängte Dateien Angehängte Dateien
    Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
    Selig, wer nichts zu sagen hat und trotzdem schweigt.

  11. #11

    Registriert seit
    22.11.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Original von Crack

    Dein Script spuckt nämlich
    MDCCCCLXXXIIII

    statt
    MDCCCCLXXXIV
    aus.
    darf bei den römischen ziffern afaik ein buchstabe nicht höchstens 3 mal hintereinander stehen? also wegen cccc meine ich

  12. #12

    Registriert seit
    01.11.03
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Original von Mc Goodi
    darf bei den römischen ziffern afaik ein buchstabe nicht höchstens 3 mal hintereinander stehen? also wegen cccc meine ich
    Das stimmt nur, wenn man die Subtraktionsregel nicht anwendet! (Was im einfachen Fall der Aufgabenstellung entspricht)

  13. #13

    Registriert seit
    09.12.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Original von lagalopex
    Original von Mc Goodi
    darf bei den römischen ziffern afaik ein buchstabe nicht höchstens 3 mal hintereinander stehen? also wegen cccc meine ich
    Das stimmt nur, wenn man die Subtraktionsregel nicht anwendet! (Was im einfachen Fall der Aufgabenstellung entspricht)
    Japp sorry, hatte den Artikel von Wikipedia nicht gelesen sondern hab einfach gedacht die Schreibweise wäre falsch weil es mir - wie Mc Goodi es schon sagte - auch so beigebracht wurde. In dem Fall ist natürlich auch das Vierfache C falsch.

  14. #14

    Registriert seit
    20.11.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Eine PHP funktion. Kann wahlweise verkürzen oder nicht.

    PHP   
    PHP-Code:
    <?php

        
        
    echo "1984 - ".Roemisch(1984,False)." - ".Roemisch(1984)."<br>";
        echo 
    "2006 - ".Roemisch(2006,False)." - ".Roemisch(2006)."<br>";
        echo 
    "5000 - ".Roemisch(5000,False)." - ".Roemisch(5000)."<br>";
        
        
        
        Function 
    Roemisch($Wert,$Kurz=True)
        {
            
    $Zahlen[0]=array(1        ,"I"    ,1);
            
    $Zahlen[1]=array(5        ,"V"    ,5);
            
    $Zahlen[2]=array(10        ,"X"    ,1);
            
    $Zahlen[3]=array(50        ,"L"    ,5);
            
    $Zahlen[4]=array(100    ,"C"    ,1);
            
    $Zahlen[5]=array(500    ,"D"    ,5);
            
    $Zahlen[6]=array(1000    ,"M"    ,1);
            
    $Zahlen[7]=array(5000    ,"A"    ,5);
        
        
            
    //Unverkürzt berechnen
            
    For($Nummer=count($Zahlen)-1;$Nummer>-1;$Nummer--)
            {
                
                While(
    $Wert>=$Zahlen[$Nummer][0])
                {
                    
    $Wert=$Wert-$Zahlen[$Nummer][0];
                    
    $Ausgabe=$Ausgabe.$Zahlen[$Nummer][1];
                }
                
                
            }
            
    //Kürzen
            
    IF($Kurz==True)
            {
                For(
    $Nummer=count($Zahlen)-2;$Nummer>-1;$Nummer--)
                {    
                    
    // "9" berücksichtigen
                    
    IF($Zahlen[$Nummer][2]==5)
                    {
                        
    $Ausgabe=ereg_replace($Zahlen[$Nummer][1].$Zahlen[$Nummer-1][1].$Zahlen[$Nummer-1][1].$Zahlen[$Nummer-1][1].$Zahlen[$Nummer-1][1],$Zahlen[$Nummer-1][1].$Zahlen[$Nummer+1][1],$Ausgabe);
                    }
                    
                    
    // "4" berücksichtigen
                    
    $Ausgabe=ereg_replace($Zahlen[$Nummer][1].$Zahlen[$Nummer][1].$Zahlen[$Nummer][1].$Zahlen[$Nummer][1],$Zahlen[$Nummer][1].$Zahlen[$Nummer+1][1],$Ausgabe);
                }
            }
            return 
    $Ausgabe;
        }

    ?>

  15. #15

    Registriert seit
    02.08.05
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Anzeige
    @CraHack: bei dir fehlt laut wikipedia noch "$Zahlen[7]=array(5000, "A", 5);"

    cYa

Ähnliche Themen

  1. Zahlen per SMS
    Von Dawen im Forum Internet Allgemein
    Antworten: 3
    Letzter Beitrag: 06.07.08, 01:22
  2. Zahlen ordnen C++
    Von Tux1990 im Forum Code Kitchen
    Antworten: 3
    Letzter Beitrag: 26.02.07, 18:02
  3. Antworten: 7
    Letzter Beitrag: 13.12.06, 07:59
  4. Problem mit Zahlen in PHP!
    Von PtB im Forum (Web-) Design und webbasierte Sprachen
    Antworten: 2
    Letzter Beitrag: 01.02.05, 14:12
  5. Zahlen in Excel
    Von nook im Forum Windows
    Antworten: 1
    Letzter Beitrag: 15.06.02, 13:47

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •