小沈的C++学习5——数组
大家好,我又回来了,最近在美国为了回国申请真是忙的不行,一晃一周过去了,发现又是一节cpp课,于是就屁颠屁颠地过来更新了。
画外音:欸?博主,那你岂不是之前两节课的内容水了四篇博文?而且python那边还一篇没更?
啊,没错,我就是为了水博文,那是因为一节的内容比较多,而且有几个知识点,所以就分开讲了,方便大家观看。至于python,啊?python是啥(装傻ing)
哎,好吧,装傻还是不能装的,毕竟今天还是要靠python当引子,不然我这个文盲真的不知道怎么开头
一、定义
python 中有一个函数叫for(和cpp的for用法相似,但功能更加nb)可以实现可迭代对象的迭代,链接可以看这里,比如将一个列表中的所有数据遍历一遍,for 对象 in 可迭代对象的格式。列表的妙就妙在可以批量处理数据,而cpp中也有一个东西有类似的功能,那就是数组。让我们先来看看它的定义:
数组:一批具有同属性的数据集合。
首先,它也是一个集合,有顺序(可以利用标号唯一确定数组中的成员,从0开始),而且和列表一样是可以嵌套的(二维数组),但是它的所有数据都是相同类型的,而且数目确定。
二、定义和引用
定义:一维数组: int d1[2];
二维数组:double d2[3];
三维数组:int d3[2][3][4];
......
其中int和double为数组中数据的数据类型;d1/2/3为数组名,中括号“[]”中间的数字代表数组的大小
现在我们给一个一维数组赋值:int a[10]={0,1,2,3,4,5,6,7,8,9};
上面的数组也可以这么赋值:
int d1[10]; for(int i=0;i<10;i++){ d1[i]=i+; }
逆序输出:
#include<iostream> #include<iomanip> using namespace std; int main(){ int d1[10]; for(int i=0;i<10;i++){ d1[i]=i; } for(int i=0;i<10;i++){ cout<<setw(3)<<d1[9-i]<<endl; } }
*数组的数据默认为0或者空(字符数组)
对于全部数组元素赋初始值的时候,由于个数已定,可以不指定数组长度。
int a[]={1,2,3,4,5}
笔者这里在尝试整型数组的时候发现了一个很有意思的事情,当输出超过定义数组长度的数据时,序号2输出的总是1,之后的4、6是一个很大的整数。如下:
#include<iostream> #include<iomanip> using namespace std; int main(){ int d[2]={1,2};//<<--任意变量名,任意长度(小于3),任意赋值 cout<<d[2];//<<--2对应的未被赋值的数据总是1 }
是不是感觉有点奇妙,下面让我们用循环看看后面的100位都有啥:
#include<iostream> #include<iomanip> using namespace std; int main(){ int d[4]={1,2}; for(int i = 0;i<100;i++){ cout<<d[i]<<"\t"; } }
可以看到,无论数组定义的多长,基本上,定义范围外都会有一个很靠近的数是1,之后的数会有
数个很大的值。
其实这是和内存有关,取值的指针超过内存分配给这个数组的范围后,就会把数组之后的数据输出
看完了这个有(wu)趣(liao)的实验,让我们再来看看每个学习编程的大学牲的必经之路:排序
代码如下:
#include<iostream> using namespace std; /*比较和交换*/ void sort(int n,int d[]){ int bak; if(d[n-1]>d[n]){ bak=d[n-1]; d[n-1]=d[n]; d[n]=bak; } } /*整体排序*/ void sortall(int d[],int lenth){ for(int i=1;i<lenth;i++){ for(int j=1;j<=lenth-i;j++){ sort(j,d); } } } /*实战调用*/ int main(){ int d[20]={ 1, 1, 2, 3, 4, 5, 433, 45, 241, 1321, 31, 2, 4, 123, 212, 3124, 22, 3, 34, 12}; sortall(d,20); for(int i=0;i<=19;i++){ cout<<d[i]<<endl; } }
既然有了一维数组,那当然也会有二维数组,我们来看看二维数组的赋初值
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
对全部元素赋初值的时候,第一维长度可以不指定,但第二维长度必须指定
矩阵的转置:
求最大值:
#include<iostream> using namespace std; int ismax(int a,int b){ if(a>b){ return a; } return b; }//比较 int findmax(int d[][4],int h){ int max = d[0][0]; for(int i=0;i<h;i++){ for(int j=0;j<4;j++){ max = ismax(max,d[i][j]); } } return max; }//“打擂台” int main(){ /*矩阵转置*/ int d[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}}; cout<<findmax(d,3); }
细心的朋友可能会问:findmax的函数这样子写岂不是只能适用于列数为4的矩阵了嘛。确实,如果不定义二维长度,指针会不知道如何为这个变量分配空间,对于这种情况,我们可以创造一个动态存储的数据类型来解决(这也是一些高级语言的做法),由于太麻烦了所以这里就不赘述了(这才是第六节课啊喂)为了灵活性,我们也可以用指针来解决这一问题,经过我一系列的学习(依葫芦画瓢),我写出了利用指针实现的更灵活的代码。
#include<iostream> using namespace std; int ismax(int a,int b){ if(a>b){ return a; } return b; }//比较 int findmax(int *p,int h,int l){ int max=*p; int d[h][l]; for(int i=0;i<h*4;i++){ max = ismax(max,*p); p++; } return max; }//“打擂台” int main(){ /*矩阵转置*/ int d[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}}; int *p=&d[0][0]; cout<<findmax(p,3,4); }
有了指针,只需要一层for循环就可以比较完所有的值,而且可以更方便地定位最大值的位置。如果我们函数返回的值为一个指针的话,我们将获得这个函数的终极版:
//↑无敌这个词用了两遍吧两遍↑ #include<iostream> using namespace std; int max(int a,int b){ if(a>b){ return a; } return b; } //比较 int *findst(int *p,int h,int l,int (*func)(int,int)){ int res=*p; int num=0; for(int i=1;i<h*l;i++){ int bak = func(res,p[i]); if(res!=bak){ res = bak; num=i; } } cout<<num<<endl; int res_y_x[3]={res,num/l+1,num%l+1}; int *myx=&res_y_x[0]; return myx; }//“打擂台” int main(){ /*矩阵实战*/ int d[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}}; int *p=&d[0][0]; int *q=findst(p,3,4,max); cout<<"最大的数是"<<*q<<"\n它在第"<<*(q+1)<<"行第"<<*(q+2)<<"个"<<endl; }
是不是突然感觉这个程序的灵活度就上去了呢
好了,数组有关的内容就讲到这里,下一篇文章我将继续聊聊字符数组,让字符串也成为函数的参量和返回值
posted on 2020-03-19 14:18 crazyplayer 阅读(97) 评论(0) 编辑 收藏 举报