鱼C论坛

 找回密码
 立即注册
查看: 930|回复: 4

[已解决]S1E24第一题

[复制链接]
发表于 2020-10-1 15:07:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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')”这段话
最佳答案
2020-10-1 15:45:09
// 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 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
QQ图片20201001150136.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-1 15:45:09 | 显示全部楼层    本楼为最佳答案   
// 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 15:47:36 | 显示全部楼层
这是 S1E24 所有题目的答案,在比较难懂之处,我都有注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 15:48:49 | 显示全部楼层
意思是二维数组各个元素的地址也是连续的,所以 ++p 指向 e 后面的 F
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 16:08:25 | 显示全部楼层
写成二维数组,那是给程序员看了,对于机器,它是按顺序存贮的,或者说是一维数组的线性扩展

数组的存贮.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表