Unit caja1;
Interface
Uses
SysUtils,dialogs;
Type
CEMNumeroNatural = Class(Exception);
CNumeroNatural = Class
Private
Valor : Cardinal;
Function UnidadesRom(u : Byte ) : string;
Function DeLiRom (dl: Byte ) : string;
Function DecenasRom (d : Byte ) : string;
Function CentenasRom(c : word ) : string;
Function MilesRom (m : word ) : string;
Function Unidades(u : Byte ) : string;
Function DeLi (dl: Byte ) : string;
Function Decenas (d : Byte ) : string;
Function Centenas(c : word ) : string;
Function Miles (m : word ) : string;
Public
Constructor Crear;
Procedure AsignarValor( NuevoValor : Cardinal);
Procedure InsertarDigito( Posicion : Byte ; Digito : Byte);
Procedure EliminarDigito( Posicion : Byte );
Procedure Invertir;
Function ObtenerValor : Cardinal;
Function NumeroDigitos : Byte;
Function Digito( Posicion : Byte ) : Byte;
Function EsPrimo : Boolean;
Function EsPar : Boolean;
Function SumarDigitos : Byte;
Function DigitosPares : Byte;
Function DigitosImpares : Byte;
End;
Implementation
Function CNumeroNatural.UnidadesRom(u : Byte) : string;
Var
Uni : string;
Begin
Case( u )of
0: Uni := '';
1: Uni := 'I';
2: Uni := 'II';
3: Uni := 'III';
4: Uni := 'IV';
5: Uni := 'V';
6: Uni := 'VI';
7: Uni := 'VII';
8: Uni := 'VIII';
9: Uni := 'IX';
End;
Result := Uni;
End;
Function CNumeroNatural.DeLiRom(dl : Byte) : string;
Var
Li : string;
Begin
Case( dl )of
1: Li := 'X';
2: Li := 'XX';
3: Li := 'XXX';
4: Li := 'XL';
5: Li := 'L';
6: Li := 'LX';
7: Li := 'LXX';
8: Li := 'LXXX';
9: Li := 'XC';
End;
Result := Li ;
End;
Function CNumeroNatural.DecenasRom(d : Byte) : string;
Var
Suma , Uni , Dec : string;
Begin
Uni := UnidadesRom( d mod 10 );
Dec := DeliRom( d div 10 );
Case( d )of
0..9 : Suma := Uni;
10..99 : Suma := Dec + Uni;
End;
Result := Suma;
End;
Function CNumeroNatural.CentenasRom(c : word) : string;
Var
K ,Dec : string;
Begin
Dec := DecenasRom( c mod 100 );
Case ( c div 100 ) of
0: K := dec;
1: K := 'C' + dec;
2: K := 'CC' + dec;
3: K := 'CCC' + dec;
4: K := 'CD' + dec;
5: K := 'D' + dec;
6: K := 'DC' + dec;
7: K := 'DCC' + dec;
8: K := 'DCCC' + dec;
9: K := 'CM' + dec;
End;
If( c = 100 )Then
K := 'C';
Result := K;
End;
Function CNumeroNatural.MilesRom(m : word) : string;
Var
Q , Cent : string;
Mi : word;
Begin
Cent := CentenasRom( m mod 1000 );
Mi := ( m div 1000 );
Case( Mi )of
0: Q := cent;
1: Q := 'M' + cent;
2: Q := 'MM' + cent;
3: Q := 'MMM' + cent;
End;
Result:=Q;
End;
Function CNumeroNatural.Unidades( u : Byte ) : string;
Var
un : string;
Begin
Case( u )of
0: un:='';
1: un:='Uno';
2: un:='Dos';
3: un:='Tres';
4: un:='Cuatro';
5: un:='Cinco';
6: un:='Seis';
7: un:='Siete';
8: un:='Ocho';
9: un:='Nueve';
End;
result := un;
End;
Function CNumeroNatural.DeLi ( dl : Byte ) : string;
Var
li : string;
Begin
Case( dl )of
2: li:='Veinte';
3: li:='Treinta';
4: li:='Cuarenta';
5: li:='Cincuenta';
6: li:='Sesenta';
7: li:='Setenta';
8: li:='Ochenta';
9: li:='Noventa';
End;
result := li;
End;
Function CNumeroNatural.Decenas ( d : Byte ) : string;
Var s,uni,dec : string;
Begin
uni := unidades( d Mod 10 ); dec := Deli( d Div 10 );
Case( d )of
0..9: s:=uni;
10: s:='Diez';
11: s:='Once';
12: s:='Doce';
13: s:='Trece';
14: s:='Catorce';
15: s:='Quince';
16..19: s:='Dieci' + uni;
20: s:=dec;
21..29: s:='Veinti' + uni;
30..99: s:=dec + ' y ' + uni;
End; If( d In [30,40,50,60,70,80,90] )Then s := dec;
result := s;
End;
Function CNumeroNatural.Centenas ( c : word ) : string;
Var
k,dec : string;
Begin
dec := Decenas( c Mod 100 );
Case( c Div 100 )of
0: k:='';
1: k:='Ciento ' + dec;
2: k:='Doscientos ' + dec;
3: k:='Trescientos ' + dec;
4: k:='Cuatrocientos ' + dec;
5: k:='Quinientos ' + dec;
6: k:='Seiscientos ' + dec;
7: k:='Setecientos ' + dec;
8: k:='Ochocientos ' + dec;
9: k:='Novecientos ' + dec;
End; If( c = 100 )Then k := 'Cien'; result := K;
End;
Function CNumeroNatural.Miles(m : word) : string;
Var
Q ,cent : string; mi ,p : word;
Begin
cent := Centenas( m mod 1000) ; mi := ( m div 1000 );
Case( mi )of
0: Q:='';
1: Q:='Un Mil ' + cent;
2..9: Q:=Unidades(mi) + ' Mil ' + cent;
10..99: Q:=Decenas (mi) + ' Mil ' + cent;
100..999: Q:=Centenas(mi) + ' Mil ' + cent;
End;
p := pos( 'Uno Mil' , Q );
If( p > 0 )Then
delete(Q , p+2 ,1);
result := Q;
end;
Constructor CNumeroNatural.Crear;
Begin
Valor := 0;
End;
Procedure CNumeroNatural.AsignarValor( NuevoValor : Cardinal);
Begin
Valor := NuevoValor;
End;
Procedure CNumeroNatural.InsertarDigito ( Posicion : Byte ; Digito : Byte);
Var
Aux , Aux2 , Digi :Cardinal;
Begin
Aux := Valor;
If( Posicion > 0)and( Posicion <= NumeroDigitos )Then
Begin
Aux2 := 0; Digi := 0;
While( Digi <= NumeroDigitos-Posicion )do
Begin
Aux2 := ( Aux2 * 10 ) + Aux Mod 10; Aux := Aux Div 10; Inc( Digi );
End;
Aux := ( Aux * 10 ) + Digito; While( Digi > 0 )do
Begin
Aux := ( Aux * 10 ) + ( Aux2 Mod 10 ); Aux2 := Aux2 Div 10; Dec( Digi );
End;
Valor := Aux;
End
Else
Raise CEMNumeroNatural.Create
('CNumeroNatural.InsertarDigito: Error Fuera de RANGO...');
End;
Procedure CNumeroNatural.EliminarDigito( Posicion : Byte );
Var
Aux , Aux2 , Digi :Cardinal;
Begin
Aux := Valor;
If( Posicion > 0)and( Posicion <= NumeroDigitos )Then
Begin
Aux2 := 0;
Digi := 0;
While( Digi < NumeroDigitos-Posicion )do
Begin
Aux2 := ( Aux2 * 10 ) + Aux Mod 10;
Aux := Aux Div 10;
Inc( Digi );
End;
Aux := ( Aux Div 10 ); While( Digi > 0 )do
Begin
Aux := ( Aux * 10 ) + ( Aux2 Mod 10 );
Aux2 := Aux2 Div 10;
Dec( Digi );
End;
Valor := Aux;
End
Else
Raise CEMNumeroNatural.Create
('CNumeroNatural.EliminarDigito: Error Fuera de RANGO...');
End;
Procedure CNumeroNatural.Invertir;
Var
Aux , Aux2 , i :Cardinal;
Begin
Aux2 := Valor;
Aux := 0;
i := 0;
While( i < NumeroDigitos )do
Begin
Aux := ( Aux * 10 ) + Aux2 Mod 10;
Aux2 := Aux2 Div 10;
Inc( i );
End;
Valor := Aux;
End;
Function CNumeroNatural.ObtenerValor : Cardinal;
Begin
Result := Valor;
End;
Function CNumeroNatural.NumeroDigitos : Byte;
Var
Aux : Cardinal;
Cant : Byte;
Begin
Aux := Valor;
Cant := 0;
Repeat
Aux := Aux Div 10;
Inc( Cant );
Until(Aux = 0);
Result := Cant;
End;
Function CNumeroNatural.Digito( Posicion : Byte ) : Byte;
Var
Aux : Cardinal;
Digi , Digito : Byte;
Begin
Aux := Valor;
Digi := 0;
if( Posicion > 0 )and( Posicion <= NumeroDigitos )then
Begin
Repeat
Digito := Aux Mod 10;
Aux := Aux Div 10;
Inc( Digi );
Until( Digi > NumeroDigitos-Posicion );
Result := Digito;
End
Else
Raise CEMNumeroNatural.Create
('CNumeroNatural.Digito: Error Fuera de RANGO...');
End;
Function CNumeroNatural.EsPrimo : Boolean;
Var
i , n : word;
sw : boolean;
Begin
sw := true;
i := 2;
while(i <= ( Valor div 2 ) ) and ( sw = true ) do
Begin
n := Valor mod i;
if( n = 0 )then
sw := false;
i := i + 1 ;
End;
result := sw;
End;
Function CNumeroNatural.EsPar : Boolean;
Begin
Result := (valor mod 2)= 0 ;
End;
Function CNumeroNatural.SumarDigitos : Byte;
Var
Aux , Suma : Cardinal;
Begin
Aux := Valor;
Suma := 0;
Repeat
Suma := Suma +( Aux Mod 10 );
Aux := Aux Div 10;
Until( Aux = 0 );
Result := Suma;
End;
Function CNumeroNatural.DigitosPares : Byte;
Var
Aux : Cardinal;
Cant , Digito : Byte;
Begin
Aux := Valor;
Cant := 0;
Repeat
Digito := Aux Mod 10;
Aux := Aux Div 10;
If( Digito mod 2 = 0 )Then
Inc( Cant );
Until( Aux = 0 );
Result := Cant;
End;
Function CNumeroNatural.DigitosImpares : Byte;
Begin
Result := NumeroDigitos-DigitosPares;
End;
End.