Convertire un numero decimale in numerazione romana: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
Per convertire un numero intero decimale in un numero a [http://it.wikipedia.org/wiki/Sistema_di_numerazione_romano rappresentazione numerale romana] è possibile utilizzare un codice come quello seguente:
Per convertire un numero intero decimale in un numero a [http://it.wikipedia.org/wiki/Sistema_di_numerazione_romano rappresentazione numerale romana] è possibile utilizzare un codice come quello seguente:
  '''Public''' Struct CifraRomana_S
  '''Public''' Struct CifraRomana_S
   cf_stringa As String
   cr_stringa As String
   cf_intero As Integer
   cr_intero As Short
  '''End''' Struct
  '''End''' Struct
   
   
Riga 10: Riga 10:
  '''Private''' Function ConverteInRomano(numerus As Short) As String
  '''Private''' Function ConverteInRomano(numerus As Short) As String
   
   
  Dim rd0, rd1, rd2, rd3, rd4, rd5, rd6, rd7, rd8, rd9, rd10, rd11, rd12 As New CifraRomana_S
Dim rd0, rd1, rd2, rd3, rd4, rd5, rd6, rd7, rd8, rd9, rd10, rd11, rd12 As New CifraRomana_S
  Dim stringaRomana As String
Dim stringaRomana As String
  Dim i As Integer
Dim i As Integer
   
   
   
   
  If numerus > 3999 Then
  If numerus > 3999 Then
    Message.Warning("Il numero da convertire non deve essere superiore a 3999 !")
    Message.Warning("Il numero da convertire non deve essere superiore a 3999 !")
    Return
    Return
  Endif
  Endif
   
   
   
   
  rd0.cf_stringa = "M"
  rd0.cr_stringa = "M"
  rd0.cf_intero = 1000
  rd0.cr_intero = 1000
    RD.Add(rd0)
  RD.Add(rd0)
  rd1.cf_stringa = "CM"
  rd1.cr_stringa = "CM"
  rd1.cf_intero = 900
  rd1.cr_intero = 900
    RD.Add(rd1)
  RD.Add(rd1)
  rd2.cf_stringa = "D"
  rd2.cr_stringa = "D"
  rd2.cf_intero = 500
  rd2.cr_intero = 500
    RD.Add(rd2)
  RD.Add(rd2)
  rd3.cf_stringa = "CD"
  rd3.cr_stringa = "CD"
  rd3.cf_intero = 400
  rd3.cr_intero = 400
    RD.Add(rd3)
  RD.Add(rd3)
  rd4.cf_stringa = "C"
  rd4.cr_stringa = "C"
  rd4.cf_intero = 100
  rd4.cr_intero = 100
    RD.Add(rd4)
  RD.Add(rd4)
  rd5.cf_stringa = "XC"
  rd5.cr_stringa = "XC"
  rd5.cf_intero = 90
  rd5.cr_intero = 90
    RD.Add(rd5)
  RD.Add(rd5)
  rd6.cf_stringa = "L"
  rd6.cr_stringa = "L"
  rd6.cf_intero = 50
  rd6.cr_intero = 50
    RD.Add(rd6)
  RD.Add(rd6)
  rd7.cf_stringa = "XL"
  rd7.cr_stringa = "XL"
  rd7.cf_intero = 40
  rd7.cr_intero = 40
    RD.Add(rd7)
  RD.Add(rd7)
  rd8.cf_stringa = "X"
  rd8.cr_stringa = "X"
  rd8.cf_intero = 10
  rd8.cr_intero = 10
    RD.Add(rd8)
  RD.Add(rd8)
  rd9.cf_stringa = "IX"
  rd9.cr_stringa = "IX"
  rd9.cf_intero = 9
  rd9.cr_intero = 9
    RD.Add(rd9)
  RD.Add(rd9)
  rd10.cf_stringa = "V"
  rd10.cr_stringa = "V"
  rd10.cf_intero = 5
  rd10.cr_intero = 5
    RD.Add(rd10)
  RD.Add(rd10)
  rd11.cf_stringa = "IV"
  rd11.cr_stringa = "IV"
  rd11.cf_intero = 4
  rd11.cr_intero = 4
    RD.Add(rd11)
  RD.Add(rd11)
  rd12.cf_stringa = "I"
  rd12.cr_stringa = "I"
  rd12.cf_intero = 1
  rd12.cr_intero = 1
    RD.Add(rd12)
  RD.Add(rd12)
   
   
  For i = 0 To 12
  For i = 0 To 12
    While (RD[i].cf_intero <= numerus)
    While (RD[i].cr_intero <= numerus)
      stringaRomana &= RD[i].cf_stringa
      stringaRomana &= RD[i].cr_stringa
      numerus -= RD[i].cf_intero
      numerus -= RD[i].cr_intero
    Wend
    Wend
  Next
  Next
   
   
  Return stringaRomana
  Return stringaRomana
   
   
  '''End'''
  '''End'''





Versione delle 05:49, 3 dic 2013

Per convertire un numero intero decimale in un numero a rappresentazione numerale romana è possibile utilizzare un codice come quello seguente:

Public Struct CifraRomana_S
 cr_stringa As String
 cr_intero As Short
End Struct

Private RD As New CifraRomana_S[]


Private Function ConverteInRomano(numerus As Short) As String

Dim rd0, rd1, rd2, rd3, rd4, rd5, rd6, rd7, rd8, rd9, rd10, rd11, rd12 As New CifraRomana_S
Dim stringaRomana As String
Dim i As Integer


 If numerus > 3999 Then
   Message.Warning("Il numero da convertire non deve essere superiore a 3999 !")
   Return
 Endif


 rd0.cr_stringa = "M"
 rd0.cr_intero = 1000
  RD.Add(rd0)
 rd1.cr_stringa = "CM"
 rd1.cr_intero = 900
  RD.Add(rd1)
 rd2.cr_stringa = "D"
 rd2.cr_intero = 500
  RD.Add(rd2)
 rd3.cr_stringa = "CD"
 rd3.cr_intero = 400
  RD.Add(rd3)
 rd4.cr_stringa = "C"
 rd4.cr_intero = 100
  RD.Add(rd4)
 rd5.cr_stringa = "XC"
 rd5.cr_intero = 90
  RD.Add(rd5)
 rd6.cr_stringa = "L"
 rd6.cr_intero = 50
  RD.Add(rd6)
 rd7.cr_stringa = "XL"
 rd7.cr_intero = 40
  RD.Add(rd7)
 rd8.cr_stringa = "X"
 rd8.cr_intero = 10
  RD.Add(rd8)
 rd9.cr_stringa = "IX"
 rd9.cr_intero = 9
  RD.Add(rd9)
 rd10.cr_stringa = "V"
 rd10.cr_intero = 5
  RD.Add(rd10)
 rd11.cr_stringa = "IV"
 rd11.cr_intero = 4
  RD.Add(rd11)
 rd12.cr_stringa = "I"
 rd12.cr_intero = 1
  RD.Add(rd12)

 For i = 0 To 12
   While (RD[i].cr_intero <= numerus)
     stringaRomana &= RD[i].cr_stringa
     numerus -= RD[i].cr_intero
   Wend
 Next

 Return stringaRomana

End


Rappresentare in numerazione romana una cifra superiore a 3999

Poiché nella numerazione romana per rappresentare una cifra non possono essere utilizzate più di tre segni della medesima lettera (ad esempio per rappresentare il numero 4 si usano le lettere IV e non IIII), per rappresentare le cifre superiori a 3999 non sarà possibile, dunque, scrivere più di tre volte la lettera "M" (che sta per mille). Il stema numerico romano utilizza degli appositi segni diacritici al di sopra delle lettere per moltiplicare per 10000, per 100000 e per 1000000.

E' possibile ottenere, ancorché con una certa approssimazione, la rappresentazione grafica di questi particolari simboli numerici romani utilizzando anche un paio di caratteri diacritici del codice UNICODE:

TextEdit1.RichText = "V&#x305;  |V&#x305;|  V&#x33F;"


Note

[1] Vi sono diversi codici, anche realizzati con vari linguaggi informatici, per convertire numeri arabi in numeri romani e viceversa. Un paio di essi a titolo esemplificativo: