• C++ 语法基础课 习题4 —— 数组


    课堂

    1. 一维数组

    #include
    using namespace std;
    
    int main()
    {
        int a[10];
        float b[10];
        double c[10];
        char d[9];// 字符串
        string g[10];
        
        char d[] = {'a','b','c'};
        float f[10]={0};// 将数组初始化为0,数组下标从零开始
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2. 数组旋转

    #include
    using namespace std;
    
    int main()
    {
        int a[100];
        int n,k;
        cin >> n >> k;
        
        for(int i = 0; i < n;i++) cin >> a[i];
        // 旋转k次
        while(k--)
        {
            int t = a[n-1];// 把最后的数存下来,后面的都向后移一位
            for(int i= n-2;i>=0;i--)
            {
                a[i+1] = a[i];//向后移动一位
            }
            a[0] = t;
        }
        for(int i = 0;i < n;i ++) cout << a[i] << ' ';
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3. memset(难点)

    在这里插入图片描述

    #include
    #include
    #include
    using namespace std;
    
    int main()
    {
        int a[10],b[10];
        
        memset(a, 0, 40);// 初始化数组,初始化值,初始化多长,memset单位是字节byte,1byte=8bit,int类型是4个字节,32位,全是0,40表示Byte
        memset(a, -1, 40);// 存的都是1
        memset(a, -1, sizeof(a));
        
        for(int i = 0; i < 10; i++) cout << a[i] << ' ';
        cout << endl;
        
        //复制数组
        memcpy(b, a, sizeof(a));
        for(int i = 0; i < 10; i++) cout << b[i] << ' ';
        cout << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    例题

    1. 数组替换

    Acwing 737.数组替换

    #include
    using namespace std;
    
    int main()
    {
        int x[10];
        for(int i = 0; i < 10; i++)
        {
            scanf("%d",&x[i]);// 输入 10 个数据
        }
        for(int i = 0; i < 10; i++)
        {
            if(x[i] <= 0)
            x[i] = 1;
        }
        for(int i = 0; i < 10; i++)
        {
          printf("X[%d] = %d\n",i,x[i]);
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2. 数组填充

    Acwing 738.数组填充

    #include
    #include
    using namespace std;
    
    int main()
    {
        int a;
        scanf("%d",&a);
        int n[10];
        
        n[0] = a;// 这里不能加int
        for(int i = 1; i < 10;i++)
        {
            n[i]=n[i-1]*2;
        }
        for(int i = 0; i < 10; i++)
        {
            printf("N[%d] = %d\n",i,n[i]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3. 数组选择

    Acwing 739.数组选择

    #include
    using namespace std;
    
    int main()
    {
        double x[100];
        for(int i = 0; i < 100; i++)
        {
            scanf("%lf",&x[i]);
        }
        for(int i = 0; i < 100; i++)
        {
            if(x[i] <= 10)
            {
                printf("A[%d] = %.1lf\n", i, x[i]);
            }
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4. 数组中的行

    Acwing 743.数组中的行

    #include
    using namespace std;
    
    int main()
    {
        double m[12][12];
        int a;
        cin >> a;
        
        char b;
        cin >> b;
        
        double sum = 0;
        
        for(int i = 0;i < 12;i++)
            for(int j = 0;j < 12;j++)
            {
                scanf("%lf",&m[i][j]);
            }
            if(b == 'S')
            {
                for(int i = 0;i <12;i++)
                {
                    sum += m[a][i];
                }
                printf("%.1lf\n",sum);
            }
            else if(b == 'M')
            {
                for(int i = 0;i < 12;i++)
                {
                    sum += m[a][i];
                }
                double mean = sum / 12;
                printf("%.1lf\n",mean);
            }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    5. 数组的右上半部分

    Acwing 745.数组的右上半部分

    #include
    using namespace std;
    
    int main()
    {
        char t;// 首先进行输入
        scanf("%c",&t);
        double a[12][12];
        for(int i = 0; i <12; i++)
            for(int j = 0; j< 12; j++)
                scanf("%lf",&a[i][j]);
                
        int c = 0;// 记录元素个数
        double s = 0;// 记录元素的和
        
        for(int i=0; i<12; i++)
            for(int j=i+1; j<12; j++)
            {
                c++;
                s+=a[i][j];
            }
            
        if(t == 'S') printf("%.1lf\n",s);
        else printf("%.1lf\n",s/c);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    6. 数组的左上半部分

    Acwing 747.数组的左上半部分

    #include
    #include
    using namespace std;
    
    int main()
    {
        char t;
        cin >> t;
        
        double a[12][12];
        for(int i = 0; i < 12;i++)
            for(int j = 0;j < 12;j++)
            scanf("%lf",&a[i][j]);
        
        int c = 0;// count
        double s = 0;// sum
        
        for(int i = 0; i < 12; i++)
            for(int j = 0; j <= 10-i;j++)
            {
                c++;
                s +=a[i][j];
            }
        
        if (t == 'S')printf("%.1lf\n",s);
        else printf("%.1lf\n",s/c);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    7. 数组的上方区域

    Acwing 749.数组的上方区域

    #include
    #include
    using namespace std;
    
    int main()
    {
        char t;
        scanf("%c",&t);
        
        double a[12][12];
        for(int i = 0; i < 12; i++)
            for(int j = 0; j < 12; j++)
                scanf("%lf",&a[i][j]);
        
        int c = 0 ;
        double s = 0;
        for(int i = 0; i < 5;i++)
            for(int j = i+1; j<=10-i;j++)
            {
                c++;
                s+=a[i][j];
            }
         
        if( t=='S') printf("%.1lf\n",s);
        else printf("%.1lf\n",s/c);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    8. 数组的左方区域

    Acwing 751.数组的左方区域

    #include 
    using namespace std;
    
    int main()
    {
        char t;
        double a[12][12];
    
        scanf("%c", &t);
        for (int i = 0; i < 12; i ++ )
            for (int j = 0; j < 12; j ++ )
                scanf("%lf", &a[i][j]);
    
        double s = 0, c = 0;
        for (int i = 0; i < 5; i ++ )
            for (int j = i + 1; j <= 10 - i; j ++ )
            {
                c += 1;
                s += a[j][i];// 将之前的算法进行行列互换
            }
        if (t == 'S') printf("%.1lf\n", s);
        else printf("%.1lf\n", s / c);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    9. 平方矩阵I(难题)

    Acwing 753.平方矩阵1

    #include
    #include
    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)) << ' ';// 求4个数那个最小
                }
                cout << endl;
            }
            cout << endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    习题

    1. 数组变换

    Acwing 740.数组变换

    #include
    using namespace std;
     
    int main()
    {
        int a[20];
        for(int i = 0; i < 20; i++)
        {
            scanf("%d",&a[i]);
        }
        
        for(int i = 0; i < 20; i++)
        printf("N[%d] = %d\n",i,a[19-i]);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2. 斐波那契数列

    Acwing 741.斐波那契数列

    #include
    #include
    using namespace std;
    
    int main()
    {
        long long f[61];
        f[0]=0, f[1]=1;//直接赋值,不可以用int f[0]=1
        for(int i= 2; i<=60;i++) f[i]=f[i-1]+f[i-2];
        int n;
        cin >> n;
        while(n--)// n个测试数据
        {
            int x;
            cin >> x;
            printf("Fib(%d) = %lld\n",x,f[x]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3. 最小数和它的位置

    Acwing 742.最小数和它的位置

    #include
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;// 输入n个数据
        
        int a[1000];
        for(int i = 0;i < n;i++)
        {
            scanf("%d",&a[i]);
        }
        
        int p = 0;
        for(int i=1;i<n;i++)
        {
            if(a[p]>a[i])
            {
                p=i;
            }
        }
        printf("Minimum value: %d\n",a[p]);
        printf("Position: %d",p);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4. 数组中的列

    Acwing 744.数据中的列

    #include
    #include
    using namespace std;
    
    int main()
    {
        int a;
        cin >> a;// a表示第几列
        
        char b;// 输入字母
        cin >> b;
        
        double m[12][12];
        
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
                scanf("%lf",&m[i][j]);// 输入12*12个数据
        
        double sum=0;
        if(b =='S')// 求某一列的元素和
        {
            for(int i=0;i<12;i++)
            {
                sum+=m[i][a];
            }
            printf("%.1lf\n",sum);
        }
    
        else if(b == 'M')
        {
            for(int i = 0; i <12; i++)
                {
                    sum+=m[i][a];
                }
            double mean = sum/12;// 第a列元素的平均值
            printf("%.1lf\n",mean);
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    5. 数组的右下半部分

    Acwing 748.数组的右下半部分

    #include
    using namespace std;
    
    int main()
    {
        char t;
        scanf("%c",&t);
        
        double a[12][12];// 输入12*12个数据
        for(int i = 0; i < 12; i++)
            for(int j = 0;j < 12;j++)
             scanf("%lf",&a[i][j]);
        
        // i=1,j=11,j>10;i=2,j=11,j>9
        int c = 0;
        double s = 0;
        for(int i = 1;i < 12; i++)
            for(int j = 11;j > 11-i; j--)
            {
                c++;// 记录有多少个数据
                s+=a[i][j];
            }
        
        if(t =='S') printf("%.1lf\n",s);
        else printf("%.1lf\n",s/c);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    6. 数组的左下半部分

    Acwing 746.数组的左下半部分

    #include
    #include
    using namespace std;
    
    int main()
    {
        char t;
        scanf("%c",&t);
        
        double a[12][12];
        for(int i = 0; i < 12; i++)
            for(int j = 0; j < 12; j++)
                scanf("%lf",&a[i][j]);
        
        double s = 0, c = 0;
        for(int i = 1; i< 12; i++)
            for(int j = 0; j<=i-1; j++)
            {
                c += 1;
                s += a[i][j];
            }
            
        if(t=='S') printf("%.1lf",s);
        else printf("%.1lf",s/c);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    7. 数组的下方区域

    Acwing 750.数组的下方区域

    #include
    using namespace std;
    
    int main()
    {
        char a;
        cin >> a;
        
        double m[12][12];
        for(int i=0;i<12;i++)
            for(int j=0;j<12;j++)
            cin >> m[i][j];
        
        double c=0,s=0;
        for(int i=7;i<=11;i++)
            for(int j=12-i;j<=i-1;j++)
            {
                c+=1;
                s+=m[i][j];
            }
            
        if( a=='S') printf("%.1lf\n",s);
        else printf("%.1lf\n",s/c);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    8. 数组的右方区域

    Acwing 752.数组的右方区域

    #include
    using namespace std;
    int main()
    {
        char t;
        cin >> t;
        
        double m[12][12];
        for(int i = 0; i< 12;i++)
            for(int j=0; j < 12;j++)
            cin >> m[i][j];
    
        double c=0,s=0;
        for(int i=7;i <= 11;i++)
            for(int j=12-i;j<=i-1;j++)
            {
                c+=1;
                s+=m[j][i];
            }
        
        if(t=='S')printf("%.1lf",s);
        else printf("%.1lf",s/c);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    9. 平方矩阵II(难题)

    Acwing 754.平方矩阵II
    在这里插入图片描述

    • while(cin >> n,n):输入n的值
    • 曼哈顿距离
      在这里插入图片描述
    #include
    #include// 使用到abs
    using namespace std;
    
    int main()
    {
        double a[100][100];
        int n;
        while(cin >> n,n)
        {
            for(int i=0;i<n;i++)
            {
                a[i][i]=1;
                for(int j=i+1;j<n;j++) a[i][j]=abs(i-j)+1;
                for(int j=i+1;j<n;j++) a[j][i]=abs(i-j)+1;
            }
            
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                 cout<<a[i][j]<<' ';
                 cout<<endl;
            }
            cout<<endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    10. 平方矩阵III(难题)

    Acwing 755.平方矩阵III

    #include
    #include
    
    using namespace std;
    
    int main()
    {
        int n;
        while(cin >> n,n)
        {
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    int v = 1;
                    for(int k = 0;k < i+j; k++) v*=2;
                    cout << v << ' ';
                }
                cout<<endl;
            }
            cout<<endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    11. 蛇形矩阵(难题-回环)

    Acwing 756.蛇形矩阵

    • 使用到偏移量技巧,撞墙主要有出界、重复两种情况

    在这里插入图片描述

    #include
    using namespace std;
    
    int res[100][100];
    int main()
    {
        int n,m;
        cin >> n>> m;
        
        int dx[]={0,1,0,-1},dy[]={1,0,-1,0};// 前面是横坐标变化,后面是纵坐标变化
        for(int x=0,y=0,d=0,k=1;k<=n*m;k++)// k是指坐标里要填的数,比如说3行4列,则n=3,m=4
        {
            res[x][y]=k;// 先在x = 0,y = 0出填一个数
            int a=x+dx[d],b=y+dy[d];// d表示填坐标变化,而a和b则表示坐标位置
            if(a<0||a>=n||b<0||b>=m||res[a][b])//撞墙,包括出界和重复两个情况,前面表示不能出界,a>=3,b<=4才会算出界,后一个res[a][b]表示不能重复
            {
                d=(d+1)%4;// 表示进行回旋,就是旋转方向
                a=x+dx[d],b=y+dy[d];// 重新求得新的方向
            }
            x= a,y=b;
        }
        
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            cout<<res[i][j]<<' ';
            cout<<endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    顺子日期(蓝桥杯)
    16. Java字符串拼接的低层原理
    Golang操作RabbitMQ详细教程
    【小白专属03】SpringBoot实现增删改查
    31.JavaScript数组进阶,一网打尽数组操作函数slice、filter、map、reduce、some、every、find、splice
    (Python入门)函数
    JavaEE初阶学习:Linux 基本使用和 web 程序部署
    8.SSH高级命令
    WIN11任务栏出现空白,卡任务栏的解决办法
    HTML+CSS 测试题部分 150
  • 原文地址:https://blog.csdn.net/qq_42731062/article/details/127875836