26.6.. Napisati program koji omogućuje pretvaranje decimalnih brojeva u heksadecimalne i obratno.

Opis rješenja:

Primjer pretvaranja decimalnog broja 435210 u heksadecimalni broj 110016.
4352 : 16 = 272
X(1) = 0    ostatak
272 : 16 = 17
X(2) = 0    ostatak
17 : 16 = 1                            435210 = 110016
X(3) = 1    ostatak
1 : 16 = 0
X(4) = 1    ostatak
text
110016 = 1 * 163 + 1 * 162 + 0 * 161 + 0 * 160 =
= 1 * 4096 + 1 * 256 + 0 * 16 + 0 * 1 = 435210

Opis programa: Heksadecimalni brojevi se često koriste u računarskoj tehnici. Preračunavanje iz heksadecimalne u decimalne brojeve je zamoran posao. Ovaj program olakšava proračunavanje.
Poslije startanja programa na ekranu se ispisuje: Program omogućuje da biramo način pretvaranja:

  1. Heksadecimalni u decimalni broj
  2. Decimalni u heksadecimalni broj
  3. Kraj

Izaberemo pretvaranje koje želimo. Primjer pretvaranja decimalnog broja 435210 u heksadecimalni broj 110016.
text
4352 : 16 = 272
X(1) = 0    ostatak
272 : 16 = 17
X(2) = 0    ostatak
17 : 16 = 1                            435210 = 110016
X(3) = 1    ostatak
1 : 16 = 0
X(4) = 1    ostatak
text
110016 = 1 * 163 + 1 * 162 + 0 * 161 + 0 * 160 =
= 1 * 4096 + 1 * 256 + 0 * 16 + 0 * 1 = 435210


Ispis na ekranu:
Učitati heksadecimalni broj: FAO
Heksadecimalni broj FAO
Decimalni ekvivalent 4000
Hoćeš li novi broj: N

II izvođenje
Učitati decimalni broj: 2748
Decimalni broj = 2748
Heksadecimalni ekvivalent = ABC
Hoćeš li novi broj: N

Spisak varijabli:
A - pomoćna varijabla
BR - broj cifara heksadecimalnog broja
CI$ - cifra heksadecimalnog broja
D - pomoćna varijabla
DB - decimalni broj
HX$ - heksadecimalni broj
I - pomoćna varijabla
SEM - kontrolna varijabla
X - cifra heksadecimalnog broja (decimalni zapis)

PROGRAM  HexDecKonverter;
USES
  WinCrt;
type
  TCifreNiz = array[1..50] of Char;

var
  X: TCifreNiz;
  IZ, DB: Integer;
  HX, DA: string;
  SEM: Boolean;

procedure Menu;
begin
  ClrScr;
  Writeln(Tab(10), 'I Z B O R');
  Writeln;
  Writeln;
  Writeln('1. Heksadecimalni u decimalni broj');
  Writeln('2. Decimalni u heksadecimalni broj');
  Writeln('3. Kraj');
  Writeln; Writeln; Writeln;
  Write(Tab(20), 'Vas izbor: ');
  Readln(IZ);
end;

procedure ProvjeraHeksa(HX: string; var HB: string; var Znak: Integer; var SEM: Boolean);
var
  I: Integer;
  C: Char;
begin
  SEM := False;
  Znak := 1;
  HB := HX;
  
  if HX[1] = '-' then
  begin
    Znak := -1;
    HB := Copy(HX, 2, Length(HX) - 1);
  end;
  
  for I := 1 to Length(HB) do
  begin
    C := UpCase(HB[I]);
    if not ((C >= '0') and (C <= '9') or (C >= 'A') and (C <= 'F')) then
    begin
      SEM := True;
      Writeln('Greska: Neispravan heksadecimalni broj!');
      Break;
    end;
  end;
end;

function HeksaUDecimalni(HB: string; Znak: Integer): Integer;
var
  I, V, Rezultat: Integer;
  C: Char;
begin
  Rezultat := 0;
  
  for I := 1 to Length(HB) do
  begin
    C := UpCase(HB[I]);
    if (C >= '0') and (C <= '9') then
      V := Ord(C) - Ord('0')
    else
      V := Ord(C) - Ord('A') + 10;
    
    Rezultat := Rezultat * 16 + V;
  end;
  
  HeksaUDecimalni := Rezultat * Znak;
end;

procedure HeksUDec;
var
  HX, HB: string;
  Znak: Integer;
begin
  repeat
    Write('Ucitati heksadecimalni broj: ');
    Readln(HX);
    
    ProvjeraHeksa(HX, HB, Znak, SEM);
    if SEM then
      Continue;
    
    DB := HeksaUDecimalni(HB, Znak);
    
    Writeln('Heksadecimalni broj ', HX);
    Writeln('Decimalni ekvivalent ', DB);
    
    Write('Hoces li novi broj? ');
    Readln(DA);
  until (UpCase(DA[1]) = 'N');
end;

function DecUHeksa(DB: Integer): string;
var
  Temp, Ostatak: Integer;
  Rezultat, ZnakStr: string;
  C: Char;
begin
  Rezultat := '';
  Temp := DB;
  
  if Temp = 0 then
  begin
    DecUHeksa := '0';
    Exit;
  end;
  
  ZnakStr := '';
  if DB < 0 then
  begin
    ZnakStr := '-';
    Temp := -DB;
  end;
  
  while Temp > 0 do
  begin
    Ostatak := Temp mod 16;
    if Ostatak < 10 then
      C := Chr(Ostatak + 48)
    else
      C := Chr(Ostatak + 55);
    
    Rezultat := C + Rezultat;
    Temp := Temp div 16;
  end;
  
  DecUHeksa := ZnakStr + Rezultat;
end;

procedure DecUHex;
begin
  repeat
    Write('Ucitati decimalni broj: ');
    Readln(DB);
    
    HX := DecUHeksa(DB);
    
    Writeln('Decimalni broj ', DB);
    Writeln('Heksadecimalni ekvivalent ', HX);
    
    Write('Hoces li novi broj? ');
    Readln(DA);
  until (UpCase(DA[1]) = 'N');
end;

begin
  repeat
    Menu;
    case IZ of
      1: HeksUDec;
      2: DecUHex;
      3: begin
           Writeln('Kraj programa');
           Break;
         end;
    else
      Writeln('Nepoznat izbor!');
    end;
  until IZ = 3;
  READLN;
END.

Izvođenje programa:

Index