gzq44 发表于 2020-10-1 15:07:22

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')”这段话

风过无痕1989 发表于 2020-10-1 15:45:09

// 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 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

风过无痕1989 发表于 2020-10-1 15:47:36

这是 S1E24 所有题目的答案,在比较难懂之处,我都有注释

灰白 发表于 2020-10-1 15:48:49

意思是二维数组各个元素的地址也是连续的,所以 ++p 指向 e 后面的 F

风过无痕1989 发表于 2020-10-1 16:08:25

写成二维数组,那是给程序员看了,对于机器,它是按顺序存贮的,或者说是一维数组的线性扩展

页: [1]
查看完整版本: S1E24第一题