一道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函数进行赋值。最后进行的是使用一个单层循环对字符串数组的输出。进行的结果如下: