小沈的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;
}
宇宙超级无敌霹雳旋风终极无敌版v1.0

 

是不是突然感觉这个程序的灵活度就上去了呢

好了,数组有关的内容就讲到这里,下一篇文章我将继续聊聊字符数组,让字符串也成为函数的参量和返回值

 

posted on 2020-03-19 14:18  crazyplayer  阅读(97)  评论(0编辑  收藏  举报

导航