bueno.. aca otro problemita...
// Pida un numero por teclado e inserte el digito 9 en la 3 posicion de dicho numero... Sin usar IF - WHILE - REPEAT //
Tambien utilizando esta unidad..
Ejemplo.. N = 123456789
N = 129456789
Código Delphi
[-]
Unit caja1;
Interface
Uses
SysUtils,dialogs;
Type
CEMNumeroNatural = Class(Exception);
CNumeroNatural = Class
Private
Valor : Cardinal;
Function UnidadesRom(u : Byte ) : 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;
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.