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)

Listing programa:

I verzija rjesenje WHILE petlja
REM 26011490
1 REM DECIMALNI <--> HEKSADECIMALNI BROJEVI
10 REM Glavni program
20 DIM X(50): REM cifre heksa broja (max 50)
30 GOSUB 100: REM menu
40 ON IZ GOSUB 200, 500, 60: REM heks. u dek., dek. u heks. broj, kraj
50 GOTO 30
60 STOP

100 REM Menu
110 CLS: PRINT TAB(10); "I Z B O R"
120 PRINT: PRINT
130 PRINT "1. Heksadecimalni u decimalni broj"
140 PRINT "2. Decimalni u heksadecimalni broj"
150 PRINT "3. Kraj"
160 PRINT: PRINT: PRINT
170 PRINT TAB(20);
180 INPUT "Vas izbor "; IZ
190 RETURN

200 REM Heksadecimalni broj u decimalni broj
210 INPUT "Ucitati heksadecimalni broj "; HX$
220 GOSUB 300: REM provjera cifara heksa broja
230 IF SEM = 1 THEN GOTO 210
240 GOSUB 400: REM pretvaranje heksa u decimalni
249 REM ispis
250 PRINT "Heksadecimalni broj "; HX$
260 PRINT "Decimalni ekvivalent "; DB
270 INPUT "Hoces li novi broj "; DA$
280 IF LEFT$(DA$, 1) <> "N" AND LEFT$(DA$, 1) <> "n" THEN GOTO 210
290 RETURN

300 REM Provjera cifara heksadecimalnog broja
310 SEM = 0
znak = 1: REM predznak - pozitivan heksa broj
HB$ = HX$: REM heksa broj
320 IF LEFT$(HX$, 1) = "-" THEN
    znak = -1: REM negativan heksa broj
    HB$ = MID$(HX$, 2): REM broj postaje pozitivan za pretvaranje
325 END IF
330 FOR I = 1 TO LEN(HB$)
    C$ = UCASE$(MID$(HB$, I, 1))
    IF NOT ((C$ >= "0" AND C$ <= "9") OR (C$ >= "A" AND C$ <= "F")) THEN
        SEM = 1
        PRINT "Greska: Neispravan heksadecimalni broj!"
        EXIT FOR
    END IF
335 NEXT I
350 RETURN

400 REM Pretvaranje heksadecimalnog u decimalni broj (deli?i su nedostajali u slikama)
410 DB = 0: REM pocetna vrijednost decimalnog broja
420 FOR I = 1 TO LEN(HB$)
    C$ = UCASE$(MID$(HB$, I, 1)): REM ulaz sve ccifre heksadecimalnog broja velika slova
    IF C$ >= "0" AND C$ <= "9" THEN
        V = VAL(C$): REM heksa cifra od 0 do 9
    ELSE
        V = ASC(C$) - ASC("A") + 10: REM heksa cifra od 10 do 15 tj A do F
    END IF
    DB = DB * 16 + V
460 NEXT I
DB = DB * znak: REM predznak broja
480 RETURN

500 REM Decimalni broj u heksadecimalni (deli?i su nedostajali u slikama)
510 INPUT "Ucitati decimalni broj "; DB
520 GOSUB 600: REM pretvaranje decimalnog u heksadecimalni
530 PRINT "Decimalni broj "; DB
540 PRINT "Heksadecimalni ekvivalent "; HX$
550 INPUT "Hoces li novi broj "; DA$
560 IF LEFT$(DA$, 1) <> "N" AND LEFT$(DA$, 1) <> "n" THEN GOTO 510
570 RETURN

600 REM Pretvaranje decimalnog u heksadecimalni broj
610 HX$ = ""
620 TEMP = DB
630 IF TEMP = 0 THEN HX$ = "0": GOTO 690
znak$ = "": REM predznak
640 IF DB < 0 THEN
    znak$ = "-"
    TEMP = -DB: REM broj postaje pozitivan za pretvaranje
END IF

650 WHILE TEMP > 0
    OST = TEMP MOD 16
    IF OST < 10 THEN
        C$ = CHR$(OST + 48): REM 48 je ASCII za '0'
    ELSE
        C$ = CHR$(OST + 55): REM  55 daje ASCII za 'A' kada OST=10
    END IF
    HX$ = C$ + HX$: REM heksadecimalna cifra se dodaje ispred prethodne vrijednosti HX$
    TEMP = TEMP \ 16: REM Celobrojno deljenje
WEND
HX$ = znak$ + HX$: REM dodaj znak ispred heksadecimalnog broja
690 RETURN


II verzija staro rjesenje
REM 26011490
1 REM DECIMALNI <--> HEKSADECIMALNI BROJEVI
10 REM Glavni program
20 DIM X(50), XY(50): REM cifre heksa broja (max 50)
25 HD = 16: REM osnova heksadecimilnog sistema
30 GOSUB 100: REM menu
40 ON IZ GOSUB 200, 500, 60: REM heks. u dek., dek. u heks. broj, kraj
50 GOTO 30
60 STOP

100 REM Menu
110 CLS: PRINT TAB(10); "I Z B O R"
120 PRINT: PRINT
130 PRINT "1. Heksadecimalni u decimalni broj"
140 PRINT "2. Decimalni u heksadecimalni broj"
150 PRINT "3. Kraj"
160 PRINT: PRINT: PRINT
170 PRINT TAB(20);
180 INPUT "Vas izbor "; IZ
190 RETURN

200 REM Heksadecimalni broj u decimalni broj
210 INPUT "Ucitati heksadecimalni broj "; HX$
220 GOSUB 300: REM provjera cifara heksa broja
230 IF SEM = 1 THEN GOTO 210
240 GOSUB 400: REM pretvaranje heksa u decimalni
249 REM ispis
250 PRINT "Heksadecimalni broj "; HX$
260 PRINT "Decimalni ekvivalent "; DB
270 INPUT "Hoces li novi broj (/N) "; DA$
280 IF LEFT$(DA$, 1) <> "N" AND LEFT$(DA$, 1) <> "n" THEN GOTO 210
290 RETURN

300 REM Provjera cifara heksa broja
310 SEM = 0: REM indikator greske
320 FOR I = 1 TO LEN(HX$)
    330 CI$ = MID$(HX$, I, 1): REM cifra heksa broja
    340 IF CI$ >= "0" AND CI$ <= "9" THEN GOTO 370
    350 IF CI$ >= "A" AND CI$ <= "F" THEN GOTO 370 
    360 SEM = 1: PRINT "GRESKA": GOTO 380
370 NEXT I
380 RETURN

400 REM Pretvaranje heksadecimalnog u decimalni
410 DB = 0: REM decimalni broj
420 TK = 1: REM pocetna vrijednost tezinskog faktora
430 FOR I = LEN(HX$) TO 1 STEP -1
    440 CI$ = MID$(HX$, I, 1): REM cifra heksa broja
    450 IF CI$ <= "9" THEN CI = ASC(CI$) - 48: GOTO 470 ' Izmenjeno: dodato ASC()
    460 IF CI$ >= "A" THEN CI = ASC(CI$) - 55 ' Izmenjeno: dodato ASC()
    470 DB = DB + CI * TK: TK = TK * HD
480 NEXT I
490 RETURN

500 REM Decimalni broj u heksadecimalni broj (ulaz-izlaz)
510 INPUT "Ucitati decimalni broj "; DB
520 GOSUB 600: REM izdvaja cifre decimalnog broja
530 GOSUB 700: REM formira heksadecimalni broj
539 REM ispis
540 PRINT "Decimalni broj = "; DB
550 PRINT "Heksadecimalni ekvivalent = "; HX$
560 INPUT "Hoces li novi broj "; DA$
570 IF LEFT$(DA$, 1) <> "N" AND LEFT$(DA$, 1) <> "n" THEN GOTO 510
580 RETURN

600 REM Izdvaja cifre za heksadecimalni broj
610 BR = 1: REM pocetna vrijednost broja cifara heksa broja
620 A = ABS(DB) ' Koristimo apsolutnu vrijednost za negativne brojeve
630 D = INT(A / HD)
640 X(BR) = A - HD * D: REM cifra heksa broja - unazad
650 IF A > 15 THEN A = D: BR = BR + 1: GOTO 630
660 RETURN

700 REM Formiranje heksadecimalnog broja
710 HX$ = "": REM heksa broj
720 REM Dodajemo minus ako je originalni broj negativan
730 IF DB < 0 THEN HX$ = "-"
740 FOR I = BR TO 1 STEP -1: REM cifre u obrnutom redoslijedu
    750 IF X(I) < 10 THEN CI$ = CHR$(X(I) + 48)
    760 IF X(I) > 9 THEN CI$ = CHR$(X(I) + 55)
    770 HX$ = HX$ + CI$
780 NEXT I
790 RETURN

Ispis na ekranu:

Index