戳一戳!和我一起走进信息学的世界
导读
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与区块链技术
长按二维码关注