///////////////////////////////////////////////////////////////////////
// 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);
}