版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pfl_327/article/details/81516635
**输出型参数的设计理解**
在设计算法时,输入型参数的设计是十分简单的,那么输出型参数如何让解决呢?下面通过一个实例进行说明。
1. 例如设计一个交换两个整数的算法,编写相应的swap1(x,y)如下:
void swap1(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;`
}
在该函数中确实发现了两个形参x和y的值交换,但调用该算法(也就是执行语句swap1(a,b))时发现a和b实参值并不会发生交换。出现错误的原因是这里的形参x,y既是输入型参数,也是输出型参数,而swap1(x,y)中仅仅将形参x,y作为输入型参数设计。
2.采用指针的方式来回传形参的值,将上述函数改为如下:
void swap2(int *x,int *y)
{
int temp;
temp=*x; /*将x所指的值放在temp中*/
*x=*y; /*将x所指的值改为y所指的值*/
*y=temp; /*将y所指的值改为temp*/
}
这样调用该函数的方式改为swap1(&a,&b),其中,&a,&b分别是实参a,b的地址,显然这个算法比较复杂,可读性差。
3.采用引用型形参,也就是将输出型形参设计为引用类型形参。
①.在C++语言中提供了一种引用运算符“&”。当建立引用时,程序用另一个已定义的变量(目标变量)的名字初始化它,从那时起,引用变量作为目标变量的别名使用,对引用变量的改动实际是对目标变量的改动。
例如:
int a=4; /*定义整形变量a*/
int &b=a; /*定义整形变量a的引用变量b*/
变量b是变量a的引用变量,b也等于4,之后这两个变量同步改变。
②.引用常用于函数参数中,当采用引用形参时,在函数调用是会将形参的改变回传给实参。利用引用运算符将swap1()改为如下:
void swap(int &a,int &b) /*形参前的“&”符号不是指针运算符,而是引用*/
{
int temp;
temp=x;
x=y;
y=temp;
}
当执行语句swap(a,b)时,形,实参的匹配相当于:
int &x=a; /*x为a的引用*/
int &y=b; /*y为b的引用*/
这样a与x共享存储空间,b与y共享存储空间,因此执行函数后a与b的值发生了交换。
③.为了加深对引用型形参的理解特写此例:
输入一元二次方程的三个系数a,b,c输出跟的个数,以及根的值。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int solution(double a,double b,double c,double &x3,double &x4); /*声明函数*/
int solution(double a,double b,double c,double &x3,double &x4)
{
double d;
d=b*b-4*a*c; /*数学公式*/
if(d>0)
{
x3=(-b+sqrt(d))/(2*a);
x4=(-b-sqrt(d))/(2*a); /*数学公式*/
return 2; /*两个实根*/
}
else if(d==0)
{
x3=-b/(2*a);
return 1; /*一个实根*/
}
else
return 0; /*一个实根也没有,返回零即可*/
}
int main()
{
double x1,x2;
double a,b;
int e;
double c;
printf("请输入一元二次方程的三个系数:\n");
while(scanf("%lf%lf%lf",&a,&b,&c)&&EOF!=0) /*循环输入*/
{
e=solution(a,b,c,x1,x2);
printf("此方程有%d个根\n",e);
if(e==2)
printf("x1=%.5lf , x2=%.5lf\n",x1,x2);
else if(e==1)
printf("x1=%.5lf\n",x1);
}
return 0;
}