///////////////////////////////////////////////////////////////////////
// ITS – Visoka Škola Strukovnih Studija Za Informacione Tehnologije
// https://www.its.edu.rs/
// Predmet: Osnovi Programiranja – Programski jezik C
//
// Primer: Program za izracunavanje sinusa, kosinusa, tangensa
//            i kotangensa uglova od 0 do 90 stepeni za zadati korak.
//            Tabelarni prikaz rezultata.
///////////////////////////////////////////////////////////////////////

#include <stdio.h>     // standardni header
#include <math.h>      // matematicki header
#include <windows.h>   // WinApi header za promenu boje

#define PI 3.141592    // definise vrednost za PI

int plavaBoja();      // definisanje funkcije za promenu boje karaktera u plavo
int crvenaBoja();      // definisanje funkcije za promenu boje karaktera u crveno

main()
{
  // definisanje promenljivih
  double x=0, korak;
  int znak=219, horLin, prvaLin;

  plavaBoja(); // poziv funkcije za promenu boje

  // Poruka korisniku
  printf("Unestite prirastaj u stepenima: ");

  // Ucitavanje vrednosti za korak
  scanf("%lf", &korak);
  printf("

");

  // Pretvaranje stepena u radijane
  korak=korak/180*PI;

  crvenaBoja(); // poziv funkcije za promenu boje u crvenu

  for (prvaLin=1;prvaLin<=80;prvaLin++){printf("%c",176);}   // ispis prozirne linije

  plavaBoja(); // poziv funkcije za promenu boje u plavo

  // Ispis zaglavlja tabele
  printf(" ");
  for (horLin=1;horLin<=64;horLin++) {printf("%c",znak);}

  printf("
%c     x     %c   sin(x)   %c   cos(x)   %c  tan(x)   %c    ctg(x)  %c
",znak,znak,znak,znak,znak,znak);
  printf(" ");
  for (horLin=1;horLin<=64;horLin++) {printf("%c",znak);}
  printf("
");

  // Izracunavanje trigonometrijskih funkcija i ispis u while petlji
  while(x*180/PI<=90.0000001)
  // koriscen je uslov <90.0000001, a ne <90 zbog racunanja sa double vrednostima, a ne sa int vrednostima
  {
    // Ispis svih potrebnih funkcija za jednu vrednost x u jednom redu
    printf(" %c%10.3f %c%11.3f %c%11.3f ",znak , x*180/PI, znak, sin(x), znak, cos(x));

    // Ukoliko je kosinus mnogo mali, tangens ce biti beskonacno veliki
    if (cos(x)<0.00001)
    {
      printf("%c     + %c   ",znak,236);
    }
    else
    {
      printf("%c%10.3f ",znak, tan(x));
    }

    // Kotangens ima vrednost inverznu u odnosu na tanges
    // Ukoliko tangens tezi nuli, kotangens ce teziti beskonacnosti
    if(tan(x)<0.00001)
    {
      printf("%c      + %c   %c
",znak,236,znak);
    }

    else
    {
      printf("%c%11.3f %c
",znak , 1/tan(x), znak);
    }

    // Uvecanje x za zadati korak
    x+=korak;
  }

  // Kraj tabele
  printf(" ");
  for (horLin=1;horLin<=64;horLin++) {printf("%c",znak);}
  printf("
");
  crvenaBoja(); // poziv funkcije za promenu boje u crvenu

  for (prvaLin=1;prvaLin<=80;prvaLin++){printf("%c",176);}   // ispis prozirne linije

  plavaBoja(); // poziv funkcije za promenu boje u plavo

  // Pauza
  printf("

");
  system("PAUSE");

}

int plavaBoja()   // funkcija za promenu boje u plavo
{
  // menjanje boje
  HANDLE hConsole;
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole, 11);
  return 0; // povratak
}

int crvenaBoja()   // funkcija za promenu boje u crveno
{
  // menjanje boje
  HANDLE hConsole;
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole, 12);
  return 0; // povratak
}