S1E24第一题
#include <stdio.h>int main()
{
char matrix = {
'I', 'l', 'o', 'v', 'e',
'F', 'i', 's', 'h', 'C',
'.', 'c', 'o', 'm', '!'
};
char *p;
p = &matrix;
printf("%c", *p);
printf("%c", *p++);
printf("%c", *++p);
printf("\n");
return 0;
}
不是很懂“由于二维数组实质上是一维数组的线性扩展,所以 ++p 指向的是第二行第一个元素('F')”这段话 // 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 int matrix = {0};,请问 matrix 和 matrix + 0 的含义一样吗?
#if(0)
#include <stdio.h>
int main()
{
char matrix = {
'I', 'l', 'o', 'v', 'e',
'F', 'i', 's', 'h', 'C',
'.', 'c', 'o', 'm', '!'
};
char *p;
p = &matrix;
printf("%c", *p); // 输出0行3列的值,即字符 v
printf("%c", *p++);// 输出0行3列的值之后,指针加1,此时指针指向了0行4列的字符,即字母 e
printf("%c", *++p);// 先使指针加1,指针便指向了1行1列的字符,输出1行1列的值,即字母F
printf("\n");
return 0;
}
#endif
// 假设有二维数组如下,请问 *(matrix + 1) + 2 的含义是?
#if(0)
#include <stdio.h>
int main()
{
char matrix = {
'I', 'l', 'o', 'v', 'e',
'F', 'i', 's', 'h', 'C',
'.', 'c', 'o', 'm', '!'
};
printf("%c\n",*matrix); // 字符数组的首地址,即 &matrix
printf("%c\n",*(matrix + 1)); // 第二行第一个元素的地址&matrix
printf("%c\n",*(matrix + 1) + 2); // *(matrix + 1) + 2 的含义是一个指向字符变量的指针,其值是
// 二维数组 matrix 第二行第三个元素的地址(即 &matrix)
printf("%c\n",*(*(matrix + 1) + 2));// 这才是第二行第三个元素的值,输出 s
}
#endif
// 请问下边代码将打印什么值?
#if(0)
#include <stdio.h>
int main()
{
char array = {
{
{'a', 'b', 'x', 'x', 'x'}, // 原题a、b位置都是x
{'x', 'x', 'o', 'x', 'x'},
{'x', 'x', 'x', 'x', 'x'}
},
{
{'x', 'x', 'x', 'x', 'x'},
{'x', 'x', 'w', 'x', 'x'}, // 原题 w 位置是o
{'x', 'x', 'x', 'x', 'x'}
}
};
// 下面语句分别输出array、array、array、array 的值,即 owab
printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1));// **array 是一个指向指针数据的指针变量,相当于*(*p)
return 0;
}
#endif
// 如果不上机,你能看出下边代码将打印什么值吗?
#if(0)
#include <stdio.h>
int main()
{
int array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p) = (int (*))&array;// int(*)是指向int这个数组类型的指针的类型,
// int(*p)是这种类型的一个名称为p的对象
// 所以,array 前面的 & 是可有可无的
printf("%d\n",p); // a 的值为 *(*(p + 2) + 2)
return 0;
}
#endif
// 编写一个程序,接收用户的输入,并将前 9 个字符以正方形矩阵(3 * 3)的方式输出。
#if(0)
#include <stdio.h>
int main()
{
int matrix = {0}; // 定义一个三维数组并初始化
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
matrix = getchar();// 接收用户从键盘输入
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%c ", matrix);// 输出 3 x 3 矩阵
}
printf("\n");
}
return 0;
}
#endif
#if(0)
#include <stdio.h>
int main()
{
int array = {{0, 1, 2, 3, 4},{ 5, 6, 7, 8, 9}};
int (*p) = array ; // 定义一个一维的指针变量,并将数组的首地址赋给它
printf("%d\n",*(*(p+1)+2));// 输出第1行第2列的值 7
printf("%d\n",array);
return 0;
}
#endif
//不限制正方形矩阵的尺寸,要求程序自动计算用户输入的字符,并以最大的正方形矩阵输出(比如用户输入 17 个字符,输出 4 * 4 矩阵)
#if(0)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 1024
int main()
{
int length, aver;
int i, j;
char str;
scanf("%s", str);
length = strlen(str);
aver = sqrt(length); // 从double 型转换到 int 型,会有数据丢失的告警
for (i = 0; i < aver; i++)
{
for (j = 0; j < aver; j++)
{
printf("%c ", str);
}
printf("\n");
}
return 0;
}
#endif
// 编写一个程序,用户输入待查询年月份(输入格式:2015-03),输出该月份的 PM2.5 值
#if(0)
#include <stdio.h>
int main()
{
float pm25 = {
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
{59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
{34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
}; // 将const double类型的值直接赋予float类型变量,引发18个告警
int year, month;
printf("请输入待查询年月分(年-月): ");
scanf("%d-%d", &year, &month);
if (year < 2014 || year > 2016 || month < 1 || month > 12)
{
printf("输入数据错误!\n");
}
else
{
year -= 2014;
month -= 1;
if (pm25)
{
printf("%d年%d月广州的PM2.5值是: %.2f\n", year + 2014, month + 1, pm25);
}
else
{
printf("抱歉,该月份未收录数据!\n");
}
}
return 0;
}
#endif
// 将上面所有记录的数据打印为横向直方图
#if(1)
#include <stdio.h>
int main()
{
float pm25 = {
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
{59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
{34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
}; // 将const double类型的值直接赋予float类型变量,引发18个告警
int i, j, step;
float min, max, data;
// 找出最大值和最小值
min = max = pm25;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 12; j++)
{
if (pm25)
{
min = min > pm25 ? pm25 : min;
max = max < pm25 ? pm25 : max;
}
}
}
// 计算步进值
if ((int)(max - min) > 80)
{
step = 2;
}
else
{
step = 1;
}
printf("最小值: %.2f, 最大值: %.2f\n", min, max);
// 打印直方图
for (i = 0; i < 3; i++)
{
for (j = 0; j < 12; j++)
{
data = pm25;
if (data)
{
printf("%d年%2d月: ", i + 2014, j + 1);
while (data >= min)
{
printf("*");
data -= step;
}
printf("\n");
}
}
}
return 0;
}
#endif 这是 S1E24 所有题目的答案,在比较难懂之处,我都有注释 意思是二维数组各个元素的地址也是连续的,所以 ++p 指向 e 后面的 F 写成二维数组,那是给程序员看了,对于机器,它是按顺序存贮的,或者说是一维数组的线性扩展
页:
[1]