///////////////////////////////////////////////////////////////////////
// ITS – Visoka Škola Strukovnih Studija Za Informacione Tehnologije
// https://www.its.edu.rs/
// Predmet: Osnovi Programiranja – Programski jezik C
//
// Primer: Program za konverziju pozitivnih celih brojeva iz dekadnog
// brojnog sistema u binarni, heksadecimalni i oktalni brojni
// sistem. Tabelarni prikaz.
///////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <windows.h> // WinApi header, potreban za promenu boje
// funkcija za pretvaranje decimalnog sistema u binarni
char* dec2bin(long dec, char *binNiz);
// funkcija za pretvaranje decimalnog sistema u oktalni
char* dec2okt(long dec, char *oktNiz);
// funkcija za pretvaranje decimalnog sistema u heksadecimalni
char* dec2hex(long dec, char *hexNiz);
int Boja(); // definisanje funkcije za promenu boje
int inverznaBoja(); // inverzna boja za tablicu
void zaglavlje2(); // ispis linija
int main()
{
long i,min,max,dec,zamena;
int dx = 0, pauza = 0, ekran = 1, ver = 186, hor=205, krst=206;
char nastavak = '1', progPonovo=0;
char binNiz[80];
char oktNiz[80];
char hexNiz[80];
// konverzacija sa korisnikom radi prikupljanja podatka
printf("
Unesite pozitivan ceo broj od koga zelite da prikazete brojne sisteme: ");
scanf("%ld",&min);
if(min<=0)
{
printf("Potrebno je da broj bude pozitivan!
");
return 1;
}
printf("
Unesite pozitivan ceo broj do koga zelite da prikazete brojne sisteme: ");
scanf("%ld",&max);
if(max<=0)
{
printf("Potrebno je da broj bude pozitivan!
");
return 1;
}
// provera i eventualna zamena ukoliko je OD vece od DO
while(max<min)
{
printf("
Uneli ste vrednost manju od pocetne, vrednosti ce biti zamenjene");
zamena=max;
max=min;
min=zamena;
}
// provera da li je prirastaj pozitivan i veci od nule
while (dx<=0)
{
printf("
Unesite pozitivan ceo decimalni broj za prirastaj brojnih sistema: ");
scanf("%d",&dx);
}
inverznaBoja(); // inverzna boja za ispis tabele
//prvo zaglavlje tabele
printf("
%c dec %c bin %c okt %c hex %c ",ver,ver,ver,ver,ver); // zaglavlje
zaglavlje2(krst,hor); // pozivanje linije
for (i=min;i<=max;i=i+dx) // brojac koraka
{
dec=i;
pauza++; // pauzu koristimo za ispis jednog po jednog ekrana
dec2bin(dec,binNiz); // pozivanje izracunavanja binarnog broja
dec2okt(dec,oktNiz); // pozivanje izracunavanja oktalnog broja
dec2hex(dec,hexNiz); // pozivanje izracunavanja heksadecimalnog broja
printf(" %c%12ld %c%32s %c%13s %c%10s %c ",ver,dec,ver,binNiz,ver,oktNiz,ver,hexNiz,ver); // ispis reda
if (pauza==22 && ekran==1) // u slucaju prvog prolaska ENTER ostaje stisnuto pa trebaju dva getchar()
{
getchar();
getchar();
pauza=0;
ekran++;
printf("
%c dec %c bin %c okt %c hex %c ",ver,ver,ver,ver,ver); // zaglavlje
zaglavlje2(krst,hor);
}
if (pauza==22 && ekran!=1) // u slucaju da nije prvi prolaz
{
getchar();
pauza=0;
ekran++;
printf("
%c dec %c bin %c okt %c hex %c ",ver,ver,ver,ver,ver); // zaglavlje
zaglavlje2(krst,hor);
}
}
Boja(); // promena boje
system("PAUSE"); // poruka press any key…
return 0;
}
// prihvata dekadni broj i vraca binarni niz
char* dec2bin(long dec, char *binNiz)
{
int k = 0, n = 0;
int ostatak;
int stariDec; //test
char temp[80];
do
{
stariDec = dec; // test
ostatak = dec % 2;
// deljenje sa dva
dec = dec / 2;
// smesta 0 ili 1 u niz
temp[k++] = ostatak + '0';
} while (dec > 0);
// okrece niz
while (k >= 0)
binNiz[n++] = temp[–k];
binNiz[n-1] = 0; // kraj sa NULL
return binNiz;
}
// prihvata dekadni broj i vraca oktalni niz
char* dec2okt(long dec, char *oktNiz)
{
int k = 0, n = 0;
int ostatak;
int stariDec; //test
char temp[80];
do
{
stariDec = dec; // test
ostatak = dec % 8;
// deljenje sa osam
dec = dec / 8;
// smesta ostatak u niz
temp[k++] = ostatak + '0';
} while (dec > 0);
// okrece niz
while (k >= 0)
oktNiz[n++] = temp[–k];
oktNiz[n-1] = 0; // kraj sa NULL
return oktNiz;
}
// prihvata dekadni broj i vraca heksadecimalni niz
char* dec2hex(long dec, char *hexNiz)
{
int k = 0, n = 0;
int ostatak;
int stariDec; //test
char temp[80];
do
{
stariDec = dec; // test
ostatak = dec % 16;
// deljenje sa 16
dec = dec / 16;
// dodeljivanje vrednosti clanu u zavisnosti od ostatka
// prvih 10 su mogli ici pod default vrednosti ali je ovako preglednije
switch (ostatak)
{
case 0: temp[k++] = ostatak + '0'; break;
case 1: temp[k++] = ostatak + '0'; break;
case 2: temp[k++] = ostatak + '0'; break;
case 3: temp[k++] = ostatak + '0'; break;
case 4: temp[k++] = ostatak + '0'; break;
case 5: temp[k++] = ostatak + '0'; break;
case 6: temp[k++] = ostatak + '0'; break;
case 7: temp[k++] = ostatak + '0'; break;
case 8: temp[k++] = ostatak + '0'; break;
case 9: temp[k++] = ostatak + '0'; break;
case 10: temp[k++] = 'A'; break;
case 11: temp[k++] = 'B'; break;
case 12: temp[k++] = 'C'; break;
case 13: temp[k++] = 'D'; break;
case 14: temp[k++] = 'E'; break;
case 15: temp[k++] = 'F'; break;
}
// smesta ostatak u niz
} while (dec > 0);
// okrece niz
while (k >= 0)
hexNiz[n++] = temp[–k];
hexNiz[n-1] = 0; // kraj sa NULL
return hexNiz;
}
Boja() // funkcija za promenu boje
{
// menjanje boje
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 10);
return 0; // povratak
}
inverznaBoja() // funkcija za menjanje boje u inverznu
{
// menjanje boje
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 160);
return 0; // povratak
}
void zaglavlje2(krst,hor) // ispisivanje linije
{
int j;
printf(" %c",krst);
for (j=1;j<=13;j++)
{
printf("%c",hor);
}
printf("%c",krst);
for (j=1;j<=33;j++)
{
printf("%c",hor);
}
printf("%c",krst);
for (j=1;j<=14;j++)
{
printf("%c",hor);
}
printf("%c",krst);
for (j=1;j<=11;j++)
{
printf("%c",hor);
}
printf("%c ",krst);
}