C Primer Plus 第6版 编程练习 chapter 13

文章目录

  • 1. 第1题
    • 1.1 题目描述
    • 1.2 编程源码
    • 1.3 结果显示
  • 2. 第2题
    • 2.1 题目描述
    • 2.2 编程源码
    • 2.3 结果显示
  • 3. 第3题
    • 3.1 题目描述
    • 3.2 编程源码
    • 3.3 结果显示
  • 4. 第4题
    • 4.1 题目描述
    • 4.2 编程源码
    • 4.3 结果显示
  • 5. 第5题
    • 5.1 题目描述
    • 5.2 编程源码
    • 5.3 结果显示
  • 6. 第6题
    • 6.1 题目描述
    • 6.2 编程源码
    • 6.3 结果显示
  • 7. 第7题
    • 7.1 题目描述
    • 7.2 a 答案
      • 7.2.1 源码
      • 7.2.3 结果显示
    • 7.3 b答案
      • 7.3.1 源码
      • 7.3.2 结果显示
  • 8. 第8题
    • 8.1 题目描述
    • 8.2 编程源码
    • 8.3 结果显示
  • 9. 第9题
    • 9.1 题目描述
    • 9.2 编程源码
    • 9.3 结果显示
  • 10. 第10题
    • 10.1 题目描述
    • 10.2 编程源码
    • 10.3 结果显示
  • 11. 第11题
    • 11.1 题目描述
    • 11.2 编程源码
    • 11.3 结果显示
  • 12. 第12题
    • 12.1 题目描述
    • 12.2 编程源码
    • 12.3 结果显示
  • 13. 第13题
    • 13.1 题目描述
    • 13.2 编程源码
    • 13.3 结果显示
  • 14. 第14题
    • 14.1 题目描述
    • 14.2 编程源码
    • 14.3 结果显示

1. 第1题

1.1 题目描述

修改程序清单中13.1中的程序,要求提示用户输入文件名,并读取用户输入的信息,不使用命令行参数。

1.2 编程源码

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

int main(int argc, char* argv[]){
	int ch;
	char name[40];
	FILE *fp;
	unsigned long count = 0;
	
	printf("请输入文件名:");
	scanf("%s", name);
	
	if((fp=fopen(name,"r"))==NULL){
		printf("Can`t open %s \n", argv[1]);
		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;
}

1.3 结果显示

文档内容:

abc 123 ref 345
dog is running 
cat is running 

结果显示


2. 第2题

2.1 题目描述

编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文件名。尽量使用标准I/O和二进制模式。

2.2 编程源码

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

int main(int argc, char* argv[]){
	if(argc<3){
		printf("请按照程序 输入文件名 输出文件名 格式进行输入\n");
		exit(EXIT_FAILURE);
	}
	
	FILE *in,*out;
	
	if((in=fopen(argv[1],"r")) == NULL){
		printf("%s 打开失败!\n", argv[1]);
		exit(EXIT_FAILURE);
	}
	
	if((out=fopen(argv[2],"w"))==NULL){
		printf("%s 打开失败!\n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	char ch;
	
	while((ch = getc(in)) && ch != EOF)
		putc(ch,out);
	
	fclose(in);
	fclose(out);
	
	return 0;
}

2.3 结果显示

原始文档:

#include<iostream>

int main(void){
	const int i;
	
	return 0;
}

结果显示
拷贝后文档:

#include<iostream>

int main(void){
	const int i;
	
	return 0;
}

3. 第3题

3.1 题目描述

编写一个文件拷贝程序,提示用户输入文本文件名,并以该文件名作为原始文件名和输出文件名。该程序要使用ctype.h中的toupper函数,在写入到输出文件时把所有文本转换成大写。使用标准I/O和文本模式

3.2 编程源码

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

int main(int argc, char* argv[]){
	char name[40];
	char name2[40];
	printf("请输入文件名:");
	scanf("%s", name);
	printf("请输出文件名:");
	scanf("%s", name2);		
	
	FILE *in,*out;	
	if((in=fopen(name,"r")) == NULL){
		printf("%s 打开失败!\n", name);
		exit(EXIT_FAILURE);
	}	
	
	if((out=fopen(name2,"w"))==NULL){
		printf("%s 打开失败!\n", name2);
		exit(EXIT_FAILURE);
	}
	
	char ch;
	
	while((ch = getc(in)) && ch != EOF)
		putc(ch,out);
	
	fclose(in);
	fclose(out);
	
	return 0;
}

3.3 结果显示

test.c

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

int main(int argc, char* argv[]){
	char name[40];
	char name2[40];
	printf("请输入文件名:");
	scanf("%s", name);
	printf("请输出文件名:");
	scanf("%s", name2);		
	
	FILE *in,*out;	
	if((in=fopen(name,"r")) == NULL){
		printf("%s 打开失败!\n", name);
		exit(EXIT_FAILURE);
	}	
	
	if((out=fopen(name2,"w"))==NULL){
		printf("%s 打开失败!\n", name2);
		exit(EXIT_FAILURE);
	}
	
	char ch;
	
	while((ch = getc(in)) && ch != EOF)
		putc(ch,out);
	
	fclose(in);
	fclose(out);
	
	return 0;
}

结果显示

a.txt

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

int main(int argc, char* argv[]){
	char name[40];
	char name2[40];
	printf("请输入文件名:");
	scanf("%s", name);
	printf("请输出文件名:");
	scanf("%s", name2);		
	
	FILE *in,*out;	
	if((in=fopen(name,"r")) == NULL){
		printf("%s 打开失败!\n", name);
		exit(EXIT_FAILURE);
	}	
	
	if((out=fopen(name2,"w"))==NULL){
		printf("%s 打开失败!\n", name2);
		exit(EXIT_FAILURE);
	}
	
	char ch;
	
	while((ch = getc(in)) && ch != EOF)
		putc(ch,out);
	
	fclose(in);
	fclose(out);
	
	return 0;
}

4. 第4题

4.1 题目描述

编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件。使用argc控制循环。

4.2 编程源码

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

int main(int argc, char* argv[]){
	for(int i=1;i<argc;++i){
		puts(argv[i]);
	}
	
	return 0;
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

修改程序清单13.5中的程序,用命令行界面代替交互式界面。

5.2 编程源码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 4096
#define SLEN 81
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) *find = '\0';
		else{
			while(getchar()!='\n')continue;
		}
	}
	return ret_val;
}

int main(int argc, char* argv[]){
	if(argc<3){
		printf("缺少文件,请按照格式输入\n");
		exit(EXIT_FAILURE);
	}	
	
	FILE *fa, *fs;
	int files = 0;
	char file_app[SLEN];
	char file_src[SLEN];
	int ch;
	
	if((fa=fopen(argv[1], "a+"))==NULL){
		fprintf(stderr, "Can`t open %s \n", file_app);
		exit(EXIT_FAILURE);
	}
	
	if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0){
		fputs("Can`t create output buffer\n", stderr);
		exit(EXIT_FAILURE);
	}
	
	for(int i=2;i<argc;++i){
		if(strcmp(argv[i], file_app) == 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){
				fputs("Can`t create input buffer\n", stderr);
				continue;
			}
			append(fs, fa);
			if(ferror(fs)!=0) fprintf(stderr, "Error in reading files %s\n", argv[i]);
			if(ferror(fa)!= 0)fprintf(stderr, "Error in reading files %s\n", file_app);
			fclose(fs);
			++files;
			printf("File %s appended.\n", argv[i]);
		}
	}
	
	printf("Done append. %d files appended.\n", files);
	rewind(fa);
	printf("%s contents: \n", file_app);
	while((ch=getc(fa))!=EOF) putchar(ch);
	puts("Done displaying.");
	fclose(fa);
	
	return 0;	
}

5.3 结果显示

a.txt
abc 123 ref 345
dog is running
cat is running

t.cpp
#include

int main(void){
const int i;

return 0;

}

test.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 4096
#define SLEN 81
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) *find = '\0';
		else{
			while(getchar()!='\n')continue;
		}
	}
	return ret_val;
}

int main(int argc, char* argv[]){
	if(argc<3){
		printf("缺少文件,请按照格式输入\n");
		exit(EXIT_FAILURE);
	}	
	
	FILE *fa, *fs;
	int files = 0;
	char file_app[SLEN];
	char file_src[SLEN];
	int ch;
	
	if((fa=fopen(argv[1], "a+"))==NULL){
		fprintf(stderr, "Can`t open %s \n", file_app);
		exit(EXIT_FAILURE);
	}
	
	if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0){
		fputs("Can`t create output buffer\n", stderr);
		exit(EXIT_FAILURE);
	}
	
	for(int i=2;i<=argc;++i){
		if(strcmp(argv[i], file_app) == 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){
				fputs("Can`t create input buffer\n", stderr);
				continue;
			}
			append(fs, fa);
			if(ferror(fs)!=0) fprintf(stderr, "Error in reading files %s\n", argv[i]);
			if(ferror(fa)!= 0)fprintf(stderr, "Error in reading files %s\n", file_app);
			fclose(fs);
			++files;
			printf("File %s appended.\n", argv[i]);
		}
	}
	
	printf("Done append. %d files appended.\n", files);
	rewind(fa);
	printf("%s contents: \n", file_app);
	while((ch=getc(fa))!=EOF) putchar(ch);
	puts("Done displaying.");
	fclose(fa);
	
	return 0;	
}#include<iostream>

int main(void){
	const int i;
	
	return 0;
}#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 4096
#define SLEN 81
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) *find = '\0';
		else{
			while(getchar()!='\n')continue;
		}
	}
	return ret_val;
}

int main(int argc, char* argv[]){
	if(argc<3){
		printf("缺少文件,请按照格式输入\n");
		exit(EXIT_FAILURE);
	}	
	
	FILE *fa, *fs;
	int files = 0;
	char file_app[SLEN];
	char file_src[SLEN];
	int ch;
	
	if((fa=fopen(argv[1], "a+"))==NULL){
		fprintf(stderr, "Can`t open %s \n", file_app);
		exit(EXIT_FAILURE);
	}
	
	if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0){
		fputs("Can`t create output buffer\n", stderr);
		exit(EXIT_FAILURE);
	}
	
	for(int i=2;i<argc;++i){
		if(strcmp(argv[i], file_app) == 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){
				fputs("Can`t create input buffer\n", stderr);
				continue;
			}
			append(fs, fa);
			if(ferror(fs)!=0) fprintf(stderr, "Error in reading files %s\n", argv[i]);
			if(ferror(fa)!= 0)fprintf(stderr, "Error in reading files %s\n", file_app);
			fclose(fs);
			++files;
			printf("File %s appended.\n", argv[i]);
		}
	}
	
	printf("Done append. %d files appended.\n", files);
	rewind(fa);
	printf("%s contents: \n", file_app);
	while((ch=getc(fa))!=EOF) putchar(ch);
	puts("Done displaying.");
	fclose(fa);
	
	return 0;	
}

结果显示


6. 第6题

6.1 题目描述

使用命令行参数的程序依赖于用户的内存如何正确地使用它们。重写程序清单13.2中的程序,不适用命令行参数,而是提示用户输入所需信息。

6.2 编程源码

#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;
	
	if(argc < 2){
		fprintf(stderr, "Usage: %s filename\n", argv[0]);
		exit(EXIT_FAILURE);
	}
	
	if((in = fopen(argv[1], "r")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", argv[1]);
		exit(EXIT_FAILURE);
	}
	
	strncpy(name, argv[1], LEN-5);
	strcat(name, ".red");
	if((out=fopen(name, "w")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", argv[1]);
		exit(EXIT_FAILURE);
	}
	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;
}

6.3 结果显示

a.txt

dog is running on the grass.

结果显示
a.txt.red

dog is running on the grass.

7. 第7题

7.1 题目描述

编写一个程序打开两个文件。可以使用命令行参数或提示用户输入文件名。
a. 该程序以这样的顺序打印:打印第1个文件第1行,第2个文件第1行,第1个文件的第2行,第2个文件的第2行,以此类推,打印到行数较多文件的最后一行。
b. 修改该程序,把行号相同的行打印成1行。

7.2 a 答案

7.2.1 源码

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

int main(int argc, char*argv[]){
	if(argc<3){
		printf("Usage: %s 文件名", argv[0]);
		exit(EXIT_FAILURE);
	}
	
	FILE *in_1, *in_2;
	
	if((in_1 = fopen(argv[1], "r")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", argv[1]);
		exit(EXIT_FAILURE);
	}
	
	if((in_2 = fopen(argv[2], "r")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	int ch1=1,ch2=1;
	while(ch1 != EOF && ch2 != EOF){
		while(((ch1 = getc(in_1))!= '\n') && (ch1 != EOF)) putchar(ch1);
		if(ch1 == EOF) {
			putchar('\n');
			break;
		}
		if(ch1 == '\n'){
			putchar(ch1);
			while(((ch2 = getc(in_2))!= '\n') && (ch2 != EOF)) putchar(ch2);
			if(ch2 == EOF){
				putchar('\n');
				break;
			} 
			if(ch2 == '\n') {
				putchar(ch2);
				continue;			
			}
		}
	}
	
	if(ch1 != EOF){
		while((ch1 = getc(in_1))!= EOF) putchar(ch1);
	}
	
	if(ch2 != EOF){
		while((ch1 = getc(in_2))!= EOF) putchar(ch2);
	}
	
	return 0;
}

7.2.3 结果显示

t.txt文档内容

abc 123 ref 345
dog is running 
cat is running
cat is running

a.txt文档内容

dog is running on the grass.
aaaa
bbbb

结果显示

7.3 b答案

7.3.1 源码

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

int main(int argc, char*argv[]){
	if(argc<3){
		printf("Usage: %s 文件名", argv[0]);
		exit(EXIT_FAILURE);
	}
	
	FILE *in_1, *in_2;
	
	if((in_1 = fopen(argv[1], "r")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", argv[1]);
		exit(EXIT_FAILURE);
	}
	
	if((in_2 = fopen(argv[2], "r")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	int ch1=1,ch2=1;
	while(ch1 != EOF && ch2 != EOF){
		while(((ch1 = getc(in_1))!= '\n') && (ch1 != EOF)) putchar(ch1);
		if(ch1 == EOF) {
			putchar('\n');
			break;
		}
		if(ch1 == '\n'){
			//putchar(ch1);
			while(((ch2 = getc(in_2))!= '\n') && (ch2 != EOF)) putchar(ch2);
			if(ch2 == EOF){
				putchar('\n');
				break;
			} 
		}
		printf("\n");
	}
	
	if(ch1 != EOF){
		while((ch1 = getc(in_1))!= EOF) putchar(ch1);
	}
	
	if(ch2 != EOF){
		while((ch1 = getc(in_2))!= EOF) putchar(ch2);
	}
	
	return 0;
}

7.3.2 结果显示

abc 123 ref 345
dog is running 
cat is running
cat is running

a.txt文档内容

dog is running on the grass.
aaaa
bbbb

结果显示


8. 第8题

8.1 题目描述

编写一个程序,以一个字符和任意文件名作为命令行参数。如果字符后面没有参数,该程序读取标准输入,否则,程序依次打开每个文件并报告每个文件中该字符出现的次数。文件名和字符本身也要一同报告。程序应包含错误检查,以确定参数数量是否正确或是否能够打开文件。如果无法打开文件。程序应报告这一情况,然后继续处理下一个文件。

8.2 编程源码

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

int count_char_num(char *n,char c){
	FILE *in;
	if((in = fopen(n, "r")) == NULL){
		fprintf(stderr, "I can`t open the file %s \n", n);
		exit(EXIT_FAILURE);
	}
	
	char t;
	int num=0;
	while((t=getc(in))!=EOF){
		if(t == c) ++num;
	}
	return num;
}

int main(int argc, char*argv[]){
	char name[LEN];
	
	if(argc<2) printf("参数不够,请重新输入命令。");
	else if(argc<3){
		printf("请输入文件名:");
		while(scanf("%s", name) == 1){
			printf("%s 文件中有 %d 个%c字符\n", name, count_char_num(name, argv[1][0]), argv[1][0]);
			while(getchar()!='\n');
		}		
	}else{
		for(int i=2;i<argc;++i)printf("%s 文件中有 %d 个%c字符\n", argv[i], count_char_num(argv[i], argv[1][0]), argv[1][0]);
	}
	
	return 0;
}

8.3 结果显示

a.txt内容

dog is running on the grass.
aaaa
bbbb

t.txt内容

abc 123 ref 345
dog is running 
cat is running
cat is running

运行结果


9. 第9题

9.1 题目描述

修改程序清单13.3中的程序,从1开始,根据加入列表的顺序为每个单词编号。当程序下次运行时,确保新的单词编号接着上次的编号开始。

9.2 编程源码

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

int main(int argc, char* argv[]){
	FILE *in,*out;	
	if((in=fopen(argv[1],"r")) == NULL){
		printf("%s 打开失败!\n", argv[1]);
		exit(EXIT_FAILURE);
	}	
	
	if((out=fopen(argv[2],"a+"))==NULL){
		printf("%s 打开失败!\n", argv[2]);
		exit(EXIT_FAILURE);
	}
	char w[40];
	int num=0;
	
	fseek(out,-(long)sizeof(int), SEEK_END);
	if(fscanf(out,"%d",&num)!=1) num=0;
	printf("%d\n",num);
	fseek(out,0L, SEEK_END);
	
	while(fscanf(in,"%s",w) == 1){
		printf("%s\n",w);
		fprintf(out,"%s - %d\n",w,++num);
	}
	fclose(in);
	fclose(out);
	
	return 0;
}

9.3 结果显示

a.txt内容

dog is running on the grass.
aaaa
bbbb

运行两次后的t.txt内容


dog - 1
is - 2
running - 3
on - 4
the - 5
grass. - 6
aaaa - 7
bbbb - 8
dog - 9
is - 10
running - 11
on - 12
the - 13
grass. - 14
aaaa - 15
bbbb - 16

10. 第10题

10.1 题目描述

编写一个程序打开一个文本文件,通过交互方式获得文件名。通过一个循环,提示用户输入一个文件位置。然后该程序打印从该位置开始到下一个换行符之间的内容。用户输入负数或非数值字符可以结束输入循环。

10.2 编程源码

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

int main(int argc, char* argv[]){
	char name[40];
	printf("请输入您要处理的文件名:");
	scanf("%s", name);
	
	FILE *in;	
	if((in=fopen(name,"r")) == NULL){
		printf("%s 打开失败!\n", name);
		exit(EXIT_FAILURE);
	}
	long loc=0;
	char c;
	printf("请输入您要处理的位置:");
	while((scanf("%ld", &loc) == 1) && (loc >=0)){
		fseek(in, loc, SEEK_SET);
		while((c=getc(in))!=EOF && c!='\n') putchar(c);
	}
	
	fclose(in);
	
	return 0;
}

10.3 结果显示

a.txt内容

dog is running on the grass.
aaaa
bbbb

结果显示


11. 第11题

11.1 题目描述

编写一个程序,接受两个命令行参数。第一个参数是一个字符串,第2个参数是一个文件名。然后该程序查找该文件,打印文件中包含该字符串的所有行。因为该任务是面向行而不是面向字符的,所以要使用fgets而不是getc。使用标准c库函数strstr在每一行中查找指定字符串。假设文件中的所有行都不超过255个字符。

11.2 编程源码

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

int main(int argc, char* argv[]){
	if(argc<3){
		printf("输入格式错误!");
		exit(EXIT_FAILURE);
	}
	
	FILE *in;	
	if((in=fopen(argv[2],"r")) == NULL){
		printf("%s 打开失败!\n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	char str[256];
	
	while(fgets(str,255,in) != NULL){
		if(strstr(str,argv[1])!= NULL){
			puts(str);
		}
	}
	
	fclose(in);
	
	return 0;
}

11.3 结果显示

a.txt内容

dog is running on the grass.
aaaa
bbbb

结果显示


12. 第12题

12.1 题目描述

创建一个文本文件,内含20行,每行30个整数。这些整数都在0~9之间,用空格分开。该文件是用数字表示一张图片,0 ~ 9表示逐渐增加的灰度。编写一个程序,把文件中的内容读入一个2030的int数组中。一种把这些数字转换为图片的粗略方法是:该程序使用数组中的值初始化一个2031的字符数组,用值0对应空格字符,1对应点字符,以此类推。数字越大表示字符所占的空间越大。例如,用#表示9.每行的最后一个字符(第31个)是空字符,这样该数组包含了20个字符串。最后,程序显示最终的图片(即,打印所有的字符串),并将结果储存在文本文件中。例如,下面是开始的数据:

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 1 9 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

根据以上描述选择特定的输出字符,最终输出如下:
输出结果

12.2 编程源码

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

int main(int argc, char* argv[]){
	char file[] = "t.txt";
	
	FILE *in;	
	if((in=fopen(file,"r")) == NULL){
		printf("%s 打开失败!\n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	int num[20][30]={0};
	int r=0;
	int c=0;
	char ch;
	while((ch=getc(in))!=EOF){
		if(isdigit(ch))num[r][c++] = ch-'0';
		if(ch=='\n'){
			++r;
			c=0;
		}
	}	
	
	char label[]={' ', '.', ',', ':', '~', '*', '=', '+', '%', '#'};
	for(int i=0;i<20;++i){
		for(int j=0;j<30;++j){
			putchar(label[num[i][j]]);
		}
		putchar('\n');
	}
	fclose(in);
	
	return 0;
}

12.3 结果显示

结果显示


13. 第13题

13.1 题目描述

使用变长数组代替标准数组,完成编程练习12.

13.2 编程源码

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

int main(int argc, char* argv[]){
	char file[] = "t.txt";
	
	FILE *in;	
	if((in=fopen(file,"r")) == NULL){
		printf("%s 打开失败!\n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	int row = 20;
	int col = 30;
	
	int num[row][col];
	int r=0;
	int c=0;
	char ch;
	while((ch=getc(in))!=EOF){
		if(isdigit(ch))num[r][c++] = ch-'0';
		if(ch=='\n'){
			++r;
			c=0;
		}
	}	
	
	char label[]={' ', '.', ',', ':', '~', '*', '=', '+', '%', '#'};
	for(int i=0;i<20;++i){
		for(int j=0;j<30;++j){
			putchar(label[num[i][j]]);
		}
		putchar('\n');
	}
	fclose(in);
	
	return 0;
}

13.3 结果显示

结果显示


14. 第14题

14.1 题目描述

数字图像,尤其是从宇宙飞船发回的数字图像,可能会包含一些失真。为编程练习12添加消除失真的函数。该函数把每个值与它上下左右相邻的值作比较,如果该值与其他周围相邻值的差都大于1,则用所有相邻值的平均值(四舍五入)代替该值。注意,与边界上的点相邻的点少于4个,所以做特殊处理。

14.2 编程源码

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

int main(int argc, char* argv[]){
	char file[] = "t.txt";
	
	FILE *in;	
	if((in=fopen(file,"r")) == NULL){
		printf("%s 打开失败!\n", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	int row = 20;
	int col = 30;
	
	int num[row][col];
	int r=0;
	int c=0;
	char ch;
	while((ch=getc(in))!=EOF){
		if(isdigit(ch))num[r][c++] = ch-'0';
		if(ch=='\n'){
			++r;
			c=0;
		}
	}	
	
	for(int i=1;i<29;++i){
		if(abs(num[0][i-1]-num[0][i])>1 && abs(num[0][i+1]-num[0][i])>1 && abs(num[1][i]-num[0][i])>1)
			num[0][i] = (num[0][i-1]+num[0][i+1]+num[1][i])/3;
	}
	
	for(int i=1;i<29;++i){
		if(abs(num[19][i-1]-num[19][i])>1 && abs(num[19][i+1]-num[19][i])>1 && abs(num[18][i]-num[19][i])>1)
			num[19][i] = (num[19][i-1]+num[19][i+1]+num[18][i])/3;
	}	
	
	for(int i=1;i<19;++i){
		if(abs(num[i-1][0]-num[i][0])>1 && abs(num[i+1][0]-num[i][0])>1 && abs(num[i][1]-num[i][0])>1)
			num[i][0] = (num[i-1][0]+num[i+1][0]+num[i][1])/3;
	}
	for(int i=1;i<19;++i){
		if(abs(num[i-1][29]-num[i][29])>1 && abs(num[i+1][29]-num[i][29])>1 && abs(num[i][28]-num[i][29])>1)
			num[i][29] = (num[i-1][29]+num[i+1][29]+num[i][28])/3;
	}	
	
	for(int i=1;i<19;++i){
		for(int j=1;j<29;++j){
			if(abs(num[i-1][j]-num[i][j])>1 && abs(num[i+1][j]-num[i][j])>1 && abs(num[i][j-1]-num[i][j])>1 && abs(num[i][j+1]-num[i][j])>1)
			num[i][j] = (num[i-1][j]+num[i+1][j]+num[i][j-1]+num[i][j+1])/4;
		}
	}
	for(int i=0;i<20;++i){
		for(int j=0;j<30;++j){
			printf("%d",num[i][j]);
		}
		putchar('\n');
	}
	
	char label[]={' ', '.', ',', ':', '~', '*', '=', '+', '%', '#'};
	for(int i=0;i<20;++i){
		for(int j=0;j<30;++j){
			putchar(label[num[i][j]]);
		}
		putchar('\n');
	}
	fclose(in);
	
	return 0;
}

14.3 结果显示

结果显示


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​水经微图Web1.5.0版即将上线

让每一个人都有自己的地图&#xff01; 最近我们上线了水经微图&#xff08;简称“微图”&#xff09;Web1.4.0版&#xff0c;现在1.5.0版也即将上线&#xff0c;接下来的1.6.0版研发计划也已经确定好。 这里就来分享一下已上线的版本&#xff0c;即将上线的版本&#xff0c;…

virtualbox Ubuntu 网络连接

一、网络连接需求1—— 上网&#xff1a; 虚拟机默认的NAT连接方式&#xff0c;几乎不需要怎么配置&#xff0c;即可实现上网。 enp0s17以太网必须要开启&#xff0c;才能上网&#xff1b; 但是主机ping不通虚拟机&#xff0c;貌似可以ping 127.0.0.1; 二、主机和虚拟机相互p…

8年经验之谈!一文看懂性能测试的流程!

每天做着点点点测试有没有危机感&#xff1f; 突然有一天&#xff0c;领导说&#xff1a;“小王&#xff0c;今天把996福报系统压一下&#xff0c;下班前把压测报告发我邮箱。” 啥&#xff1f;压测&#xff1f;今天&#xff1f;报告&#xff1f;怎么压&#xff1f;怎么写&am…

java多线程面试集合(1)

1.并行和并发的区别 操作系统角度&#xff0c;线程是最小的执行单位 并行同一时刻两个线程都在执行&#xff0c;这就要求要有两个cpu。并发就是 同一时刻&#xff0c;只有一个执行但是在一个时间段内&#xff0c;两个线程都执行了&#xff0c;并发依赖于CPU切换线程&#xff…

20240112-【UNITY 学习】实现第一人称移动教程

1、创建一个空物体&#xff0c;挂载Rigidbody组件&#xff0c;并设置相应参数 2、在上述空物体下创建一个胶囊体&#xff0c;两个空物体&#xff0c;一个用来控制朝向&#xff0c;另一个用来控制摄像机 3、给摄像机创建一个父物体&#xff0c;并挂载脚本MoveCamera_01.cs using…

YOLOv8改进 更换层次化视觉变换器的网络结构

一、SwinTransformer论文 论文地址:arxiv.org/pdf/2103.14030.pdf 二、 SwinTransformer网络结构 SwinTransformer是一种基于transformer的图像分类网络结构。SwinTransformer是由微软亚洲研究院提出的,其特点是具有高效的计算和参数效率。 SwinTransformer的网络结构主要…

java每日一题——打印100以内个位和十位相同,尾数为1,3,5,7的数字

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;打印100以内个位和十位相同&#xff0c;尾数为1,3,5,7的数字 思路&#xff1a;1&#xff0c;个位通过对10求余数可求出1&#xff0c;3&#xff0c;5&#xff0c;7&#xff1b; 2&#xff0c;十位可通过先除10…

主流浏览器设置代理IP之Firefox浏览器

给浏览器设置代理IP是目前代理IP的主流使用场景之一&#xff0c;接下来小编就手把手教你如何对Firefox浏览器进行代理IP设置 注&#xff1a;本次使用IP来源于携趣代理平台https://www.xiequ.cn/index.html?4c51b56bhttps://www.xiequ.cn/index.html?4c51b56bFirefox浏览器内…

Java多线程并发篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、阻塞状态(BLOCKED)二、线程死亡(DEAD)三、终止线程 4 种方式前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

ERROR in Plugin “react“ was conflicted .... 天坑留念-turborepo、eslint plugin

前两天项目代码拉下来&#xff0c;装完依赖启动的时候直接报错&#xff1a; [eslint] Plugin "react" was conflicted between ".eslintrc.js eslint-config-custom eslint-config-alloy/react" and "BaseConfig D:\pan\erp\test\business-servic…

矿泉水除硝酸盐的关键技术

在全球工业化和城市化的加速推进下&#xff0c;饮用水安全问题已经成为公众关注的焦点。在众多的水质污染物中&#xff0c;硝酸盐因其对健康的潜在危害而备受关注。为了确保饮用水的安全&#xff0c;去除水中的硝酸盐至关重要。本文将重点介绍离子交换树脂工艺在饮用水硝酸盐去…

学习C指针

指针基本介绍 计算机中的每个内存都有地址 整型分配4字节&#xff0c;字符分配1字节 &#xff0c;浮点数分配4字节 指针是一个变量&#xff0c;它存放着另外一个变量的地址 int a; int *p; p &a;// a 5; printf(p) //get a address print &a //get a address …

黑马苍穹外卖学习Day5

文章目录 Redis学习Redis简介准备工作Redis常用数据类型介绍各数据类型的特点Redis常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用操作命令 在Java中操作Redis导入Spring Data Redis坐标配置Redis数据源编写配置类&#xff0c;创建RedisTemp…

Golang基础入门及Gin入门教程(2024完整版)

Golang是Google公司2009年11月正式对外公开的一门编程语言&#xff0c;它不仅拥有静态编译语言的安全和高性能&#xff0c;而 且又达到了动态语言开发速度和易维护性。有人形容Go语言&#xff1a;Go C Python , 说明Go语言既有C语言程序的运行速度&#xff0c;又能达到Python…

【贪心】一手顺子

/** 贪心&#xff1a;将一个数当成一个组中最小的数&#xff0c;在根据该最小数找其它数。* 思路&#xff1a;将hand进行分组&#xff0c;假设hand长度为 n&#xff0c;必须n % groupSize 0才可以分组&#xff0c;否则返回false&#xff0c;* 使用哈希表记录每个数出现…

ffmpeg命令增加headers参数解决http请求ts返回404 not found问题的解决方法:-headers、-an

最近项目上遇到一个问题&#xff0c;用ffmpeg请求录制一个m3u8的实时流成为mp4文件的时候&#xff0c;命令返回404错误&#xff1a; 但是有一个很奇怪的现象&#xff0c;就是ffmpeg请求不到的&#xff0c;VLC却能正常播放&#xff0c;对比一下抓包&#xff1a; 那么既然就差别…

用机器学习方法来预测设备故障

最近做了一个项目&#xff0c;根据设备的状态&#xff0c;来判断设备是否有故障&#xff0c;这里总结一下所用到的数据探索&#xff0c;特征工程以及机器学习模型等方法。考虑到项目数据的敏感性&#xff0c;这里我以网上找到的一个公开数据集UCI Machine Learning Repository作…

基于STM32的温室大棚环境检测及自动浇灌系统设计

需要全部资料请私信我&#xff01; 基于STM32的温室大棚环境检测及自动浇灌系统设计 一、绪论1.1 研究背景及意义1.2 研究内容1.3 功能设计 二、系统方案设计2.1 总体方案设计 三、系统硬件设计3.1 STM32单片机最小系统3.2 环境温度检测电路设计3.3 土壤湿度检测电路设计3.4 光…

FineBI实战项目一(23):订单商品分类词云图分析开发

点击新建组件&#xff0c;创建订单商品分类词云图组件。 选择词云&#xff0c;拖拽catName到颜色和文本&#xff0c;拖拽cat到大小。 将组件拖拽到仪表板。 结果如下&#xff1a;

企业微信forMAC,如何左右翻动预览图片

1、control commandshifd 进入企业微信的debug调试模式 2、按照如下步骤选择 3、重启企业微信