数据压缩--蓝桥杯 (二)

2014-11-24 02:37:45 · 作者: · 浏览: 5
ck(rfp, wfp);

fclose(wfp);
fclose(rfp);
}【注意】
只填写缺少的部分,不要抄写已有的代码。
所填写代码不超过1条语句(句中不会含有分号)
所填代码长度不超过256个字符。
答案写在“解答.txt”中,不要写在这里!

分析
该题目若是编程题,让自己写代码,难度貌似第一点。但是它是填空题,可以在不读懂每一条语句的情况下得出答案,当然都读懂更好。

pop函数的作用是将缓冲数组中的变量输出到文件。

为了验证代码正确性,在头部添加了一些预处理命令,才得以编译通过。

源代码
[cpp]
# include
# include
# define BUF_N 1000
# define RFILE "rfile.txt"
# define WFILE "wfile.txt"
void pop(int s, int* buf, int c, FILE* fp)
{
int i;
if(s)
{
fprintf(fp, "%d %d ", c, *buf);
}
else
{
fprintf(fp, "%d ", -c);
for(i=0; i {
fprintf(fp, "%d ", buf[i]);
}
}
}

void dopack(FILE* r, FILE* w)
{
int buf[BUF_N];

int pos = 0; // 下一个数字在buf中将要存放的位置
int c = 0; // 当前段已读入的整数个数
int pst;
int cst;

while(fscanf(r, "%d", buf+pos)==1)
{
if(c==0)
{
c = pos = 1;
continue;
}

if(c==1)
{
pst = buf[0] == buf[1]; //前两个是否相等
pos = pos + 1 - pst;
c = 2;
continue;
}

cst = buf[pos-1] == buf[pos]; //后两个是否相等
if(pst && !cst)
{
pop(pst, buf, c, w);
buf[0] = buf[1];
c = pos = 1;
pst = cst;
}
else if(!pst && cst || pos == BUF_N-1)
{
pop(pst, buf, c-1, w);
buf[0] = buf[pos-1];
c = 2;

if(!cst)
{
buf[1] = buf[pos];
pos = 2;
}
else
{
pos = 1;
pst = 1; // 填空1
}
}
else
{
c++;
if(!pst) pos++;
}
} // while

if(c>0) pop(pst, buf, c, w); // 填空2
}

int main()
{
FILE* rfp;
FILE* wfp;

if((rfp=fopen(RFILE, "r")) == NULL)
{
printf("can not open %s!\n", RFILE);
exit(1);
}

if((wfp=fopen(WFILE, "w")) == NULL)
{
printf("can not open %s!\n", WFILE);
fclose(rfp);
exit(2);
}

dopack(rfp, wfp);

fclose(wfp);
fclose(rfp);
}

# include
# include
# define BUF_N 1000
# define RFILE "rfile.txt"
# define WFILE "wfile.txt"
void pop(int s, int* buf, int c, FILE* fp)
{
int i;
if(s)
{
fprintf(fp, "%d %d ", c, *buf);
}
else
{
fprintf(fp, "%d ", -c);
for(i=0; i {
fprintf(fp, "%d ", buf[i]);
}
}
}

void dopack(FILE* r, FILE* w)
{
int buf[BUF_N];

int pos = 0; // 下一个数字在buf中将要存放的位置
int c = 0; // 当前段已读入的整数个数
int pst;
int cst;

while(fscanf(r, "%d", buf+pos)==1)
{
if(c==0)
{
c = pos = 1;
continue;
}

if(c==1)
{
pst = buf[0] == buf[1]; //前两个是否相等
pos = pos + 1 - pst;
c = 2;
continue;
}

cst = buf[pos-1] == buf[pos]; //后两个是否相等
if(pst && !cst)
{
pop(pst, buf, c, w);
buf[0] = buf[1];
c = pos = 1;
pst = cst;
}
else if(!pst && cst || pos == BUF_N-1)
{
pop(pst, buf, c-1, w);
buf[0] = buf[pos-1];
c = 2;

if(!cst)
{
buf[1] = buf[pos];
pos = 2;
}
else
{
pos = 1;
pst = 1; // 填空1
}
}
else
{
c++;
if(!pst) pos++;
}
} // while

if(c>0) pop(pst, buf, c, w); // 填空2
}

int main()
{
FILE* rfp;
FILE* wfp;

if((rfp=fopen(RFILE, "r")) == NULL)
{
printf("can not open %s!\n", RFILE);
exit(1);
}

if((wfp=fopen(WFILE, "w")) == NULL)
{
printf("can not open %s!\n", WFILE);
fclose(rf