Pascal/Turbo Pascal - Binario a octal

   
Vista:

Binario a octal

Publicado por javijusty (2 intervenciones) el 31/10/2014 01:39:30
Hola gente
Estoy intentando hacer una función de conversión de números binarios a octales
La verdad no se en que le estoy errando y quisas alguno de ustedes le vea el error
La idea es contar los caracteres y agregarle uno o dos ceros para que quede numero de caracteres multiplo de 3

Luego dividirlos y buscar cada cadena en un vector y que me vaya devolviendo su posición como valor octal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
program binOctal;
uses crt;
 
 function binOcta:integer;     //arranca la funcion
  var
    cantOcta,i,e,m,y:integer;
    cOcta:real;
    nBin,nOcta,x,v,n:string;
    vector: array[1..8] of string;
 
  begin
   vector[1]:='000';
   vector[2]:='001';
   vector[3]:='010';
   vector[4]:='011';
   vector[5]:='100';
   vector[6]:='101';
   vector[7]:='110';
   vector[8]:='111';
 
   write('Ingrese su numero binario: '); //ingresa numero
   readln(nBin);
   cOcta:= length(nBin) mod 3 ; //devuelve el resto de la division para saber si es multiplo de tres o si tenemos que agregar ceros al numero
    if (cOcta=2) then // si devuelve 2 agrego 1 cero al comienzo del binario
     nBin:='0'+nBin
    else
     if (cOcta=1) then  // si devuelve 1 agrego 2 ceros al comienzo del binario
      nBin:='00'+nBin;
 
   cantOcta:= length(nBin) div 3;  // el div me determina la cantidad de cifras octales
 
   nOcta:='';
   e:=1;
 
  for i:=1 to cantOcta do
   begin
    for m:=1 to 8 do
     begin
     v:=copy(nBin,e,e+2);
      if (v=vector[m]) then
       begin
        e:=e+3;
        y:=m-1;
        str(y,x);
        nOcta:=nOcta+x;
       end;
      end;
    end;
    writeln(cantOcta);
    writeln('Tu numero ',nBin,' binario se ha convertido a ',nOcta,' octal.');
   end;
 
begin
 clrscr;
   binOcta;
 readkey;
end.

Si prueban el programa... ven que con numeros de una cifra (de 000 a 111) y de dos cifras (de 001000 a 111111) el programa funciona impecable
Pero al agregar la tercera cifra o mas... ya deja de funcionar....
No entiendo el por qué hace eso
Si alguien lo puede mirar quizas encuentre el error
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Binario a octal

Publicado por David (144 intervenciones) el 01/11/2014 20:01:56
Te propongo la siguiente solución:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
program binOctal;
uses crt;
 
 function binOcta:integer;
  var
    cantOcta,i,e,m,y:integer;
    cOcta:real;
    s, auxcad, nBin,nOcta,x,v,n:string;
    vector: array[1..8] of string;
 
  begin
   s:='';
   vector[1]:='000';
   vector[2]:='001';
   vector[3]:='010';
   vector[4]:='011';
   vector[5]:='100';
   vector[6]:='101';
   vector[7]:='110';
   vector[8]:='111';
 
   write('Ingrese su numero binario: ');
   readln(nBin);
   cOcta:= length(nBin) mod 3 ;
    if (cOcta=2) then
     nBin:='0'+nBin
    else
     if (cOcta=1) then
      nBin:='00'+nBin;
 
   cantOcta:= length(nBin) div 3;
 
   nOcta:='';
   e:=1;
   While nbin<>'' do
     begin
       auxcad:=copy(nbin,1,3);
       for i:=1 to 8 do
         if auxcad=vector[i] then
           begin
              str(i-1,s);
              nOcta:=concat(nOcta,s);
              delete(nbin,1,3);
           end;
     end;
     writeln(nOcta);
end;
 
begin
 clrscr;
   binOcta;
 readkey;
end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Binario a octal

Publicado por javijusty (2 intervenciones) el 02/11/2014 19:49:22
Muchísimas gracias David
En efecto era ese el problema
Estaba intentando hacer el copy desde una determinada posición, hasta otra, por ejemplo de la 4 a la 4+2 cuando en realidad es de la 4 y 3 lugares a partir de ahí
Muchísimas gracias y ya pueden cerrar el hilo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar