|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
int main()
{
char matrix[3][5] = {
'I', 'l', 'o', 'v', 'e',
'F', 'i', 's', 'h', 'C',
'.', 'c', 'o', 'm', '!'
};
char *p;
p = &matrix[0][3];
printf("%c", *p);
printf("%c", *p++);
printf("%c", *++p);
printf("\n");
return 0;
}
不是很懂“由于二维数组实质上是一维数组的线性扩展,所以 ++p 指向的是第二行第一个元素('F')”这段话
- // 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 int matrix[4][5] = {0};,请问 matrix 和 matrix + 0 的含义一样吗?
- #if(0)
- #include <stdio.h>
- int main()
- {
- char matrix[3][5] = {
- 'I', 'l', 'o', 'v', 'e',
- 'F', 'i', 's', 'h', 'C',
- '.', 'c', 'o', 'm', '!'
- };
- char *p;
- p = &matrix[0][3];
- 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[3][5] = {
- 'I', 'l', 'o', 'v', 'e',
- 'F', 'i', 's', 'h', 'C',
- '.', 'c', 'o', 'm', '!'
- };
- printf("%c\n",*matrix); // 字符数组的首地址,即 &matrix[0][0]
- printf("%c\n",*(matrix + 1)); // 第二行第一个元素的地址&matrix[1][0]
- printf("%c\n",*(matrix + 1) + 2); // *(matrix + 1) + 2 的含义是一个指向字符变量的指针,其值是
- // 二维数组 matrix 第二行第三个元素的地址(即 &matrix[1][2])
- printf("%c\n",*(*(matrix + 1) + 2)); // 这才是第二行第三个元素的值,输出 s
- }
- #endif
- // 请问下边代码将打印什么值?
- #if(0)
- #include <stdio.h>
- int main()
- {
- char array[2][3][5] = {
- {
- {'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[0][1][2]、array[1][1][2]、array[0][0][0]、array[0][0][1] 的值,即 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[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- int (*p)[3] = (int (*)[3])&array; // int(*)[3]是指向int[3]这个数组类型的指针的类型,
- // int(*p)[3]是这种类型的一个名称为p的对象
- // 所以,array 前面的 & 是可有可无的
- printf("%d\n",p[2][2]); // a[2][2] 的值为 *(*(p + 2) + 2)
- return 0;
- }
- #endif
- // 编写一个程序,接收用户的输入,并将前 9 个字符以正方形矩阵(3 * 3)的方式输出。
- #if(0)
- #include <stdio.h>
- int main()
- {
- int matrix[3][3] = {0}; // 定义一个三维数组并初始化
- int i, j;
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 3; j++)
- {
- matrix[i][j] = getchar(); // 接收用户从键盘输入
- }
- }
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 3; j++)
- {
- printf("%c ", matrix[i][j]); // 输出 3 x 3 矩阵
- }
- printf("\n");
- }
- return 0;
- }
- #endif
- #if(0)
- #include <stdio.h>
- int main()
- {
- int array[2][5] = {{0, 1, 2, 3, 4},{ 5, 6, 7, 8, 9}};
- int (*p)[5] = array ; // 定义一个一维的指针变量,并将数组的首地址赋给它
- printf("%d\n",*(*(p+1)+2)); // 输出第1行第2列的值 7
- printf("%d\n",array[1][2]);
- 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[MAX];
- 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[i * aver + j]);
- }
- printf("\n");
- }
- return 0;
- }
- #endif
- // 编写一个程序,用户输入待查询年月份(输入格式:2015-03),输出该月份的 PM2.5 值
- #if(0)
- #include <stdio.h>
- int main()
- {
- float pm25[3][12] = {
- {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[year][month])
- {
- printf("%d年%d月广州的PM2.5值是: %.2f\n", year + 2014, month + 1, pm25[year][month]);
- }
- else
- {
- printf("抱歉,该月份未收录数据!\n");
- }
- }
- return 0;
- }
- #endif
- // 将上面所有记录的数据打印为横向直方图
- #if(1)
- #include <stdio.h>
- int main()
- {
- float pm25[3][12] = {
- {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[1][0];
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 12; j++)
- {
- if (pm25[i][j])
- {
- min = min > pm25[i][j] ? pm25[i][j] : min;
- max = max < pm25[i][j] ? pm25[i][j] : 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[i][j];
- if (data)
- {
- printf("%d年%2d月: ", i + 2014, j + 1);
- while (data >= min)
- {
- printf("*");
- data -= step;
- }
- printf("\n");
- }
- }
- }
- return 0;
- }
- #endif
复制代码
|
-
|