C Primer Plus(中文版)第13章编程练习,仅供参考

news2024/9/22 1:24:21

第十三章编程练习

对于文件的操作是程序开发过程中必不可少的。首先,来看一下第一题,对13.1程序进行修改,输入文件名,而不是命令行参数。完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
int main(void){
    int ch;
    FILE * fp;
    unsigned long count = 0;
    char name[44];
    printf("请输入要打开的文件名:\n");
    scanf("%s",name);
    if ((fp = fopen(name,"r")) == NULL){
        printf("Can't open %s\n",name);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(fp)) != EOF){
        putc(ch,stdout);
        count++;
    }
    fclose(fp);
    printf("File %s has %lu characters\n",name,count);
    
    return 0;
}

在这里插入图片描述

下面,来看一下第二题,编写一个文件拷贝程序,通过命令行获取两个文件名,完整程序代码以及运行结果如下

#include<stdio.h>
#include<stdlib.h>
#define SIZE 44
int main(int argc, char * argv[]){
    int ch;
    FILE * in, * out;
    
    if(argc < 2){
        fprintf(stderr,"Usage: %s filename\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((in = fopen(argv[1], "r")) == NULL){
        fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[1]);
    }
    if((out = fopen(argv[2],"w")) == NULL){
        fprintf(stderr,"Can't open or create the file \"%s\"\n",argv[2]);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(in)) != EOF){
        putc(ch,out);
    }
    if (fclose(in) != 0 || fclose(out) != 0){
        fprintf(stderr,"Error in close files\n");
    }
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述

下面来看一下第三题,还是写一个文件拷贝程序,但是是让用户输入文件名,然后以该文件名作为原始文件名和输出文件名,然后将文本全部转换成大写。完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define SIZE 44
#define PF "D:\\C\\"
#define Y "D:\\C\\a.txt"
int main(){
    int ch;
    FILE * in, * out;
    char name[SIZE];
    char pf[SIZE] = PF;
    
    printf("请输入文件名:\n");
    scanf("%s",name);
    strcat(pf,name);
    if ((in = fopen(Y, "r")) == NULL){
        fprintf(stderr,"I couldn't open the file \"%s\"\n",Y);
    }
    if((out = fopen(pf,"w+")) == NULL){
        fprintf(stderr,"Can't open or create the file \"%s\"\n",pf);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(in)) != EOF){
        putc(toupper(ch),out);
    }
    if (fclose(in) != 0 || fclose(out) != 0){
        fprintf(stderr,"Error in close files\n");
    }
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来,来看一下第四题,要求用命令行参数去展示所有的文件,完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define SIZE 44
int main(int argc,char * argv[]){
    int ch;
    FILE * in, * out;
    for (int i = 1; i < argc; i++){
        if ((in = fopen(argv[i], "r")) == NULL){
            fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[i]);
        }
        while ((ch = getc(in)) != EOF){
            putc(ch,stdout);
        }
        printf("\n");
        if (fclose(in) != 0){
            fprintf(stderr,"Error in close files\n");
        }
    }
    
    return 0;
}

在这里插入图片描述

下面,我们来看一下第五题的要求,让我们将清单13.5的程序修改为命令行界面。将需要获取的文件名通过命令去赋值即可,完整程序代码以及运行结果如下:

/* append.c -- 把文件附加到另一个文件末尾 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 4096
#define SLEN 81
void append(FILE *source, FILE *dest);
char * s_gets(char * st, int n);

int main(int argc, char * argv[]){
     FILE *fa, *fs;          // fa 指向目标文件,fs 指向源文件
     int files = 0;          // 附加的文件数量
     //char file_app[SLEN];    // 目标文件名
     //char file_src[SLEN];    // 源文件名
     int ch;

    if (argc < 2){
        fprintf(stderr,"Usage: %s filename\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    
     //puts("Enter name of destination file:");
     //s_gets(file_app, SLEN);
     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)
     {
          fputs("Can't create output buffer\n", stderr);
          exit(EXIT_FAILURE);
     }
     puts("Enter name of first source file (empty line to quit):");
     int i = 2;
     while (i < argc)
     {
          if (strcmp(argv[2], argv[1]) == 0)
               fputs("Can't append file to itself\n", stderr);
          else if ((fs = fopen(argv[2], "r")) == NULL)
               fprintf(stderr, "Can't open %s\n", argv[2]);
          else
          {
               if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
               {
                    fputs("Can't create input buffer\n", stderr);
                    continue;
               }
               append(fs, fa);
               if (ferror(fs) != 0)
                    fprintf(stderr, "Error in reading file %s.\n",
                              argv[2]);
               if (ferror(fa) != 0)
                    fprintf(stderr, "Error in writing file %s.\n",
                              argv[1]);
               fclose(fs);
               files++;
               printf("File %s appended.\n", argv[1]);
               puts("Next file (empty line to quit):");
          }
        i++;
     }
     printf("Done appending. %d files appended.\n", files);
     rewind(fa);
     printf("%s contents:\n", argv[1]);
     while ((ch = getc(fa)) != EOF)
          putchar(ch);
     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)
          fwrite(temp, sizeof(char), bytes, dest);
}

char * s_gets(char * st, int n)
{
     char * ret_val;
     char * find;

     ret_val = fgets(st, n, stdin);
     if (ret_val)
     {
          find = strchr(st, '\n');     // 查找换行符
          if (find)                    // 如果地址不是NULL,
               *find = '\0';           // 在此处放置一个空字符
          else
               while (getchar() != '\n')
                    continue;
     }
     return ret_val;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第五题我是直接用书上的程序清单改的,有些地方提示会比较粗糙,如有需要,请自行修改文本文字。下面看一下第六题的题目要求。将命令行参数修改为提示用户输入所需信息。程序的完整代码以及运行结果如下;

// reducto.c –把文件压缩成原来的1/3!
#include <stdio.h>
#include <stdlib.h>    // 提供 exit()的原型
#include <string.h>    // 提供 strcpy()、strcat()的原型
#define LEN 40
#define PF "D:\\C\\"

int main()
{
     FILE  *in, *out;    // 声明两个指向 FILE 的指针
     int ch;
     char name[LEN];     // 存储输出文件名
     int count = 0;

     char inn[LEN];     // 存储输出文件名
     char pfin[LEN] = PF;     // 存储输出文件名
     printf("请输入文件名:\n");
     scanf("%s",inn);
     strcat(pfin,inn);
     // 设置输入
     if ((in = fopen(pfin, "r")) == NULL)
     {
          fprintf(stderr, "I couldn't open the file \"%s\"\n",
                    pfin);
          exit(EXIT_FAILURE);
     }
     // 设置输出
     char innn[LEN];
     strcpy(innn,inn);
     int i = 0;
     while (innn[i] != '\0'){
        if(innn[i] == '.'){
            innn[i] = '_';
        }
        i++;
     } 
     strncpy(name, innn, LEN - 5);    // 拷贝文件名
     name[LEN - 5] = '\0';
     strcat(name, ".red");                // 在文件名后添加.red
     char pfout[LEN] = PF;     // 存储输出文件名
     strcat(pfout,name);
     if ((out = fopen(pfout, "w")) == NULL)
     {                       // 以写模式打开文件
          fprintf(stderr, "Can't create output file.\n");
          exit(3);
     }
     // 拷贝数据
     while ((ch = getc(in)) != EOF)
          if (count++ % 3 == 0)
               putc(ch, out);    // 打印3个字符中的第1个字符
     // 收尾工作
     if (fclose(in) != 0 || fclose(out) != 0)
          fprintf(stderr, "Error in closing files\n");

     return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来,来看一下第七题,打开两个文件,文件名可以用命令行或者输入都可以,然后有两个打印顺序。完整程序代码以及运行结果如下:

在这里插入图片描述

样式a结果

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define SIZE 44
#define SIZE2 100
int main(int argc,char * argv[]){
    char ch[SIZE2];
    char ch2[SIZE2];
    FILE * in, * out;
    if (argc < 2){
        fprintf(stderr,"Usage: %s filename\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((in = fopen(argv[1], "r")) == NULL){
        fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[1]);
        exit(EXIT_FAILURE);
    }
    if((out = fopen(argv[2],"r")) == NULL){
        fprintf(stderr,"Can't open the file \"%s\"\n",argv[2]);
        exit(EXIT_FAILURE);
    }
    int i = 1 ,j = 1;
    while (i == 1 || j == 1){
        if (fgets(ch,SIZE2,in) != NULL){
            fputs(ch,stdout);
        }else{
            i = 0;
        }
        if (fgets(ch2,SIZE2,out) != NULL){
            fputs(ch2,stdout);
        }else{
            j = 0;
        }
        if (i == 0|| j == 0){
            printf("\n");
        }
          
    }
    if (fclose(in) != 0||fclose(out) != 0){//运行的时候忘记关闭out文件流了,后来补充的
        fprintf(stderr,"Error in close files\n");
    }
    
    return 0;
}

在这里插入图片描述

样式b结果:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define SIZE 44
#define SIZE2 100
int main(int argc,char * argv[]){
    char ch[SIZE2];
    char ch2[SIZE2];
    FILE * in, * out;
    if (argc < 2){
        fprintf(stderr,"Usage: %s filename\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((in = fopen(argv[1], "r")) == NULL){
        fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[1]);
        exit(EXIT_FAILURE);
    }
    if((out = fopen(argv[2],"r")) == NULL){
        fprintf(stderr,"Can't open the file \"%s\"\n",argv[2]);
        exit(EXIT_FAILURE);
    }
    int i = 1 ,j = 1;
    while (i == 1 || j == 1){
        int w = 0;
        while (ch[w] != '\0'){
            ch[w] = '\0';
            w++;
        }
        w = 0;
        while (ch2[w] != '\0'){
            ch2[w] = '\0';
            w++;
        }
        if (fgets(ch,SIZE2,in) != NULL){
            i = 1;
            if (j == 1){
                char * find = strchr(ch,'\n');
                *find = '\0';
            }
        }else{
            i = 0;
        }
        if (fgets(ch2,SIZE2,out) != NULL && j==1){
            strcat(ch,ch2);
        }else{
            j = 0;
        }
    fputs(ch,stdout);
          
    }
    if (fclose(in) != 0 || fclose(out) != 0){
        fprintf(stderr,"Error in close files\n");
    }
    
    return 0;
}

在这里插入图片描述

接下来,我们来看一下第八题的要求,编写一个可以循环依次计算命令行中文件中指定字符的个数,如果没有文件参数的话,就从标准输入中获取需要计算的内容。完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define SIZE 100
int main(int argc, char * argv[]){
    
    FILE * in;
    char * c = argv[1];
    char arr[SIZE];
    int count;
    char ch;

    if (argc < 2){
        fprintf(stderr,"Usage: %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if (argc == 2){
        printf("请输入您需要回显的内容:\n");
        fgets(arr,SIZE,stdin);
        fputs(arr,stdout);
        count = 0;
        for (int i = 0; i < strlen(arr); i++){
            if (arr[i] == *c){
                count++;
            }
        }
        fprintf(stdout,"字符%c在输入中共出现了%d次!\n",*c,count);
    }
    for (int i = 2; i < argc; i++){
        if ((in = fopen(argv[i],"r")) == NULL){
            fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[i]);
            continue;
        }
        count = 0;
        while ((ch = getc(in)) != EOF){
            if (ch == *c){
                count++;
            }
        }
        fprintf(stdout,"字符%c在文件%s中共出现了%d次!\n",*c,argv[i],count);    
        if (fclose(in) != 0){
            fprintf(stderr,"Error in close files\n");
        }
    }
    return 0;
}

在这里插入图片描述

在这里插入图片描述

接着,我们来看第九题的题目要求,对程序清单13.3进行修改,在前面加一个单词编号,并且每次都在更新编号,完整程序代码以及运行结果如下:

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

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

     if ((fp = fopen("wordy", "a+")) == NULL)
     {
          fprintf(stdout, "Can't open \"wordy\" file.\n");
          exit(EXIT_FAILURE);
     }
     rewind(fp);
     while (fgets(words,MAX,fp) != NULL){
          number++;
     }
     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, "%d: %s\n", ++number, words);

     puts("File contents:");
     rewind(fp);        /* 返回到文件开始处 */
     while (fgets(words,MAX,fp) != NULL){
          fputs(words,stdout);
     }
     
     puts("Done!");
     if (fclose(fp) != 0)
          fprintf(stderr, "Error closing file\n");

     return 0;
}

在这里插入图片描述

下面,我们来看一下第十题的题目要求,需要我们去展示文件位置到第一个换行符之间的内容。完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 44
#define PF "D:\\C\\"
int main(void){
     FILE * in;
     char name[SIZE];
     char pfname[SIZE] = PF;
     int number;
     char ch;
     printf("请输入您要查询的文件名:\n");
     scanf("%s",name);
     strcat(pfname,name);
     if ((in = fopen(pfname,"r")) == NULL){
          fprintf(stderr,"I couldn't open the file \"%s\"\n",pfname);
          exit(EXIT_FAILURE);
     }
     printf("请输入您要展示的文件位置:\n");
     while (scanf("%d",&number) == 1 && number > 0){
          fseek(in,(long)number,SEEK_SET);
          while ((ch = getc(in)) != '\n'){
               putchar(ch);
          }
          rewind(in);
          printf("\n请再次输入需要展示的文件位置:\n");
     }
     printf("Done!");
     return 0;
}

在这里插入图片描述

在这里插入图片描述

接下来,便是第十一题的内容了,我们先看一下这道题目的具体要求是什么。接受两个命令行参数,然后一个字符串,一个文件名,打印出文件中包含字符串的所有行的内容,文件中的所有行都不会超过255个字符。完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 255
int main(int argc, char * argv[]){
     FILE * in;
     char words[SIZE];

     if (argc < 2){
          fprintf(stderr,"Usage: %s filename\n",argv[0]);
          exit(EXIT_FAILURE);
     }
     if ((in = fopen(argv[2],"r")) == NULL){
          fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[2]);
          exit(EXIT_FAILURE);
     }
     while (fgets(words,SIZE,in) != NULL){
          if (strstr(words,argv[1])){
               fputs(words,stdout);
          } 
     }
     if (fclose(in) != 0){
          fprintf(stderr,"Error in closing files\n");
     }
     
     return 0;
}

在这里插入图片描述

在这里插入图片描述

下面,我们来看一下第十二题要求我们实现一些什么功能

在这里插入图片描述

在这里插入图片描述

让我们将数字转换为图像字符,完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define NAME "D:\\C\\test.txt"
void zhuan(char (* s)[31], int (* a)[30]);
int main(void){
     FILE * in,* out;
     int arr[20][30];
     char sc[20][31];
     char name[44];
     if ((in = fopen(NAME,"r")) == NULL){
          fprintf(stderr,"I could't open the file %s\n",NAME);
          exit(EXIT_FAILURE);
     }
     int (* a)[30] = arr;
     char (* s)[31] = sc;
     for (int i = 0; i < 20; i++){
          for (int j = 0; j < 30; j++){
               fscanf(in,"%d",(*(a+i)+j));
          }
     }
     zhuan(s,a);
     printf("请输入您要存储的文件名:\n");
     scanf("%s",name);
     while ((out = fopen(name,"w+")) == NULL){
          fprintf(stderr,"I could't create the file %s\n",name);
          printf("请再次输入您要存储的文件名:\n");
          scanf("%s",name);
     }
     for (int i = 0; i < 20; i++){
          for (int j = 0; j < 31; j++){
               putchar(sc[i][j]);
               putc(sc[i][j],out);
               //printf("%c",sc[i][j]);
          }
          printf("\n");
          putc('\n',out);
     }
     if (fclose(in) != 0 || fclose(out) != 0){
          fprintf(stderr,"Error in close files\n");
     }
     return 0;
}
void zhuan(char (* s)[31],int (* a)[30]){
     for (int i = 0; i < 20; i++){
          for (int j = 0; j < 31; j++){
               if (j == 30){
                    *(*(s+i)+j) = '\0';
                    continue;
               }
               switch (*(*(a+i)+j))
               {
               case 0:
                    *(*(s+i)+j) = ' ';
                    break;
               case 1:
                    *(*(s+i)+j) = '.';
                    break;
               case 2:
                    *(*(s+i)+j) = '\'';
                    break;
               case 3:
                    *(*(s+i)+j) = ':';
                    break;
               case 4:
                    *(*(s+i)+j) = '~';
                    break;
               case 5:
                    *(*(s+i)+j) = '*';
                    break;
               case 6:
                    *(*(s+i)+j) = '=';
                    break;
               case 7:
                    *(*(s+i)+j) = '@';
                    break;
               case 8:
                    *(*(s+i)+j) = '%';
                    break;
               case 9:
                    *(*(s+i)+j) = '#';
                    break;
               
               default:
                    break;
               }
          }
     }
}

在这里插入图片描述

在这里插入图片描述

接下来,我们来看一下第十三题的要求,让我们用变长数组代替标准数组去修改上一个编程练习。将程序中的数组长度修改为变量值,如有需要,可以根据文件长度去设置变量值,这里暂时不提,完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define NAME "D:\\C\\test.txt"
void zhuan(int m, int r, int n, char (* s)[r], int (* a)[n]);
int main(void){
     FILE * in,* out;
     int m = 20;
     int n = 30;
     int r = 31;
     int arr[m][n];
     char sc[m][r];
     char name[44];
     if ((in = fopen(NAME,"r")) == NULL){
          fprintf(stderr,"I could't open the file %s\n",NAME);
          exit(EXIT_FAILURE);
     }
     int (* a)[n] = arr;
     char (* s)[r] = sc;
     for (int i = 0; i < m; i++){
          for (int j = 0; j < n; j++){
               fscanf(in,"%d",(*(a+i)+j));
          }
     }
     zhuan(m,r,n,s,a);
     printf("请输入您要存储的文件名:\n");
     scanf("%s",name);
     while ((out = fopen(name,"w+")) == NULL){
          fprintf(stderr,"I could't create the file %s\n",name);
          printf("请再次输入您要存储的文件名:\n");
          scanf("%s",name);
     }
     for (int i = 0; i < m; i++){
          for (int j = 0; j < r; j++){
               putchar(sc[i][j]);
               putc(sc[i][j],out);
               //printf("%c",sc[i][j]);
          }
          printf("\n");
          putc('\n',out);
     }
     if (fclose(in) != 0 || fclose(out) != 0){
          fprintf(stderr,"Error in close files\n");
     }
     return 0;
}
void zhuan(int m, int r, int n, char (* s)[r],int (* a)[n]){
     for (int i = 0; i < m; i++){
          for (int j = 0; j < r; j++){
               if (j == 30){
                    *(*(s+i)+j) = '\0';
                    continue;
               }
               switch (*(*(a+i)+j))
               {
               case 0:
                    *(*(s+i)+j) = ' ';
                    break;
               case 1:
                    *(*(s+i)+j) = '.';
                    break;
               case 2:
                    *(*(s+i)+j) = '\'';
                    break;
               case 3:
                    *(*(s+i)+j) = ':';
                    break;
               case 4:
                    *(*(s+i)+j) = '~';
                    break;
               case 5:
                    *(*(s+i)+j) = '*';
                    break;
               case 6:
                    *(*(s+i)+j) = '=';
                    break;
               case 7:
                    *(*(s+i)+j) = '@';
                    break;
               case 8:
                    *(*(s+i)+j) = '%';
                    break;
               case 9:
                    *(*(s+i)+j) = '#';
                    break;
               
               default:
                    break;
               }
          }
     }
}

在这里插入图片描述

在这里插入图片描述

最后,我们来看一下最后一个问题,在上面的基础上写一个函数去做图像失真处理,四个边上的值需要做一下特殊处理,因为相邻的值只有三个。完整程序代码以及运行结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define NAME "D:\\C\\test.txt"
void zhuan(int m, int r, int n, char (* s)[r], int (* a)[n]);
int shiZhen(int x, int y, int m,int n, int (* a)[n]);
int main(void){
     FILE * in,* out;
     int m = 20;
     int n = 30;
     int r = 31;
     int arr[m][n];
     int arnew[m][n];
     char sc[m][r];
     char name[44];
     if ((in = fopen(NAME,"r")) == NULL){
          fprintf(stderr,"I could't open the file %s\n",NAME);
          exit(EXIT_FAILURE);
     }
     int (* a)[n] = arr;
     char (* s)[r] = sc;
     for (int i = 0; i < m; i++){
          for (int j = 0; j < n; j++){
               fscanf(in,"%d",(*(a+i)+j));
          }
     }
     for (int i = 0; i < m; i++){
          for (int j = 0; j < n; j++){
               arnew[i][j] = shiZhen(i,j,m,n,arr);
          }   
     }
     int (* b)[n] = arnew;
     zhuan(m,r,n,s,b);
     printf("请输入您要存储的文件名:\n");
     scanf("%s",name);
     while ((out = fopen(name,"w+")) == NULL){
          fprintf(stderr,"I could't create the file %s\n",name);
          printf("请再次输入您要存储的文件名:\n");
          scanf("%s",name);
     }

     for (int i = 0; i < m; i++){
          for (int j = 0; j < n; j++){
               printf("%d",arr[i][j]);
          }
          printf("\n");
     }
     printf("\n");
     for (int i = 0; i < m; i++){
          for (int j = 0; j < n; j++){
               printf("%d",arnew[i][j]);
          }
          printf("\n");
     }

     for (int i = 0; i < m; i++){
          for (int j = 0; j < r; j++){
               putchar(sc[i][j]);
               putc(sc[i][j],out);
               //printf("%c",sc[i][j]);
          }
          printf("\n");
          putc('\n',out);
     }
     if (fclose(in) != 0 || fclose(out) != 0){
          fprintf(stderr,"Error in close files\n");
     }
     return 0;
}
int shiZhen(int x, int y, int m,int n, int (* a)[n]){
     int sum = 0,count = 0;//计算总和以及周围数据个数
     int number = *(*(a+x)+y);//获取当前下标下原数组的值
     int flagu = 1,flagd = 1,flagl = 1,flagr = 1;//是否做失真处理
     if (x != 0){//不是最上面一行,就会有上方的值存在
          int up = *(*(a+x-1)+y);//获取数据上方的值
          if (number-up>1||up-number>1){
               flagu = 1;
          }else{
               flagu = 0;
          }
          sum += up; 
          count++;
     }
     if (x<m-1){//不是最后一行,就会有下侧数据存在
          int down = *(*(a+x+1)+y);//获取数据下方的值
          if (number-down>1||down-number>1){
               flagd = 1;
          }else{
               flagd = 0;
          }
          sum += down;
          count++;
     }
     if (y != 0){//不是最左侧一行,就会有左侧数据存在
          int left = *(*(a+x)+y-1);//获取数据左侧的值
          if ((number-left)>1||(left-number)>1){
               flagl = 1;
          }else{
               flagl = 0;
          }
          sum += left;
          count++;
     }
     if (y < n-1){//不是最右侧一行,就会有右侧数据存在
          int right = *(*(a+x)+y+1);//获取数据右侧的值
          if ((number-right)>1||(right-number)>1){
               flagr = 1;
          }else{
               flagr = 0;
          }
          sum += right;
          count++;
     }
     if (flagu && flagd && flagl && flagr){
          return (int)(sum/count);
     }else{
          return number;
     }
}
void zhuan(int m, int r, int n, char (* s)[r],int (* a)[n]){
     for (int i = 0; i < m; i++){
          for (int j = 0; j < r; j++){
               if (j == 30){
                    *(*(s+i)+j) = '\0';
                    continue;
               }
               switch (*(*(a+i)+j))
               {
               case 0:
                    *(*(s+i)+j) = ' ';
                    break;
               case 1:
                    *(*(s+i)+j) = '.';
                    break;
               case 2:
                    *(*(s+i)+j) = '\'';
                    break;
               case 3:
                    *(*(s+i)+j) = ':';
                    break;
               case 4:
                    *(*(s+i)+j) = '~';
                    break;
               case 5:
                    *(*(s+i)+j) = '*';
                    break;
               case 6:
                    *(*(s+i)+j) = '=';
                    break;
               case 7:
                    *(*(s+i)+j) = '@';
                    break;
               case 8:
                    *(*(s+i)+j) = '%';
                    break;
               case 9:
                    *(*(s+i)+j) = '#';
                    break;
               
               default:
                    break;
               }
          }
     }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

结果中分别是处理之前以及处理之后的数据内容,为了明显的看一下效果,所以在控制台打印了一下,其实这部分是没必要展示的,如果有需要的话,可以自行删掉。好,以上就是第十三章的编程练习的全部内容,着实废了一些时间,不过秉着磨刀不误砍柴工的想法,慢慢研究慢慢做,总会有效果的。总之,在那发生之前,要多想。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构篇】~单链表(附源码)

【数据结构篇】~链表 链表前言链表的实现1.头文件2.源文件 链表前言 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1、链式机构在逻辑上是连续的&#xff0c;在物理结构上不一定连续​ 2、结点一般是从…

Java二十三种设计模式-命令模式(18/23)

命令模式&#xff1a;将请求封装为对象的策略 概要 本文全面探讨了命令模式&#xff0c;从基础概念到实现细节&#xff0c;再到使用场景、优缺点分析&#xff0c;以及与其他设计模式的比较&#xff0c;并提供了最佳实践和替代方案&#xff0c;旨在帮助读者深入理解命令模式并…

【xr-frame】微信小程序xr-frame典型案例

微信小程序xr-frame典型案例 在之前的工作中&#xff0c;我大量使用XR-Frame框架进行AR开发&#xff0c;并积累了一些案例和业务代码。其中包括2D图像识别、手部动作识别、Gltf模型加载、动态模型加载、模型动画等内容。小程序部分使用TypeScript编写&#xff0c;而XR-Frame组…

利用puppeteer将html网页生成图片

1.什么是puppeteer&#xff1f; Puppeteer是一个Node库&#xff0c;它提供了一个高级API来通过DevTools协议控制Chromium或Chrome。 可以使用Puppeteer来自动化完成浏览器的操作&#xff0c;官方给出的一些使用场景如下&#xff1a; 生成页面PDF抓取 SPA&#xff08;单页应用…

3.Windows Login Unlocker-忘记电脑密码也可以解决

想要解锁Windows系统的开机密码&#xff0c;但官网的传统方法只适合Windows本地账户&#xff0c;对微软账户或PIN码()束手无策&#xff1f;别担心&#xff0c;小编之前推荐过的「Windows Login Unlocker」软件能为您排忧解难。这款出色的工具不仅能够轻松绕过各种Windows密码&a…

C语言-写一个用矩形法求定积分的通用函数,分别求积分区间为[0,1]sinx,cosx,e的x方的定积分

一、题目要求&#xff1a; 二、思路 ①数学方面:矩形法求定积分的公式 将积分图形划分成为指定数量的矩形&#xff0c;求取各个矩形的面积&#xff0c;然后最终进行累加得到结果 1.积分区间: [num1, num2] 2.分割数量:count 每个矩形的边长:dx(num2-num1)/count 3.被积分…

智慧草莓基地管理系统--论文pf

TOC springboot359智慧草莓基地管理系统--论文pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xf…

泰安鲁菜根普照店重装开业:传承与创新并举 品味舌尖上的泰安

8月17日&#xff0c;泰安鲁菜根普照店重装开业。店内装修以泰山文化为主题&#xff0c;营造出一种浓郁的地方文化特色氛围。这家以泰山文化为底蕴&#xff0c;以大汶河传统民俗食材为基础的餐饮企业&#xff0c;一直致力于发掘和传承泰山周边及汶河两岸的传统特色美食&#xff…

【漫谈C语言和嵌入式009】探索LVDT:线性可变差动变压器的工作原理与应用

引言 在现代工业和工程领域中&#xff0c;精确的位移测量是许多系统正常运行的关键。线性可变差动变压器&#xff08;LVDT, Linear Variable Differential Transformer&#xff09;是一种广泛使用的位移传感器&#xff0c;因其高精度、可靠性和耐用性在各种应用中得到了普遍认可…

iOS(OC)学习第1天-怎么设置UI

xCode 版本为 新建工程 xCode->iOS->App->输入工程名称 项目结构 storyboard文件&#xff1a;可以通过拖动方式添加UI的UI布局文件&#xff0c;理解为Android的XML布局文件 名字说明Main.storyboard首页LaunchScreen.storyboard引导页 添加布局 引导页 设置组件的属…

复现DOM破坏案例

准备工作&#xff1a; 做好代理然后访问靶场 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 第一关 Ma Spaghet! 这是源代码部分&#xff1a; <!-- Challenge --> <h2 id"spaghet"></h2> <script> spaghet.innerHTM…

【推荐100个unity插件之25】使用Vroid进行二次元建模,并在unity中使用VRM模型——URP-UniVrm插件的使用

最终效果 文章目录 最终效果什么是Vriod官网地址下载安装使用导出模型unity使用VRM模型导入URP-UniVrm插件 Blender使用Blender安装Cats Blender Plugin 插件Blender安装VRM-Addon-for-Blender插件导入VRM模型导出为FBX模型 使用别人的VRM模型完结 什么是Vriod 如果你玩过能捏…

经典动作手机游戏:《艾希》安卓手机游戏下载

《艾希手游》是一款以女性为主角的游戏&#xff0c;玩家在游戏中将扮演主角艾希&#xff0c;在各种场景中进行冒险&#xff0c;探索剧情和解开谜题。这款游戏的画面精美&#xff0c;操作简单易上手&#xff0c;同时提供了丰富的剧情和多样的玩法。 下载地址&#xff1a;https:/…

氙灯老化试验箱试验机

氙灯老化试验箱&#xff0c;采用6.5KW大功率的精密水冷式氙灯&#xff0c;曝晒面积达到了6500cm2 功能强大&#xff0c;测试结果可靠 ◆ 满足国内外所有氙灯测试标准要求。 ◆ 采用氙灯灯管及滤光器组件&#xff0c;保证试验数据的可比性和重现性。 ◆ 自动旋转式三层鼓型样板架…

MATLAB根据数值画直方图

一直很纠结MATLAB为什么不提供根据数值&#xff08;或统计值&#xff09;画直方图的函数&#xff0c;只给一个不专业的bar&#xff0c;原来histogram支持。 edges [0-0.5:70.5]; counts [508 821 898 892 552 181 159 85];figure; histogram(BinEdges,edges,BinCounts,count…

SAP Memory ABAP Memory超级详细解析

SAP Memory & ABAP Memory超级详细解析_abap set parameter id-CSDN博客 FREE MEMORY ID ZTESTMAT. 清空指定的ABAPmemory FREE MEMORY. 清空externalsession内的所有ABAPmemory 最后请注意 IMPORT…

【Spring Boot-SpringBoot怎么实现自动配置】

目录 什么是Spring Boot自动配置 自动配置中需要的重要注解 一.Condition 二.Enable 三.EnableAutoConfiguration 实现一个自定义starter 什么是Spring Boot自动配置 SpringBoot的自动配置简单来说就是当spring容器启动后&#xff0c;一些配置类、bean对象就自动存入到了…

Python新手入门指南:从零开始学编程

欢迎来到Python的世界&#xff01;Python是一种功能强大、易于学习且用途广泛的编程语言。无论你是完全没有编程经验的新手&#xff0c;还是想要学习新技能的开发者&#xff0c;Python都是一个非常好的起点。接下来&#xff0c;我们将一起踏上这段编程之旅&#xff0c;从基础语…

机器学习第十一章-特征选择与稀疏学习

11.1子集收集与评价 属性称为"特征" &#xff0c;对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程&#xff0c;称为"特征选择"。 特征选择是一个重要的"…

Linux系统中的弹性计算功能

在当今数字化时代&#xff0c;弹性计算已经成为信息技术领域的重要概念之一。弹性计算指的是根据需要自动调整计算资源&#xff0c;以满足应用程序的需求。这种灵活性和自适应性使得弹性计算成为了云计算、大数据、人工智能等领域的核心技术之一。在这个领域中&#xff0c;Linu…