当前位置: 首页 > news >正文

三个整数排序

描述

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

输入

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

输出

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

输入样例 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++之所以增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能。

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

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

http://www.lryc.cn/news/123297.html

相关文章:

  • Nginx反向代理出现错误 502 bad gateway 案例解析
  • 截止到目前全量主体总数有多少?
  • HTTP--Request详解
  • Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client
  • 如何构建一个 NodeJS 影院微服务并使用 Docker 部署
  • BEVFusion(ICRA-2023)--01
  • Java——Iterator迭代器
  • GCC编译过程:预处理->编译->汇编->链接
  • JVM笔记 —— 出现内存溢出错误时时如何排查
  • 多级嵌套引入组件导致Vue提示子组件未注册问题
  • vue3+element-plus组件下拉列表,数组数据转成树形数据
  • 【kubernetes】调度约束
  • 【深度学习MOT】SMILEtrack SiMIlarity LEarning for Multiple Object Tracking,论文
  • jmeter通过BeanShell对接口参数进行MD5和HmacSHA256加密【杭州多测师_王sir】
  • 基于自适应曲线阈值和非局部稀疏正则化的压缩感知图像复原研究【自适应曲线阈值去除加性稳态白/有色高斯噪声】(Matlab代码实现)
  • Spring AOP 切点表达式
  • 打破传统直播,最新数字化升级3DVR全景直播
  • 网络安全--利用awk分析Apache日志
  • 计算机视觉一 —— 介绍与环境安装
  • 如何看懂统一社会信用代码?
  • 计算机网络 运输层端口号,复用、分用
  • systrace: 系统级跟踪工具的解析
  • 关于青少年学习演讲与口才对未来的领导力的塑造的探析
  • 大数据分析案例-基于KMeans和DBSCAN算法对汽车行业客户进行聚类分群
  • Vue 3 中定义组件常用方法
  • Linux | curl命令调用接口时查看调用时长和详情
  • 用ngrok实现内网穿透,一行命令就搞定!
  • C++ 混合Python编程 及 Visual Studio配置
  • 斐波拉契数列+二进制--夏令营
  • 【使用Hilbert变换在噪声信号中进行自动活动检测】基于Hilbert变换和平滑技术进行自动信号分割和活动检测研究(Matlab代码实现)