c - 为什么我的最小值和最大值为 0?

标签 c max average min

#include <stdio.h>
#include <stdlib.h>
#include <time.h> /* to initialize your random generator */
#define BUFF_SIZE 10
#define FIVE 5
#define TEN 10
#define ZERO 0
#define ONE 1
float min=0;
float max=0;
float average=0;
float input_buffer[BUFF_SIZE+2] = {0};
float output_buffer[FIVE] = {0};
float local_buffer[TEN];
int no_of_data_pts=0;
int function_id=0;

// a function for generating data size, function ID and
// all data, and putting all of it into input_buffer
void generate_data() {
    /* initialize random seed: */
    srand ( time(NULL) );
    /* Generate a random number: */
    input_buffer[0] = floor(1 + 10*(float)rand()/RAND_MAX);
    input_buffer[1] = floor(1 + 4*(float)rand()/RAND_MAX);
    int i;
    for (i=0; i < (int)input_buffer[0]; i++ ){
        input_buffer[i+2]=(float)rand()/RAND_MAX;
    }
}

// a function for copying the content of input_buffer into
// local buffer (called here my_buffer)
void reading() {
    no_of_data_pts= (int)input_buffer[0];
    function_id= (int)input_buffer[1];
    int i;
    for (i=0; i < no_of_data_pts; i++ ){
        local_buffer[i]=input_buffer[2+i];
    }
}

// a function for processing the content of local buffer;
// it reads function_ID and number of data points from my_buffer
// and saves the results also into my_buffer
void processing() {
    float num=0;
    int i;
    float sum = 0;
    float min=0;

    for (i=0; i<no_of_data_pts; i++){
       num = local_buffer[i+1];
       if (num < min) {
           min=num;
       }
    }

    for (i=0;i<no_of_data_pts;i++){
       num = local_buffer[i+1];
       if (num < max) {
           max=num;
       }
    }

    for (i=0;i<no_of_data_pts;i++) {
       sum = sum + local_buffer[i];
    }
    average = sum/no_of_data_pts;
}

// a function for copying the content of my_buffer to the
// output_buffer (according to the patter explained earlier)
void writing() {
    switch (function_id){

        case 1:
            output_buffer[0]= min;
            printf ("Minimum value is: %f ",output_buffer[0]);
            break;
        case 2:
            output_buffer[0]= max;
            printf ("Maximum value is: %f ",output_buffer[0]);
            break;
        case 3:
            output_buffer[0]= average;
            printf ("Average value is: %f ",output_buffer[0]);
            break;
        case 4:
            output_buffer[0]= min;
            output_buffer[1]= max;
            output_buffer[2]= average;
            printf ("Minimum, maximum and average value is: %f,%f,%f ",output_buffer[0],output_buffer[1],output_buffer[2]);
            break;
    }


}

int main () {
    setvbuf(stdout, NULL, _IONBF, 0); 
    setvbuf(stderr, NULL, _IONBF, 0); 
    generate_data();
    reading();
    processing();
    writing();
    return 0;
}

所以这是一个 C 作业。

所以当我运行这段代码时,它应该生成一些从 0 到 1 的随机数并计算最小值、最大值和平均值。

从输入缓冲区读取数据涉及:

  • 从输入缓冲区的第一个元素读取一个数字,如果它是一个非零数字(而且应该是),程序执行以下两个操作,这个数字代表要读取的数据点的数量(no_of_data_points)
  • 读取处理函数的 ID (function_ID)
  • 读取所有数据点 数据处理函数ID和所有点读入本地缓冲区

数据处理涉及:

  • 根据处理函数的读取 ID 执行特定计算, 可以进行四种不同的处理:
  • 如果 ID 为 1:确定最少数据点
  • 如果 ID 为 2:确定最大数据点
  • 如果 ID 为 3:确定数据点的平均值
  • 如果ID为4:确定数据点的最小值、最大值和平均值 结果应放入本地缓冲区。

将数据写入输出缓冲区涉及:

  • 写入一个数字,指示有多少数据点写入输出中 buffer(包含处理函数的ID,以及得到的结果)
  • 写一个数字,称为处理函数的ID,表示是什么操作 对数据执行(范围从 1 到 4)

  • 写入结果,这取决于它是什么函数:

§ 如果 ID 为 1:写入最小值

§ 如果 ID 为 2:写入最大值

§ 如果 ID 为 3:写入平均值

§ 如果 ID 为 4:写入最小值、最大值和平均值

然后我在程序最后打印结果。

代码运行良好。没有错误,但由于某种原因,我无法弄清楚为什么 min 和 max 的值始终为 0!我的平均值很好,但由于某种原因我的最大值和最小值始终为 0,这是不对的。

最佳答案

对于初学者来说,这个

   if (num < max) {
       max = num;
   }

应该

   if (num > max) {
       max = num;
   }

至少。

<小时/>

此外,使用上述方法将 minmax 初始化为 0 可能不适用于任何类型的输入。

确保检测到输入初始化的所有可能性

min = FLT_MAX;

max = -FLT_MAX;
<小时/>

如果出于任何原因未知最小/最大可能值,请更改检测 minmax 的方式:

void processing() {
  float num=0;
  int i;
  float sum = 0;

  min = local_buffer[1];
  for (i = 1; i < no_of_data_pts; i++){
    num = local_buffer[i + 1];
    if (num < min) {
       min = num;
    }
  }

  max = local_buffer[1];
  for (i = 1; i < no_of_data_pts; i++){
    num = local_buffer[i + 1];
    if (num > max) {
       max = num;
    }
  }

  ...
<小时/>

此外^2代码定义了min两次:

  1. 全局
  2. 本地于 processing(),遮蔽 1。

删除第二个nd定义。

<小时/>

该代码缺少原型(prototype) floor()。这就是为什么编译器假设它返回一个int。这可能会调用未定义的行为。

要修复此问题,请添加

#include <math.h>
<小时/>

此外^3在processing()中读取local_buffer时,代码使用了错误的索引。索引从 0 开始,而不是从 1 开始。因此它总是读出生成器尚未设置的最后一个值。这就是 min0 的来源。

纠正这个问题将使上面的 processing() 代码片段看起来像:

void processing() {
  float num=0;
  int i;
  float sum = 0;

  min = local_buffer[0];
  for (i = 1; i < no_of_data_pts; i++){
    num = local_buffer[i];
    if (num < min) {
       min = num;
    }
  }

  max = local_buffer[0];
  for (i = 1; i < no_of_data_pts; i++){
    num = local_buffer[i];
    if (num > max) {
       max = num;
    }
  }

  ...
<小时/>

最后的注释:

  1. 听取编译器的意见,认真对待其警告。
  2. 您可能需要考虑学习如何使用调试器,以便下次能够自己解决此类问题。

关于c - 为什么我的最小值和最大值为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29093136/

相关文章:

python - 使用 'max' 和 'len' 正确格式化列表的第 10 项

sql-server - 计算列中两天之间的方差

c - 将简单指针作为双指针传递给函数

c - 传递给函数的指针不重新分配

HTTP/1.1 Body 可以包含像 "\r\n"这样的字符串吗?

R cummax函数与NA

c++ - 逗号运算符和乱序执行

mysql - 能否在 MySQL SELECT 语句中的多行中多次返回某列的最大值?

mysql - ORDER BY 帮助 : How to get Average score PER YEAR?

hadoop - 如何为 AVG 函数转换 Pig 字段