ola.. soy yo .. siempre .. con algun problema.. que no puedo resolver..
bueno ahora..el ejercicio es este... //
Ingresar un numero.. y sacar el promedio de los digitos pares//
bueno ahora les explico ....
aca esta mi unit.. con la que tengo que trabarjar este ejercicio...
necesito resolver... utilizando lo que tengo aca...( Yo ya lo hice.. pero me sale error en el momento de dividir...).. bueno les dejo toda la unit.. aun que no creo que este ejercicio se resuelva con lo que esta en private..
espero me ayuden ... gracias ...
saludos
Código Delphi
[-]
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.