【问题标题】:Using functions to determine min or max [closed]使用函数来确定最小值或最大值 [关闭]
【发布时间】:2016-06-13 18:58:16
【问题描述】:

我想编写一个 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);
}

【问题讨论】:

  • 每次调用函数时最大值和最小值都设置为零,并且不能在函数内存储变量。您应该创建一个在其中包含这些变量的类和一个像 MinMax 这样的函数,但每次在该类中调用它时不要将最小值和最大值重置为零。然后该类可以存储变量信息,并且每次调用 minmax 时它都会更新信息。或者如答案中所说,通过引用传递变量。
  • “我想写一个 C 程序”——那么你应该标记问题 C 而不是 C++。
  • “我想写一个C++程序”——那为什么这段代码完全是C?
  • while (num!=EOF) 首先num 在第一个循环中是undefined,并且可能在下一个循环中。其次是 scanf 返回 EOF 而不是您输入的 double 值。但即便如此,最好检查while(scanf("%lf", &amp;num) != 1) 以了解成功扫描的项目数。

标签: c function loops


【解决方案1】:

您可以通过两种方式修复代码:

  • 使minmax变量static,或者
  • 通过引用传递 minmax

第一种方法需要进行以下更改:

static double max=0, min=0; 

第二种方法更复杂,但也更好:minmax需要移动到mainMinMax的签名需要引用他们:

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

【讨论】:

  • 抱歉,我缺乏知识,但将 min 和 max 设为静态是什么意思?而对于第二种方法,它是如何工作的,因为我知道函数只能用于一个结果?
  • @EdwinAndrew 静态变量在调用之间保留它们的值。通过引用传递可以让函数改变事物而不返回它们。
【解决方案2】:
#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);
}

您也可以选择使用:

static double max = 0, min = 0; 

这将在 MinMax 函数之上进行,但解决问题的最佳方法是使用指针通过引用传递。如上所示:

void MinMax(double a, double* min, double* max)

注意:C 在原型中使用 * 而不是 &。

编码愉快。

【讨论】:

  • 您重复了while (num!=EOF) 失态,这也是未定义的行为
  • @WeatherVane 你能推荐一个更好的方法吗,谢谢。
  • 正如我上面的评论:while(scanf("%lf", &amp;num) != 1) 或可能== 1,具体取决于流程逻辑。
  • @twahanz 使用这个程序不会改变最小值,这是我遇到的同样的问题
  • @EdwinAndrew 我已经运行了代码,它改变了最小值。
【解决方案3】:

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

double MinMax(double a, double &min, double &max) {...}

因此,您的更新值会在函数调用之间保存。

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多