/* * arithmetic */ #include "arithmetic.c" int main(void){ int i; long k; unsigned char orig[500], code[1000], new[500]; printf("--- 算術符号によるデータ圧縮 ---\n"); printf("テキストを入力して下さい(入力例 aaaabbbbccdde)\n"); scanf("%s", orig); k = enArith(code, 1000L, orig, (long)strlen(orig)); if (k < 0) { printf("符号化できませんでした\n"); exit(1); } printf("\n各文字の出現頻度\n"); for (i = 0; i < 512; i += 2) if (code[i] != 0 || code[i+1] != 0) printf("文字 %c、頻度 %d\n", i/2, code[i]*256+code[i+1]); printf("\nテキストの長さ textlen = %d\n", strlen(orig)); printf("符号の長さ codelen = %ld\n", k - 512); printf("圧縮率 codelen/textlen = %5.1f (%%)\n\n", (k-512)*100.0/strlen(orig)); k = deArith(new, 500L, code, k); if (k < 0) { printf("復号できませんでした\n"); exit(1); } printf("復号されたテキスト: 長さ %ld 文字\n", k); for (i = 0; i < k; i++) printf("%c", new[i]); printf("\n"); return 0; }