c primer plus 第十三章课后编程14题

#include <stdio.h>
#include <stdlib.h>
#define STR " .’:~*=&%#" //STR+0对应“ ”,+1=“.”,+2=“‘”以此类推
#define ROWS 20
#define LEN 30
void files1(FILE *fp,int file1[ROWS][LEN]); //把文件内容拷贝到数组中
void files2(int file1[ROWS][LEN]); //对失真问题进行特殊处理
void files3(int file1[ROWS][LEN], char file2[ROWS][LEN+1]); //把数字转换为图像

int main(int argc, const char * argv[])
{
int i,j;
int file1[ROWS][LEN];
char file2[ROWS][LEN+1];
FILE *fp,*fc;
//检查打开的文件
if((fp=fopen(argv[1], “r”))==NULL)
{
fprintf(stderr,“无法打开%s文件。\n”,argv[1]);
exit(1);
}

if((fc=fopen(argv[2], "w"))==NULL)
{
    fprintf(stderr,"无法打开%s文件。\n",argv[2]);
    exit(2);
}
files1(fp,file1);
files2(file1);
for(i=0;i<20;i++)
{
    for(j=0;j<30;j++)
        file2[i][j]=*(STR+file1[i][j]);
    file2[i][j]='\0';
    fprintf(fc,"%s\n",file2[i]);      //输入到文件
    printf("%s\n",file2[i]);          //检查输入情况
}

//收尾,关闭文件
fclose(fp);
fclose(fc);

return 0;

}

void files1(FILE *fp,int file1[ROWS][LEN])
{

int i,j;
for(i=0;i<ROWS;i++)
    for(j=0;j<LEN;j++)
        while(fscanf(fp,"%d",&file1[i][j])!=1)
            fscanf(fp,"%*c");

}

void files2(int file1[ROWS][LEN])
{
int files[ROWS][LEN]={0};
int i,j;
int u,d,r,l; //上下左右
u=d=r=l=0;
for(i=0;i<ROWS;i++)
for(j=0;j<LEN;j++)
{
files[i][j]=file1[i][j];

        u=abs(file1[i][j]-file1[i-1][j])>1?1:0;
        d=abs(file1[i][j]-file1[i+1][j])>1?1:0;
        r=abs(file1[i][j]-file1[i][j-1])>1?1:0;
        l=abs(file1[i][j]-file1[i][j+1])>1?1:0;
        if(i==0)
            u=0;
        else if(i==19)
            d=0;
        else if(j==0)
            r=0;
        else if(j==29)
            l=0;
        
        //4个角
        if(abs(file1[0][0]-d)>1 || abs(file1[0][0]-l)>1)
            files[0][0]=(file1[0][0]+d+l)/3+0.5;
        
        else if(abs(file1[19][0]-u)>1 || abs(file1[19][0]-l)>1)
            files[19][0]=(file1[19][0]+u+l)/3+0.5;
        
        else if(abs(file1[0][29]-d)>1 || abs(file1[0][29]-r)>1)
            files[0][29]=(file1[0][29]+d+r)/3+0.5;
        
        else if(abs(file1[19][29]-u)>1 || abs(file1[19][29]-r)>1)
            files[19][29]=(file1[19][29]+u+r)/3+0.5;
        //4条边
        else if(abs(file1[0][j]-d)>1 || abs(file1[0][j]-r)>1 ||abs(file1[0][j]-r)>1)
            files[0][j]=(file1[0][j]+d+r+l)/4+0.5;
        
        else if(abs(file1[i][0]-u)>1 || abs(file1[i][0]-d)>1 ||abs(file1[i][0]-l)>1)
            files[i][0]=(file1[i][0]+d+r+l)/4+0.5;
        
        else if(abs(file1[19][j]-u)>1 || abs(file1[19][j]-d)>1 ||abs(file1[19][j]-r)>1)
            files[19][j]=(file1[19][j]+d+r+l)/4+0.5;
        
        else if(abs(file1[i][29]-u)>1 || abs(file1[i][29]-d)>1 ||abs(file1[i][29]-r)>1)
            files[i][29]=(file1[i][29]+d+r+l)/4+0.5;
        //剩下的
        else if(abs(file1[i][j]-u)>1 || abs(file1[i][j]-d)>1 || abs(file1[i][j]-r)>1 ||
                abs(file1[i][j]-l)>1)
            files[i][j]=(file1[i][j]+u+d+r+l)/5+0.5;
        }

for(i=0;i<ROWS;i++)
    for(j=0;j<LEN;j++)
        file1[i][j]=files[i][j];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值