最近《算法设计与分析》课程留了一个作业: 关于ascii压缩: ascii压缩方法是一种经过两级压缩之后可以减少62.5%存储空间的对村数据进行压缩的技术,其压缩过程如下: (1)将原来数据的每两位数字作为一组,各组的值在00-99之间;然后将他们转换成16进制,即00-99分别对应于00H-63H,并将其与ASCII字符进行映射,也即将00-99分别映射成CHR(00H)-CHR(63H)。显然,经过这一次压缩之后,数据压缩量为50%。 (2)因为字符CHR(00H)-CHR(63H)共有100个,且他们的最高位都为0,因此,每一组字符实际上是用7个二进制位表示即可。这样,又可以压缩掉1/8的信息量,即总共可以压缩掉62.5%的信息量。 例:用ASCII压缩方法对16个数字的压缩过程如下: 原始数字(16个ASCII码):1 2 3 4 5 6 7 8 9 1 9 2 9 3 9 4 分组:12 34 56 78 91 92 93 94 第一次压缩(8个ASCII码):0C 22 38 4E 5B 5C 5D 5E 第二次压缩(7个ASCII码):将第八个十六进制数据5E即01011110的低7位的7个二进制位分别填入第1-7个16进制数据的最高位(第八位),最后压缩结果为7个ASCII码字符: 8C 22 B8 CE DB DC 5D ============================= 下面是我编的一个压缩程序(为方便解压,我加了一位奇偶判别位) 请高人指点:(能否改成用类来实现?忘指点!) ============================= //输入字符格式:1 2 3 4 5 // #include <iostream.h> #include <stdio.h> #include <math.h> void main() { int k=0; int a[7]; cout<<"input numbers:"<<endl; char c1,c2; while((c1=getchar())!=10) //接收前一个字符 { c2=getchar(); //消除空格 int n; if(c2!=10) { c2=getchar(); //接收下一个字符 n=(c1-'0')*10+(c2-'0'); k++; if(k<8) { a[k-1]=n; } else { k=0; int b,c; for(c=2;c<=8;c++) { b=pow(2,8-c); b=n&b; b=b<<(c-1); a[c-2]+=b; if(a[c-2]>15) printf("%X",a[c-2]); else printf("0%X",a[c-2]); }
} c2=getchar(); if(c2==10) { for(int x=0;x<k;x++) { if(a[x]>15) printf("%X",a[x]); else printf("0%X",a[x]); } cout<<"0"<<endl; printf("\n"); break; } } else //接收奇数个字符 { n=(c1-'0')*10; k++; if(k<8) { a[k-1]=n; for(int x=0;x<k;x++) { if(a[x]>15) printf("%X",a[x]); else printf("0%X",a[x]); } } else { k=0; int bb,cc; for(cc=2;cc<=8;cc++) { bb=pow(2,8-cc); bb=n&bb; bb=bb<<(cc-1); a[cc-2]+=bb; if(a[cc-2]>15) printf("%X",a[cc-2]); else printf("0%X",a[cc-2]); }
} cout<<"1"<<endl; printf("\n"); break; } } }