///////////////////////////////////////////////////////////////////////
// ITS – Visoka Škola Strukovnih Studija Za Informacione Tehnologije
// https://www.its.edu.rs/
// Predmet: Osnovi Programiranja – Programski jezik C
//
// Primer: Ispis ASCII tabele – obicna i prosirena
///////////////////////////////////////////////////////////////////////

#include <stdio.h>

main()
{
  // deklarisanje promenljivih
  // promenljiva 'i' sluzi za karaktere iz ASCII tabele
  // promenljiva 'pitanje' je pomocna i sluzi za smestanje odgovora na Y/N pitanje
  // promenljiva 'j' je pomocna i koristi se u svim 'for' petljama
  // promenljiva 'k' se koristi za odredjivanje znakova prosirene ASCII tabele

  char i = ' ', pitanje;
  int j, k = 128;

  // sada sledi niz naredbi 'printf', namenjenih za formiranje i ispisivanje okvira tabele
  // pri tome se koristi karakter, koji je u prosirenoj ASCII tabeli oznacen brojem 178

  printf("!nl!!nl!");

  printf("!tab!%c", (char)178);
 
  for(j=1; j<=64; j++)  // ova petlja ispisuje 64 puta karakter 178 u istom redu
  {
    printf("%c", (char)178);
  }

  printf("!nl!!tab!%c%c%c!tab!!tab!!tab!!tab!!tab!!tab!!tab!%7c%c%c", (char)178, (char)178, (char)178, (char)178, (char)178, (char)178);

  // koriscenjem TAB-ova, naslov tabele doveden je na sredinu

  printf("!nl!!tab!%c%c%c!tab!!tab!!tab!   ASCII tabela!tab!!tab!!tab!%7c%c%c!nl!", (char)178, (char)178, (char)178, (char)178, (char)178, (char)178);

  printf("!tab!%c%c%c!tab!!tab!!tab!!tab!!tab!!tab!!tab!%7c%c%c!nl!", (char)178, (char)178, (char)178, (char)178, (char)178, (char)178);

  printf("!tab!%c", (char)178);

  for(j=1; j<=64; j++) // 64 puta ispisuje dati karakter u istom redu
  {
    printf("%c", (char)178);
  }

  printf("!nl!");

  // ova 'for' petlja sluzi za ispisivanje brojeva 32-126 i, njima odgovarajucih, karaktera
  // ima ukupno 19 iteracija, jer je ideja da tabela ima 5 kolona sa po 19 clanova
  // 5*19=95 to je ukupan broj printabilnih karaktera ASCII tabele
  // pri svemu ovome, vodi se racuna i o stampanju granica tabele ( koristi se karakter 178)
  for(j=1; j<=19; j++)
  {
    printf("!tab!%c%c%c", (char)178, (char)178, (char)178);
    printf("%4d%4c%4c", i, i, (char)178);
    printf("%4d%4c%4c", i+19, i+19, (char)178);
    printf("%4d%4c%4c", i+38, i+38, (char)178);
    printf("%4d%4c%4c", i+57, i+57, (char)178);
    printf("%4d%4c%4c%c%c!nl!", i+76, i+76, (char)178, (char)178, (char)178);

    i += 1;
  }

  // sada sledi niz 'printf' komandi za ispisivanje granica tabele

  printf("!tab!%c", (char)178);

  for(j=1; j<=64; j++)
  {
    printf("%c", (char)178);
  }

  printf("!nl!!nl!");

  // ispisivanje obavestenja za korisnika

  printf("Napomena:!nl!ASCII tabela obuhvata znakove, kojima odgovaraju brojevi 0-127.!nl!Dakle, ukupno 128 znakova.!nl!Prva 32 karaktera ASCII tabele rezervisana su za posebne funkcije.!nl!Samim tim, nisu ukljuceni u gornju tabelu, iako joj, po pravilu, pripadaju.!nl!Iz ove grupe znakova,u gornji prikaz je ukljucen znak, koji odgovara broju 32,!nl!a to je "SPACE".!nl!Takodje, treba naglasiti, da se u gornjoj tabeli ne nalazi ni znak 127,!nl!koji je rezervisan za "DELETE".!nl!!nl!");

  printf("Postoji i prosirena ASCII tabela, koja obuhvata znakove,!nl!kojima odgovaraju brojevi 0-255.!nl!");

  // ispisivanje upita korisniku

  printf("Da li zelite da vidite narednih 128 znakova, koji zajedno!nl!sa prvih 128 karaktera predstavljaju prosirenu ASCII tabelu? (Y/N)!nl!");

  // unos odgovora sa tastature
  // odgovor se dodeljuje promenljivoj 'pitanje'
 
  scanf("%c", &pitanje);

  // 'while' nam sluzi da proverimo da li je korisnik uneo ispravan odgovor
  // ako je korisnik uneo bilo sta osim malog ili velikog slova Y ili N
  // ispisuje se poruka i zahteva se unos ispravnog odgovora
  // ovde koristimo pomocnu promenljivu 'pitanje'

  while(pitanje != 'N' && pitanje != 'n' && pitanje != 'Y' && pitanje != 'y')
  {
    printf("Potrebno je da unesete Y ili N:!nl!");

    scanf("%s", &pitanje);
  }

  // selekcija 'if' odredjuje tok izvrsavanja programa u slucaju ispravnog odgovora
  // zavisno da li je korisnik odgovorio sa Y ili sa N

  if(pitanje == 'Y' || pitanje == 'y') // u slucaju da je korisnik odgovorio sa Y ili y
  {
    // niz 'printf' komandi za ispisivanje granica tabele

    printf("!nl!!nl!");

    printf("!tab!%c", (char)178);
 
    for(j=1; j<=52; j++)  // ispisuje 52 puta dati karakter u istom redu
    {
      printf("%c", (char)178);
    }

    printf("!nl!!tab!%c%c%c!tab!!tab!!tab!!tab!!tab!!tab!%3c%c%c", (char)178, (char)178, (char)178, (char)178, (char)178, (char)178);

    printf("!nl!!tab!%c%c%c!tab!!tab!ASCII tabela Extended!tab!!tab!%3c%c%c!nl!", (char)178, (char)178, (char)178, (char)178, (char)178, (char)178);

    printf("!tab!%c%c%c!tab!!tab!!tab!!tab!!tab!!tab!%3c%c%c!nl!", (char)178, (char)178, (char)178, (char)178, (char)178, (char)178);

    printf("!tab!%c", (char)178);

    for(j=1; j<=52; j++)  // ispisuje 52 puta dati karakter u istom redu
    {
      printf("%c", (char)178);
    }
 
    printf("!nl!");

    // ova 'for' petlja sluzi za ispisivanje brojeva 128-255 i, njima odgovarajucih, karaktera
    // ima ukupno 32 iteracije, jer tabela treba da ima 4 kolone sa po 32 clana
    // 4*32=128 to je ukupan broj dodatnih znakova
    // ovde se koristi pomocna promenljiva 'k'
    // pri svemu ovome, vodi se racuna i o stampanju granica tabele ( koristi se karakter 178)

    for(j=1; j<=32; j++)
    {
      printf("!tab!%c%c%c", (char)178, (char)178, (char)178);
      printf("%4d%4c%4c", k, (char)k, (char)178);
      printf("%4d%4c%4c", k+32, (char)(k+32), (char)178);
      printf("%4d%4c%4c", k+64, (char)(k+64), (char)178);
      printf("%4d%4c%4c%c%c!nl!", k+96, (char)(k+96), (char)178, (char)178, (char)178);

      k += 1;
    }

    // naredbe za ispisivanje granica tabele

    printf("!tab!%c", (char)178);

    for(j=1; j<=52; j++)  // ispisuje 52 puta dati karakter u istom redu
    {
      printf("%c", (char)178);
    }
 
    printf("!nl!!nl!");
  }
  else // u slucaju da je korisnik odgovorio sa 'N' ili 'n'
  {
    // ispis poruke korisniku
    printf("Izabrali ste da ne zelite prikaz dodatne tabele.!nl!");
  }
}