三个整数排序

描述

给定三个整数,请将它们按从小到大的顺序输出。

输入

输入为一行,包含三个整数,用空格分隔。

输出

输出为一行,包含三个整数,用空格分隔,表示排序后的结果。

输入样例 1 

9 3 7

输出样例 1

3 7 9

代码一(如下):最普通的方法

#include <iostream>
using namespace std;
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	int t;
	if (a > b)
	{
		t = a;
		a = b;
		b = t;
	}
	if (a > c)
	{
		t = a;
		a = c;
		c = t;
	}
	if (b > c)
	{
		t = b;
		b = c;
		c = t;
	}
	cout << a << " " << b << " " << c;
	return 0;
}

代码二(如下):指针法

#include <iostream>
using namespace std;
void exchange(int*, int*);
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	int* p1 = &a, * p2 = &b, * p3 = &c;
	if (a > b)exchange(p1, p2);
	if (a > c)exchange(p1, p3);
	if (b > c)exchange(p2, p3);
	cout << a << " " << b << " " << c;
	return 0;
}
void exchange(int* a, int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

代码三(如下):返回值有两个

#include <iostream>
#include <utility>
using namespace std;
pair<int, int>exchange(int a,int b)
{
	int t = a;
	a = b;
	b = t;
	pair<int, int>result;
	result = make_pair(a, b);
	return result;
}
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	if (a > b)
	{
		pair<int, int>result = exchange(a, b);
		a = result.first;
		b = result.second;
	}
	if (a > c)
	{
		pair<int, int>result = exchange(a, c);
		a = result.first;
		c = result.second;
	}
	if (b > c)
	{
		pair<int, int>result = exchange(b, c);
		b = result.first;
		c = result.second;
	}
	cout << a << " " << b << " " << c;
	return 0;
}

代码四(如下):引用法

#include <iostream>
using namespace std;
void exchange(int&, int&);
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	if (a > b)exchange(a, b);   //实参为整型变量
	if (a > c)exchange(a, c);
	if (b > c)exchange(b, c);
	cout << a << " " << b << " " << c;
	return 0;
}
void exchange(int& x, int& y)    //形参是“引用”
{
	int t = x;
	x = y;
	y = t;
}

问题点:

①:引用

对一个数据可以建立一个“引用”,它的作用是为一个变量起一个别名。这是C++对C的一个重要扩充。

// 假如有一个变量啊,想给它起一个别名b,可以这样写:

int a;                       //定义a是整型变量

int &b=a;                //声明b是a的“引用”

// 以上声明了b是a的引用,即b是a的别名。经过这样的声明后,使用a或b的作用相同,都代表同一变量。如果a的值是20,则b的值也是20。

 &是引用声明符,并不代表地址。不得理解为“把a的值赋给b的地址”。在数据类型名后面出现的&是引用声明符,在其他场合出现的都是地址符。

注意:

1)引用不是一种独立的数据类型。对引用只有声明,没有定义。必须先定义一个变量,然后声明对该变量建立一个引用(别名)。

2)声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量。当引用作为函数形参时不必在声明中初始化,它的初始化是在函数调用时的虚实结合实现的,即作为形参的引用是实参的别名。

3)在声明一个引用后,不能再使之作为另一变量的引用。

4)不能建立引用数组。如:

int a[5];

int &b[5]=a;           // 错误,不能建立引用数组

int &b=a[0];           // 错误,不能作为数组元素的别名

5)不能建立引用的引用。也没有引用的指针。

int a=3;

int &b=a;               //声明b是a的别名,正确

int &c=b;               //试图建立引用的引用,错误

int*p=b;                 //不能建立指向引用的指针

6)可以取引用的地址。如已声明b是a的引用,则&b就是变量a的地址&a。

int *pt;

pt=&b;                //把变量a的地址&a赋给指针变量pt

7)区别引用声明符&和地址运算符&。

int &b=a;               //声明b是a的引用

cout<<&b<<endl;             //输出b的地址,此处&b不是引用

在声明了引用后,在使用它时不带&,而只用引用的名字(如b,而不是&b)。

关于引用的性质:如果在程序中声明了b是变量a的引用,实际上在内存中为b开辟了一个指针型的存储单元,在其中存放变量a的地址,输出引用b时,就输出b所指向的变量a值,相当于输出*b。引用其实就是一个指针常量,它的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有引用的功能都可以由指针实现。

C++之所以增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能。

以引用作为形参,实参不是地址而是整型变量名,由于形参是引用,系统会自动将实参的地址传递给形参。注意:此时传送的是实参变量的地址而不是实参变量的值。

将变量名作为实参和形参的函数调用 以及 使用指针变量作形参的函数调用(实参是地址,传递的是地址,故仍然是传值方式,不要误以为是传址方式)都是传值方式;以引用作为形参的函数调用(实参是变量名,而传递的是变量的地址)时传址方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值