- Delphiartiklar, tips, forum, länksamling - 

      

START | DELPHI | LÄNKARGÄSTBOK 




 Forum

Grundkurs
  »Introduktion
  »Snabbguide
  »Komponenter
  »Händelser
  »Strängar
  »Räkna med Delphi   »Egna typer
  »Selektion
  »Iteration
  »Menyer
  »Funktioner
  »Arraystrukturer

Tips & Tricks
  »Nya tips
  »Blandat
  »Databaser
  »Filer
  »Forms
  »Grafik
  »Internet
  »Komponenter
  »Matematik
  »Multimedia
  »Objekt/ActiveX
  »Skrivare
  »Strängar
  »System
  »Mest lästa tips

Artiklar
  »Delphi och ADO
  »Bygga en DLL
  »Skapa en enkel rapport
  »Hantera registret
  »Enheter, units
  »Klassen TCanvas
  »Använd LookUp Controls

 Nya tips
 Lägg till tips
 Delphilänkar
 Gästbok

 

Konvertera romerska tal till decimaltal Kategori: Matematik
Inlagt: 2004-08-17
Läst: 1366
Inlagt av: Staffan Berg
Beskrivning
Funktion som konvertera romerska tal till vanliga decimaltal. 
Kod
function EsRomano(Roman : String) : Boolean; 
const 
  Romanos : Array[1..13] of String = ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 
                     'XL', 'X', 'IX', 'V', 'IV', 'I'); 
var 
  i : Integer; 
  Ro : String; 
  Longitud : Integer; 
  Temporal : String; 
  RomanTemp : String; 
  Cantidad : Integer; 
  NumMayor : Boolean; 
  Entrado  : Boolean; 
  Sucesion : Boolean; 
begin 
  Result  := False; 
  Temporal := ''; 
  NumMayor := True; 
  Entrado  := False; 
  Sucesion := True; 
 
   for i := 1 to 13 do 
  begin 
   Longitud := Length(Romanos[i]); 
   Ro := Copy(RomanTemp, 1, Longitud);   Cantidad := 0;  
   while ((Length(RomanTemp)>0) and (Ro = Romanos[i])) do 
   begin 
       RomanTemp := Copy(RomanTemp, 1 + Longitud, Length(RomanTemp) - Longitud); 
    
    Temporal := Temporal + Romanos[i]; 
    Ro := Copy(RomanTemp, 1, Longitud); 
    Inc(Cantidad); 
    Entrado := True; 
   end; 
 
   if Entrado then 
   begin 
    case i of 
     5, 9, 13 :  
      if Cantidad > 3 then 
       NumMayor := False; 
     2, 3, 4, 6, 7, 8, 10, 11, 12 :  
      if Cantidad > 1 then 
       NumMayor := False; 
    end; 
    Entrado := False; 
   end; 
  end; 
 
   if ((Temporal = Roman) and NumMayor) then 
  begin 
   RomanTemp := Roman; 
   for i := 1 to 13 do 
   begin 
    Longitud := Length(Romanos[i]); 
    Ro := Copy(RomanTemp, 1, Longitud); 
    while (Sucesion and (Length(RomanTemp)>0) and (Ro = Romanos[i])) do 
    begin 
     case i of 
      2, 6, 10 : // Si es CM, XC o IX. 
      begin 
       
       if (Copy(RomanTemp,3,1) = Romanos[i+1]) then 
        Sucesion := False 
       else 
        
        if (Copy(RomanTemp,3,2) = Romanos[i+2]) then 
         Sucesion := False 
        else 
     
         if (Copy(RomanTemp,3,1) = Romanos[i+3]) then 
          Sucesion := False; 
      end; 
      3, 7, 11 :  
       if (Copy(RomanTemp,2,2) = Romanos[i+1]) then 
        Sucesion := False; 
      4, 8, 12 :  
       if (Copy(RomanTemp,3,1) = Romanos[i+1]) then 
        Sucesion := False 
     end; 
     RomanTemp := Copy(RomanTemp, 1 + Longitud, Length(RomanTemp) - Longitud); 
     Ro := Copy(RomanTemp, 1, Longitud); 
    end; 
   end; 
   Result := Sucesion; 
  end 
  else 
   Result := False; 
end; 
 
 
 
 
function RomanToDec(Roman : String): LongInt; 
const 
  Numeros : Array[1..13] of Integer = (1000, 900, 500, 400, 100, 90, 50, 40, 
                     10,  9,  5,  4,  1); 
  Romanos : Array[1..13] of String = ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 
                     'XL', 'X', 'IX', 'V', 'IV', 'I'); 
var 
  i : Integer; 
  Ro : String; 
  Longitud : Integer; 
begin 
  Result := 0; 
 
  Roman := UpperCase(Roman); 
 
  if EsRomano(Roman) then 
   for i := 1 to 13 do 
   begin 
    Longitud := Length(Romanos[i]); 
    Ro := Copy(Roman, 1, Longitud); 
    while ((Length(Roman)>0) and (Ro = Romanos[i])) do 
    begin 
     Roman := Copy(Roman, 1 + Longitud, Length(Roman) - 1); 
     Result := Result + Numeros[i]; 
     Ro := Copy(Roman, 1, Longitud); 
    end; 
   end; 
end; 

 
 
© Copyright 2005 - Staffan Berg
- Alla rättigheter förbehålles -