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


int main()
{
	FILE *fptr, *encode, *fff, *decode, *fxxx, *ffff, *encoderead, *encode2;
	char FileName[100];
	int z = 0, number, number2 = 5, a, b = 0, c = 0, d = 0, zz = 8, i = 0, j = 0, k = 0, p = 0;
	double entropy = 0;
	char out[5][5] = { 0 }, other[5];
	fptr = fopen("111.txt", "r"); //輸入檔案
	fff = fopen("111.txt", "r"); //輸入檔案
	encode = fopen("encode.txt", "w");// 讀入檔案

	decode = fopen("decode.txt", "w");// 讀入輸入檔案

	float zzz[5] = { 0 }, pro[5] = { 0 }, fx[5] = { 0 }, ffx[5] = { 0 }, lenn = 0, len[4] = { 0 };

	// 出現1-4數字個數
	while (z < 8)
	{
		fscanf(fptr, "%d", &number);
		zzz[number]++;
		printf("%d", number);
		z++;
	}
	for (a = 1; a <= 4; a++){
		printf("\n%.0f", zzz[a]);
		entropy += (zzz[a] / zz)*log2(zz / zzz[a]);//entropy
	}
	printf("\n");
	//1-4分別出現的機率
	for (a = 1, b = 1; a, b <= 4; a++, b++){

		pro[b] += (zzz[a] / zz);

		printf("pro=%.5f\n", pro[b]);
	}
	printf("\n");
	//累加值F(X)
	for (b = 1, c = 1; c <= 4, b <= 4; b++, c++){

		fx[c] += fx[c - 1] + pro[b];

		printf("F(X)=%.5f\n", fx[c]);
	}
	printf("\n");

	//出現FX(bar)
	for (b = 1, c = 0, d = 1; b <= 4, c <= 3, d <= 4; b++, c++, d++){

		ffx[d] = 0.5*pro[b] + fx[c];
		printf("FFX=%.5f+%.5f", pro[b], fx[c]);
		printf("=%.5f\n", ffx[d]);

	}
	//codeword 長度
	for (i = 0; i <= 3; i++){
		len[i] = ceil(log2(1 / pro[i + 1]) + 1);
		printf("%f\n", len[i]);
	}
	//Codeword
	for (d = 1; d <= 4; d++){
		for (i = 0; i < len[d - 1]; i++){
			ffx[d] = ffx[d] * 2;
			if (ffx[d] >= 1){
				out[d][i] = '1';
				ffx[d] = ffx[d] - 1;
			}
			else{
				out[d][i] = '0';
			}
		}
		printf("%s\n", out[d]);
		printf("\n");
	}
	//average length
	for (d = 1; d <= 4; d++)
	{
		lenn += len[d - 1] * pro[d];
	}
	while (j < zz)
	{
		fscanf(fff, "%d", &number);
		fprintf(encode, "%s", out[number]);
		j++;
	}

	fclose(fptr);
	fclose(fff);
	fclose(encode);
	int num,oo,pp,num2;
	int ok[4][4] = {0};
	//解碼
	encode = fopen("encode.txt", "r");// 
	encode2 = fopen("encode.txt", "r");// 
	while (k < (float)zz*2.75){

		fscanf(encode, "%1d", &num);
	
	
		k++;
	}
		//fprintf(decode,"%d\n",number2)
		
	
	printf("entropy=%f\n", entropy);
	printf("length=%f\n", lenn);
	
	
	system("pause");
	return 0;

}