为什么我的最小值和最大值为 0?
Why am I getting a value of 0 for my min and max?
#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;
}
至少。
同样使用上述方法将 min
和 max
初始化为 0
可能不适用于任何类型的输入。
确保检测输入初始化的所有可能性
min = FLT_MAX;
和
max = -FLT_MAX;
如果 smallest/largest 可能的值出于任何原因未知,请更改检测 min
和 max
的方式:
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
:
- 全球
- 本地到
processing()
,隐藏 1.
删除第 2nd 个定义。
代码未形成原型 floor()
。这就是编译器假定它为 return 和 int
的原因。这可能会调用未定义的行为。
要解决此问题,请添加
#include <math.h>
另外^3 在 processing()
中读出 local_buffer
代码使用了错误的索引。索引从 0
开始,而不是 1
。所以它总是读出生成器未设置的最后一个值。 min
的 0
终于来了。
更正此问题会使 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;
}
}
...
最后的笔记:
- 听听你的编译器,认真对待它的警告。
- 您可能想考虑学习如何使用调试器,以便下次能够自己解决此类问题。
#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;
}
至少。
同样使用上述方法将 min
和 max
初始化为 0
可能不适用于任何类型的输入。
确保检测输入初始化的所有可能性
min = FLT_MAX;
和
max = -FLT_MAX;
如果 smallest/largest 可能的值出于任何原因未知,请更改检测 min
和 max
的方式:
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
:
- 全球
- 本地到
processing()
,隐藏 1.
删除第 2nd 个定义。
代码未形成原型 floor()
。这就是编译器假定它为 return 和 int
的原因。这可能会调用未定义的行为。
要解决此问题,请添加
#include <math.h>
另外^3 在 processing()
中读出 local_buffer
代码使用了错误的索引。索引从 0
开始,而不是 1
。所以它总是读出生成器未设置的最后一个值。 min
的 0
终于来了。
更正此问题会使 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;
}
}
...
最后的笔记:
- 听听你的编译器,认真对待它的警告。
- 您可能想考虑学习如何使用调试器,以便下次能够自己解决此类问题。