Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
Ordenar digitos de menor a mayor

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

//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;
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
//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.
//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;

Última edición por luisito2011 fecha: 04-05-2011 a las 20:18:52.
Responder Con Cita
  #2  
Antiguo 04-05-2011
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Luisito, creo que tu problema está en los indices que utilizas en los bucles de ordenamiento... Por lo menos, en el "método de la burbuja" debería ser:

Código Delphi [-]
For i:= 1 to N-1 do
  For j:= i+1 to N do

Por otro lado te aconsejo, para mejorar tu clase:

1) utiliza las propiedades, son poderosas...

Código Delphi [-]
CNumeroNatural = Class (TObject)
Private
   FValor : Cardinal;
   procedure setValor(Value: Cardinal);
Public
  Property Valor: Cardinal read FValor write setValor;
end;//CNumeroNatural 

implementation

procedure setValor(Value: Cardinal);
Begin
  // validaciones, cálculos ...
  FValor := Value;
end;

De esta manera, no tenbdrias que llamar directamente el método: AsignarValor
así:

Código Delphi [-]
a:=cnumeronatural.crear;
Writeln('Digite un Numero');
Readln(a.Valor);

2) ¿Porqué el ordeamiento o hace parte de la clase?,

Código Delphi [-]
a.OrdenarDigitos

Eso por ahora...

Un saludo,
Responder Con Cita
  #3  
Antiguo 04-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
.... eso de for.. si esta bien.. por que me funciona en vector
.... y tengo que resolver el ejercicio .. utilizando la unit.. que esta arriba..
y no puedo añadir ... o borrar .. nada de la unit...
Responder Con Cita
  #4  
Antiguo 04-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
respondan .... porfavor
Responder Con Cita
  #5  
Antiguo 04-05-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
me he dado cuenta que a nuestro amigo luisito, le han dejado en su centro de estudios varios ejercicios y encima le han dado una libreria con la cual poder resolverlos

entonces (y no quiero ser despectivo ni petulante), creo que es cuestion de pensar y analizar un poquito cual es la solucion (con un martillo no puedo sacar clavos de una madera)

y me uno a lo menciono Roman en otro hilo
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #6  
Antiguo 05-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Además de que hace falta que le des una releída a nuestra guía de estilo, amigo luisito2011, aquí estamos para ayudar, pero no para hacerle el trabajo a los demás. Si tanto te urge entonces tendrás que buscar a un profesional que te ayude, te pase la minuta, etc.
Responder Con Cita
  #7  
Antiguo 05-05-2011
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Cita:
Empezado por luisito2011 Ver Mensaje
respondan .... porfavor
No se si reir o llorar...

Bueno luisito...

1) ¿a que te refieres con eso de: "con vector si funciona"?... por que no nos muestras el codigo ejemplo..

2) ¿A que te refieres con que "no funciona"?, te sale error?, te miuestra un numero, pero te lo muestra mal??


3) hice la prueba y efectivamente el ordenamiento sirve... pero veo que el probelma esta en el intercambio que haces en el codigo interno...

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;


Es decir... si has analizado lo que esto hace????

No hay que hacer debug para ver que en cada iteraccion se destruye el numero..!!!

Si tenemos un valor b.Valor ==> 89675 entonces:
x:=8 //en la primera iteraccion
b.Valor==> (9) * 10 + 8 ..!!!

En tu segunda iteraccion vale 98... es decir... 89675 se convirtio en 98...

¿Sabes como hacer un seguimiento paso a paso? podrias valerte de un memo o algo para ver lo que tu codigo esta mostrando...

un saludo.
Responder Con Cita
  #8  
Antiguo 05-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
Además de que hace falta que le des una releída a nuestra guía de estilo, amigo luisito2011, aquí estamos para ayudar, pero no para hacerle el trabajo a los demás. Si tanto te urge entonces tendrás que buscar a un profesional que te ayude, te pase la minuta, etc.

no pue.. si yo quisiera que me resuelvan todo.. les pongo todos ejercicios... que me dieron.... de los 50.. son como 10 o 5..que me parte la cabeza..ademaj... solo posteo.. los que.. no le entiendo..
y solo les pedi...una ayuda... ni modo graciaj de todoj modos
bye
Responder Con Cita
  #9  
Antiguo 05-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
[quote=gatosoft;398969]No se si reir o llorar...

voj.. si querej reite llora... hace lo que voj queraj..viejo..
nadie nace sabiendo...

quote]
Responder Con Cita
  #10  
Antiguo 05-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por luisito2011 Ver Mensaje
nadie nace sabiendo...
Tienes toda la razón, amigo, el problema es que nos parece que no estás haciendo mucho esfuerzo, que estás exponiendo tus problemas un poco superficialmente a la espera de que te lo solucionen. Pero ya te digo, es la sensación que nos da.

Aquí no hay ningún problema en ayudar, al contrario, eso es lo que hacemos todos, para eso existe estos foros, pero la mayoría de esos problemas que nos relata no son "problemas", son cosas que se solucionan poniéndose a seguir paso a paso el código y pensando un poco.
Además que tienes la opción de buscar, hay cientos de miles de posts, también tienes la sección de trucos, y el FTP con muchísimo código, tutoriales, programas, ejemplos, libros, etc.

En fin, no estoy contando nada que no esté escrito en nuestras normas, la guía de estilo.

Saludos.
Responder Con Cita
  #11  
Antiguo 05-05-2011
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Cita:
Empezado por luisito2011 Ver Mensaje
voj.. si querej reite llora... hace lo que voj queraj..viejo..
nadie nace sabiendo...
Cita:
Empezado por luisito2011 Ver Mensaje
no pue.. si yo quisiera que me resuelvan todo.. les pongo todos ejercicios... que me dieron.... de los 50.. son como 10 o 5..que me parte la cabeza..ademaj... solo posteo.. los que.. no le entiendo..
y solo les pedi...una ayuda... ni modo graciaj de todoj modos
Es cierto que nadie nace sabiendo, pero no puedes negar que hemos intentado ayudarte en este hilo... Así como en otros que has posteado...

Ya en un hilo pasado habia pasado algo parecido contigo, y apoyo el comentario de casimiro cuando dice

Cita:
nos parece que no estás haciendo mucho esfuerzo
Entendemos que estas empezando, pero parece que no has entendido la mecanica del club... (Es por eso que cada tanto te remiten a visitar la guia de estilo)

Vaya amigo, ya tienes un buen numero de post en este sitio, otros han abandonado ante la primera insinuación de "visitar la guia de estilo"... Te invito a que continues, pero por favor intenta tambien comprender que estamos aqui por que nos gusta ayudar y no por que tengamos que hacerlo... desde ese punto de vista no sobra un "por favor" y un gracias" pero de corazón.

y bueno, ya volviendo sobre tu tema, te repito mi teoria sobre la causa del error:

está en las líneas:

Código Delphi [-]
x:=b.digito(i);
b.AsignarValor(b.Digito(I+1)* 10+ x);

Debes generar un procedimeitno para reemplazar un digito dentro del número:

Código Delphi [-]
x:=b.digito(i);
b.ReemplazarDigito(I   , b.digito(i+1));
b.ReemplazarDigito(I+1, x);


Un saludo,
Responder Con Cita
  #12  
Antiguo 05-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
mmm bueno eso del esfuerzo... si lo hago..
solo que si.. lo acepto es como si no lo haga...

//beuno dejando eso aparte.. aca resolvi mi problema... solo
que solo me funciona con 8 digitos..cuando pongo mas de 9.. error..//

me pueden decir por que...

Código Delphi [-]
 
procedure ordenar(var b:cnumeronatural);
var 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
            b.InsertarDigito(i,b.Digito(i+1));
            b.ObtenerValor;
             b.EliminarDigito(i+2);
          end;
        end;
    end;
end;
Responder Con Cita
  #13  
Antiguo 06-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por luisito2011 Ver Mensaje
[..]
que solo me funciona con 8 digitos..cuando pongo mas de 9.. error..//
[..]
¿Y qué error es?
Responder Con Cita
  #14  
Antiguo 06-05-2011
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
saludos.

porque no usas la propiedad invertir?

Código:
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils,caja1;

 
 var a:cnumeronatural;
 X:integer;
 begin
  a:=cnumeronatural.crear;
  Writeln('Digite un Numero');
  Readln(x);
  a.AsignarValor(x);
  a.Invertir;
  writeln('Numero Ordenado De Menor a Mayor ',a.obtenervalor);
  readln;
 end.
Responder Con Cita
  #15  
Antiguo 06-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
el error que me sale.. es // fuera de rango//
Responder Con Cita
  #16  
Antiguo 06-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
Cita:
Empezado por beginner01 Ver Mensaje
saludos.

porque no usas la propiedad invertir?

Código:
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils,caja1;
 
 
 var a:cnumeronatural;
 X:integer;
 begin
  a:=cnumeronatural.crear;
  Writeln('Digite un Numero');
  Readln(x);
  a.AsignarValor(x);
 a.Invertir;
  writeln('Numero Ordenado De Menor a Mayor ',a.obtenervalor);
  readln;
 end.
No pue si uso el metodo invertir.. solo me sirve para los digitos
ordenados como 98765.. o 654321..

//Y sobre el error .. me sale fuera de rango..//
/
Responder Con Cita
  #17  
Antiguo 06-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 Luisito.

Este método 'tendría' que ordenarte lenta pero correctamente los dígitos de menor a mayor:
Código Delphi [-]
procedure CNumeroNatural.Ordenar;
var
  i,j:integer;
  a: Byte;
begin
   for i:= 1 to NumeroDigitos  do
    for j := i+1 to NumeroDigitos do
     if Digito(i) > Digito(j) then
     begin
       a:= Digito(i);
       InsertarDigito(i,Digito(j));
       InsertarDigito(j,a);
     end;
end;
Y digo 'tendría' por que así lo haría si el método InsertarDigito funcionara como se espera...

Como un ejemplo vale más que mil palabras, intentemos llenar los 6 dígitos de una cifra con ceros:
Código Delphi [-]
var
  N: TNumeroNatural;
  i: Integer;
begin
  N:= TNumeroNatural.Crear;
  N.AsignarValor(123456);
  for i:= 1 to 8 do
    N.InsertarDigito(i,0);
  ShowMessage(IntToStr(N.ObtenerValor));   
end;
Seguro que esperabas ver: 000000, pero por suerte la programación nunca deja de sorprendernos...
El resultado es: 3569126384

Un saludo.
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 06-05-2011 a las 08:32:24.
Responder Con Cita
  #18  
Antiguo 06-05-2011
luisito2011 luisito2011 is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 82
Poder: 14
luisito2011 Va por buen camino
Cita:
Hola Luisito.

Este método 'tendría' que ordenarte lenta pero correctamente los dígitos de menor a mayor:

Código Delphi [-]
procedure CNumeroNatural.Ordenar;
var
i,j:integer;
a: Byte;
begin
for i:= 1 to NumeroDigitos do
for j := i+1 to NumeroDigitos do
if Digito(i) > Digito(j) then
begin
a:= Digito(i);
InsertarDigito(i,Digito(j));
InsertarDigito(j,a);
end;
end;





Un saludo
mmm.. si te das cuenta.. cuando uso el metodo.. de insertar digito
no remplaza al digito...
ejem... si quiero ordenar esto 54.. solo 2 numeros
mi respuesta sera esto 445554.. eso es con tu procedure..

por eso en mi procedure.. utilize .. eliminardigito... pero solo me funciona con 8 digitos...
Responder Con Cita
  #19  
Antiguo 06-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 Luisito.

Entonces malinterpreté la función que realiza el método InsertarDigito. (Errare humanum est... )
En cuanto al error que te genera al usar más 8 dígitos vas a tener que hacer un seguimiento del comportamiento del método o los métodos que te lo generan. Podés poner un break y hacer un TraceInto (F7) para ir viendo el comportamiento del método y también ir evaluando los valores que asumen sus variables.
Lamento no disponer del tiempo para hacer esa tarea.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



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
¿como hago para comprobar si un nº de versión es mayor o menor? cocute Varios 8 21-01-2010 11:31:13
Fecha de mayor a menor alcides Varios 2 15-02-2008 16:46:09
Conocer el menor inexistente brandolin Firebird e Interbase 3 25-01-2007 12:27:00
ordenar un DBGrid de mayor a menor jmlifi Varios 2 03-11-2005 16:36:34
Agrupamiento mostrando el menor agonzalez SQL 3 19-02-2004 23:29:19


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


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