0
点赞
收藏
分享

微信扫一扫

C++强化 | 05 那些必须掌握的一维数组经典应用

秀儿2020 2022-10-19 阅读 114


C++强化 | 05 那些必须掌握的一维数组经典应用_数据

戳一戳!和我一起走进信息学的世界

导读

C++是大多数学生入门信息学、参加信息学竞赛必备的编程语言。掌握C++,能够有助于孩子未来工作发展,也能提升孩子的综合能力,如抗挫折能力、逻辑分析能力等。


1 说在前面的话

继续前行、不断攻坚克难!


前面两节课,我们讲了数组的基本概念,讲了数组中要注意的数组越界问题。想必通过这两节课程的学习,我们对数组有了更加深刻的认识。


这节课我们要通过几个案例,来让我们对数组有更加全面的了解,能够知道,数组都能应用到哪些领域。


从前面的一节课开始,我们对数学的要求就会越来越高啦,同时也会越来越促进大家对于数学的学习。

2 数组找最值

之前我们讲过用if判断寻找最值,那时候我们只需要找三个数中的最值,还是比较简单,如果比较多,应该怎么做呢?

1 引入

三个数据找最值,我们已经熟练掌握了,我们以找最小值为例:


一种方法是,如果一个数据比另外两个数据都小,则这个数据就是最小值:


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


 一种方法是,我们定义一个变量min,让min为第一个数据,然后和后两个数据比较,如果有数据比min更小,那么我们就将min赋值为那个数据:


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


第一种方法,每个数据都要和其他的两个数据进行一次比较,三个数据的话,就比较了3×2=6次,效率比较低。


第二种方法,我们只需要两次比较即可找到最小值,所以我们一般都使用第二种方式来找最值。



2 思路分析

如果我们的数据不只有三个该怎么办呢?:


按照一般做法,我们可以定义多个变量,有多少个数据,就可以定义多少个变量。


然后我们需要定义一个min来存放最小值,并赋值为第一个:


  int a1,a2,a3,a4,a5,a6,min;
cin>>a1>>a2>>a3>>a4>>a5>>a6;
min = a1;


然后我们让a2到a6依次和min进行比较:


if(min>a2) min = a2;
if(min>a3) min = a3;
if(min>a4) min = a4;
if(min>a5) min = a5;
if(min>a6) min = a6;
cout<<min<<endl;


全部代码如下:


#include<iostream>
using namespace std;
int main(){
int a1,a2,a3,a4,a5,a6,min;
cin>>a1>>a2>>a3>>a4>>a5>>a6;
min = a1;
if(min>a2) min = a2;
if(min>a3) min = a3;
if(min>a4) min = a4;
if(min>a5) min = a5;
if(min>a6) min = a6;
cout<<min<<endl;
return 0;
}


3 数组找最值

我们通过上面的示例发现,变量可以用数组来存储,找最值的过程,可以利用循环来实现:


#include<iostream>
using namespace std;
int main(){
int a[10],min;
for(int i = 0;i<10;i++)
cin>>a[i];
min = a[0];
for(int i = 1;i<10;i++)
if(min>a[i]) min = a[i];
cout<<min<<endl;
return 0;
}


这样的话,我们不管对多少个数据求最值,都可以用上面的代码,只不过需要把数组长度该换一下即可。


如果我们找最大值就可以这么写:


#include<iostream>
using namespace std;
int main(){
int a[10],max;
for(int i = 0;i<10;i++)
cin>>a[i];
max = a[0];
for(int i = 1;i<10;i++)
if(max<a[i]) max = a[i];
cout<<max<<endl;
return 0;
}


3 数组元素交换位置

在后面,我们需要交换数组元素的位置,来实现更多更丰富的操作,所以在这里,我们来讲一下如何交换数组中的两个元素。

1 思路分析

在之前,我们讲了如何交换两个变量中存储的数据:


第一种方式,我们需要应用一个额外的空间,来帮助我们交换:


#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int t; //用来辅助交换
t = a;
a = b;
b = t;
cout<<a<<b<<endl;
return 0;
}


第二种方式,我们要求不能定义额外的空间:


#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b; // a = 3 ,b = 4
a = a + b; // a = a + b = 3 + 4
b = a - b; // b = a - b = 3 + 4 - 4 = 3
a = a - b; // a = a - b = 3 + 4 - 3 = 4
cout<<a<<b<<endl;
return 0;
}


第一种方法虽然需要一个额外的空间,但是只需要赋值,不需要运算。当需要交换的数据多的时候,都可以使用这一个额外的空间,当数据很多时,多用一个额外空间可以忽略,所以我们一般使用第一个。但是第二个很重要,我们必须也要掌握。

数组元素交换位置,也是使用这两种方法,只不过是把两个变量变为数组的两个元素即可。


2 数组元素交换位置

对于数组元素来说,我们可以使用如下方式交换:


假设我们有一个长度为10的数组,然后我们要交换索引为5和6的两个数据,交换方式如下:


#include<iostream>
using namespace std;
int main(){
int a[10],t;
for(int i = 0;i<10;i++)
cin>>a[i];

t = a[5];
a[5] = a[6];
a[6] = t;

return 0;
}


4 数组逆序

我们有一个数组了,如果我们想把数组逆序怎么办呢?


逆序主要有两种,一个是逆序输出,一个是逆序存储,让我们来分别看一下吧!

1 逆序输出

我们需要将数组逆序输出,顺序输出是从前往后,逆序输出自然就是从后往前。


所以最简单的逆序输出就是,我们输出数组元素的时候,从数组索引最大,访问到数组索引最小,即为逆序输出:


#include<iostream>
using namespace std;
int main(){
int a[10];
for(int i = 0;i<10;i++)
cin>>a[i];
for(int i = 9;i>=0;i--) {
cout<<a[i]<<endl;
}
return 0;
}


或者可以用如下方式:


#include<iostream>
using namespace std;
int main(){
int a[10];
for(int i = 0;i<10;i++)
cin>>a[i];

for(int i = 0;i<10;i++) {
cout<<a[9-i]<<endl;
}
return 0;
}


2 逆序存储

逆序输出只是将其输出顺序为逆序,但是我们存储还是顺序存储的,那我们应该如何实现逆序的存储呢?


如果我们只有123三个数据,我们想存为321,我们发现只需要将1和3交换位置即可。


我们举一反三,我们将一个数组逆序,就要将第一个和最后一个交换位置,将第二个和倒数第二个交换位置……


也就是说,我们要针对前一半的数据,和与之对应的后一半数据进行交换即可:


#include<iostream>
using namespace std;
int main(){
int a[10],t;
for(int i = 0;i<10;i++)
cin>>a[i];
for(int i = 0;i<5;i++) {
t = a[i];
a[i] = a[9-i];
a[9-i] = t;
}
for(int i = 0;i<10;i++) {
cout<<a[9-i]<<endl;
}
return 0;
}


要注意如下几点:




如果数组长度为n,那么我们交换时,到i<n/2结束;如果数组长度为n,a[i]要和a[n-1-i]做交换。




5 数组元素排序

数组元素排序是比较重要的一块知识了,我们以后要经常用到排序算法。让我们在这一节开始,入门讲解一下排序算法吧!


当然这也是我们学习信息学接触到的第一个算法,算是大家对算法的初次相识。如果觉得逻辑比较难也不要担心,我们通过不断深入学习,一定能够掌握的!

1 思路分析

数组元素排序的算法有很多,我们在这里讲一种方法,以从小到大排列为例:


我们前面有找最值的方法,利用找最值的方法来进行排序,每次都让当前的最前面的元素与其后面的比较,如果后面的数据比前面的数据小,就和前面的数据交换位置;


写成流程如下:

定义一个数组a[10]用来保存数据,定义一个变量t用做数组元素交换;输入数组的值;然后依次做比较:对于索引为i的数据,要和索引为i+1到9的数据作比较,如果索引为i个数据大,就将两个数据交换;一直重复上述操作(循环),直到遍历完所有的数。


根据上面的流程,我们知道,对于每个位置上的数据,都要和其后的数据作比较,要用循环实现,然后对于所有位置,也要用循环实现。所以我们需要用到循环嵌套。


2 数组元素排序

根据上面的分析,我们可以写代码如下:


#include<iostream>
using namespace std;
int main(){
int a[10],t;
for(int i = 0;i<10;i++)
cin>>a[i];
for(int i = 0;i<9;i++) {
for(int j = i+1;j<10;j++){
if(a[i]>a[j]){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for(int i = 0;i<10;i++) {
cout<<a[i]<<endl;
}
return 0;
}


输入数据如下:

3 2 9 4 6 1 0 8 7 5


输出如下:

0123456789


3 说在后面的话

到这里,一维数组非常经典也非常重要的应用就给大家介绍完啦!希望大家能够掌握这些经典应用,并能够将其应用到我们的后续学习中。


如果想要了解更多关于信息学的知识,那就关注我吧!



AI与区块链技术

C++强化 | 05 那些必须掌握的一维数组经典应用_c++_02

长按二维码关注


举报

相关推荐

0 条评论