【问题标题】:Accessing the rows and columns of a multidimensional array访问多维数组的行和列
【发布时间】:2021-05-13 14:31:35
【问题描述】:

如何访问多维数组的行和列。我想制作一个读取多维数组的行和列的函数。例如,row = 0 输出将是 {7.5, 7.0, 6.3, 0.8, 0.5, 1.2, 2.3, 3.5, 4.3, 5.0, 5.5, 6.7},第 2 列输出将是 {6.3, 6.5, 6.2, 5.8, 5.0}

int main ()
{
    float Rainfall_amounts[5][12] = {
        {7.5, 7.0, 6.3, 0.8, 0.5, 1.2, 2.3, 3.5, 4.3, 5.0, 5.5, 6.7},
        {8.3, 7.2, 6.5, 1.5, 0.5, 1.6, 2.0, 3, 4.38, 4, 5.3, 6.0},
        {7.7, 7.3, 6.2, 0.9, 1.8, 1.3, 2.8, 3.8, 5, 5.5, 5.8, 5.9},
        {7.0, 7.0, 5.8, 0.8, 1.1, 1.8, 3.4, 4.0, 5.0, 5.2, 5.8, 6.7},
        {8.2, 6.1, 5.0, 1.2, 0.5, 2.3, 4.5, 3.5, 4.0, 5.0, 5.5, 6.7}
    return 0;
}

【问题讨论】:

  • 没有 for 循环。为什么??您可以通过编写同一行代码 12 次。 printf("%d ", Rainfall_amounts[row][0]); printf("%d ", Rainfall_amounts[row][1]); printf("%d ", Rainfall_amounts[row][2]); 等。但这将是糟糕的代码。还是您的意思是使用不同的循环类型,例如while
  • 我是 C 新手,所以我想我会删除没有 for 循环的最后一部分。如果使用循环就可以了。
  • 你知道如何使用循环来迭代一维数组吗?
  • 我真的不知道。
  • 那么您需要阅读教科书或教程。这是任何这些资源中教授的基本 C 语言。我们可以用勺子喂你一个答案,但学习如何有效学习对你自己的长期前景更有益。

标签: arrays c function multidimensional-array iteration


【解决方案1】:

由于已初始化,Rainfall_amounts[5][12]中的[5]可以省略; [] 编译器会弄清楚的。如果您想在不更改常数的情况下增加更多年,这是一个很好的做法。稍后,可以使用静态sizeof 以编程方式确定字节大小。 cdecl may be helpful 了解如何使用 sizeof 计算各个元素的大小。

此代码使用不鼓励使用函数或结构的用例;一个人只想打印一次。还有许多其他同样有效的考虑因素。

#include <stdio.h>

int main(void) {
    const float rainfall_amounts[][3] = {
        {7.5, 7.0, 6.3},
        {8.3, 7.2, 6.5}
    };
    const size_t years = sizeof rainfall_amounts / sizeof *rainfall_amounts,
        months = sizeof *rainfall_amounts / sizeof **rainfall_amounts;
    size_t i;

    /* Row 1. */
    for(i = 0; i < months; i++) {
        printf("%s%.1f", i ? ", " : "", rainfall_amounts[1][i]);
    }
    printf(".\n");

    /* Column 1. */
    for(i = 0; i < years; i++) {
        printf("%s%.1f", i ? ", " : "", rainfall_amounts[i][1]);
    }
    printf(".\n");

    return 0;
}

fprintf 手册页说“.#”是“出现在基数字符之后的位数”。 "%s" 在除第一个之外的每个前插入一个 ","。

【讨论】:

    【解决方案2】:

    下面显示了如何编码的示例。

    请注意,有许多不同(和更好)的方法,如何做到这一点。无论如何,它是有效的,它应该给你一个关于你能做什么的想法。

    评论(个人喜好):

    • 我会考虑将矩阵存储为 C 中的向量,例如 向量包括第一列 0,然后是第 1 列,然后是 第 2 列,...(在下面 m=5 和 n=12 的情况下,这意味着向量 [60])。
    • 然后,您只需通过vector[row+m*column]访问[row, column]-entry。
    • 接下来,我会考虑将向量(将保存矩阵)定义为指针,并动态分配其大小(使用 malloc)。
    #include <stdio.h>
    
    void print_row_or_col(int m, int n, float matrix[m][n], int row, int col, int choose){
       int i;
       if(choose==0) // print row   
       {
          if(!(row<m) || row==-1) return; // return if row exceeds size
          for(i=0;i<n;i++) printf("%.1f ",matrix[row][i]);  
       }
       if(choose==1) // print column
       {
          if(!(col<n) || col==-1) return; // return if col exceeds size
          for(i=0;i<m;i++) printf("%.1f ",matrix[i][col]);     
       }
       printf("\n");
    }
    
    int main ()
    {
        float Rainfall_amounts[5][12] = {
            {7.5, 7.0, 6.3, 0.8, 0.5, 1.2, 2.3, 3.5, 4.3, 5.0, 5.5, 6.7},
            {8.3, 7.2, 6.5, 1.5, 0.5, 1.6, 2.0, 3, 4.38, 4, 5.3, 6.0},
            {7.7, 7.3, 6.2, 0.9, 1.8, 1.3, 2.8, 3.8, 5, 5.5, 5.8, 5.9},
            {7.0, 7.0, 5.8, 0.8, 1.1, 1.8, 3.4, 4.0, 5.0, 5.2, 5.8, 6.7},
            {8.2, 6.1, 5.0, 1.2, 0.5, 2.3, 4.5, 3.5, 4.0, 5.0, 5.5, 6.7}};
               
        print_row_or_col(5, 12, Rainfall_amounts, 0, -1, 0);
        print_row_or_col(5, 12, Rainfall_amounts, -1, 2, 1);   
        return 0;
    }
    
    Output:
    7.5 7.0 6.3 0.8 0.5 1.2 2.3 3.5 4.3 5.0 5.5 6.7 
    6.3 6.5 6.2 5.8 5.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      相关资源
      最近更新 更多