如果程序使用传值调用的方式是否可以,为什么?
程序可以写出,但是对此处传值调用不太理解
根据题目的要求,应该是不可以改为传值调用的,理由如下:
首先,看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);
}
}
运行结果: