【问题标题】:Arrays in C programmingC语言中的数组
【发布时间】:2021-08-29 05:33:52
【问题描述】:

我正在开发以下二维数组程序来输出图片所示的结果:

我似乎无法获得结果的最小值并将其以数组形式显示。 代码如下:

#include<stdio.h>
#define NUMROWS 2
#define NUMCOLS 3

//accessing elements of 2D array using pointers
int main(void){

    const int table[NUMROWS][NUMCOLS]={{1,2,3},{5,6,7}};
    int minvals[NUMROWS];
    int i, j;
    int *ptr = &table;

    //accessing the elements of 2D array using ptr
    printf("table values:  min value\n");

    for(int i=0;i<NUMROWS;i++){
        for(int j=0;j<NUMCOLS;j++)
            printf("%d ",*((ptr+i*NUMCOLS)+j)); 
        printf("\n");
    }
    
    for(int i=0;i<NUMROWS;i++){
        for(int j=0;j<NUMCOLS;j++)
            printf("%d ",*((ptr+i*NUMCOLS)+j)<minvals[i]); 
    }
    return 0;
}

【问题讨论】:

  • “我似乎无法以数组形式显示结果并将其作为命令行参数执行。” - 那是因为您实际上没有编写任何代码这样做。
  • 这是我需要完成的有问题的代码,不是我自己的代码。
  • 是的,这是需要完成的代码,而不是我们。尝试先解决问题,然后在碰壁时回来,并对自己的代码提出具体问题。如果您已经尝试过 - 请展示它,而不仅仅是问题的大纲。请阅读How do I ask homework questions?
  • 哦,是的,ofc,我的代码给了我编译错误,所以我没有包含它,但我会把它放在这里,谢谢
  • 我的印象是,你一次解决整个问题太难了。因此,我建议您首先尝试编写仅打印第一行的代码(不需要嵌套循环),一旦成功,然后您可以扩展它以打印多行(这需要嵌套循环)。

标签: arrays c minimum


【解决方案1】:

线

int *ptr = &amp;table;

是错误的,因为&amp;tableint (*)[2][3] 类型(即指向整个表的指针),而ptr 是指向单个元素的指针。另外,您的指针不是const,因此不能指向const 数组。

如果您希望 ptr 指向单个 int 值,则应按以下方式声明它:

const int *ptr = &amp;table[0][0];

此外,您正在读取数组minvals 的内容,尽管该数组包含未初始化的数据。这没有意义并导致未定义的行为。

而不是用表达式做复杂的指针运算

*((ptr+i*NUMCOLS)+j))

你可以简单地写下:

table[i][j]

这样,您就不需要指针ptr 并且您的代码更简单。

【讨论】:

  • 非常感谢!
【解决方案2】:

minvals 的存在意味着您需要计算table 的每一“行”的最小值之前 然后继续打印。就目前而言,如果您的程序正确计算了每个数组的最小值,那么您的打印将相当混乱。

无需进行任何棘手的手动指针操作。简单的数组订阅更清晰。

让我们从简单开始,回到基础,看看我们如何在一维数组中找到最小值,因为它是这个问题的核心。

要找到数组中的最小值,我们需要做一些事情:

  • 一个数组
  • 数组的长度
  • 要比较的初始值

数组本身显然是table的每个子数组,在这种情况下长度已知为NUMCOLS。我们的初始值应该是INT_MAX(或找到的另一个适合类型的最大常量&lt;limits.h&gt;),这样数组中的每个元素都等于或小于我们的初始值,或者是数组本身的值。

通常我们在这里选择第二个选项,选择数组中的第一个元素作为我们的初始值,并将其与第二个和后续元素进行比较。

因此,在单个“行”中找到最小值看起来像这样

const int row[NUMCOLS] = { 9, 2, 5 };
int min = row[0];

for (int i = 1; i < NUMCOLS; i++)
    if (row[i] < min)
        min = row[i];

但由于我们想找到并记录table 中每个“行”的最小值,我们将使用嵌套循环。我们将每个值存储在 minvals 数组的关联索引中,而不是之前的 min 变量。

for (i = 0; i < NUMROWS; i++) {
    minvals[i] = table[i][0];

    for (j = 1; j < NUMCOLS; j++)
        if (table[i][j] < minvals[i])
            minvals[i] = table[i][j];
}

当需要打印时,我们将重复我们的嵌套循环。我们的内循环打印table 的每个“行”的每个元素,并且我们通过打印在minvals 中找到的值与我们的“行”的相同索引来结束外循环的每次迭代。

for (i = 0; i < NUMROWS; i++) {
    for (j = 0; j < NUMCOLS; j++)
        printf("%6d", table[i][j]);

    printf(":%6d\n", minvals[i]);
}

这是一个工作示例。

#include <stdio.h>
#define NUMROWS 2
#define NUMCOLS 3

int main(void) {
    const int table[NUMROWS][NUMCOLS] = {
        { 9, 2, 5 },
        { 3, -4, -12 }
    };
    int minvals[NUMROWS];
    int i, j;

    for (i = 0; i < NUMROWS; i++) {
        minvals[i] = table[i][0];

        for (j = 1; j < NUMCOLS; j++)
            if (table[i][j] < minvals[i])
                minvals[i] = table[i][j];
    }

    puts("Table value: minimum values");

    for (i = 0; i < NUMROWS; i++) {
        for (j = 0; j < NUMCOLS; j++)
            printf("%6d", table[i][j]);

        printf(":%6d\n", minvals[i]);
    }
}

对您来说,一个很好的进一步练习是将用于查找最小值的内部循环的逻辑组合到一个更通用的函数中。它的函数签名看起来像

int min(int *array, size_t length);

允许它处理不同大小的数组。那么我们的外层循环就可以这么简单:

for (i = 0; i < NUMROWS; i++)
    minvals[i] = min(table[i], NUMCOLS);

【讨论】:

猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2013-04-15
相关资源
最近更新 更多