此题可否用传值调用C++

img


如果程序使用传值调用的方式是否可以,为什么?
程序可以写出,但是对此处传值调用不太理解

根据题目的要求,应该是不可以改为传值调用的,理由如下:

首先,看solveQuadraticEquation函数里的各个参数含义,参数a,b,c代表一元二次方程的三个系数,discriminant代表判别式,r1代表一元二次方程的第一个根,r2代表一元二次方程的第二个根.

然后,看它们的数据类型:
参数a,b,c是doublel类型,它们传值调用,因为不需要在main函数看到它们有没有在solveQuadraticEquation函数中修改了值,所以可以定义为double类型进行传值调用;

而参数discriminant,r1,r2是double类型引用,它们的值在solveQuadraticEquation函数修改后需要在main函数里看到变化,所以它们需要被定义为double类型引用或者double指针也可以。所以如果根据题目的要求,应该是不可以改为传值调用的。

参考链接:
【C语言函数调用详解】——传值调用&传址调用_Y_^O^的博客-CSDN博客_c语言值调用
C 语言笔记 —— 函数参数带 & 和不带 & 的区别_Strange191110的博客-CSDN博客
c++中&的使用_大道一支菜鸟的博客-CSDN博客_&的使用 c++
一元二次方程20道典型例题,附详细解答过程

代码如下,测试例子为第四个参考链接的第16题:

#include <iostream>
#include <cmath>
using namespace std;

//定义函数原型 
void solveQuadraticEquation(double a,double b,double c,double &discriminant,double &r1,double &r2);

int main(void){
    
    double a,b,c,r1,r2,discriminant;
    cin>>a>>b>>c;  //获取一元二次方程三个系数 
    //https://blog.csdn.net/m0_70980326/article/details/126435568
    //https://blog.csdn.net/weixin_45330741/article/details/114176994
    //https://blog.csdn.net/zhong29/article/details/79455488
    solveQuadraticEquation(a,b,c,discriminant,r1,r2);  //调用函数计算判别式的值,及一元二次方程的根 
    
    //打印结果 
    if(discriminant>0){  //16题 
        cout<<r1<<" "<<r2<<endl;  
    }else if(discriminant==0){ //第三题 
        cout<<r1<<endl;
    }else{   //20题 
        cout<<"该方程式没有根"<<endl;
    }
    
    return 0;

} 


void solveQuadraticEquation(double a,double b,double c,double &discriminant,double &r1,double &r2){
    
    discriminant = b*b-4*a*c;   //计算判别式的值 
    if (discriminant==0){ //如果判别式为0,则它有一个根 
        r1=r2=-b/(2*a);  
    }else if(discriminant>0){ //如果判别式大于0,则它有两个根 ,判别式小于0不需要判断,直接在main函数打印提示即可 
        //https://baijiahao.baidu.com/s?id=1722370687157957463&wfr=spider&for=pc 
        r1=(-b+sqrt(discriminant))/(2*a);
        r2=(-b-sqrt(discriminant))/(2*a);
    }
}


运行结果:

img