#include <stdio.h>
#include <math.h>

main(){

int zeichen[256], digramm[256][256], i, j,
    a, b, Anzahl;
float p[256], pij[256][256];
double H, Delta;

for(i = 0; i < 256; i++){
  zeichen[i] = 0;
  for (j=0; j<256; j++){
    digramm[i][j] = 0;
  }
}

printf("Entropie auf ASCII-Basis\n\n");

a = getchar(); zeichen[a]++;

while( (b = getchar()) != EOF ) {
     zeichen[b]++;
     digramm[a][b]++;
     a = b;
}


Anzahl = 0;
for (i=0; i<256; i++){
    Anzahl += zeichen[i];
    }

for (i=0; i<256; i++){
  if (zeichen[i] != 0) {
    for (j=0; j<256; j++) {
      pij[i][j] = ( (float) digramm[i][j] )/zeichen[i];
    }
  }
  else {for (j=0; j<256; j++) { pij[i][j] = 0.0; }}
}

H = 0.0;
for (i=0; i<256; i++){
  p[i] = ( (float) zeichen[i] )/Anzahl;
  if (p[i] != 0.0) {
     H -= (p[i]*logf(p[i])/logf(2.0));
  }
}

printf("Entropie1 %11.8f Redundanz %11.8f\n", H, 8.0 - H);

Delta = 0.0;
for (i=0; i<256; i++) {
for (j=0; j<256; j++) 
    if (pij[i][j] != 0) { Delta-=p[i]*pij[i][j] * log(pij[i][j]) / logf(2.0);
       }
}
  
printf("Entropie2 %11.8f Redundanz %11.8f\n", H+Delta, 16.0 - (H+Delta));
printf("EntropieU %11.8f Redundanz %11.8f\n", Delta, 8.0 - Delta);

}
