zoukankan      html  css  js  c++  java
  • C,C++语法基础 | 数组 | 04

    数组 | 04

    程序 = 逻辑 + 数据,数组是存储数据的强而有力的手段.

    数组的定义

    数组的定义非常简单,就是一个变量后面加上一个[],中括号中写上数组长度.

    int a[100],b[10]; // int数组
    float c[11]; 
    double d[13];
    char e[14]; // 字符数组,本质上就是字符串
    string g[25]; //字符串数组
    

    数组的初始化

    一般的数组初始化尝试如下,定义的时候进行初始化,后面加上一个大括号.

    int a[3] = {0,1,3}; // 长度为3的数组,给了3个值
    int a[5] = {0,1,3}; // 定义了一个长度为5的数组,给了3个值,后面两个没有给值得默认为0
    int a[] = {0,1,3}; // 不指定数组长度,给3个值,则数组长度为3
    

    常用技巧,定义一个初始都为0的数组,需要进行初始化,在函数内部数组未初始化,里面的值是随机值. 而在函数外的数组,也就是全局数组,默认都是0,可以不进行初始化.

    int b[100]; // 全局数组,默认都为0
    int main(){
        int a[100] = {0}; // 定义一个初值都为0的数组
        int b[100] = {1}; // 定义一个初值都为1的数组
    }
    

    还有一个知识点: 在函数内开的数组都是存放在栈空间的,一般默认就是1M,也就是说不能在函数内开很大的数组,否则就容易爆栈. 在函数外的数组是存放在堆中,这个就没有内存限制,上限取决于计算机的内存大小.

    细节补充

    常量声明const, 声明了const的变量就不能在被重新赋值,否则会报错

    memset(数组,初始化数值,数组长度),这个是在#include<cstring>中的, 需要注意是最后的一个参数是以字节B为单位的,如果是int需要乘4,doublelong long需要乘8.

    需要注意的, 这个memset一般是用来赋值0, 还有一个情况就是-1,这个是需要记住的.

    然后数组的字节数量也不需要自己计算,可以使用运算符sizeof,不用括号的

    memset(a,-1,sizeof a)

    还有一点就是效率的问题,memeset给数组赋初值比循环赋值要快很多.

    还有就是数组和复制函数memcpy(目标数组,源数组,sizeof xxx)

    两个数组常用的函数就是memsetmemcpy

    习题四

    数组替换

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    
    int main(){
        int x[10];
        for(int i=0;i<10;i++) cin >> x[i];
        for(int i=0;i<10;i++){
            if(x[i]<=0){
                x[i] = 1;
            }
            printf("X[%d] = %d
    ",i,x[i]);
        }
        
        
        
        return 0;
    }
    

    数组填充

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int main(){
        int x;
        cin >> x;
        int a[10];
        a[0] = x;
        for(int i=1;i<10;i++){
            a[i] = a[i-1]*2;
        }
        for(int i=0;i<10;i++){
            printf("N[%d] = %d
    ",i,a[i]);
        }
        return 0;
    }
    

    数组选择

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    int main(){
        double a[100];
        for(int i=0;i<100;i++){
            scanf("%lf",&a[i]);
            if(a[i]<=10){
                printf("A[%d] = %.1lf
    ",i,a[i]);
            }
        }
        
        return 0;
    }
    

    数组中的行

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        int n;
        char c;
        cin >> n >> c;
        for(int i=0;i<12;i++){
            for(int j=0;j<12;j++){
                cin >> M[i][j];
            }
        }
        
        double res=0;
        for(int i=0;i<12;i++)res+=M[n][i];
        if(c=='M'){
            printf("%.1lf",res/12);
        }else{
            printf("%.1lf",res);
            
        }
        
        
        return 0;
    }
    

    数组的右上半部分

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
        for(int i=0;i<12;i++)
            for(int j=i+1;j<12;j++)
                res += M[i][j],cnt++;
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    数组的左上半部分

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
        for(int i=0;i<12;i++)
            for(int j=0;j<=10-i;j++)
                res += M[i][j],cnt++;
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    数组的上方区域

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
        for(int i=0;i<5;i++)
            for(int j=i+1;j<=10-i;j++)
                res += M[i][j],cnt++;
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    数组的左方区域

    这里最好就划分为上下两部分区域.

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
        for(int i=1;i<=5;i++)
            for(int j=0;j<i;j++)
                res += M[i][j],cnt++;
                
        for(int i=6;i<=10;i++)
            for(int j=0;j<11 - i;j++)
                res += M[i][j],cnt++;
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    平方矩阵I

    #include<iostream>
    #include<cmath>
    using namespace std;
    
    int main(){
        int n;
        while(cin >> n,n){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    int up=i,down=n-i+1,left=j,right=n-j+1;
                    cout << min(min(up,down),min(left,right)) << " ";
                }
            cout << endl;
            }
            cout << endl;
        }
        
        
        return 0;
    }
    

    数组变换

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int main(){
        int a[20];
        for(int i=0;i<20;i++)cin>>a[i];
        reverse(a,a+20);
        for(int i=0;i<20;i++)printf("N[%d] = %d
    ",i,a[i]);
        
        
        return 0;
    }
    

    斐波那契数列

    #include<iostream>
    using namespace std;
    
    long long fib(int n){
        long long a=0,b=1;
        for(int i=0;i<n;i++){
            long long c = a+b;
            a=b,b=c;
        }
        
        return a;
    }
    
    int main(){
        int n;
        cin >> n;
        while(n--){
            int x;
            cin >> x;
            printf("Fib(%d) = %lld
    ",x,fib(x));
        }
        
        
        return 0;
    }
    

    最小数和它的位置

    #include<iostream>
    
    using namespace std;
    
    const int N = 1100;
    int a[N];
    
    int main(){
        int n;
        int m=0x7fffffff,idx=-1;
        cin >> n;
        for(int i=0;i<n;i++){
            cin>>a[i];
            if(a[i]<m)m=a[i],idx=i;
        }
        printf("Minimum value: %d
    Position: %d
    ",m,idx);
        return 0;
    }
    

    数组中的列

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        int n;
        char c;
        cin >> n >> c;
        for(int i=0;i<12;i++){
            for(int j=0;j<12;j++){
                cin >> M[i][j];
            }
        }
        
        double res=0;
        for(int i=0;i<12;i++)res+=M[i][n];
        if(c=='M'){
            printf("%.1lf",res/12);
        }else{
            printf("%.1lf",res);
            
        }
        
        
        return 0;
    }
    

    数组的右下半部分

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
        for(int i=0;i<12;i++)
            for(int j=12-i;j<12;j++)
                res += M[i][j],cnt++;
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    数组的左下半部分

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
        for(int i=0;i<12;i++)
            for(int j=0;j<i;j++)
                res += M[i][j],cnt++;
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    数组的下方区域

    ![1604819519638](C:UsersRowry ChoAppDataRoamingTypora ypora-user-images1604819519638.png)

    数组的右方区域

    #include<iostream>
    using namespace std;
    
    double M[12+10][12+10];
    
    int main(){
        char c;
        cin >> c;
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                cin >> M[i][j];
        double res = 0;
        int cnt=0;
    
      
        for(int i=0;i<=5;i++){
            for(int j=12-i;j<12;j++){
                res += M[i][j],cnt++;
            }
        }
           for(int i=6;i<12;i++){
            for(int j=11;j>i;j--){
                res += M[i][j],cnt++;
            }
        }
        
        if(c=='M')printf("%.1lf",res/cnt);
        else printf("%.1lf",res);
        
        return 0;
    }
    

    平方矩阵II

    可以看看对角线的规律.

    #include<iostream>
    using namespace std;
    
    const int N = 110;
    int a[N][N];
    
    int main(){
        int n;
        while(cin>>n,n){
            for(int i=1;i<=n;i++){
                int x=1,y=i;
                while(x<=n && y<=n){
                    a[x][y]=a[y][x]=i;
                    x+=1,y+=1;
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    cout << a[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl;
        }
        
        return 0;
    }
    

    平方矩阵III

    #include<iostream>
    using namespace std;
    
    const int N = 110;
    int a[N][N];
    
    int main(){
        int n;
        while(cin>>n,n){
            int t=1;
            for(int i=0;i<n;i++){
                a[i][0]=t,t*=2;
            }
            
            for(int i=0;i<n;i++){
                t = a[i][0];
                for(int j=0;j<n;j++){
                    a[i][j]=t,t*=2;
                }
            }
            
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    cout << a[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl;
            
        }
        
        
        return 0;
    }
    

    蛇形矩阵

    #include<iostream>
    using namespace std;
    
    const int N = 110;
    int a[N][N];
    
    int dr[] = {0,+1,0,-1};
    int dc[] = {1,0,-1,0};
    
    
    int main(){
        int n,m;
        cin >> n >> m;
        int t=1;
        int r=0,c=0,d=0;
        while(t<=n*m){
            // 先写在改
            a[r][c] = t++;
            int tr=r+dr[d],tc=c+dc[d];
            if(tr>=0 && tr<n && tc>=0 && tc<m && !a[tr][tc]){
                r=tr,c=tc;
            }else{
                d = (d+1)%4;
                r+=dr[d],c+=dc[d];
            }
        
        }
        
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
        
        
        return 0;
    }
    
  • 相关阅读:
    js解码
    node.js关于传送数据的二三事
    node下新建工程
    mysql配置
    mongodb配置及简单示例
    vue使用watch 观察路由变化,重新获取内容
    vue 封装方法
    ES6,import时如何正确使用花括号'{ }'
    css字体图标的制作
    vue实现淘宝商品详情页属性选择功能
  • 原文地址:https://www.cnblogs.com/Rowry/p/13945352.html
Copyright © 2011-2022 走看看