Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
Sacar promedio de Nro.. pares

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
//PRIVATE
//ROMANOS
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;
//LITERAL
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;
//PUBLIC
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;//Inserta 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 );//Elimina 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.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.
Responder Con Cita
  #2  
Antiguo 01-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por luisito2011 Ver Mensaje
bueno ahora..el ejercicio es este...

//Ingresar un numero.. y sacar el promedio de los digitos pares//
Así, de memoria, más o menos es algo así:

Código Delphi [-]
function getPromedioDigitosPares( cNumero:string ):double;
var
  iX : integer;
  dSuma : double;
  iDigitos : integer;
begin
  dSuma := 0;
  iDigitos := 0;
  for iX:=0 to length(cNumero) do
  begin
    if (iX mod 2)=0 then
    begin
      dSuma := dSuma + StrToFloat(cNumero[iX]);
      inc(iDigitos)
    end;
  end;
  Result := dSuma / iDigitos;
end;

Y la llamada sería algo así:
Código Delphi [-]
ShosMessage(FloatToStr(getPromedioDigitosPares('8942472384')));

Si no te he entendido mal, es algo así.
Responder Con Cita
  #3  
Antiguo 01-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Así, de memoria, más o menos es algo así:


Código Delphi [-]
function getPromedioDigitosPares( cNumero:string ):double;
var
iX : integer;
dSuma : double;
iDigitos : integer;
begin
dSuma := 0;
iDigitos := 0;
for iX:=0 to length(cNumero) do
begin
if (iX mod 2)=0 then
begin
dSuma := dSuma + StrToFloat(cNumero[iX]);
inc(iDigitos)
end;
end;
Result := dSuma / iDigitos;
end;





Y la llamada sería algo así:

Código Delphi [-]
ShosMessage(FloatToStr(getPromedioDigitosPares('8942472384')));





Si no te he entendido mal, es algo así.

si esta bien eso.. pero eso esta en Form application--
ai no me sale error cuando hago la divicion... pero yo la quiero en
console.. ai si me sale error cuando hago la division ...
Responder Con Cita
  #4  
Antiguo 02-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
alguien que me responda porfavor... oh que me diga si no le entiende.. a mi problema
Responder Con Cita
  #5  
Antiguo 02-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola luisito2011.

¿ Que error te arroja el procedimiento cuando intentás ejecutarlo en consola ? ¿ De compilación, de ejecucion ?

También es importante que escribas textualmente el mensaje que te arroja y si además indicas la línea donde se produce, mejor todavia.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 02-05-2011 a las 16:18:52.
Responder Con Cita
  #6  
Antiguo 02-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Claro, no he contestado nada porque estaba esperando que explicase correctamente el error que tiene.
Responder Con Cita
  #7  
Antiguo 02-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
ok.. bueno lo siento ..esto es lo que hice.. si esta mal .. me corrigen.. oh si puedo hacerlo de otra forma..espero me ayuden..
saludos..
(' Tambien probe.. cambiando lo que devuelve la funcion Integer por Real.. y.. el prom.. tambien en real... pero me salen unos numero.. muy largos..




Código Delphi [-]
function Promediopar(var n:cnumeronatural):integer;
var
cont,i,sum,pro:integer;
 
begin
cont:=0;
sum:=0;
for i := 1 to n.numerodigitos do
begin
if (n.Digito(i) mod 2) =0 then
sum := sum + n.Digito(i);
cont:=cont+1;
end;
pro:=Sum/Cont; (error *Incompatible types:'Integer' and extended *)
Promediopar:=pro; (error*Incompatible types:'integer' and extended *)
end;
 
 
var a:cnumeronatural;
x:integer;
begin
a:=cnumeronatural.Crear;
WriteLn('Digite Un Numero'); Readln(x);
A.AsignarValor(x);
WriteLn('Promedio De Digotos Pares ' ,promediopar(a));
readln;
Responder Con Cita
  #8  
Antiguo 02-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si ves mi ejemplo... he usado el tipo "double", no el 'integer'
Si no te importa la precisión ni los decimales, entonces usa 'div' en lugar de la barra de dividir '/'
Código Delphi [-]
pro := Sum div Cont;
Responder Con Cita
  #9  
Antiguo 02-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
omg-- se me olvido del DIV.. bueno gracias..... ago otro tema tengo otro problema... siempre con problemas
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cumpleaños a pares Casimiro Notevi La Taberna 6 14-10-2010 16:55:09
Como tomo los nro pares de un select tulio SQL 2 22-04-2009 13:16:13
Sacar el promedio o media en sql ? juangabriel1786 SQL 4 04-12-2008 23:33:28
Imprimir páginas pares o impares mediante el QReport? bestiux Impresión 4 10-06-2004 20:53:48
Colorear filas pares rxDBGrid?????? mguixot OOP 1 08-09-2003 15:50:52


La franja horaria es GMT +2. Ahora son las 21:27:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi