// Springt een beetje heen en weer tussen karakters en bijbehorende
// numerieke waardes. Somt onder andere alle 256 karakters op.

// Getest op 4 november 2002          Rudy van Vliet

#include <iostream>
using namespace std;

//*************************************************************************

void WachtEven ()
{ char kar;

  cout << "Voer een karakter in om verder te gaan: ";
  cin >> kar;
// Mogelijke alternatieven:
//   kar = cin.get ();  // roep de methode `get' van `cin' aan
// of
//   cin.get (kar);  // roep de methode `get' van `cin' aan
// Op de werking van `cin.get' kreeg ik niet voldoende vat.

}

//*************************************************************************

void Schrijf (int i, char kar)
  // schrijf eerst de integer i en dan het karakter kar
{
  cout << "i = " << i << endl;
  cout << "kar = " << kar << endl;
  cout << endl;

}  // Schrijf

//*************************************************************************

void Schrijf (char kar, int i)
  // schrijf eerst het karakter kar en dan de integer i
{
  cout << "kar = " << kar << endl;
  cout << "i = " << i << endl;
  cout << endl;

}  // Schrijf

//*************************************************************************

int main ()
{ int i;
  char kar;

   // eerst een paar eenvoudige conversies:

   // van integer naar karakter
  i = 65;
  kar = i;

  cout << "i = " << i << endl;
  cout << 'i' << ' ' << '=' << ' ' << i << '\n';
  cout << "kar = " << kar << endl;
  cout << "kar = '" << kar << "'\n";
  cout << endl;

   // van karakter naar integer
  kar = 'B';
  i = kar;
  Schrijf (kar, i);
  
  WachtEven ();
    
   // welke waardes horen bij enkele speciale karakters
   // (zie blz 10 van het boek van Ammeraal, in iets
   // andere volgorde)

  i = 7;
  kar = i;
  cout << "geluidje:\n";
  Schrijf (i, kar);

  WachtEven ();

  kar = '\b';
  i = kar;
  cout << "backspace:\n";
  Schrijf (kar, i);

  kar = '\t';
  i = kar;
  cout << "horizontale tab:\n";
  Schrijf (kar, i);

  kar = '\n';
  i = kar;
  cout << "newline:\n";
  Schrijf (kar, i);

  kar = '\v';
  i = kar;
  cout << "verticale tab:\n";
  Schrijf (kar, i);

  kar = '\r';
  i = kar;
  cout << "carriage return:\n";
  Schrijf (kar, i);

  WachtEven ();

  kar = '\\';
  i = kar;
  cout << "backslash:\n";
  Schrijf (kar, i);

  kar = '\'';
  i = kar;
  cout << "apostrof:\n";
  Schrijf (kar, i);

  kar = '\"';
  i = kar;
  cout << "aanhalingsteken:\n";
  Schrijf (kar, i);

  kar = ' ';
  i = kar;
  cout << "spatie:\n";
  Schrijf (kar, i);

  kar = '\377';  // octaal voor 255;
                 // groter (bijv. 400) wordt niet geaccepteerd
                 // door de compiler
  i = kar;
  cout << "bitpatroon 377:\n";
  Schrijf (kar, i);

  kar = '\x7E';  // hexadecimaal voor 126
  i = kar;
  cout << "bitpatroon x7E:\n";
  Schrijf (kar, i);

  WachtEven ();

   // nu geven we alle 256 karakters, in drie stappen
  cout << "De eerste 14 karakters zijn:\n";
  for (i=0;i<=13;i++)
  { kar = i;
    cout << "-|-" << kar;
  }
    // `(char) 7' is een leeg karakter (alleen een geluidje)
    // `(char) 8' is een back space
    // `(char) 9' is een horizontale tab
    // `(char) 10' is een newline

    // `(char) 13' is een carriage return!
    // je zou het voorgaande op de regel kwijtraken
    // als je op diezelfde regel verder zou schrijven
  cout << endl;

  cout << "De volgende 114 karakters zijn:\n";
  for (i=14;i<=127;i++)
  { kar = i;
    cout << '-' << kar;
  }
  cout << endl;

  cout << "De laatste 128 karakters zijn:\n";
  for (i=128;i<=255;i++)
  { kar = i;
    cout.put ('-');  // roep de methode `put' van `cout' aan
    cout.put (kar);  // roep de methode `put' van `cout' aan
  }
  cout << endl;

  WachtEven ();

    // wat gebeurt er met getallen > 255
  i = 321;  // 256 + 65
  kar = i;
  Schrijf (i, kar);

    // ten slotte een wellicht verrassende conversie:
    // van integer naar karakter en dan weer terug naar integer;
    // we krijgen een andere waarde!
  i = 135;
  kar = i;
  Schrijf (i, kar);
  i = kar;
  Schrijf (kar, i);

  return 0;

}

