jueves, 26 de enero de 2012

Practica entregable IB

Este programa NO pone infinito o NaN.



PROGRAM ieeee (input,output);                                      
(*Programa que pasa de un número en decimal a IEEE y vicerbeza*)
VAR
   Opcion:char;
   Opcion2:char;
 
PROCEDURE menu;
          BEGIN
               Writeln('[S] Salir del programa.');
               Writeln('[D] De decimal a IEEE. ');
               Writeln('[I] De IEEE a decimal. ');
          END;
(*****************************************************************************)        
PROCEDURE menud;
          BEGIN
               Writeln('[V] Volver al menú anterior.');
               Writeln('[S] Simple precisión.       ');
               Writeln('[D] Doble precisión.        ');
          END;
(*****************************************************************************)        
PROCEDURE menui;
          BEGIN
               Writeln('[V] Volver al menú anterior.');
               Writeln('[S] Simple precisión.       ');
               Writeln('[D] Doble precisión.        ');
          END;
(*****************************************************************************)        
PROCEDURE dectoieeesp;
TYPE
    TCadena = string (50);
    TAbinario = ARRAY [1..23] OF integer;
    TAexponente = ARRAY [1..8] OF integer;
    Tatotal = ARRAY [1..32] OF integer;
    TAieee = PACKED ARRAY [1..8] OF char;
VAR
    Numero:real;(**)
    Entero:real VALUE (0); (**)
    Decimal:real VALUE (0); (**)
    Enteroi:integer;    (**)
    Binarioe:TAbinario;  (**)
    Exponente:integer;    (**)
    Exponenteb:TAexponente;   (**)
    Signo:integer VALUE (0);  (**)
    Total:TAtotal;           (**)
    Resultado:TAieee;        (**)
    Contador:integer;        (**)

PROCEDURE pedir_numero;
          BEGIN
               Write('Escribe el número que quieres pasar: ');
               Readln(Numero);
          END;
(******************************************************************************)        
PROCEDURE signos;
          BEGIN
          IF Numero<0 THEN
             BEGIN
             Signo:=1;
             Numero:=-Numero;
             END
          ELSE
              Signo:=0;    
          END;
(*****************************************************************************)        
PROCEDURE partes;
          BEGIN
          Decimal:=FRAC(Numero);
          Entero:=INT (Numero);
          Enteroi:=ROUND(Entero);
          END;
(******************************************************************************)        
PROCEDURE binario;
          TYPE
              TAABinario = ARRAY [1..23] OF integer;
          VAR
             i:integer VALUE (1);
             Binarios:TAABinario;                                    
          PROCEDURE b_entero;
                    VAR
                       i:integer VALUE (1);
                       j:integer VALUE (1);
                    BEGIN
                         i:=1;          
                         WHILE i<=23 DO
                               BEGIN
                                    Binarios[i] := Enteroi MOD (2);
                                    Enteroi:= Enteroi DIV (2);
                                    i:=i+1
                               END;
                         i:=23;
                         j:=1;
                         WHILE i>=1 DO
                               BEGIN
                                     Binarioe[i]:=Binarios[j];
                                     i:=i-1;
                                     j:=j+1;
                               END;
                    END;
(******************************************************************************)                  
            PROCEDURE binario_de;    
                     VAR
                        i:integer;
                        Decimalada:real;
                     BEGIN
                          i:=23-contador;
                          Decimalada:=Decimal;
                          WHILE i<=23 DO
                                BEGIN
                                     Decimalada:=Decimalada*2;
                                     IF Decimalada >=1 THEN
                                        BEGIN
                                             Binarioe[i]:=1;
                                             Decimalada:=Decimalada-1;
                                             i:=i+1;
                                        END
                                     ELSE
                                         BEGIN
                                         Binarioe[i]:=0;
                                         i:=i+1;
                                         END;
                               END;
                     END;                          
 (*****************************************************************************)                                                                                                                
            PROCEDURE buscar_cifras;
                    VAR
                       i:integer;
                       j:integer;
                       buscador:integer VALUE (0);
                    BEGIN
                         i:=1;
                         Contador:=0;                  
                         WHILE i<=23 DO
                              BEGIN
                              buscador:=Binarioe[i];
                              IF buscador = 1 THEN
                                 i:=24
                              ELSE
                                   contador:=contador+1;
                                   i:=i+1;
                              END;
                         Exponente:=23-contador;
                    END;
(**************************************************************************)
         PROCEDURE binario_man;
                    VAR
                       i:integer VALUE (1);
                       j:integer VALUE (1);
                       Buscador:integer;
                       Contadore:integer VALUE (0);
                    BEGIN
                        j:=1;
                        i:=1;
                        Contadore:=1;
                        WHILE i<=23 DO
                              BEGIN
                                   Buscador:=Binarioe[i];
                                   IF Buscador=1 THEN
                                   BEGIN
                                      Contadore:=Contadore+1;
                                      i:=24;
                                   END  
                                   ELSE
                                   BEGIN  
                                      Contadore:=Contadore+1;
                                      i:=i+1;
                                   END;
                              END;  
                        FOR i:=Contadore TO 23 DO
                            BEGIN
                                 Binarioe[j]:=Binarioe[i];
                                 j:=j+1;
                            END;
                        FOR i:=1 TO Contadore DO
                            BEGIN
                                 Binarioe[j]:=0;
                                 j:=j+1;
                            END;
                    END;                                                        
                                               
(*PROCEDIMIENTO binario, principal *)                                        
                   
          BEGIN
          b_entero;        
          buscar_cifras;        
          binario_man;
          binario_de;        
          END;
(****************************************************************************)        
PROCEDURE exponenciadas;
          VAR
             exponenci:integer;
          PROCEDURE dos_ene;
                    BEGIN
                          exponenci:=(2 POW(7)-1)+Exponente-1;
                    END;
(******************************************************************************)                  
          PROCEDURE exp_bin;
                    TYPE
                        TABinarioex = ARRAY [1..8] OF integer;
                    VAR
                       i:integer;
                       j:integer;
                       Binarioex:TABinarioex;
                    BEGIN
                         i:=1;
                              WHILE i<=8 DO
                                    BEGIN
                                         Binarioex[i]:=exponenci MOD (2);
                                         exponenci:=exponenci DIV (2);
                                         i:=i+1;
                                    END;
                              i:=8;
                              j:=1;
                              WHILE i>=1 DO
                                    BEGIN
                                         Exponenteb[i]:=Binarioex[j];
                                         i:=i-1;
                                         j:=j+1;
                                    END;
                    END;
(*****************************************************************************)                          
          BEGIN
               dos_ene;
               exp_bin;
          END;
(*****************************************************************************)        
PROCEDURE resultadot;
          VAR
             i:integer;
          BEGIN
               Writeln;
               Writeln('SIGNO EXPONENTE      MANTISA');
               Write('  ',Signo:0,'   ');
               FOR i:=1 TO 8 DO
               Write(Exponenteb[i]:0);
               Write('     ');
               FOR i:=1 TO 23 DO
               Write(Binarioe[i]:0);
               writeln;
          END;
(******************************************************************************)        
PROCEDURE rieee;
          VAR
              i:integer VALUE (1);
          PROCEDURE unir;
                    VAR
                       i:integer;
                       j:integer VALUE (1);
                    BEGIN
                         Total[1]:=Signo;
                         j:=1;
                         FOR i:=2 TO 9 DO
                              BEGIN
                                   Total[i]:=Exponenteb[j];
                                   j:=j+1;
                              END;
                         j:=1;    
                         FOR i:=10 TO 32 DO
                             BEGIN
                                  Total[i]:=binarioe[j];
                                  j:=j+1;
                             END;
                    END;
(*************************************************************************************)                  
          PROCEDURE gruposb;
                    VAR
                       i:integer;
                       j:integer;
                       k:integer;
                       tope:integer;
                       Contador:integer;
                    BEGIN
                         j:=1;
                         tope:=4;
                         FOR i:=1 TO 8 DO BEGIN
                             Contador:=90000;
                             WHILE j<=tope DO BEGIN
                                 Contador:=Contador+Total[j]*10 POW(tope-j);
                                 j:=j+1;
                             END;
                             CASE Contador OF
                                        90000: Resultado[i]:='0';
                                        90001: Resultado[i]:='1';
                                        90010: Resultado[i]:='2';
                                        90011: Resultado[i]:='3';
                                        90100: Resultado[i]:='4';
                                        90101: Resultado[i]:='5';
                                        90110: Resultado[i]:='6';
                                        90111: Resultado[i]:='7';
                                        91000: Resultado[i]:='8';
                                        91001: Resultado[i]:='9';
                                        91010: Resultado[i]:='A';
                                        91011: Resultado[i]:='B';
                                        91100: Resultado[i]:='C';
                                        91101: Resultado[i]:='D';
                                        91110: Resultado[i]:='E';
                                        91111: Resultado[i]:='F';
                                   END;
                              tope:=tope+4;        
                                   END;
                                   Writeln;
                                   Writeln(Resultado);  
               END;
(****************************************************************************)                                                    
          BEGIN
               unir;
               gruposb;
          END;
(****************************************************************************)        
BEGIN
     pedir_numero;
     signos;
     partes;
     binario;
     exponenciadas;
     resultadot;
     rieee;
END;
(*****************************DECTOIEEEDP**********************************)
PROCEDURE dectoieeedp;
TYPE
    TCadena = string (50);
    TAbinario = ARRAY [1..52] OF integer;
    TAexponente = ARRAY [1..11] OF integer;
    Tatotal = ARRAY [1..64] OF integer;
    TAieee = PACKED ARRAY [1..16] OF char;
VAR
    Numero:real;(**)
    Entero:real VALUE (0); (**)
    Decimal:real VALUE (0); (**)
    Enteroi:integer;    (**)
    Binarioe:TAbinario;  (**)
    Exponente:integer;    (**)
    Exponenteb:TAexponente;   (**)
    Signo:integer VALUE (0);  (**)
    Total:TAtotal;           (**)
    Resultado:TAieee;        (**)
    Contador:integer;        (**)

PROCEDURE pedir_numero;
          BEGIN
               Write('Escribe el número que quieres pasar: ');
               Readln(Numero);
          END;
(******************************************************************************)        
PROCEDURE signos;
          BEGIN
          IF Numero<0 THEN
             BEGIN
             Signo:=1;
             Numero:=-Numero;
             END
          ELSE
              Signo:=0;    
          END;
(*****************************************************************************)        
PROCEDURE partes;
          BEGIN
          Decimal:=FRAC(Numero);
          Entero:=INT (Numero);
          Enteroi:=ROUND(Entero);
          END;
(******************************************************************************)        
PROCEDURE binario;
          TYPE
              TAABinario = ARRAY [1..52] OF integer;
          VAR
             i:integer VALUE (1);
             Binarios:TAABinario;                                    
          PROCEDURE b_entero;
                    VAR
                       Resultado:integer;
                       i:integer VALUE (1);
                       j:integer VALUE (1);
                    BEGIN
                         i:=1;          
                         WHILE i<=52 DO
                               BEGIN
                                    Binarios[i] := Enteroi MOD (2);
                                    Enteroi:= Enteroi DIV (2);
                                    i:=i+1
                               END;
                         i:=52;
                         j:=1;
                         WHILE i>=1 DO
                               BEGIN
                                     Binarioe[i]:=Binarios[j];
                                     i:=i-1;
                                     j:=j+1;
                               END;    
                    END;
(******************************************************************************)                  
            PROCEDURE binario_de;    
                     VAR
                        i:integer;
                        Decimalada:real;
                     BEGIN
                          i:=52-contador;
                          Decimalada:=Decimal;
                          WHILE i<=52 DO
                                BEGIN
                                     Decimalada:=Decimalada*2;
                                     IF Decimalada >=1 THEN
                                        BEGIN
                                             Binarioe[i]:=1;
                                             Decimalada:=Decimalada-1;
                                             i:=i+1;
                                        END
                                     ELSE
                                         BEGIN
                                         Binarioe[i]:=0;
                                         i:=i+1;
                                         END;
                               END;
                     END;                          
 (*****************************************************************************)                                                                                                                
            PROCEDURE buscar_cifras;
                    VAR
                       i:integer;
                       j:integer;
                       buscador:integer VALUE (0);
                    BEGIN
                         i:=1;
                         Contador:=0;                  
                         WHILE i<=52 DO
                              BEGIN
                              buscador:=Binarioe[i];
                              IF buscador = 1 THEN
                                 i:=53
                              ELSE
                                   contador:=contador+1;
                                   i:=i+1;
                              END;
                         Exponente:=52-contador;
                    END;
(******************************************************************************)
          PROCEDURE binario_man;
                    VAR
                       i:integer VALUE (1);
                       j:integer VALUE (1);
                       Buscador:integer;
                       Contadore:integer VALUE (0);
                    BEGIN
                        j:=1;
                        i:=1;
                        Contadore:=1;
                        WHILE i<=52 DO
                              BEGIN
                                   Buscador:=Binarioe[i];
                                   IF Buscador=1 THEN
                                   BEGIN
                                      Contadore:=Contadore+1;
                                      i:=53;
                                   END  
                                   ELSE
                                   BEGIN  
                                      Contadore:=Contadore+1;
                                      i:=i+1;
                                   END;
                              END;  
                        FOR i:=Contadore TO 52 DO
                            BEGIN
                                 Binarioe[j]:=Binarioe[i];
                                 j:=j+1;
                            END;
                        FOR i:=1 TO Contadore DO
                            BEGIN
                                 Binarioe[j]:=0;
                                 j:=j+1;
                            END;
                    END;                                                        
(******************************************************************************)                                                
(*PROCEDIMIENTO binario, principal *)                                        
                   
          BEGIN
          b_entero;        
          buscar_cifras;        
          binario_man;
          binario_de;        
          END;
(****************************************************************************)        
PROCEDURE exponenciadas;
          VAR
             exponenci:integer;
          PROCEDURE dos_ene;
                    BEGIN
                          exponenci:=(2 POW(10)-1)+Exponente-1;
                    END;
(******************************************************************************)                  
          PROCEDURE exp_bin;
                    TYPE
                        TABinarioex = ARRAY [1..11] OF integer;
                    VAR
                       i:integer;
                       j:integer;
                       Binarioex:TABinarioex;
                    BEGIN
                         i:=1;
                              WHILE i<=11 DO
                                    BEGIN
                                         Binarioex[i]:=exponenci MOD (2);
                                         exponenci:=exponenci DIV (2);
                                         i:=i+1;
                                    END;
                              i:=11;
                              j:=1;
                              WHILE i>=1 DO
                                    BEGIN
                                         Exponenteb[i]:=Binarioex[j];
                                         i:=i-1;
                                         j:=j+1;
                                    END;
                    END;
(*****************************************************************************)                          
          BEGIN
               dos_ene;
               exp_bin;
          END;
(*****************************************************************************)        
PROCEDURE resultadot;
          VAR
             i:integer;
          BEGIN
               Writeln;
               Writeln('SIGNO EXPONENTE      MANTISA');
               Write('  ',Signo:0,'   ');
               FOR i:=1 TO 11 DO
               Write(Exponenteb[i]:0);
               Write('     ');
               FOR i:=1 TO 52 DO
               Write(Binarioe[i]:0);
               writeln;
          END;
(******************************************************************************)        
PROCEDURE rieee;
          VAR
              i:integer VALUE (1);
          PROCEDURE unir;
                    VAR
                       i:integer;
                       j:integer VALUE (1);
                    BEGIN
                         Total[1]:=Signo;
                         j:=1;
                         FOR i:=2 TO 12 DO
                              BEGIN
                                   Total[i]:=Exponenteb[j];
                                   j:=j+1;
                              END;
                         j:=1;    
                         FOR i:=13 TO 64 DO
                             BEGIN
                                  Total[i]:=binarioe[j];
                                  j:=j+1;
                             END;
                    END;
(*************************************************************************************)                  
          PROCEDURE gruposb;
                    VAR
                       i:integer;
                       j:integer;
                       k:integer;
                       tope:integer;
                       Contador:integer;
                    BEGIN
                         j:=1;
                         tope:=4;
                         FOR i:=1 TO 16 DO BEGIN
                             Contador:=90000;
                             WHILE j<=tope DO BEGIN
                                 Contador:=Contador+Total[j]*10 POW(tope-j);
                                 j:=j+1;
                             END;
                             CASE Contador OF
                                        90000: Resultado[i]:='0';
                                        90001: Resultado[i]:='1';
                                        90010: Resultado[i]:='2';
                                        90011: Resultado[i]:='3';
                                        90100: Resultado[i]:='4';
                                        90101: Resultado[i]:='5';
                                        90110: Resultado[i]:='6';
                                        90111: Resultado[i]:='7';
                                        91000: Resultado[i]:='8';
                                        91001: Resultado[i]:='9';
                                        91010: Resultado[i]:='A';
                                        91011: Resultado[i]:='B';
                                        91100: Resultado[i]:='C';
                                        91101: Resultado[i]:='D';
                                        91110: Resultado[i]:='E';
                                        91111: Resultado[i]:='F';
                                   END;
                              tope:=tope+4;        
                                   END;
                                   Writeln;
                                   Writeln(Resultado);  
               END;
(****************************************************************************)                                                    
          BEGIN
               unir;
               gruposb;
          END;
(****************************************************************************)        
BEGIN
     pedir_numero;
     signos;
     partes;
     binario;
     exponenciadas;
     resultadot;
     rieee;
END;              
(*******************IEEE TO DEC SP*********************************************)
PROCEDURE ieeetodecsp;
          TYPE
               TCadena = STRING (100);  (**)
               TABinario = ARRAY [1..32] OF integer; (**)
               TAExponente = ARRAY [1..8] OF integer; (**)
               TAMantisa = ARRAY [1..23] OF integer; (**)
               TAGrupos = ARRAY[1..4] OF integer; (**)
               
          VAR
               Numero:TCadena; (**)
               Binario:TABinario; (**)
               Exponenteb:TAExponente; (**)
               Mantisab:TAMantisa; (**)
               Signob:real; (**)
               Exponented:integer; (**)
               Partee:integer; (**)
               Parted:real; (**)
               Parteer:real; (**)
             
          PROCEDURE pedir_numero;
                    BEGIN
                         Write('Escribe el número que quieres pasar: ');
                         Readln(Numero);
                    END;
(*****************************************************************************)                  
          PROCEDURE hextobin;
                    TYPE
                        TRGrupos = RECORD
                                         Grupos:TAGrupos;
                                   END;
                        TARGrupos = ARRAY [1..8] OF TRGrupos;
                    VAR
                    Agrupados:TARGrupos;
                    i,j,k:integer;
                    BEGIN
                          i:=1;
                          j:=1;
                          WHILE i<=8 DO
                                BEGIN
                                     WITH AGrupados[j] DO
                                          BEGIN
                                               CASE Numero[i] OF
                                                    '0': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '1': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    '2': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '3': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;

                                                         END;
                                                    '4': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '5': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    '6': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '7': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;
                                                         END;
                                                    '8': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '9': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    'A','a': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    'B','b': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;
                                                         END;
                                                    'C','c': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    'D','d': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    'E','e': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    'F','f': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;
                                                         END;
                                               END;(*Del CASE*)                                        
                                          END; (*Del WITH*)
                                          i:=i+1;
                                          j:=j+1;
                                END; (*Del WHILE*)
                                 Writeln;
                                 k:=1;
                                 i:=1;
                                 WHILE i<=8 DO
                                       BEGIN
                                       WITH AGrupados[i] DO
                                            BEGIN
                                               FOR j:=1 TO 4 DO BEGIN
                                               Binario[k]:=Grupos[j];
                                               k:=k+1;
                                               END;
                                            END;
                                        i:=i+1;
                                       END;                          
                    END;(*Del procedimiento*)
(****************************************************************************)
          PROCEDURE separar;
                    VAR
                       i:integer;
                       j:integer;
                    BEGIN
                         i:=1;
                         j:=2;
                         Signob:=Binario[1];
                         FOR i:=1 TO 8 DO BEGIN  
                            Exponenteb[i]:=Binario[j];
                            j:=j+1;
                         END;
                         FOR i:=1 TO 23 DO BEGIN
                            Mantisab[i]:=Binario[j];
                            j:=j+1;
                         END;
                         Writeln('SIGNO  EXPONENTE    MANTISA');
                         Write('  ');
                         Write(Signob:1:0);
                         Write('    ');
                         FOR i:=1 TO 8 DO BEGIN
                             Write(Exponenteb[i]:0);
                         END;
                         Write('     ');
                         FOR i:=1 TO 23 DO BEGIN
                             Write(Mantisab[i]:0);
                         END;
                         Writeln;
                    END;
(******************************************************************************)
          PROCEDURE Exp_dec;
                    VAR
                       i,j:integer;
                    BEGIN
                         Exponented:=0;
                         i:=1;
                         j:=7;
                         WHILE i<=8 DO BEGIN
                             IF Exponenteb[i]=1 THEN
                                Exponented:=Exponented+ (2 POW (j))
                             ELSE
                                Exponented:=Exponented;
                             j:=j-1;
                             i:=i+1;  
                         END;
                    Exponented:=Exponented-127;
                    END;
(******************************************************************************)
          PROCEDURE parted_partee;
                    VAR
                       i,j:integer;
                    BEGIN
                         j:=Exponented-1;
                         Partee:=2 POW (Exponented);
                         FOR i:=1 TO Exponented DO BEGIN
                             IF Mantisab[i]=1 THEN
                                Partee:=Partee+ (2 POW(j))
                             ELSE
                                Partee:=Partee;
                         j:=j-1;
                         END;
                         j:=1;
                         Parted:=0;
                         Exponented:=Exponented+1;
                         FOR i:=Exponented TO 23 DO BEGIN
                             IF Mantisab[i] = 1 THEN
                                Parted:=Parted + (1/(2 POW(j)))
                             ELSE
                                Parted:=Parted;
                         j:=j+1;
                         END;
                         Parteer:=Partee+Parted;
                         IF Signob = 0 THEN
                            Parteer:=Parteer
                         ELSE
                            Parteer:=-Parteer;
                         Writeln(Parteer:20:10);  
                    END;
(******************************************************************************)                                                                                                                                                                                                                  
BEGIN
           REPEAT
           pedir_numero;
           UNTIL length(Numero)=8;
           hextobin;
           separar;
           Exp_dec;
           parted_partee;
END;
(******************************IEEE TO DEC DP**********************************)
PROCEDURE ieeetodecdp;
          TYPE
               TCadena = string(100);
               TABinario = ARRAY [1..64] OF integer; (**)
               TAExponente = ARRAY [1..11] OF integer; (**)
               TAMantisa = ARRAY [1..52] OF integer; (**)
               TAGrupos = ARRAY[1..4] OF integer; (**)
               
          VAR
               Numero:TCadena; (**)
               Binario:TABinario; (**)
               Exponenteb:TAExponente; (**)
               Mantisab:TAMantisa; (**)
               Signob:real; (**)
               Exponented:integer; (**)
               Partee:integer; (**)
               Parted:real; (**)
               Parteer:real; (**)
             
          PROCEDURE pedir_numero;
                    BEGIN
                         Write('Escribe el número que quieres pasar: ');
                         Readln(Numero);
                    END;
(*****************************************************************************)                  
          PROCEDURE hextobin;
                    TYPE
                        TRGrupos = RECORD
                                         Grupos:TAGrupos;
                                   END;
                        TARGrupos = ARRAY [1..16] OF TRGrupos;
                    VAR
                    Agrupados:TARGrupos;
                    i,j,k:integer;
                    BEGIN
                          i:=1;
                          j:=1;
                          WHILE i<=16 DO
                                BEGIN
                                     WITH AGrupados[j] DO
                                          BEGIN
                                               CASE Numero[i] OF
                                                    '0': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '1': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    '2': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '3': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;

                                                         END;
                                                    '4': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '5': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    '6': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '7': BEGIN
                                                         Grupos[1] := 0;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;
                                                         END;
                                                    '8': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    '9': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    'A','a': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    'B','b': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 0;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;
                                                         END;
                                                    'C','c': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 0;
                                                         END;
                                                    'D','d': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 0;
                                                         Grupos[4] := 1;
                                                         END;
                                                    'E','e': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 0;
                                                         END;
                                                    'F','f': BEGIN
                                                         Grupos[1] := 1;
                                                         Grupos[2] := 1;
                                                         Grupos[3] := 1;
                                                         Grupos[4] := 1;
                                                         END;
                                               END;(*Del CASE*)                                        
                                          END; (*Del WITH*)
                                          i:=i+1;
                                          j:=j+1;
                                END; (*Del WHILE*)
                                 Writeln;
                                 k:=1;
                                 i:=1;
                                 WHILE i<=16 DO
                                       BEGIN
                                       WITH AGrupados[i] DO
                                            BEGIN
                                               FOR j:=1 TO 4 DO BEGIN
                                               Binario[k]:=Grupos[j];
                                               k:=k+1;
                                               END;
                                            END;
                                        i:=i+1;
                                       END;                              
                    END;(*Del procedimiento*)
(****************************************************************************)
          PROCEDURE separar;
                    VAR
                       i:integer;
                       j:integer;
                    BEGIN
                         Signob:=Binario[1];
                         i:=1;
                         FOR j:=2 TO 12 DO BEGIN  
                            Exponenteb[i]:=Binario[j];
                            i:=i+1;
                         END;
                         i:=1;
                         FOR j:=13 TO 64 DO BEGIN
                            Mantisab[i]:=Binario[j];
                            i:=i+1;
                         END;
                         Writeln('SIGNO  EXPONENTE       MANTISA');
                         Write('  ');
                         Write(Signob:1:0);
                         Write('    ');
                         FOR i:=1 TO 11 DO BEGIN
                             Write(Exponenteb[i]:0);
                         END;
                         Write('     ');
                         FOR i:=1 TO 54 DO BEGIN
                             Write(Mantisab[i]:0);
                         END;
                         Writeln;
                    END;
(******************************************************************************)
          PROCEDURE Exp_dec;
                    VAR
                       i,j:integer;
                    BEGIN
                         Exponented:=0;
                         i:=1;
                         j:=10;
                         WHILE i<=11 DO BEGIN
                             IF Exponenteb[i]=1 THEN
                                Exponented:=Exponented+ (2 POW (j))
                             ELSE
                                Exponented:=Exponented;
                             j:=j-1;
                             i:=i+1;  
                         END;
                    Exponented:=Exponented-1023;
                    END;
(******************************************************************************)
          PROCEDURE parted_partee;
                    VAR
                       i,j:integer;
                    BEGIN
                         j:=Exponented-1;
                         Partee:=2 POW (Exponented);
                         FOR i:=1 TO Exponented DO BEGIN
                             IF Mantisab[i]=1 THEN
                                Partee:=Partee+ (2 POW(j))
                             ELSE
                                Partee:=Partee;
                         j:=j-1;
                         END;
                         j:=1;
                         Parted:=0;
                         Exponented:=Exponented+1;
                         FOR i:=Exponented TO 64 DO BEGIN
                             IF Mantisab[i] = 1 THEN
                                Parted:=Parted + (1/(2 POW(j)))
                             ELSE
                                Parted:=Parted;
                         j:=j+1;
                         END;
                         Parteer:=Partee+Parted;
                         IF Signob = 0 THEN
                         Parteer:=Parteer
                         ELSE
                         Parteer:=-Parteer;
                         Writeln(Parteer:20:10);  
                    END;
(******************************************************************************)                                                                                                                                                                                                                  
BEGIN
           REPEAT
           pedir_numero;
           UNTIL length(Numero)=16;
           hextobin;
           separar;
           Exp_dec;
           parted_partee;    
END;                                
(***********************PROGRAMA PRINCIPAL*************************************)            
BEGIN
     REPEAT
           menu;
           Readln(Opcion);
           CASE Opcion OF
           'd','D':BEGIN
                        REPEAT
                        menud;
                        Readln(Opcion2);
                              CASE Opcion2 OF
                                   'S','s': BEGIN
                                            dectoieeesp;
                                            END;
                                   'D','d': BEGIN
                                            dectoieeedp;
                                            END;
                                   'V','v':Writeln('Volviendo al menú anterior...');
                                   OTHERWISE
                                            Writeln('Opción no válida por favor elija otra.');
                                   END;
                        UNTIL (Opcion2 = 'V') OR (Opcion2 = 'v');          
                   END;
           'I','i':BEGIN
                        REPEAT
                        menui;
                        Readln(Opcion2);
                        CASE Opcion2 OF
                             'S','s': BEGIN
                                      ieeetodecsp;
                                      END;
                             'D','d': BEGIN
                                      ieeetodecdp;                                    
                                      END;
                             'V','v': Writeln('Volviendo al menú anterior...');
                        OTHERWISE
                                 Writeln('Opción no válida por favor elija otra...');
                        END;
                        UNTIL (Opcion2 = 'v') OR (Opcion2 = 'V');
                   END;
           'S','s':Writeln('Saliendo del programa...');
     OTHERWISE
               Writeln('Opción no válida, por favor elija otra.');
     END;    
     UNTIL (Opcion = 'S') OR (Opcion = 's');
END.

3 comentarios:

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | GreenGeeks Review