蓝桥杯试题集试题总汇(C++)
问题描述
编写一个程序,输入两个整数,分别存放在变量x和y当中,然后使用自己定义的函数swap来交换这两个变量的值。
输入格式:输入只有一行,包括两个整数。
输出格式:输出只有一行,也是两个整数,即交换以后的结果。
要求:主函数负责数据的输入与输出,但不能直接交换这两个变量的值,必须通过调用单独定义的函数swap来完成,而swap函数只负责交换变量的值,不能输出交换后的结果。
输入输出样例
样例输入
4 7
样例输出
7 4
分析
使用swap()函数,要注意的是,想要交换a,b的值,其实就是相当于要在函数中改变变量的值,要做到这一点,就需要向形式参数传递实际参数的地址,因为这样把变量的地址复制到函数中的变量里,它们指向的是内存中的同一个地方,在函数中改变这个地方的值,那么外部的变量的值也就会改变。(其实C++本身是有swap函数的,但我们还是要按照题意做一下)
参考代码
#include<iostream>
using namespace std;
void myswap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main(){
int x,y;
cin>>x>>y;
myswap(&x,&y);
cout<<x<<" "<<y;
return 0;
}
备注
常见swap使用分析
swap1只进行了值传递,所以函数调用结束后形参被释放,不能实现实参的值交换;
swap2直接使用全局变量,这样swap2函数和main函数操作的是同一个变量(地址和值都一样),可以实现值交换;
swap3使用传地址的方式,通过修改内存块来实现变量的值交换,是可以的。
swap4使用引用(&)的方式,这样是给mian函数中待交换的变量起一个别名,并把把别名作为形参在swap4中进行处理,这其实就实现了形参和实参的地址和内容完全一样,当然可以实现值交换,swap4的效果和swap2的一样,但这种定义方式更利于程序的调试和维护,同时也可以减小内存开销。
swap5中虽然也把变量的地址传到了函数中,但在函数内部并没用修改地址指向的内存块而是把地址在形参上完成交换,swap5函数运行结束,所有的工作都会都是,而main函数中的变量也没有实现交换,这种情况和swap1类似。
代码如下
#include <iostream>
using namespace std;
void swap1 (int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
int a=3,b=5;
void swap2()
{
int temp;
temp=a;
a=b;
b=temp;
}
void swap3(int *px,int *py)
{
int temp;
temp=*px;
*px=*py;
*py=temp;
}
void swap4(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
void swap5(int *qx,int *qy)
{
itn *q;
q=qx;
qx=qy;
qy=q;
}
int main()
{
int a=3,b=5;
swap4(a,b);
cout<<a<<" "<<b;
return 0;
}