Bueno gente, después de mucho tiempo sin postear les traigo algo hecho pura y exclusivamente por mi jaja. Se trata de un programita para pasar convertir sistemas de numeración.
Los sistemas de numeración a los que hace referencia el programa son el decimal, el binario, el octal y el hexadecimal. Aclaro que este programa fue realizado en Lazarus, que es bastante parecido al Turbo Pascal asi que el código que utilicé es el mismo.
Vamos con un poco de teoría
De Wikipedia
Un sistema de numeración es un conjunto de símbolos y reglas de generación que permiten construir todos los números válidos.
El sistema de numeración decimal, también llamado sistema decimal, es un sistema de numeración posicional en el que las cantidades se representan utilizando como base aritmética las potencias del número diez. El conjunto de símbolos utilizado (sistema de numeración arábiga) se compone de diez cifras : cero (0) - uno (1) - dos (2) - tres (3) - cuatro (4) - cinco (5) - seis (6) - siete (7) - ocho (8) y nueve (9).
El sistema numérico en base 8 se llama octal y utiliza los dígitos del 0 al 7.
En informática a veces se utiliza la numeración octal en vez de la hexadecimal. Tiene la ventaja de que no requiere utilizar otros símbolos diferentes de los dígitos. Sin embargo, para trabajar con bytes o conjuntos de ellos, asumiendo que un byte es una palabra de 8 bits, suele ser más cómodo el sistema hexadecimal, por cuanto todo byte así definido es completamente representable por dos dígitos hexadecimales.
El sistema binario, llamado también sistema diádico en ciencias de la computación, es un sistema de numeración en el que los números se representan utilizando solamente las cifras cero y uno (0 y 1). Es uno de los que se utiliza en las computadoras, debido a que trabajan internamente con dos niveles de voltaje, por lo cual su sistema de numeración natural es el sistema binario (encendido 1, apagado 0).
El sistema hexadecimal (a veces abreviado como Hex) es el sistema de numeración posicional que tiene como base el 16. Su uso actual está muy vinculado a la informática y ciencias de la computación, pues los computadores suelen utilizar el byte u octeto como unidad básica de memoria.
Acá abajo les dejo una tablita para que se ubiquen comparando los 15 primeros números entre dichos sistemas
Para poder realizar el programa, es necesario saber como pasar de un sistema a otro mediante métodos de conversión. Los que yo utilicé fueron los siguientes:
Suma Ponderada
División Reiterada
Método Directo
División Reiterada
Método Directo
DIVISIÓN REITERADA
Este método de conversión sirve para pasar de Sistema decimal a cualquier otro sistema, es decir, de decimal a binario, de decimal a octal y de decimal a hexadecimal. Esto pasa porque se opera con aritmética de la base de partida (base 10). Veamos un ejemplo:
Como podems observar, en este caso la base de llegada es 2 ya que queremos pasar un numero en decimal a binario. La base de partida es 10, por lo tanto se divide entre 2 utilizando aritmética de base decimal.
En general, los pasos para convertir de un sistema a otro mediante el método de la divisón reiterada son:
1) Identificar B (base de partida)
2) Identificar B' (base de llegada)
3) Establecer la siguiente relación (B')10____________(B*)B
Esto quiere decir " B' en base 10 es igual a B* en base B", siendo B* un valor equivalente en base B a B' en base 10
4) Dividir enteramente el número a convertir por B* hasta que el número sea menor. Una vez que sea menor, dividir nuevamente por última vez.
5) Cada uno de los restos tiene un valor. Esos valores están en base B, por lo que los tenemos que pasar a base B' mediante la tabla de equivalencias que ya les puse arriba. Ej: si un resto es 13 y queremos pasar de decimal a hexadecimal, entonces ese 13 es reemplazado por "D".
6) Agrupar cada uno de los restos de las divisiones enteras realizadas anteriormente para así obtener el resultado.
En nuestro ejemplo:
Nota: el numero a convertir es (100)10 a base binaria
1) B=10.
2) B'=2.
3) (B')10______________(B*)B
(2)10_____________(2)10 "2 en base 10, es igual a 2 en base 10"
4)
5) El cero en base 10 es igual a cero en base 2 y el 1 en base 10 es igual a 1 en base 2.
6) (100)10___________(1100100)2
SUMA PONDERADA
Este método conviene ser utilizado para pasar un numero de cualquier base a base decimal ya que se opera con base de llegada B'. Los pasos son los siguientes:
1) Identificar B (base de partida)
2) Identificar B' (base de llegada)
3) Establecer la siguiente relación (B)10____________(B*)B'
Esto quiere decir " B en base 10 es igual a B* en base B' ", siendo B* un valor equivalente en base B a B en base 10
4) Se multiplica cada dígito, empezando desde el que está más a la izquierda por B elevado a un exponente h que comienza desde la cantidad de dígitos menos 1 hasta cero.
5) Operando con aritmética de base de llegada, obtenemos el resultado.
Ejemplo
Nota:El número a convertir es (3034,75)8 a base 10.
1) B=8
2) B'=10
3) (B)10____________(B*)B'
(8)10____________(8)10
4) y 5)
MÉTODO DIRECTO
Y por último pero no menos importante, el método directo. Este método puede ser utilizado solo para conversiones de base binaria a base octal o hexadecimal. Esto se debe a que la segunda y la tercera son bases con potencia exacta de la primera, es decir que 2^3=8 y 2^4=16. Los pasos son los siguientes:
1) Si se quiere convertir del binario al octal, se pueden tomar grupos de a 3 dígitos del numero a convertir. Por ejemplo, si queremos convertir el numero 111 a base 8, no es necesario tomar digito por digito individualmente, si no que se pueden tomar los 3. Si se quiere convertir de binario a hexadecimal, se pueden tomar de a 4 digitos.
2) Establecer las equivalencias entre los digitos de base 2 y su correspondiente valor en base 8 o en base 16.
3) Agrupar estos ultimos para obtener el resultado.
Ejemplo
Nota: Pasar el número 100101011 que está en base 2, a base 8
1) Agrupo de a 3 digitos: 100, 101, 011
2) (100)2=(4)8
(101)2=(5)8
(011)2=(3)8
3) Agrupando, (100101011)2=(453)8
Y para pasarlo a hexadecimal seria lo mismo pero tomando de a 4 digitos.
(1011)2=(B)16
(10010)2=(B)16
Agrupando, quedaría: (100101011)2=(12B)16
Bueno ahora que ya sabemos la teoría podemos realizar el programa. Acuerdense que el lenguaje solamente opera con aritmética decimal, es decir que si quieren pasar de binario a hexadecimal, primero tienen que pasar de binario a decimal y después de decimal a hexadecimal.
Les dejo algunas capturas de pantalla para que vean de que se trata:








Antes que nada, quiero decir que el programa esta hecho en Lazarus, lo pueden descargar desde la página oficial o de algun otro lado. Y si tienen turbo pascal también es compatible ya que los archivos están en formato .PAS.
Descargá lazarus para tu sistema operativo acá
Bueno gente, después de estas capturas les dejo el programa ya terminado para que puedan convertir de una base a cualquier otra. Les pido por favor que si encuentran que algo no funciona bien me avisen asi lo reviso y cambio lo que tenga que cambiar. El archivo para descargar es un ejecutable, es decir que en teoria les tiene que funcionar a todos.
A este programita lo hice en Lazarus, por lo que tambien les voy a dejar todo para que lo puedan correr y editar a su gusto.
Me gustaría que recomienden el post a sus seguidores ya que este tipo de conocimientos debe saberse. Bah, en realidad, todo conocimiento debe saberse, asi que bueno estaria bueno que todos puedan ver como se resuelven este tipo de problemas.
Descarga todos los archivo
Descarga solamente el código en lenguaje Pascal
Descarga solamente el programa
Contraseña del .rar: chodrataringa
UNA PARTE del Código del programa
program sistemas;
uses crt;
var
i,l,z,o,aux,resto,h,num1,betasterisco,basepartida,basellegada,sumapond,mult,long,band: integer;
num,n,resto1,resultado,t,a,num2,dig: string;
v: array [1..10] of string;
begin
clrscr;
textcolor (lightred);
write ('HOLA, ESTE PROGRAMA FUE CREADO POR CHODRA PARA '); textcolor (lightblue); write ('TARINGA!'); textcolor (lightred); writeln ('. OJALA QUE TE SIRVA Y TE GUSTE ');
textcolor (white);
textmode (CO80);
highvideo;
repeat
write ('Ingrese el numero a convertir: ');
readln(num);
num2:=num;
val (num,num1,h);
resultado:=' ';
n:=' ';
sumapond:=0;
writeln ('Que desea convertir? ');
writeln ('De decimal a binario (Pulse 1) ');
writeln ('De decimal a octal (Pulse 2) ');
writeln ('De decimal a hexadecimal (Pulse 3) ');
writeln ('De hexadecimal a decimal (Pulse 4) ');
writeln ('De octal a decimal (Pulse 5)');
writeln ('De binario a decimal (Pulse 6)');
writeln ('De binario a hexadecimal (Pulse 7) ');
writeln ('De binario a octal (Pulse 8) ');
writeln ('De hexadecimal a binario (Pulse 9)');
writeln ('De hexadecimal a octal (Pulse 10) ');
writeln ('De octal a binario (Pulse 11) ');
writeln ('De octal a hexadecimal (Pulse 12) ');
writeln ('Ya no deseo convertir (Pulse 0) ');
write ('Escriba opcion que desee: ');
readln (a);
if (a='1') or (a='2') or (a='3') then
begin
if a='1' then
begin
i:=1;
band:=0;
while (band=0) and (i<=length(num)) do
begin
if (num[i]<>'0') and (num[i]<>'1') and (num[i]<>'2') and (num[i]<>'3') and (num[i]<>'4') and (num[i]<>'5') and (num[i]<>'6') and (num[i]<>'7') and (num[i]<>'8') and (num[i]<>'9') then
begin
writeln ('ERROR: Ingrese un valor correcto para poder convertirlo: ');
band:=1;
end
else
begin
basepartida:=2;
basellegada:=10;
betasterisco:=2;
i:=i+1;
end;
end;
if band=0 then
begin
resultado:=' ';
while num1>=betasterisco do
begin
resto:=(num1 mod betasterisco);
num1:=(num1 div betasterisco);
str (resto,resto1);
resultado:=resultado+resto1;
str (num1,num);
end;
if num1<betasterisco then
begin
str (num1,num);
resultado:=resultado+num;
end;
n:=' ';
for i:=length(resultado) downto 1 do
begin
n:=n+resultado[i];
end;
writeln ('El numero ',num2,' en base decimal es igual a',n,' en base binaria');
end;
end
else
begin
if a='2' then
begin
i:=1;
band:=0;
while (band=0) and (i<=length(num)) do
begin
if (num[i]<>'0') and (num[i]<>'1') and (num[i]<>'2') and (num[i]<>'3') and (num[i]<>'4') and (num[i]<>'5') and (num[i]<>'6') and (num[i]<>'7') and (num[i]<>'8') and (num[i]<>'9') then
begin
writeln ('ERROR: Ingrese un valor correcto para poder convertirlo: ');
band:=1;
end
else
begin
basepartida:=10;
basellegada:=8;
betasterisco:=8;
i:=i+1;
end;
end;
if band=0 then
begin
str (resto,resto1);
resultado:=' ';
if num1<betasterisco then
begin
case num1 of
10: begin num:='A'; end;
11: begin num:='B'; end;
12: begin num:='C'; end;
13: begin num:='D'; end;
14: begin num:='E'; end;
15: begin num:='F'; end;
end;
end;
while num1>=betasterisco do
begin
resto:=(num1 mod betasterisco);
num1:=(num1 div betasterisco);
str (resto,resto1);
case resto of
10: begin resto1:='A'; end;
11: begin resto1:='B'; end;
12: begin resto1:='C'; end;
13: begin resto1:='D'; end;
14: begin resto1:='E'; end;
15: begin resto1:='F'; end;
end;
resultado:=resultado+resto1;
str (num1,num);
end;
resultado:=resultado+num;
n:=' ';
for i:=length(resultado) downto 1 do
begin
n:=n+resultado[i];
end;
writeln ('El numero ',num2,' en base decimal es igual a',n,' en base octal');
end;
end
else
begin
if a='3' then
begin
i:=1;
band:=0;
while (band=0) and (i<=length(num)) do
begin
if (num[i]<>'0') and (num[i]<>'1') and (num[i]<>'2') and (num[i]<>'3') and (num[i]<>'4') and (num[i]<>'5') and (num[i]<>'6') and (num[i]<>'7') and (num[i]<>'8') and (num[i]<>'9') then
begin
writeln ('ERROR: Ingrese un valor correcto para poder convertirlo: ');
band:=1;
end
else
begin
basepartida:=10;
basellegada:=16;
betasterisco:=16;
i:=i+1;
end;
end;
if band=0 then
begin
if num1<betasterisco then
begin
case num1 of
0: begin num:='0'; end;
1: begin num:='1'; end;
2: begin num:='2'; end;
3: begin num:='3'; end;
4: begin num:='4'; end;
5: begin num:='5'; end;
6: begin num:='6'; end;
7: begin num:='7'; end;
8: begin num:='8'; end;
9: begin num:='9'; end;
10: begin num:='A'; end;
11: begin num:='B'; end;
12: begin num:='C'; end;
13: begin num:='D'; end;
14: begin num:='E'; end;
15: begin num:='F'; end;
end;
end
else
begin
resultado:=' ';
while num1>=betasterisco do
begin
resto:=(num1 mod betasterisco);
num1:=(num1 div betasterisco);
str (resto,resto1);
case resto of
0: begin resto1:='0'; end;
1: begin resto1:='1'; end;
2: begin resto1:='2'; end;
3: begin resto1:='3'; end;
4: begin resto1:='4'; end;
5: begin resto1:='5'; end;
6: begin resto1:='6'; end;
7: begin resto1:='7'; end;
8: begin resto1:='8'; end;
9: begin resto1:='9'; end;
10: begin resto1:='A'; end;
11: begin resto1:='B'; end;
12: begin resto1:='C'; end;
13: begin resto1:='D'; end;
14: begin resto1:='E'; end;
15: begin resto1:='F'; end;
end;
end;
resultado:=resultado+resto1;
str (num1,num);
end;
resultado:=resultado+num;
n:=' ';
for i:=length(resultado) downto 1 do
begin
n:=n+resultado[i];
end;
writeln ('El numero ',num2,' en base decimal es igual a',n,' en base hexadecimal');
end;
end;
end;
end;
end;
if (a='4') or (a='5') or (a='6') then
begin
if (a='4') then
begin
i:=1;
band:=0;
while (band=0) and (i<=length(num)) do
begin
if (num[i]<>'A') and (num[i]<>'B') and (num[i]<>'C') and (num[i]<>'D') and (num[i]<>'E') and (num[i]<>'F') and (num[i]<>'0') and (num[i]<>'1') and (num[i]<>'2') and (num[i]<>'3') and (num[i]<>'4') and (num[i]<>'5') and (num[i]<>'6') and (num[i]<>'7') and (num[i]<>'8') and (num[i]<>'9') then
begin
writeln ('ERROR: Ingrese un valor correcto para poder convertirlo: ');
band:=1;
end
else
begin
basepartida:=16;
basellegada:=10;
betasterisco:=16;
i:=i+1;
end;
end;
if band=0 then
begin
for i:=1 to length(num) do
begin
v[i]:=num[i];
end;
for i:=1 to length(num) do
begin
t:=v[i];
case t of
'A': begin v[i]:='10'; end;
'B': begin v[i]:='11'; end;
'C': begin v[i]:='12'; end;
'D': begin v[i]:='13'; end;
'E': begin v[i]:='14'; end;
'F': begin v[i]:='15'; end;
end;
end;
sumapond:=0;
l:=length(num);
for z:=1 to length(num) do
begin
aux:=betasterisco;
for i:=1 to l-2 do
begin
aux:=aux*betasterisco;
end;
if l=1 then
begin
aux:=1;
end;
t:=v[z];
val (t,mult,h);
sumapond:=sumapond+(mult*aux);
l:=l-1;
end;
writeln ('El numero ',num2,' en base hexadecimal es igual a: ',sumapond,' en base decimal');
end;
end;
if a='5' then
begin
basepartida:=8;
basellegada:=10;
betasterisco:=8;
long:=length(num);
dig:=num[long];
if (dig='8') or (dig='9') then
begin
writeln ('ERROR: Ingrese un valor correcto para poder convertirlo: ');
a:='SI';
end
else
begin
for i:=1 to length(num) do
begin
v[i]:=num[i];
end;
for i:=1 to length(num) do
begin
t:=v[i];
case t of
'A': begin v[i]:='10'; end;
'B': begin v[i]:='11'; end;
'C': begin v[i]:='12'; end;
'D': begin v[i]:='13'; end;
'E': begin v[i]:='14'; end;
'F': begin v[i]:='15'; end;
end;
end;
sumapond:=0;
l:=length(num);
for z:=1 to length(num) do
begin
aux:=betasterisco;
for i:=1 to l-2 do
begin
aux:=aux*betasterisco;
end;
if l=1 then
begin
aux:=1;
end;
t:=v[z];
val (t,mult,h);
sumapond:=sumapond+(mult*aux);
l:=l-1;
end;
end;
writeln ('El numero ',num2,' en base octal es igual a: ',sumapond,' en base decimal');
end;
if a='6' then
begin
i:=1;
band:=0;
while (band=0) and (i<=length(num)) do
begin
if (num[i]<>'0') and (num[i]<>'1') then
begin
writeln ('ERROR: Ingrese un valor correcto para poder convertirlo: ');
band:=1;
end
else
begin
basepartida:=2;
basellegada:=10;
betasterisco:=2;
i:=i+1;
end;
end;
if band=0 then
begin
for i:=1 to length(num) do
begin
v[i]:=num[i];
end;
for i:=1 to length(num) do
begin
t:=v[i];
case t of
'A': begin v[i]:='10'; end;
'B': begin v[i]:='11'; end;
'C': begin v[i]:='12'; end;
'D': begin v[i]:='13'; end;
'E': begin v[i]:='14'; end;
'F': begin v[i]:='15'; end;
end;
end;
sumapond:=0;
l:=length(num);
for z:=1 to length(num) do
begin
aux:=betasterisco;
for i:=1 to l-2 do
begin
aux:=aux*betasterisco;
end;
if l=1 then
begin
aux:=1;
end;
t:=v[z];
val (t,mult,h);
sumapond:=sumapond+(mult*aux);
l:=l-1;
end;
writeln ('El numero ',num2,' en base binaria es igual a: ',sumapond,' en base decimal');
end;
end;
end;
