Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 08-05-2011
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 835
Poder: 24
gatosoft Va camino a la fama
Bueno amigo,

hice la prueba en mi equipo y comiló perfecto... estos problemas me sucedian en Delphi 4 y 5(hace años)...

La explicación que encontré en su momento fue que el compilador intenta trabajar de "forma inteligente", eliminando variables basura, es decir, la que el considera que son inoficiosas por que se declaran, se asignan pero no se usan realmente para nada...

En tu caso no debería ser asi, pues la sentencia:

Código Delphi [-]
if aux = 0 then

deberia forzar al compilador a que se tuviera en cuenta... ¿que version de Delphi Utilizas?...

No se si alguien mas tenga una idea sobre esto, tal vez alguna opcion del compilador que haya que ajustar???


intenta algo diferente, para forzar al compilador a que tenga en cuenta tu variable...:

Código Delphi [-]
//esto es solo una idea...
function intercalar( var a,b,c:cnumeronatural):integer;
var aux,pos:integer;
begin
pos:=1;
aux:=0;
while pos < = a.numerodigitos do
   begin
    inc(aux);
     if (aux mod 2) = 0 then
        begin
           c.asignarvalor((c.obtenervalor * 10) + a.digito(pos)));
           end else
             begin
                 c.asignarvalor((c.obtenervalor * 10) + b.digito(pos)));
                 pos:=pos+1; 
       end;
    end;       
     end;
end;


Por otro lado, para la proxima, recuerda que cada nuevo hilo es una hstoria nueva y debes entregar toda la información posible... me refiero a que no todos saben que tienes una unidad llamada Caja1, que es la base de tus tareas...

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
     inherited create;
     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.


y aqui la prueba que hice:

Código Delphi [-]
uses Caja1;

{$R *.dfm}

function intercalar( var a,b,c:cnumeronatural):integer;
var aux,pos:integer;
begin
pos:=1;
aux:=0;
while pos <= a.numerodigitos do
   begin
     if aux = 0 then
        begin
           c.asignarvalor((c.obtenervalor * 10) + a.digito(pos));
           aux:=1;
        end else
             begin
                 c.asignarvalor((c.obtenervalor * 10) + b.digito(pos));
                 pos:=pos+1;
                aux:=0;
             end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c : CNumeroNatural;

begin
  Try
    a := CNumeroNatural.Crear;
    b := CNumeroNatural.Crear;
    c := CNumeroNatural.Crear;

    a.AsignarValor(StrToInt(Edit1.Text));
    b.AsignarValor(StrToInt(Edit2.Text));
    intercalar(a,b,c);

    Edit3.Text := IntTostr(c.ObtenerValor);
  Finally
    a.free;
    b.free;
    c.free;
  End;
end;

Un saludo,
Responder Con Cita
 



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
Muchos digitos...¿es posible? Carnash Varios 2 21-02-2009 23:17:26
FastReport - Matriz de Puntos - Dos copias sin intercalar ewitte Impresión 4 19-07-2008 16:35:58
intercalar paginas con fastreport mferrero Impresión 1 26-02-2008 13:36:54
Intercalar Variable en SQL... foetus SQL 7 09-07-2007 02:21:28
Ingresar un núm de 10 digitos... coronado Varios 1 12-10-2006 13:49:18


La franja horaria es GMT +2. Ahora son las 15:54:40.


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