C Primer Plus 第六版(中文版)第十三章(完美版)编程练习答案

//本博主所写的代码仅为阅读者提供参考;
//若有不足之处请提出,博主会尽所能修改;
//附上课后编程练习题目;
//若是对您有用的话请点赞或分享提供给它人;



//附上12题的文本文件;
/*
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 5 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 4 5 2 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 0 4 5 2 0 0 0 0 0 0 0 0
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 4 5 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 1 8 5 0 0 0 4 5 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 4 5 2 0 0 0 0 0
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 3 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 2 2 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 3 3 0 0 0 0 0 0 5 8 9 9 8 5 0 5 6 1 1 1 1 6 5 0 0 0
0 0 0 0 4 4 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 5 5 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
*/

//13.10 - 4.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
    
    FILE *fp;
    double n;
    double sum = 0.0;
    int ct = 0;

    if (argc == 1)
    {
    
    
        fp = stdin;
    }
    else if (argc == 2)
    {
    
    
        if ((fp = fopen(argv[1], "r")) == NULL)
        {
    
    
            fprintf(stderr, "无法打开%s文件!\n", argv[1]);
            exit(EXIT_FAILURE);
        }
    }
    else
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if (fp == stdin)
    {
    
    
        printf("请您输入一些数字(按q退出):\n");
    }
    while (!feof(fp) && fscanf(fp, "%lf", &n) == 1)
    {
    
    
        /*↑feof函数当上一次输入调用检测到
        文件结尾时返回非0值,否则返回0;*/
        ct++;
        sum += n;
    }
    if (ct > 0)
    {
    
    
        printf("%d个数的算术平均值是%g.\n", ct, sum / ct);
    }
    else
    {
    
    
        printf("无数字!无法计算算术平均值!\n");
    }

    return 0;
}

//-------------

//13.10 - 5.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 256

int has_ch(char ch, const char *line);

int main(int argc, char *argv[])
{
    
    
    FILE *fp;
    char ch;
    char line[LEN];

    if (argc != 3)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    else
    {
    
    
        if (strlen(argv[1]) != 1)
        {
    
    
            fprintf(stderr, "第二个命令行参数必须是1个字符!\n");
            exit(EXIT_FAILURE);
        }
        if ((fp = fopen(argv[2], "r")) == NULL)
        {
    
    
            fprintf(stderr, "无法打开%s文件!\n", argv[2]);
            exit(EXIT_FAILURE);
        }
    }
    ch = argv[1][0];
    printf("打印含指定字符%c的行是:\n", ch);
    while (fgets(line, LEN, fp) != NULL)
    {
    
    
        if (has_ch(ch, line))
        {
    
    
            fputs(line, stdout);
        }
    }
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
    }

    return 0;
}

int has_ch(char ch, const char *line)
{
    
    
    while (*line)
    {
    
    
        if (ch == *line)
        {
    
    
            return 1;
        }
        line++;
    }
    return 0;
}

//-------------

//13.11 - 1.c

#include <stdio.h>
#include <stdlib.h>
#define LEN 50

int main(int argc, char *argv[])
{
    
    
    int ch;
    FILE *fp;
    unsigned long count = 0;
    char filename[LEN];

    printf("Please enter a filename:\n");
    scanf("%49s", filename);

    if ((fp = fopen(filename, "r")) == NULL)
    {
    
    
        printf("Can't open %s\n", filename);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(fp)) != EOF)
    {
    
    
        putc(ch, stdout);
        count++;
    }
    fclose(fp);
    printf("File %s has %lu characters\n", filename, count);

    return 0;
}

//-------------

//13.11 - 2.c

#include <stdio.h>
#include <stdlib.h>
#define BUF 512

int main(int argc, char *argv[])
{
    
    
    size_t bytes;
    FILE *source;
    FILE *target;
    char temp[BUF];

    if (argc != 3)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((source = fopen(argv[1], "rb")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    if ((target = fopen(argv[2], "wb")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[2]);
        exit(EXIT_FAILURE);
    }
    while ((bytes = fread(temp, sizeof(char), BUF, source)) > 0)
    {
    
    
        fwrite(temp, sizeof(char), bytes, target);
    }
    if (fclose(source) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[1]);
    }
    if (fclose(target) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
    }

    return 0;
}

//-------------

//13.11 - 3.c

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define LEN 50

int main(int argc, char *argv[])
{
    
    
    int ch;
    FILE *fp;
    char filename[LEN];

    printf("请您输入一个文件名:\n");
    scanf("%49s", filename);

    if ((fp = fopen(filename, "r+")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", filename);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(fp)) != EOF)
    {
    
    
        fseek(fp, -1L, SEEK_CUR); //回退一个字节;
        putc(toupper(ch), fp);
        fseek(fp, 0L, SEEK_CUR); //改变文件状态,使得下一个字符可以被正常读取;
    }
    rewind(fp);
    printf("%s文件中的所有字符已被转换为大写:\n", filename);
    while ((ch = getc(fp)) != EOF)
    {
    
    
        putchar(ch);
        /*↑显示到屏幕上检测
        字符是否成功转换为大写;*/
    }
    putchar('\n');
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", filename);
    }

    return 0;
}

//-------------

//13.11 - 4.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
    
    int i, temp;
    FILE *source;

    if (argc == 1)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    for (i = 1; i < argc; i++)
    {
    
    
        if ((source = fopen(argv[i], "r")) == NULL)
        {
    
    
            fprintf(stderr, "无法打开%s文件!\n", argv[i]);
            continue;
        }
        while ((temp = getc(source)) != EOF)
        {
    
    
            putchar(temp);
        }
        putchar('\n');
        if (fclose(source) != 0)
        {
    
    
            fprintf(stderr, "关闭%s文件失败!\n", argv[i]);
        }
    }

    return 0;
}

//-------------

//13.11 - 5.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 4096
#define SLEN 81

void append(FILE *source, FILE *dest);

int main(int argc, char *argv[])
{
    
    
    int i, ch;
    int files = 0;
    FILE *fa;
    FILE *fs;

    if (argc < 3)
    {
    
    
        printf("Usage: %s appendfile sourcefile.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((fa = fopen(argv[1], "a+")) == NULL)
    {
    
    
        fprintf(stderr, "Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    if (setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
    {
    
    
        //↑设置缓冲区大小为BUFSIZE;
        //↑_IOFBF表示完全缓冲;
        //↑NULL表示为fa指向的文件分配缓冲区;
        fputs("Can't create output buffer\n", stderr);
        exit(EXIT_FAILURE);
    }
    for (i = 2; i < argc; i++)
    {
    
    
        if (strcmp(argv[i], argv[1]) == 0)
        {
    
    
            fputs("Can't append file to itself\n", stderr);
            //↑防止文件自身附加在文件末尾;
        }
        else if ((fs = fopen(argv[i], "r")) == NULL)
        {
    
    
            fprintf(stderr, "Can't open %s\n", argv[i]);
        }
        else
        {
    
    
            if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
            {
    
    
                //↑同上一个setvbuf函数所述;
                //↑本次调用是为fs指向的文件分配缓冲区;
                fputs("Can't create input buffer\n", stderr);
                continue;
            }
            append(fs, fa);
            if (ferror(fs) != 0)
            {
    
    
                /*↑当读或写出现错误
                ferror函数返回一个非0值*/
                fprintf(stderr, "Error in reading file %s.\n", argv[i]);
            }
            if (ferror(fa) != 0)
            {
    
    
                fprintf(stderr, "Error in writing file %s.\n", argv[1]);
            }
            fclose(fs);
            files++;
            printf("File %s appended.\n", argv[i]);
        }
    }
    printf("Done appending. %d files appended.\n", files);
    rewind(fa); //返回文件起始处;
    printf("%s contents:\n", argv[1]);
    while ((ch = getc(fa)) != EOF)
    {
    
    
        putchar(ch);
    }
    putchar('\n');
    puts("Done displaying.");
    fclose(fa);

    return 0;
}

void append(FILE *source, FILE *dest)
{
    
    
    size_t bytes;
    static char temp[BUFSIZE];
    //↑静态无链接变量只分配一次内存;

    while ((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0)
    {
    
    
        /*↑fread函数把source指向的
        文件中的BUFSIZE块char类型的
        数据写入temp数组中,返回值是成功
        读取数据块的数量;*/
        fwrite(temp, sizeof(char), bytes, dest);
        /*↑fwrite函数把temp数组中的
        bytes块char类型的数据写入dest
        指向的文件中,返回值是成功写入数据
        块的数量;*/
    }
    return;
}

//-------------

//13.11 - 6.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 40

int main(int argc, char *argv[])
{
    
    
    FILE *in, *out;
    int ch;
    char name[LEN];
    int count = 0;
    char temp[LEN];

    printf("Please enter a filename:\n");
    scanf("%39s", temp);

    if ((in = fopen(temp, "r")) == NULL)
    {
    
    
        fprintf(stderr, "I could't open the file \"%s\"\n", temp);
        exit(EXIT_FAILURE);
    }
    //↓拷贝文件名;
    strncpy(name, temp, LEN - 5);
    name[LEN - 5] = '\0';
    strcat(name, ".red");
    //↑在文件名后面添加.red;
    if ((out = fopen(name, "w")) == NULL)
    {
    
    
        fprintf(stderr, "Can't create output file.\n");
        exit(3);
    }
    //↓拷贝数据;
    while ((ch = getc(in)) != EOF)
    {
    
    
        if (count++ % 3 == 0)
        {
    
    
            putc(ch, out);
        }
    }
    if (fclose(in) != 0 || fclose(out) != 0)
    {
    
    
        fprintf(stderr, "Error in closing files\n");
    }

    return 0;
}

//-------------

//13.11 - 7(a).c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
    
    FILE *fp;
    FILE *ft;
    int i, j, ch, ct;
    i = j = 1;

    if (argc != 3)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    if ((ft = fopen(argv[2], "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[2]);
        exit(EXIT_FAILURE);
    }
    ch = getc(fp); //←读取第一个文件的第一个字符;
    ct = getc(ft); //←读取第二个文件的第一个字符;
    while ((ch != EOF) || (ct != EOF))
    {
    
    
        if (ch != EOF)
        {
    
    
            printf("打印第1个文件第%d行:\n", i++);
        }
        while ((ch != EOF) && (ch != '\n'))
        {
    
    
            putchar(ch);
            ch = getc(fp);
            //↑读取第一个文件下一个字符;
        }
        if (ch != EOF)
        {
    
    
            //↓若读取到换行符时执行此块语句;
            putchar('\n');
            ch = getc(fp);
        }
        if (ct != EOF)
        {
    
    
            printf("打印第2个文件第%d行:\n", j++);
        }
        while ((ct != EOF) && (ct != '\n'))
        {
    
    
            putchar(ct);
            ct = getc(ft);
            //↑读取第二个文件下一个字符;
        }
        if (ct != EOF)
        {
    
    
            //↓若读取到换行符时执行此块语句;
            putchar('\n');
            ct = getc(ft);
        }
    }
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[1]);
    }
    if (fclose(ft) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
    }

    return 0;
}

//-------------

//13.11 - 7(b).c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
    
    FILE *fp;
    FILE *ft;
    int ch, ct, count;
    count = 1;

    if (argc != 3)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    if ((ft = fopen(argv[2], "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[2]);
        exit(EXIT_FAILURE);
    }
    ch = getc(fp);
    ct = getc(ft);
    while ((ch != EOF) || (ct != EOF))
    {
    
    
        printf("打印2文件第%d行:\n", count++);
        while ((ch != EOF) && (ch != '\n'))
        {
    
    
            putchar(ch);
            ch = getc(fp);
        }
        if (ch != EOF)
        {
    
    
            if (ct == EOF)
            {
    
    
                //↑若遇到第二个文件EOF则换行;
                putchar('\n');
            }
            else
            {
    
    
                putchar(' ');
                //↑打印空格隔开2个文件内容;
            }
            ch = getc(fp);
        }
        while ((ct != EOF) && (ct != '\n'))
        {
    
    
            putchar(ct);
            ct = getc(ft);
        }
        if (ct != EOF)
        {
    
    
            putchar('\n');
            ct = getc(ft);
        }
    }
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[1]);
    }
    if (fclose(ft) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
    }

    return 0;
}

//-------------

//13.11 - 8.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int search(int ch, FILE *fp);

int main(int argc, char *argv[])
{
    
    
    FILE *fp;
    int i, ch, ct;
    int count = 0;

    if (argc < 2)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if (strlen(argv[1]) != 1)
    {
    
    
        fprintf(stderr, "第二个命令行参数必须是一个字符!\n");
        exit(EXIT_FAILURE);
    }
    if (argc == 2)
    {
    
    
        fp = stdin;
        ch = argv[1][0];
        printf("请您输入字符串(遇EOF退出):\n");
        count = search(ch, fp);
        printf("字符%c总共出现了%d次.\n", ch, count);
    }
    else if (argc > 2)
    {
    
    
        ch = argv[1][0];
        for (i = 2; i < argc; i++)
        {
    
    
            if ((fp = fopen(argv[i], "r")) == NULL)
            {
    
    
                fprintf(stderr, "无法打开%s文件!\n", argv[i]);
                continue;
            }
            printf("%s文件中的内容是:\n", argv[i]);
            while ((ct = getc(fp)) != EOF)
            {
    
    
                putchar(ct);
            }
            rewind(fp);
            count = search(ch, fp);
            printf("字符%c在%s文件中总共出现了%d次.\n", ch, argv[i], count);
            if (fclose(fp) != 0)
            {
    
    
                fprintf(stderr, "关闭%s文件失败!\n", argv[i]);
            }
        }
    }

    return 0;
}

int search(int ch, FILE *fp)
{
    
    
    int find;
    int n = 0;

    while ((find = getc(fp)) != EOF)
    {
    
    
        if (ch == find)
        {
    
    
            n++;
        }
    }
    return n;
}

//-------------

//13.11 - 9.c

#include <stdio.h>
#include <stdlib.h>
#define MAX 41

int main(void)
{
    
    
    FILE *fp;
    int ct = 0;
    char words[MAX];

    if ((fp = fopen("wordy", "a+")) == NULL)
    {
    
    
        fprintf(stdout, "Can't open \"wordy\" file.\n");
        exit(EXIT_FAILURE);
    }

    while (fgets(words, MAX, fp) != NULL)
    {
    
    
        ct++;
    }
    rewind(fp);
    puts("Enter words to add to the file; press the #");
    puts("key at the beginning of a line to terminate.");
    while ((fscanf(stdin, "%40s", words) == 1) && (words[0] != '#'))
    {
    
    
        fprintf(fp, "%-3d:%s\n", ++ct, words);
    }

    puts("File contents:");
    rewind(fp);
    while (fgets(words, MAX, fp) != NULL)
    {
    
    
        fputs(words, stdout);
    }
    puts("Done!");
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "Error in closing file\n");
    }

    return 0;
}

//-------------

//13.11 - 10.c

#include <stdio.h>
#include <stdlib.h>
#define LEN 50

int main(int argc, char *argv[])
{
    
    
    int ch;
    FILE *fp;
    long int number;
    char filename[LEN];

    printf("请您输入一个文件名:\n");
    scanf("%49s", filename);

    if ((fp = fopen(filename, "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", filename);
        exit(EXIT_FAILURE);
    }
    printf("请输入一个文件位置(<0或q退出):");
    while ((scanf("%ld", &number) == 1) && (number >= 0))
    {
    
    
        fseek(fp, number, SEEK_SET);
        while (((ch = getc(fp)) != '\n') && (ch != EOF))
        {
    
    
            /*↓打印从该位置开始到
            下一个换行符之前的内容;*/
            putchar(ch);
        }
        if (ch == EOF)
        {
    
    
            printf("此位置已遇到EOF!\n");
            break;
        }
        printf("\n您可以再次输入一个文件位置(<0或q退出):");
    }
    printf("本程序完成!\n");
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", filename);
    }

    return 0;
}

//-------------

//13.11 - 11.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 256

int main(int argc, char *argv[])
{
    
    
    FILE *fp;
    char temp[LEN];

    if (argc != 3)
    {
    
    
        fprintf(stderr, "本程序名是:%s.\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((fp = fopen(argv[2], "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", argv[2]);
        exit(EXIT_FAILURE);
    }
    printf("打印%s文件中包含%s字符串的所有行:\n", argv[2], argv[1]);
    while (fgets(temp, LEN, fp) != NULL)
    {
    
    
        if (strstr(temp, argv[1]) != NULL)
        {
    
    
            //↑查找右参数子串是否在左参数中;
            fputs(temp, stdout);
        }
    }
    putchar('\n');
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
    }

    return 0;
}

//-------------

//13.11 - 12.c

#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50

void change(int (*a)[COLS], char (*b)[COLS], int rows);

const char trans[LEVELS + 1] = " .':~*=&%#"; //存储需要转换的字符;

int main(void)
{
    
    
    int row, col;
    FILE *infile;
    char filename[LEN];
    int figure[ROWS][COLS];
    char picture[ROWS][COLS];

    printf("请输入一个文件名:\n");
    scanf("%49s", filename);

    if ((infile = fopen(filename, "r+")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", filename);
        exit(EXIT_FAILURE);
    }
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            fscanf(infile, "%d", &figure[row][col]);
            //↑从文件中读取数字;
        }
    }
    if (ferror(infile))
    {
    
    
        fprintf(stderr, "进行读或写文件时出现错误!\n", filename);
        exit(EXIT_FAILURE);
    }

    change(figure, picture, ROWS);
    printf("%s文件中的数字成功转换成图片如下:\n", filename);
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            putchar(picture[row][col]);
        }
        putchar('\n');
    }

    fseek(infile, 0L, SEEK_END); //定位到文件末尾;
    putc('\n', infile);          //↓将结果存储到文本文件中;
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            fprintf(infile, "%c", picture[row][col]);
        }
        putc('\n', infile);
    }
    if (fclose(infile) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", filename);
    }

    return 0;
}

void change(int (*a)[COLS], char (*b)[COLS], int rows)
{
    
    
    int row, col;

    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            b[row][col] = trans[a[row][col]];
            //↑进行数字对应的字符转换;
        }
    }
    return;
}

//-------------

//13.11 - 13.c

#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50

void change(int rows, int cols, int a[rows][cols], char b[rows][cols]);

const char trans[LEVELS + 1] = " .':~*=&%#"; //存储需要转换的字符;

int main(void)
{
    
    
    int row, col;
    FILE *infile;
    char filename[LEN];
    int figure[ROWS][COLS];
    char picture[ROWS][COLS];

    printf("请输入一个文件名:\n");
    scanf("%49s", filename);

    if ((infile = fopen(filename, "r+")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", filename);
        exit(EXIT_FAILURE);
    }
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            fscanf(infile, "%d", &figure[row][col]);
            //↑从文件中读取数字;
        }
    }
    if (ferror(infile))
    {
    
    
        fprintf(stderr, "进行读或写文件时出现错误!\n", filename);
        exit(EXIT_FAILURE);
    }

    change(ROWS, COLS, figure, picture);
    printf("%s文件中的数字成功转换成图片如下:\n", filename);
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            putchar(picture[row][col]);
        }
        putchar('\n');
    }

    fseek(infile, 0L, SEEK_END); //定位到文件末尾;
    putc('\n', infile);          //↓将结果存储到文本文件中;
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            fprintf(infile, "%c", picture[row][col]);
        }
        putc('\n', infile);
    }
    if (fclose(infile) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", filename);
    }

    return 0;
}

void change(int rows, int cols, int a[rows][cols], char b[rows][cols])
{
    
    
    int row, col;

    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            b[row][col] = trans[a[row][col]];
            //↑进行数字对应的字符转换;
        }
    }
    return;
}

//-------------

//13.11 - 14.c

#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50

int clean_distortion(int (*a)[COLS], int rows, int x, int y);
void change(int (*a)[COLS], char (*b)[COLS], int rows);

const char trans[LEVELS + 1] = " .':~*=&%#"; //存储需要转换的字符;

int main(void)
{
    
    
    int row, col;
    FILE *infile;
    char filename[LEN];
    int figure[ROWS][COLS];
    char picture[ROWS][COLS];

    printf("请输入一个文件名:\n");
    scanf("%49s", filename);

    if ((infile = fopen(filename, "r+")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", filename);
        exit(EXIT_FAILURE);
    }
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            fscanf(infile, "%d", &figure[row][col]);
            //↑从文件中读取数字;
        }
    }
    if (ferror(infile))
    {
    
    
        fprintf(stderr, "进行读或写文件时出现错误!\n", filename);
        exit(EXIT_FAILURE);
    }
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            figure[row][col] = clean_distortion(figure, ROWS, row, col);
        }
    }
    change(figure, picture, ROWS);
    printf("%s文件中的数字成功转换成图片如下:\n", filename);
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            putchar(picture[row][col]);
        }
        putchar('\n');
    }

    fseek(infile, 0L, SEEK_END); //定位到文件末尾;
    putc('\n', infile);          //↓将结果存储到文本文件中;
    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            fprintf(infile, "%c", picture[row][col]);
        }
        putc('\n', infile);
    }
    if (fclose(infile) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", filename);
    }

    return 0;
}

int clean_distortion(int (*a)[COLS], int rows, int x, int y)
{
    
    
    int average; //用于四舍五入的中间局部变量;

    if (x == 0) //←矩形的上边
    {
    
    
        if (y == 0)
        {
    
    
            //↑矩形左上顶点;
            if ((a[x][y] - a[x][y + 1]) > 1 && (a[x][y] - a[x + 1][y]) > 1)
            {
    
    
                average = ((a[x][y + 1] + a[x + 1][y]) / 2.0 + 0.5); //四舍五入公式;
                return average;
            }
        }
        if (y == COLS - 1)
        {
    
    
            //↑矩形右上顶点;
            if ((a[x][y] - a[x][y - 1]) > 1 && (a[x][y] - a[x + 1][y]) > 1)
            {
    
    
                average = ((a[x][y - 1] + a[x + 1][y]) / 2.0 + 0.5);
                return average;
            }
        }
        //↓矩形的上边除了顶点之外的点;
        if ((a[x][y] - a[x][y - 1]) > 1 &&
            (a[x][y] - a[x][y + 1]) > 1 &&
            (a[x][y] - a[x + 1][y]) > 1)
        {
    
    
            average = ((a[x][y - 1] + a[x][y + 1] + a[x + 1][y]) / 3.0 + 0.5);
            return average;
        }
    }
    else if (x == rows - 1) //←矩形的下边
    {
    
    
        if (y == 0)
        {
    
    
            //↑矩形左下顶点;
            if ((a[x][y] - a[x - 1][y]) > 1 && (a[x][y] - a[x][y + 1]) > 1)
            {
    
    
                average = ((a[x - 1][y] + a[x][y + 1]) / 2.0 + 0.5);
                return average;
            }
        }
        if (y == COLS - 1)
        {
    
    
            //↑矩形右下顶点;
            if ((a[x][y] - a[x][y - 1]) > 1 && (a[x][y] - a[x - 1][y]) > 1)
            {
    
    
                average = ((a[x][y - 1] + a[x - 1][y]) / 2.0 + 0.5);
                return average;
            }
        }
        //↓矩形的下边除了顶点之外的点;
        if ((a[x][y] - a[x][y - 1]) > 1 &&
            (a[x][y] - a[x][y + 1]) > 1 &&
            (a[x][y] - a[x - 1][y]) > 1)
        {
    
    
            average = ((a[x][y - 1] + a[x][y + 1] + a[x - 1][y]) / 3.0 + 0.5);
            return average;
        }
    }
    if (y == 0) //←矩形的左边除了顶点之外的点;
    {
    
    
        if ((a[x][y] - a[x - 1][y]) > 1 &&
            (a[x][y] - a[x + 1][y]) > 1 &&
            (a[x][y] - a[x][y + 1]) > 1)
        {
    
    
            average = ((a[x - 1][y] + a[x + 1][y] + a[x][y + 1]) / 3.0 + 0.5);
            return average;
        }
    }
    else if (y == COLS - 1) //←矩形的右边除了顶点之外的点;
    {
    
    
        if ((a[x][y] - a[x - 1][y]) > 1 &&
            (a[x][y] - a[x + 1][y]) > 1 &&
            (a[x][y] - a[x][y - 1]) > 1)
        {
    
    
            average = ((a[x - 1][y] + a[x + 1][y] + a[x][y - 1]) / 3.0 + 0.5);
            return average;
        }
    }
    //↓矩形剩余所有的点;
    if ((a[x][y] - a[x - 1][y]) > 1 &&
        (a[x][y] - a[x + 1][y]) > 1 &&
        (a[x][y] - a[x][y - 1]) > 1 &&
        (a[x][y] - a[x][y + 1]) > 1)
    {
    
    
        average = ((a[x - 1][y] + a[x + 1][y] + a[x][y - 1] + a[x][y + 1]) / 4.0 + 0.5);
        return average;
    }
    return a[x][y]; //←以上条件都不符合则返回原值;
}

void change(int (*a)[COLS], char (*b)[COLS], int rows)
{
    
    
    int row, col;

    for (row = 0; row < ROWS; row++)
    {
    
    
        for (col = 0; col < COLS; col++)
        {
    
    
            b[row][col] = trans[a[row][col]];
            //↑进行数字对应的字符转换;
        }
    }
    return;
}

//-------------

//----------------------------2020年4月5日 -------------------------------

猜你喜欢

转载自blog.csdn.net/m0_46181359/article/details/105328876
今日推荐