华师 PTA 2020程序设计基础实验作业题目集 编程题 #21 AC(初识指针)

第二十一题
3-19难度系数1 交换最小值和最大值 (5分)

题目描述

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。

输入格式

输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

输出格式

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

j3-19难度系数1 交换最小值和最大值 (5分)
其实这题很简单
我在做这题的时候,练习了一下指针的用法

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函数的栈(简化)
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;
}

(简单问题复杂化)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值