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

int nummer(char a){
if ( (a >= 'a') && (a <= 'z') )
  return a - 'a';
else if ( (a >= 'A') && (a <= 'Z') )
  return a - 'A';
else return(-1);}

 
main(){

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

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

do
a = nummer(getchar());
while( a < 0 );

zeichen[a] = 1;

while( (c = getchar()) != EOF ) {
  if ( (b = nummer(c)) != -1 ){
     zeichen[b]++;
     digramm[a][b]++;
     a = b;
  }
}

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

printf("%d Zeichen\n\n", Anzahl);

H = 0.0; Delta = 0.0;

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


printf("Entropie1 %11.8f Redundanz %11.8f\n", H, logf(26.0)/logf(2.0) - H);

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

}
