C语言 A律压缩

这里写图片描述

昨天的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] = 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值