如何使用标准C语言中的指针搜索2d数组以查找列中的最大值和最小值?

问题描述 投票:0回答:1

今天,我在搜索列中的最大值和最小值时遇到问题。我这样做是连续的,但是列却出错了。这是大学的任务,因此我必须使用指针进行操作。所以我写了一个函数:

int column_statistics(const int *ptr, int width, int height, int column_id, int* max, int* min, float *avg){

  //problem generator
      if(ptr==NULL || width<=0 || height<=0 || column_id<0 || max==NULL || min==NULL || avg==NULL || column_id>(--width)){
        return 1;
  }

  int maximal;
  int minimal;
  int sum=0;

  for(int i=0;i<width;i++){
    printf("%d ",*(ptr+column_id*width+i));
    sum+=*(ptr+column_id*width+i);
    if(i==0){
      minimal=*(ptr+column_id*width+i);
      maximal=*(ptr+column_id*width+i);
      continue;
    }

    if(*(ptr+column_id*width+i)<maximal && *(ptr+column_id*width+i)>minimal){
      continue;
    }
    else if(*(ptr+column_id*width+i)>maximal){
      maximal=*(ptr+column_id*width+i);
    }
    else if(*(ptr+column_id*width+i)<minimal){
      minimal=*(ptr+column_id*width+i);
    }
  }

  *max=maximal;
  *min=minimal;
  *avg=(float)sum/(float)height;
  return 0;
}

我认为还可以,但是当我在main中进行测试时:

#include <stdio.h>

int column_statistics(const int *ptr, int width, int height, int column_id, int* max, int* min, float *avg);


int main(void) {


  int input_array[3][5] = {{ 11, 81, -86, -63, 79}, { 94, -9, 11, -22, 72}, { 64, -61, 33, -36, -73}};
  int *ptr = input_array[0];
  int max, min, test;
  float a;


  for(int i=0; i<3; i++){
    printf("%d %d %d %d %d\n", *(ptr+i*5),*((ptr+i*5)+1),*((ptr+i*5)+2),*((ptr+i*5)+3),*((ptr+i*5)+4));
  }
  puts("============================================");
  for(int i=0;i<3;i++){
    column_statistics(ptr, 5, 3, i, &max, &min, &a);
    printf("Column %d: %d %d %.2f | Test: %d\n", ++i, max, min, a, test);
  }


  return 0;
}

出问题了,在输出中我有这样的东西:

(输入的二维数组)11 81 -86 -63 7994 -9 11 -22 7264 -61 33 -36 -73

((函数的实际输出,第一个字符串是该函数中的数字,比从列中获得的最大值和最小值,列的平均值以及从“问题生成器”进行的测试]]

11 81 -86 -63第1列:81 -86 -19.00 |测试:0

79 94 -9 11第2栏:94 -9 58.33 |测试:0

-22 72 64 -61第3列:72 -61 17.67 |测试:0

所以问题是该函数仅加载4个变量而不是5个变量,但我不知道问题是在main还是在column_statistics中。伙计们,如果您发现出了什么问题,请报告。祝您有美好的一天,并感谢您的时间。

c pointers multidimensional-array
1个回答
0
投票

该问题最有可能是由于条件column_id>(--width)--width将修改变量的值。如果为5传递了width,则在--width之后的值为4

这将影响您使用width进行迭代的循环,例如第一个循环:

for(int i=0;i<width;i++){

它也会影响您拥有起诉宽度的所有计算,例如*(ptr+column_id*width+i)

如果要比较column_idwidth - 1,请改用width - 1(例如column_id>(width-1))。

© www.soinside.com 2019 - 2024. All rights reserved.