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;
}
原文地址:https://www.cnblogs.com/Rowry/p/13945352.html