ola..saludos a todoj. bueno .. aca el problema
quisiera que me corrigan lo que hise.
Ordenar digitos de un numero de menor a mayor---
ejem---N= 54321--N= 12345
//Aca esta la unidad con la que se supone tengo que hacer el ejercicio//
Código Delphi
[-]
Unit caja1;
Interface
Uses
SysUtils,dialogs;
Type
CEMNumeroNatural = Class(Exception);
CNumeroNatural = Class
Private
Valor : Cardinal;
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
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;
Function CNumeroNatural.ABinario : String;
Var
Cad : String;
Unit caja1;
Interface
Uses
SysUtils,dialogs;
Type
CEMNumeroNatural = Class(Exception);
CNumeroNatural = Class
Private
Valor : Cardinal;
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
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.
//Esto es lo que yo hice.. (lo hice en vector.. solo que tengo un problema.. al pasarlo en numero natural..)
Código Delphi
[-]
procedure ordenar(var b:cnumeronatural);
var x,veces,i:integer;
begin
for veces := 1 to(b.NumeroDigitos - 1) do
begin
for i := 1 to (b.NumeroDigitos - veces) do
begin
if b.Digito(i) > b.Digito(I+1) then
begin
x:=b.digito(i);
b.AsignarValor(b.Digito(I+1)* 10+ x);
end;
end;
end;
end;
var a:cnumeronatural;
X:integer;
begin
a:=cnumeronatural.crear;
Writeln('Digite un Numero');
Readln(x);
a.AsignarValor(x);
ordenar(a);
writeln('Numero Ordenado De Menor a Mayor ',a.obtenervalor);
readln;