2020-09-23

一道C语言的习题分析。

  • 题目(取自CprimerPlus这本书的第13章的编程练习第12t):
  • 12.创建一个文本文件,内含20行,每行30个整数。这些整数都在0~9之间,用空格分开。该文件是用数字表示一张图片,0~9表示逐渐增加的灰度。编写一个程序,把文件中的内容读入一个20×30的int数组中。一种把这些数字转换为图片的粗略方法是:该程序使用数组中的值初始化一个20×31的字符数组,用值0对应空格字符,1对应点字符,以此类推。数字越大表示字符所占的空间越大。例如,用#表示9。每行的最后一个字符(第31个)是空字符,这样该数组包含了20个字符串。最后,程序显示最终的图片(即,打印所有的字符串),并将结果储存在文本文件中。
  • 答案:
#include<stdio.h>
#include<stdlib.h>
#define ROW 20	//定义数组的行数
#define COL 30	//定义数组的列数
int main(void)
{
	int num[ROW][COL];	//建立存储文件中的数字的数组
	char photo[ROW][COL+1];	//建立存储数字对应的字符的字符串数组.
	FILE *fp;	//定义一个文件指针,等会儿利用该指针对文件进行操作
	int i;
	int j;
	if((fp=fopen("try.txt", "r")) == NULL)
	{
		fprintf(stderr, "Couldn't open try.txt");
		exit(EXIT_FAILURE);
	}
	for(i=0; i<ROW; ++i)
	{
		for(j=0; j<COL; j++)
			fscanf(fp,"%d",&num[i][j]);
	}
	for(i=0; i<ROW; ++i)
	{
		for(j=0; j<COL; j++)
		{
			switch(num[i][j])
			{
				case 0:
					photo[i][j] = ' ';
					break;
				case 1:
					photo[i][j] = '.';
					break;
				case 2:
					photo[i][j] = '\'';
					break;
				case 3:
					photo[i][j] = ':';
					break;
				case 4:
					photo[i][j] = '~';
					break;
				case 5:
					photo[i][j] = '*';
					break;
				case 6:
					photo[i][j] = '=';
					break;
				case 8:
					photo[i][j] = '%';
					break;
				case 9:
					photo[i][j] = '#';
					break;
				default:
					photo[i][j] = 'X';
					break;
			}		
		}
		photo[i][j]='\0';
	}
	for(i=0; i<ROW; ++i)
		puts(photo[i]);
	return 0;
}
在这里插入代码片
  • 程序的说明。该程序使用的是命令行输入文件名,本次操作的文件名为try.txt,这个文件中的内容如下:
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

  • 我们就是通过文件指针对文件中的内容进行了读取,读取方式用的是fscanf函数一个数字一个数字的读取,所以用到了两层循环。我们可以这样理解计算机的执行过程。就是假设自己是内存,那么就要输入和输出两种情况。将外界的东西存储到我内存中来就是输入对应的输入函数(比如scanf,fscanf,fgets等),将我内存中的东西输出到外界就对应着输出函数(比如printf,fprintf,fputs等)。那么此处的fscanf函数的功能就是将外界的数字(此处是try.txt文件)输入到内存(此处是num)中来。
  • 根据题目要求还做出了一个字符串数组。这个字符串数组就与num这个整型数组相对应,通过一个双层循环给字符串数组赋值。由于不同的数组对应的不同的字符,所以我们采用的是switch函数进行赋值。最后进行的是使用一个单层循环对字符串数组的输出。进行的结果如下:
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值