一,目标
写一个程序压缩文件已生成另外一个新文件。新文件要比原始文件小。检查结果,确保程序可以利用新文件重新生成新的文件。
二,示例代码
#include三,思想#define MAX_NUM 10 void compression(char *start, int number[],char array[],int *subscript); void unzip(int subscript,char start,int number[]); void main() { int subscript = 0; char start; int number[MAX_NUM]; char num[] = "0000000000000001111111111111111111100000111111111111111111111111111111111"; /*************************** 压缩部分 *********************************/ compression(&start,number,num,&subscript); printf("个数是:%d\n",subscript); printf("开头是:%c\n",start); printf("数组为:"); printf("\n"); /*************************** 解压部分 *********************************/ unzip(subscript,start,number); } void compression(char *start, int number[],char array[],int* subscript) { *subscript = 0; int count = 0; *start = array[0]; for (int i = 0;; i++) { if (array[i] == 0) { break; } //不要写number[subscript]++,只能写成number[subscript]=count因为number[]初始为负的很多数。 count++; if (array[i] != array[i + 1]) { number[*subscript] = count; count = 0; //注意:这里不能是*subscript,因为++的优先级大于*. (*subscript)++; } } } void unzip(int subscript,char start,int number[]) { int real_start = start - '0'; for (int i = 0; i < subscript; i++) { for (int j = 0; j < number[i]; j++) { printf("%d",real_start); } //当初在这个问题上纠结了很久,就是,我们很容易识别出第一个,但是第二个如何取成另一个,并且不断 //循环迭代下去,一开始我用的real_start = real_start是char型的,但最后发现char型容易乱码,所以 //最后确定用int型,int型是不会乱码的。 real_start = !real_start; } }
1,压缩的思想:先确定数组的初始为0还是1,然后依次统计0和1出现的次数形成一个int型的数组,例如000000000011111可以用一个int型的{10,5}表示。
四,需要处理的细节问题。
1,初定义一个数组,例如char array[10];想把它的值赋成1不能采用array[0]++这种的方式,应该采用array[0] = 1的方式,因为array[10]的初始是把它设置成类似-8888(大约)这种无穷小的数。
2,想把一个指针指向的内容加一,例如*pointer以前为0,想把它的值变成1,不能采用*pointer++这种方式,应该采用(*pointer)++这种方式,因为++的优先级高于*。
3,想把一个值取反为0,再取反为1,不能用char型变量,应该采取int型变量。