Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Liczba arabska --> liczba rzymska


Rekomendowane odpowiedzi

Opublikowano

Cześć,

napisałem teki skrypcik zamieniający liczby arabskie na rzymskie, jutro pogłówkuję nad zamianą w drugą stronę. Puki co Wy możecie ulepszać skrypt.

Jest on na tyle prosty, że prawie każdy powinien go zrozumieć. Skrypt może się przydać młodszym lub starszym do zadań, czy do nauki.

 

#include <EditConstants.au3>
#include <string.au3>
Global $rzymska = ''
Global $arabska_tmp = ''
Dim $rzym_char_all[7] = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
Dim $rzym_char_10[4] = ['I', 'X', 'C', 'M']
Dim $rzym_char_5[3] = ['V', 'L', 'D']
GUICreate('Rzymian', 400, 70)
$input = GUICtrlCreateInput('', 10, 10, 380, 20, $ES_NUMBER)
$output = GUICtrlCreateInput('', 10, 40, 380, 20, $ES_READONLY)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
	Case -3
		Exit
EndSwitch

$arabska = GUICtrlRead($input) ;arabska --> rzymska
If $arabska > 3999 Then
	GUICtrlSetData($output, 'Zbyt duza liczba')


ElseIf $arabska <> $arabska_tmp Then

	$arabska_tmp = $arabska
	$rzymska = ''
	$arabska_reverse = _StringReverse($arabska)
	$char = StringSplit($arabska_reverse, '')
	For $i = 1 To $char[0]
		If $char[$i] = '1' Then $rzymska &= $rzym_char_10[$i - 1]
		If $char[$i] = '2' Then $rzymska &= $rzym_char_10[$i - 1] & $rzym_char_10[$i - 1]
		If $char[$i] = '3' Then $rzymska &= $rzym_char_10[$i - 1] & $rzym_char_10[$i - 1] & $rzym_char_10[$i - 1]
		If $char[$i] = '4' Then $rzymska &= $rzym_char_5[$i - 1] & $rzym_char_10[$i - 1]
		If $char[$i] = '5' Then $rzymska &= $rzym_char_5[$i - 1]
		If $char[$i] = '6' Then $rzymska &= $rzym_char_10[$i - 1] & $rzym_char_5[$i - 1]
		If $char[$i] = '7' Then $rzymska &= $rzym_char_10[$i - 1] & $rzym_char_10[$i - 1] & $rzym_char_5[$i - 1]
		If $char[$i] = '8' Then $rzymska &= $rzym_char_10[$i - 1] & $rzym_char_10[$i - 1] & $rzym_char_10[$i - 1] & $rzym_char_5[$i - 1]
		If $char[$i] = '9' Then $rzymska &= $rzym_char_10[$i] & $rzym_char_10[$i - 1]
	Next
	GUICtrlSetData($output, _StringReverse($rzymska))
EndIf
WEnd

Opublikowano

hah, tak się składa że akuratmam liczby rzymskie na matmie :D

po 3999 jest większa liczba lecz chyba niema do tego znaku w asci

np.

_

V = 5000

 

masz plusixa

@down

matematyka 3 wydawnictwa gwo?:D

Opublikowano

tak ja też to teraz mam, ale do większych muszę zrobić osobną czcionkę, a nie chce mi się na razie ;p

 

@ps pracuje teraz nad rzymskie --> arabskie, ale nie wiem czy dzisiaj sie uporam bo jeszcze trzeba zadanka domowe zrobić ;d

@ps2. teoretycznie już działa, ale mam problemy ze zrobieniem ograniczeń.

 

@ps3

http://pl.wikipedia....pisywania_liczb

śą takie znaczki w unicode więc chyba nie będzie problemu

 

@ps4 :D

Istnieje też ciekawy algorytm, napisany w Polsce (tzw. algorytm Vaxa), znacznie krótszy i szybszy (przykładowa implementacja w PHP):

function rome($N){ 		
$c='IVXLCDM'; 		
for($a=5,$b=$s='';$N;$b++,$a^=7)            	
for($o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s); 	
return $s; }

ciekawe, spróbuje ogarnąć

 

@edit, matematyka wokół nas WSiP

 

@edit234512 ;d

 

#include <EditConstants.au3>
#include <string.au3>
Global $rzymska = ''
Global $arabska_tmp = ''
Dim $rzym_char[7] = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
Dim $rzym_char_all[7] = ['0', '1', '2', '3', '4', '5', '6']
Dim $rzym_char_all_var[7] = [1, 5, 10, 50, 100, 500, 1000]
Dim $rzym_char_10[4] = ['I', 'X', 'C', 'M']
Dim $rzym_char_5[3] = ['V', 'L', 'D']
GUICreate('Rzymian', 400, 70)
$input = GUICtrlCreateInput('', 10, 10, 380, 20)
$output = GUICtrlCreateInput('', 10, 40, 380, 20, $ES_READONLY)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
	Case -3
		Exit
EndSwitch

$arabska = GUICtrlRead($input) ;arabska --> rzymska
If $arabska > 3999 Then
	GUICtrlSetData($output, 'Zbyt duza liczba')


ElseIf $arabska <> $arabska_tmp Then

	$arabska_tmp = $arabska
	$rzymska = ''
	$arabska_reverse = $arabska
	For $b = 0 To 6
		$arabska_reverse = StringReplace($arabska_reverse, $rzym_char[$b], $rzym_char_all[$b])
	Next

	$char = StringSplit($arabska_reverse, '')
;~ 		For $c = 1 To $char[0]
;~ 		Next
	For $i = 1 To $char[0]
		For $a = 0 To 6
			If $char[$i] = $rzym_char_all[$a] Then
				If $i < $char[0] And $char[$i + 1] > $char[$i] Then
					$rzymska += $rzym_char_all_var[$char[$i + 1]]
					$rzymska -= $rzym_char_all_var[$char[$i]]
					$i += 1
					ExitLoop
				Else
					$rzymska += $rzym_char_all_var[$char[$i]]
				EndIf
			EndIf
		Next


	Next
	GUICtrlSetData($output, $rzymska)
EndIf
WEnd

 

aktualny postęp, działa, ale nie ma ograniczeń, tzn można wpisywać błędne liczby

 

@ nie ograniam tego algorytmu w php

Byłby ktoś w stanie mi go wytłumaczyć?

 

ide robić zadanka...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...