今天,我在搜索列中的最大值和最小值时遇到问题。我这样做是连续的,但是列却出错了。这是大学的任务,因此我必须使用指针进行操作。所以我写了一个函数:
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中。伙计们,如果您发现出了什么问题,请报告。祝您有美好的一天,并感谢您的时间。
该问题最有可能是由于条件column_id>(--width)
。 --width
将修改变量的值。如果为5
传递了width
,则在--width
之后的值为4
。
这将影响您使用width
进行迭代的循环,例如第一个循环:
for(int i=0;i<width;i++){
它也会影响您拥有起诉宽度的所有计算,例如*(ptr+column_id*width+i)
。
如果要比较column_id
与width - 1
,请改用width - 1
(例如column_id>(width-1)
)。