Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Antwort
Alt 08.08.06, 19:51   #1
Xalon
 
Registriert seit: 23.05.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
Xalon Leistung: Facit NTK
Standard Römische Zahlen

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

Xalon ist offline   Mit Zitat antworten
Alt 08.08.06, 22:07   #2
ivegotmail
Member of Honour
 
Benutzerbild von ivegotmail
 
Registriert seit: 28.05.03
Danke (erhalten): 1
Gefällt mir (erhalten): 4
ivegotmail Leistung: Z3
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
ivegotmail ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 09.08.06, 00:55   #3
lagalopex
 
Registriert seit: 01.11.03
Danke (erhalten): 0
Gefällt mir (erhalten): 0
lagalopex Leistung: Facit NTK
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...
lagalopex ist offline   Mit Zitat antworten
Alt 09.08.06, 01:10   #4
jorey
 
Registriert seit: 22.11.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
jorey Leistung: Facit NTK
Standard

@ivegotmail wie wärs den code in spoilertags zu verschachteln? falls einer das noch nicht sehen will oder so
jorey ist offline   Mit Zitat antworten
Alt 09.08.06, 05:35   #5
Crack
 
Registriert seit: 09.12.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
Crack Leistung: Facit NTK
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
Dateityp: rar Project1.rar (161,8 KB, 158x aufgerufen)
Dateityp: rar römisch.rar (7,2 KB, 226x aufgerufen)
Crack ist offline   Mit Zitat antworten
Alt 09.08.06, 12:01   #6
BasicAvid
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
Danke (erhalten): 1
Gefällt mir (erhalten): 4
BasicAvid Leistung: Facit NTK
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! -
BasicAvid ist offline   Mit Zitat antworten
Alt 09.08.06, 15:05   #7
Crack
 
Registriert seit: 09.12.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
Crack Leistung: Facit NTK
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
Crack ist offline   Mit Zitat antworten
Alt 09.08.06, 15:18   #8
lagalopex
 
Registriert seit: 01.11.03
Danke (erhalten): 0
Gefällt mir (erhalten): 0
lagalopex Leistung: Facit NTK
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
lagalopex ist offline   Mit Zitat antworten
Alt 09.08.06, 15:43   #9
BasicAvid
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
Danke (erhalten): 1
Gefällt mir (erhalten): 4
BasicAvid Leistung: Facit NTK
Standard

Warum? Das passt doch! Ich hab die Additionsmethode sprich die einfache genommen.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 09.08.06, 21:30   #10
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
Danke (erhalten): 13
Gefällt mir (erhalten): 793
CDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPRCDW Leistung: WOPR
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
Dateityp: txt rom.com.txt (175 Bytes, 127x aufgerufen)
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 09.08.06, 21:56   #11
jorey
 
Registriert seit: 22.11.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
jorey Leistung: Facit NTK
Standard

Zitat:
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
jorey ist offline   Mit Zitat antworten
Alt 10.08.06, 02:41   #12
lagalopex
 
Registriert seit: 01.11.03
Danke (erhalten): 0
Gefällt mir (erhalten): 0
lagalopex Leistung: Facit NTK
Standard

Zitat:
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)
lagalopex ist offline   Mit Zitat antworten
Alt 10.08.06, 04:06   #13
Crack
 
Registriert seit: 09.12.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
Crack Leistung: Facit NTK
Standard

Zitat:
Original von lagalopex
Zitat:
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.
Crack ist offline   Mit Zitat antworten
Alt 10.08.06, 13:17   #14
CraHack
 
Registriert seit: 20.11.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
CraHack Leistung: Facit NTK
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;
    }

?>
CraHack ist offline   Mit Zitat antworten
Alt 10.08.06, 14:33   #15
crystal
 
Registriert seit: 02.08.05
Danke (erhalten): 0
Gefällt mir (erhalten): 0
crystal Leistung: Facit NTK
Standard

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

cYa
crystal ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] > > > » Römische Zahlen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zahlen per SMS Dawen Internet Allgemein 3 06.07.08 01:22
Zahlen ordnen C++ Tux1990 Code Kitchen 3 26.02.07 18:02
C/C++ Römische in Arabische Zahlen konvertieren + Batchkonvertierung Fifilip Code Kitchen 7 13.12.06 07:59
Problem mit Zahlen in PHP! PtB (Web-) Design und webbasierte Sprachen 2 01.02.05 14:12
Zahlen in Excel nook Windows 1 15.06.02 13:47