C 使用函数确定最小值或最大值

C 使用函数确定最小值或最大值,c,function,loops,C,Function,Loops,我想写一个C程序,它接受用户输入,并比较以前的最小值和最大值。我遇到的问题是,值的比较会自动重置,而不是使用以前输入的值作为最小值和最大值。程序将使用文件结束循环来停止程序 以下是我对该计划的尝试: #include <stdio.h> //variables for the functions: double MinMax(double a); //main program int main (){ double num; while (num!=EOF){

我想写一个C程序,它接受用户输入,并比较以前的最小值和最大值。我遇到的问题是,值的比较会自动重置,而不是使用以前输入的值作为最小值和最大值。程序将使用文件结束循环来停止程序

以下是我对该计划的尝试:

#include <stdio.h>
//variables for the functions:
double MinMax(double a);

//main program 

int main (){
    double num;
    while (num!=EOF){
        printf("Enter a real number: ");
        scanf("%lf",&num);
        MinMax(num);
    }
    return 0; 
}

//function 
double MinMax (double a){
    double max=0,min=0; 
    if (a>max){
        max=a;
    }
    else if (a<min){
        min=a;
    }
    else {
    }
    printf("The max is %lf and the min is %lf\n",max,min);
}
#包括
//函数的变量:
双极小极大值(双a);
//主程序
int main(){
双数;
while(num!=EOF){
printf(“输入实数:”);
scanf(“%lf”、&num);
最小最大值(num);
}
返回0;
}
//作用
双最小最大值(双a){
双最大值=0,最小值=0;
如果(a>最大值){
max=a;
}

否则,如果(a您可以通过两种方式修复代码:

  • 使
    min
    max
    变量
    static
    ,或
  • 通过引用传递
    min
    max
第一种方法需要进行以下更改:

static double max=0, min=0; 
第二种方法更复杂,但也更好:
min
max
需要移动到
main
,而
MinMax
的签名需要通过引用获取它们:

double MinMax(double a, double& min, double& max);

它没有保存,因为您在函数的范围内声明了
min
max
。因此,当函数返回时,这些变量将从堆栈中删除。如果您想使用函数,我建议通过如下引用传入min和max:

double MinMax(double a, double &min, double &max) {...}
因此,更新后的值将在函数调用之间保存

#include <stdio.h>
//variables for the functions
void MinMax(double a, double* max, double* min);

//main program
int main() {
    double num = 0;
    double min = 0;
    double max = 0;

    printf("Enter a real number: ");
    scanf("%lf",&num);

    //To exit the loop and avoid undefined behaviour
    while (num != -999) {    
        MinMax(num, &max, &min);
        printf("Enter a real number: ");
        scanf("%lf",&num);
    }

    return 0;
}

void MinMax (double a, double* max, double* min) {
    if (a > *max)
            *max = a;

    if (a < *min)
            *min = a;

    printf("The max is %lf and the min is %lf\n", *max, *min);
}
这将位于MinMax函数之上,但解决问题的最佳方法是使用指针通过引用进行传递。如上所示:

void MinMax(double a, double* min, double* max)
注意:C在原型中使用*而不是&


快乐编码。

每次调用函数时,最大值和最小值都设置为零,并且不能在函数中存储变量。您应该创建一个类,该类中包含这些变量,并创建一个类似于最小值的函数,但每次在该类中调用时,都不会将最小值和最大值重置为零。然后该类可以存储变量信息和每次调用Mimax,它会更新信息。或者正如在答案中所说的,通过引用来传递变量。“我想写一个C程序”——然后你应该标记问题C而不是C++。“我想写一个C++程序”——那么为什么这个代码完全是C?在<代码>(num!= eof)的时候。
首先
num
在第一个循环中是未定义的,可能在下一个循环中也是如此。其次是
scanf
返回
EOF
而不是您输入的
double
值。但即使如此,最好在(scanf(“%lf”,&num)!=1)时检查
有关成功扫描的项目数。很抱歉,我不太了解,但使最小值和最大值为静态值意味着什么?对于第二种方法,它将如何工作,因为我知道函数只能用于一个结果?@EdwinAndrew静态变量在调用之间保留其值。通过引用传递函数可以更改函数您重复了
while(num!=EOF)
gaffe,这也是一种未定义的行为。@WeatherVane您能否建议一种更好的方式,谢谢。正如我上面的评论:
while(scanf(“%lf”,&num)!=1)
或可能的
==1
取决于流逻辑。@twahanz使用此程序不会更改最小值,这与问题相同having@EdwinAndrew我已经运行了代码,它改变了最小值。
void MinMax(double a, double* min, double* max)