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

本文介绍了一个使用C语言实现的图像处理程序,该程序通过读取文件内容并将其转换为特定字符来创建图像。程序首先将文件数据读入二维数组,然后对数据进行失真处理,最后将处理后的数字转换为字符,形成图像。此过程涉及文件操作、数组处理和字符映射。

#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];

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值