第二十一题
3-19难度系数1 交换最小值和最大值 (5分)
题目描述
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
其实这题很简单
我在做这题的时候,练习了一下指针的用法
void exchange(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
正如函数名,这个函数的功能只是实现将a、b的值交换
这个函数调用方法如下
int main() {
int a = 1, b = 2;
cout << "a = " <<a << ", " << "b = " << b << endl;
exchange(&a, &b);
cout << "a = " << a << ", " << "b = " << b << endl;
return 0;
}
输出结果为
a = 1, b = 2
a = 2, b = 1
这里涉及两个运算符
*:间接运算符(解引用运算符)
&:取地址运算符
要明白这两个的运作方式就要了解一下地址,变量名和值
注:这个图并不是真正的mian函数的栈区,这里简化了。16进制的0x0A就是十进制的10。
变量名其实就是地址的 “ 代号 ”
0x00000004的代号是a
0x00000008的代号是b
取地址运算符&
,顾名思义,就是取存这个值的地址
&a = 0x00000004
&b = 0x00000008
间接运算符(解引用运算符)*
就是取一个地址所对应的值
*(0x00000004) = 1
*(0x00000008) = 2
声明变量时int* a
意思是声明一个变量a,让a中存的值是一个地址。
那么再回来看这个函数
void exchange(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
这是exchange函数的栈(简化)
我们逐语句分析
main函数调用时(以此为例)
exchange(&a, &b);
我们将main函数中的a和b的地址传入了exchange函数
在exchange函数中有a(exchange) = &a(main), b(exchange) = &b(main)
定义了一个临时变量tmp
先让tmp = *a(exchange),即tmp的值变为a(exchange)中所存的地址所对应的值,即为tmp(exchange) = a(main)
再让*a(exchange) = *b(exchange),即将b(exchange)中所存的地址所对应的值,赋值给a(exchange)中所存的地址所对应的值,即a(main)=b(main)
最后*b(exchange) = tmp,即将b(exchange)中所存的地址所对应的值变为tmp,即b(main)=tmp(exchange)
这个函数就分析完了
加上输入输出,和简单的最大值查找、最小值查找
#include<iostream>
#include<stdlib.h>
using namespace std;
void exchange(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void print(int *a,int len) {
for(int i = 0 ; i < len ;++i) {
cout << a[i] << " ";
}
cout << endl;
}
int arr[10];
int main(){
int n = 0, min = 0, max = 0;
cin >> n;
for(int i = 0;i < n; ++i) {
cin >> arr[i];
}
// min
min = 0;
for(int i = 0 ; i < n ; ++i) {
if(arr[min] > arr[i]){
min = i;
}
}
exchange(&arr[min],&arr[0]);
// max
max = n - 1;
for(int i = 1 ; i < n ; ++i) {
if(arr[max] < arr[i]){
max = i;
}
}
exchange(&arr[max],&arr[n - 1]);
//print
for(int i = 0 ; i < n ;++i) {
cout << arr[i] << " ";
}
return 0;
}
(简单问题复杂化)