输出型参数设计--数据结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}



猜你喜欢

转载自blog.csdn.net/pfl_327/article/details/81516635