C语言 A律压缩
2016-05-05 21:45
519 查看
昨天的compress之所以传出一个空值,是因为compress运行后,数组b被释放,所以需要给他定义一个static,它就使得b[8]存放在内存中的静态存储区中,所占用的存储单元一直不释放直到整个程序运行结束 。
#include <stdio.h> #include <stdlib.h> int * compress(int vaule) { int i, j; int temp, a_temp; int deviation; static int b[8] = {0};//必须是static,否则运行结束后b[]会被释放 int a[16]; int c[8] = {16,32,64,128,256,512,1024,2048}; int d[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; printf("please input vaule:"); scanf("%d",&vaule); if(vaule < 0){ //vaule = abs(vaule); vaule = -vaule; } else b[0] = 1; for(i = 0;i < 7;i++){ if(vaule < c[i]){ printf("i = %d\n",i); break; } } //段落码 switch (i) { case 0: b[1] = 0; b[2] = 0; b[3] = 0; break; case 1: b[1] = 0; b[2] = 0; b[3] = 1; break; case 2: b[1] = 0; b[2] = 1; b[3] = 0; break; case 3: b[1] = 0; b[2] = 1; b[3] = 1; break; case 4: b[1] = 1; b[2] = 0; b[3] = 0; break; case 5: b[1] = 1; b[2] = 0; b[3] = 1; break; case 6: b[1] = 1; b[2] = 1; b[3] = 0; break; case 7: b[1] = 1; b[2] = 1; b[3] = 1; break; default: break; } printf("c[%d] = %d",i,c[i]); printf("\n"); if(i == 0) temp = c[i] - 0; else temp = c[i] - c[i - 1]; printf("temp = %d\n",temp); printf("a[] = "); a_temp = temp / 16; a[15] = c[i]; for(i = 14, j = 0;i > 0, j < 16; i--, j++) { a[i] = a[15] - a_temp * d[j]; } for(i = 0;i<16;i++){ printf("[%d]",a[i]); } printf("\n"); for(i = 0;i < 16;i++){ if(vaule < a[i]){ printf("i = %d\n",i); break; } } //段内码 switch (i) { case 0: b[4] = 0; b[5] = 4000 0; b[6] = 0; b[7] = 0; break; case 1: b[4] = 0; b[5] = 0; b[6] = 0; b[7] = 1; break; case 2: b[4] = 0; b[5] = 0; b[6] = 1; b[7] = 0; break; case 3: b[4] = 0; b[5] = 0; b[6] = 1; b[7] = 1; break; case 4: b[4] = 0; b[5] = 1; b[6] = 0; b[7] = 0; break; case 5: b[4] = 0; b[5] = 1; b[6] = 0; b[7] = 1; break; case 6: b[4] = 0; b[5] = 1; b[6] = 1; b[7] = 0; break; case 7: b[4] = 0; b[5] = 1; b[6] = 1; b[7] = 1; break; case 8: b[4] = 1; b[5] = 0; b[6] = 0; b[7] = 0; break; case 9: b[4] = 1; b[5] = 0; b[6] = 0; b[7] = 1; break; case 10: b[4] = 1; b[5] = 0; b[6] = 1; b[7] = 0; break; case 11: b[4] = 1; b[5] = 0; b[6] = 1; b[7] = 1; break; case 12: b[4] = 1; b[5] = 1; b[6] = 0; b[7] = 0; break; case 13: b[4] = 1; b[5] = 1; b[6] = 0; b[7] = 1; break; case 14: b[4] = 1; b[5] = 1; b[6] = 1; b[7] = 0; break; case 15: b[4] = 1; b[5] = 1; b[6] = 1; b[7] = 1; default: break; } //计算偏差值 deviation = (a[i] + a[i - 1]) / 2 - vaule; if(deviation < 0) deviation = -deviation; for(i = 0;i < 8;i++) printf("[%d]",b[i]); printf("\n"); printf("deviation = %d\n",deviation); //printf("b = %d\n",b); //printf("*b = %d\n",*b); return b; } void decompress(int b[]) { int temp; int k; char seg; int c[8] = {1,1,2,4,8,16,32,64}; int d[8] = {0,16,32,64,128,256,512,1024}; if(b[0] == 0){ seg = '+'; } else seg = '-'; k = b[1] * 4 + b[2] * 2 + b[3]; temp = d[k] + c[k] * (b[4] * 8 + b[5] * 4 + b[6] * 2 + b[7]); printf("vaule = %c%d\n",seg,temp); } int main() { int vaule; int *b; int a[8]; int i; b = compress(vaule); //printf("%d\n",b); //printf("%d\n",*b); for(i = 0;i < 8;i++){ a[i] = *(b + i); printf("[%d]",a[i]); } decompress(a); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法