Römische Ziffern
Übersicht

![]() |
5k41Betreff: Römische Ziffern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi!
Hier mal ne kleine Spielerei, über die ich heute in der Schule nachgedacht hab... wenns nicht gut genug für Codearchiv ist, einfach trashen, aber vielleicht hilfts ja wem. main.bb Code: [AUSKLAPPEN] Local hidden = Int(Input("Arabische Zahl anzeigen ( 0 = ja, 1 = nein ):"))
hidden = hidden Mod 2 .start Graphics 600,14+((1-hidden)*28),32,2 SetBuffer BackBuffer() AppTitle "Rome Numbers" Include "Romenumbers2.bb" Initpresets() Local update = 1 Local number = Int(Input("Zahl:")) Cls Delay 200 FlushKeys() While Not KeyDown(1) If update = 1 Cls Locate 0,0 strg$ = RomeNumbers(number) number2 = NormalNumber(strg$) update = 0 EndIf If KeyDown(200) Then number = number +1:Delay 200:update = 1 If KeyDown(208) Then number = number -1:Delay 200:update = 1 If KeyDown(28 ) Then Goto start If Not hidden Text 0,0,number Text 0,28,number2 EndIf DrawRoman 0,(1-hidden)*14,strg$ Flip Cls Wend End romenumbers.bb Code: [AUSKLAPPEN] Global arraysize = 6 Dim Presets$(arraysize,1) Function Initpresets() Presets$(0,0) = "1" : Presets$(0,1) = "I" Presets$(1,0) = "5" : Presets$(1,1) = "V" Presets$(2,0) = "10" : Presets$(2,1) = "X" Presets$(3,0) = "50" : Presets$(3,1) = "L" Presets$(4,0) = "100" : Presets$(4,1) = "C" Presets$(5,0) = "500" : Presets$(5,1) = "D" Presets$(6,0) = "1000" : Presets$(6,1) = "M" End Function Function DrawRoman(x,y,strg$) If strg$ = "" Then Return 0 Local width = StringWidth(strg$) Rect x,y,width+2,1 Text x+1,y,strg$ Rect x,y+FontHeight()-1,width+2,1 Return 0 End Function Function RomeNumbers$(number,strg$="") If number <= 0 Then Return strg$ Local temp Local temp2 If number > Int(Presets(arraysize,0)) Then Return RomeNumbers$(number - Int(Presets(arraysize,0)),strg$ + Presets(arraysize,1)) For x = 0 To arraysize If number = Int(Presets(x,0)) Then Return strg$ + Presets(x,1) For y = x+1 To 1 Step -1 If number < Int(Presets(x+1,0)) Then temp2 = Int(Left(Presets(x+1,0),1)) If temp2 = 1 Then temp2 = Int(Presets(x+1,0)) / 10 Else temp2 = Int(Presets(x+1,0)) / temp2 EndIf temp = Int(Presets(x+1,0)) - Int(Presets(x+1-y,0)) If Int(Presets(x+1,0)) - temp <= temp2 Then If number - temp => 0 And number - temp < temp2 Then Return RomeNumbers$(number - temp, strg$ + Presets(x+1-y,1) + Presets(x+1,1) ) EndIf EndIf EndIf Next If number > Int(Presets(x,0)) Then If number < Int(Presets(x+1,0)) Then Return RomeNumbers$(number - Int(Presets(x,0)),strg$ + Presets(x,1)) EndIf EndIf Next Return strg$ End Function Function NormalNumber(roman$,number=0) If roman$ = "" Then Return number Local strg$ strg$ = Left(roman$,1) strg2$ = Mid(roman$,2,1) For x = 0 To arraysize If Presets(x,1) = strg$ If strg2$ <> "" Then For y = 0 To arraysize If Presets(y,1) = strg2$ Then If Int(Presets(y,0)) > Int(Presets(x,0)) Then Return NormalNumber(Right(roman$,Len(roman$)-2),number + Int(Presets(y,0)) - Int(Presets(x,0)) ) EndIf Next EndIf Return NormalNumber(Right(roman$,Len(roman$)-1), number + Int(Presets(x,0)) ) EndIf Next Return number End Function glaube eine Erklärung kann ich mir sparen. MfG ~Edit~ Hab grad mal die mir unbekannten Zahlen eingebaut ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
- Zuletzt bearbeitet von 5k41 am Do, Nov 30, 2006 15:25, insgesamt 7-mal bearbeitet
FBI-blitz |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schade dass er nur die römischen Zahlen bis zehn hat, aber ich denke dass kann jeder selbst sehtr schnell ändern | ||
Computer 1: AMD Athlon64 3500+ | nVidia GF 7900GT | 1024 MB DDR-RAM | ASUS A8N-SLI Preimium | 250 GB SATA 2 || WindowsXP | Blitz3D | Blitz+
Computer 2: AMD AthlonXP 2400+ | ATI Radeon 9500 | 512 MB DDR-RAM | MSI K7N2 | 80 GB IDE | 160 GB IDE || WindowsXP | Blitz3D | Blitz+ Computer 3: Intel Pentium MMX | onBoard-Grafik | 32 MB RAM | 1 GB IDE || Windows 98 SE | Blitz+ |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessant wäre doch einmal eine Funktion, die alle römischen Zahlen selber zusammenbastelt. Also, wenn man z.B. 6 gibt, dass sie dann "V" und "I" zusammensetzt, statt es einfach aus einer Liste zu holen. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
es werden doch alle berechnet! ( oder hab ich selbst das prinzip noch nicht verstanden ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich meine, wenn ich z.B. bei deiner Funktion 1984 eigebe, spuckt sie zig Xe hintereinader. Da fehlen C,L,M etc. und da müsste er dann klären, wann z.B. noch drei "I" hinkommen, und wann schon Die nächstgrösse Zahl als neuer Buchstabe kommt. Bei dir sind die Buchstaben bis 10 ja quasi "vorberechnet".
MfG Blitzcoder |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt, von C, L und M wusste ich auch noch nichts ![]() MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist gar nicht so schwer. Funktioniert nach dem Münzproblem (Einen Betrag in möglichst wenig Münzen ausgeben^^). Die verkürzte Schreibweise liefere ich nach.
Code: [AUSKLAPPEN] Cls
Print roemisch$(1984) WaitKey() End Function roemisch$(wert) If wert < 1 Then Return " " ausgabe$ = "" While wert > 0 If wert >= 1000 Then ausgabe$ = ausgabe$ + "M" wert = wert - 1000 ElseIf wert >= 500 Then ausgabe$ = ausgabe$ + "D" wert = wert - 500 ElseIf wert >= 100 Then ausgabe$ = ausgabe$ + "C" wert = wert - 100 ElseIf wert >= 50 Then ausgabe$ = ausgabe$ + "L" wert = wert - 50 ElseIf wert >= 10 Then ausgabe$ = ausgabe$ + "X" wert = wert - 10 ElseIf wert >= 5 Then ausgabe$ = ausgabe$ + "V" wert = wert - 5 Else ausgabe$ = ausgabe$ + "I" wert = wert - 1 EndIf Wend Return ausgabe$ End Function |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das erzeugt fehlerhafte Ausgaben, da es nicht Die Wertstellung berücksichtigt (Beispiel 4 bei Dir: IIII, richtig wäre IV) | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
BladeRunner hat Folgendes geschrieben: Das erzeugt fehlerhafte Ausgaben, da es nicht Die Wertstellung berücksichtigt (Beispiel 4 bei Dir: IIII, richtig wäre IV)
Laut Wiki aber dennoch richtig, das andere ist dann die gängige Abkürzende Schreibweise. Aber es gibt auch nicht so eindeutige Abkürzungen, deswegen weiß ich noch nicht, wie ich das machen soll. Aber dieses 4 gleiche Ziffern hintereinander werde ich mal eben fixen (sieht ja genauso scheiße aus wie Schifffahrt mit 3 f). |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
richtig stehen müsste da: MDCDLXXXIV | ||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
heult nicht rum,
das Problem war sehr einfach zu beheben; eine Zeile reichte. (hier jetzt eine Mischung aus beiden Codes): Code: [AUSKLAPPEN] While Not KeyDown(1)
Locate 0,0 Print number Print RomeNumbers(number) If KeyDown(200) Then number = number +1:Delay 200:Cls If KeyDown(208) Then number = number -1:Delay 200:Cls Wend Function RomeNumbers$(wert%) If wert < 1 Then Return "-" ausgabe$ = "" While wert > 0 If wert >= 1000 Then ausgabe$ = ausgabe$ + "M" wert = wert - 1000 ElseIf wert >= 500 Then ausgabe$ = ausgabe$ + "D" wert = wert - 500 ElseIf wert >= 100 Then ausgabe$ = ausgabe$ + "C" wert = wert - 100 ElseIf wert >= 50 Then ausgabe$ = ausgabe$ + "L" wert = wert - 50 ElseIf wert >= 10 Then ausgabe$ = ausgabe$ + "X" wert = wert - 10 ElseIf wert >= 5 Then ausgabe$ = ausgabe$ + "V" wert = wert - 5 ElseIf wert >= 4 Then ausgabe$ = ausgabe$ + "IV" wert = wert-4 Else ausgabe$ = ausgabe$ + "I" wert = wert - 1 EndIf Wend Return ausgabe$ End Function |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie du auf http://de.wikipedia.org/wiki/R...tionsregel nachlesen kannst, geht die subtraktionsregel anders: sie gilt nicht nur bei IV, sondern auch bei allen anderen ziffern.
soll heißen: man muss zuerst spion-atoms code laufen lassen und dann nochmal den ganzen string durchgehen, ob da vier gleiche zeichen aufeinander folgen, die nicht die höchste ziffern sind. ist dies der fall, so kommt die subtraktionsregel zum tragen. (also drei zeichen entfernen und einmal das nächsthöhere zeichen einfügen.) |
||
MrKeks.net |
$tankY |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auch ne Möglichkeit wäre, zuerst beim kleinsten (I) anzufangen, dann zum nächsten usw:
Code: [AUSKLAPPEN] Function RomanNumbers$(Number%) Local RNumber$ = "" For i = 1 To Number RNumber$ = RNumber$ + "I" Next While Instr(RNumber$, "IIIII") RNumber$ = Replace$(RNumber$, "IIIII", "V") Wend While Instr(RNumber$, "VV") RNumber$ = Replace$(RNumber$, "VV", "X") Wend While Instr(RNumber$, "XXXXX") RNumber$ = Replace$(RNumber$, "XXXXX", "L") Wend While Instr(RNumber$, "LL") RNumber$ = Replace$(RNumber$, "LL", "C") Wend While Instr(RNumber$, "CCCCC") RNumber$ = Replace$(RNumber$, "CCCCC", "D") Wend While Instr(RNumber$, "DD") RNumber$ = Replace$(RNumber$, "DD", "M") Wend If Instr(RNumber$, "VIIII") Then ;9 -> IX RNumber$ = Replace(RNumber$, "VIIII", "IX") EndIf If Instr(RNumber$, "IIII") Then ;4 -> IV RNumber$ = Replace(RNumber$, "IIII", "IV") EndIf If Instr(RNumber$, "LXXXX") Then ;90 -> XC RNumber$ = Replace(RNumber$, "LXXXX", "XC") EndIf If Instr(RNumber$, "XXXX") Then ;40 -> XL RNumber$ = Replace(RNumber$, "XXXX", "XL") EndIf If Instr(RNumber$, "CCCC") Then ;400 -> CD RNumber$ = Replace(RNumber$, "CCCC", "CD") EndIf If Instr(RNumber$, "DCD") Then ;900 -> CM RNumber$ = Replace(RNumber$, "DCD", "CM") EndIf Return RNumber$ End Function Ist wahrscheinlich langsamer, aber das bemerkt man kaum. PS: Wahrscheinlich fehlen ein paar Ausnahmen, aber für 1984 hats gereicht ^^. Edit: Bei größeren Zahlen is es net so Sinnvoll, deshalb doch lieber wie oben beschrieben die Zahlen subtrahieren und nicht in "I" umwandeln. |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
So Kinnings, hier die komplette Function. Lediglich 4 Zeilen haben gefehlt. Falls noch irgendwelche Fehler auftreten, lasst es mich wissen!
Code: [AUSKLAPPEN] Cls
Print roemisch$(1984) WaitKey() End Function roemisch$(wert) If wert < 1 Then Return " " ausgabe$ = "" While wert > 0 If wert >= 1000 Then ausgabe$ = ausgabe$ + "M" wert = wert - 1000 ElseIf wert >= 500 Then ausgabe$ = ausgabe$ + "D" wert = wert - 500 ElseIf wert >= 100 Then ausgabe$ = ausgabe$ + "C" wert = wert - 100 ElseIf wert >= 50 Then ausgabe$ = ausgabe$ + "L" wert = wert - 50 ElseIf wert >= 10 Then ausgabe$ = ausgabe$ + "X" wert = wert - 10 ElseIf wert >= 5 Then ausgabe$ = ausgabe$ + "V" wert = wert - 5 Else ausgabe$ = ausgabe$ + "I" wert = wert - 1 EndIf Wend ;Viererketten ausmerzen... ausgabe$ = Replace$(ausgabe$, "VIIII", "IX") ausgabe$ = Replace$(ausgabe$, "IIII", "IV") ausgabe$ = Replace$(ausgabe$, "LXXXX", "XC") ausgabe$ = Replace$(ausgabe$, "XXXX", "XL") ausgabe$ = Replace$(ausgabe$, "DCCCC", "CM") ausgabe$ = Replace$(ausgabe$, "CCCC", "CM") Return ausgabe$ End Function |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
- Zuletzt bearbeitet von SpionAtom am Do, Nov 16, 2006 12:10, insgesamt einmal bearbeitet
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nett, aber noch nicht perfekt ![]() Wenn ich Beispielsweise ein 9 eingebe, dann wirft deine Funktion VIV zurück. Ich glaube, dass stimmt noch nicht so ganz. ![]() mfg TheMatrix |
||
°_° °.° °~° °v° .. -.- |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
TheMatrix hat Folgendes geschrieben: Nett, aber noch nicht perfekt
![]() Wenn ich Beispielsweise ein 9 eingebe, dann wirft deine Funktion VIV zurück. Ich glaube, dass stimmt noch nicht so ganz. ![]() mfg TheMatrix Da hab ich doch glatt eine Zeile vergessen, habs Editiert... |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
mh, also wenn würd ich das dann ganz oder garnicht machen ( entweder nur lookup oder nur selbstständig ) ![]() MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sorry wegen Doppelpost, ist aber was neues und gehört nicht zum oberen.
Hier mal meine Version, in der er sich die Zahl Komplett selbst zusammen baut: Code: [AUSKLAPPEN] ;Local number = 1984 Dim Presets$(6,1) Initpresets() While Not KeyDown(1) Locate 0,0 Print number Print RomeNumbers(number) If KeyDown(200) Then number = number +1:Delay 200:Cls If KeyDown(208) Then number = number -1:Delay 200:Cls Wend Function Initpresets() Presets$(0,0) = "1" : Presets$(0,1) = "I" Presets$(1,0) = "5" : Presets$(1,1) = "V" Presets$(2,0) = "10" : Presets$(2,1) = "X" Presets$(3,0) = "50" : Presets$(3,1) = "L" Presets$(4,0) = "100" : Presets$(4,1) = "C" Presets$(5,0) = "500" : Presets$(5,1) = "D" Presets$(6,0) = "1000" : Presets$(6,1) = "M" End Function Function RomeNumbers$(number) If number <= 0 Then Return Local strg$ Local thousand Local fivehundred Local hundred Local fifty Local ten Local lst If number => 10 Then If number => Int(Presets$(6,0)) Then thousand = Floor ( Float(number) / Float(Presets$(6,0)) ) For x = 1 To thousand strg$ = strg$ + Presets$(6,1) Next EndIf If number => Int(Presets$(5,0)) Then fivehundred = Floor ( Float(number - thousand * Int(Presets$(6,0)) ) / Float(Presets$(5,0)) ) For x = 1 To fivehundred strg$ = strg$ + Presets$(5,1) Next EndIf If number => Int(Presets$(4,0)) Then hundred = Floor ( Float(number - thousand * Int(Presets$(6,0)) - fivehundred * Int(Presets$(5,0))) / Float (Presets$(4,0)) ) For x = 1 To hundred strg$ = strg$ + Presets$(4,1) Next EndIf If number => Int(Presets$(3,0)) Then fifty = Floor ( Float(number - thousand * Int(Presets$(6,0)) - fivehundred * Int(Presets$(5,0)) - hundred * Int(Presets$(4,0))) / Float (Presets$(3,0)) ) For x = 1 To fifty strg$ = strg$ + Presets$(3,1) Next EndIf ten = Floor ( Float(number - thousand * Int(Presets$(6,0)) - fivehundred * Int(Presets$(5,0)) - hundred * Int(Presets$(4,0)) - fifty * Int(Presets$(3,0))) / Float (Presets$(2,0)) ) For x = 1 To ten strg$ = strg$ + Presets$(2,1) Next EndIf strg = strg + LastNumber$( number - thousand * Int(Presets$(6,0)) - fivehundred * Int(Presets$(5,0)) - hundred * Int(Presets$(4,0)) - fifty * Int(Presets$(3,0)) - ten * Int(Presets$(2,0)) ) Return strg$ End Function Function LastNumber$(number) If number <= 0 Then Return Local strg$ For i = 0 To 5 If Int(Presets$(i,0)) <= number Then If Int(Presets$(i+1,0)) > number Then If Int(Presets$(i+1,0))-1 = number Then Return Presets$(0,1) + Presets$(i+1,1) strg$=strg$+Presets$(i,1) For x = 1 To ( number - Int(Presets$(i,0)) ) strg$ = strg$ + Presets$(0,1) Next Return strg$ EndIf EndIf Next End Function MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
snörkl |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
find ich schon sehr gut. Weiß jetzt nicht, ob das stimmt, aber ist nicht sowas wie 47 IIIL ?
mfg Snörkl |
||
$tankY |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
47 = 40 + 7 = XLVII soweit ich weiss, ich glaub man kann nicht alle möglichen Zahlen subtrahieren, wenn doch, dann wäre es natürlich IIIL | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group