C语言学习笔记(六) -数组 Arrays

数组的定义

一维数组

/*
数组:相同数据类型的有序集合
一维数组定义:元素类型 数组名[元素个数];
元素个数可以是常量,常量表达式,常量
*/
#include <stdio.h>
int main(void)
{
    int arr[5];  //常量 随机值
    int n;
    scanf("%d",&n);
    int arr1[n]; //变量

    int arr2[]={};//通过初始化,限定数组的长度

    int arr3[5]={0,1,2,3,4};

    int arr4[5]={1};//剩下的值都为0;
    int arr5[]={1,2,3,4,5,6,7,8,9};//根据初始化值,限定数组长度

    char arr6[3]={'a','b'};//剩下的值0=> '\0'

    return 0;
}

数组使用

/*
 数组的使用
 元素的使用:数组名[下标]
 下标从0开始,到(数组长度-1)结束
*/

#include <stdio.h>
int main(void)
{
    int a[5] = {1,2,3};

    //输入
    for(int i=0; i<5; i++)
    {
        scanf("%d",&a[i]);
    }
    //输出
    for(int i = 0; i < 5; i++)
        printf("%d\n",a[i]);

    return 0;
}

数组逆序

//
//  求数组逆序
//

#include<stdio.h>
#define N 10     //定义长度
int main(void)
{
    int a[N],i,temp;
    printf("请输入一组数:\n");
    for (i=0; i<N; i++) {
        scanf("%d",&a[i]);
    }
    for (i=0; i<N/2; i++) { //将对称元素值互换
        temp=a[i];
        a[i]=a[N-i-1];
        a[N-i-1]=temp;
    }
    printf("逆序数组为:");
    for (i=0; i< N; i++) {
        printf("%d",a[i] );
    }
    printf("\n");
    return 0;
}

二维数组

/*
二维数组:元素类型 数组名[行数][列数] 
*/

#include <stdio.h>
int main(void)
{
    char arr1[3][4];
    int n=3,m=4;
    char arr2[n][m];
    //只能省略行,不能省略列,根据初始化值的个数和列数,确定有几行
    char arr3[][4]={1,2,3,4,5,6,7,8,9,0};
    char arr4[][3]={{0},{},{1},{1,2,3}};


     printf("arr1=%lu\n",sizeof(arr1));   //char[3][4]      12
     printf("arr1[0]=%lu\n",sizeof(arr1[0])); //char[4]     4
     printf("arr1[0][0]=%lu\n",sizeof(arr1[0][0])); //char  1

     printf("arr4[0][0]=%lu\n",sizeof(arr4[0][0]));
     printf("arr4[0]=%lu\n",sizeof(arr4[0]));
     printf("arr4=%lu\n",sizeof(arr4));

    return 0;
}

二维数组元素的引用

//二维数组元素的引用
//元素的引用 数组名[行数][列数]
//


#include <stdio.h>
#define N 5
#define M 10
int main(void)
{
    char a[N][M];
    int row=sizeof(a)/sizeof(a[0]); // 50/10=5 row
    int col=sizeof(a[0])/sizeof(a[0][0]); //10/1=10 col
    //遍历二维数组的每一行
    for (int i=0; i<row; i++) {
        //遍历第i行的每一列
        for (int j=0; j<col; j++) {
            scanf("%c",&a[i][j]);
            printf("%c",a[i][j]);
        }
        printf("\n");
    }

}

数组与矩阵

矩阵的转置

//
// 矩阵的转置
//

#include <stdio.h>
int main(void)
{
    int n,m;
    printf("请输入矩阵的长度和宽度:\n");
    scanf("%d,%d",&n,&m);
    char a[n][m];

    //输入
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            scanf("%c",&a[i][j]);
            printf("%c",a[i][j]);
        }
        printf("\n");
    }

    //转置
    char b[m][n];
    for (int i=0; i<n; i++) {

        for (int j=0; j<m; j++) {
            b[j][i]=a[i][j];
        }
    }
    //输出
    for (int i=0; i<n; i++) {

        for (int j=0; j<m; j++) {
            printf("%c",b[i][j]);
        }
        printf("\n");
    }


}

矩阵的主对角线,辅对角线之和

//
//  求矩阵的主对角线,辅对角线之和
//

#include <stdio.h>
int main(void)
{
    int a[4][4]={1,2,3,4,
                 5,6,7,8,
                 9,10,11,12,
                 13,14,15,16};
    int sum1=0;
    int sum2=0;

    for (int i=0; i<4; i++) {
        for (int j=0; j<4; j++) {
            if (i==j) {
                sum1+=a[i][j];
            }
            if (i+j==3) {
                sum2+=a[i][j];
            }
        }
    }
    printf("sum1=%d,sum2=%d\n",sum1,sum2);
    return 0;
}

数组与函数

数组作为函数参数

//
//数组与函数
//数组作为函数参数
//1.数组元素作为函数参数,函数形参定义为数组元素的类型
//2.数组名作为函数参数,传递的实参是数组地址,接收形参是指针类型
//3.为了在被调函数中体现出实参是数组,形参使用数组类型接收
//4.使用其他的整型变量将数组长度传给被调函数
//5.使用数组名做函数参数,可以实现在被调函数中间间接访问主调中值
//

#include <stdio.h>
int max(int,int);
int main(void)
{
    int a[] ={1,2,3,4,5};
    int p1,p2;
    scanf("%d,%d",&p1,&p2);
    printf("max=%d\n",max(a[p1],a[p2]));
    return 0;
}

//求比较大的值
int max(int a,int b)
{
    return a>b?a:b;
}

#include <stdio.h>
void input(int [],int);//声明可以不加变量名
void output(int [],int);
void change(int [],int);

int main(void)
{
    int a[5];

    //sizeof(a)=>sizeof(int[5])
    unsigned long len=sizeof(a)/sizeof(a[0]);
    printf("数组的长度是:%lu\n",len);
    input(a,len);
    output(a,len);
    change(a,len);

    return 0;
}

void change(int a[],int len)
{
    int t;
    for (int i=0; i<len/2; i++) {
        t=a[i];
        a[i]=a[len-1-i];
        a[len-1-i]=t;

    }
    for (int i=0; i<len; i++) {
        printf("%d",a[i]);
    }
    printf("\n");
}

void input(int arr[],int len)
{
    for (int i=0; i<len; i++) {
        scanf("%d",&arr[i]);
    }
}

void output(int b[],int len) //相当于 (int *b,int len)指针
{
    for (int i=0; i<len; i++) {
        printf("%d",b[i]);
    }
    printf("\n");
}

二维数组做函数参数

/*
 *二维数组做函数参数
 *1.数组名做函数参数,实参是二维数组名,形参是指向二维数组一行的指针
 2.二维数组降维成一维数组,将行列都传递
 *
 */


 #include <stdio.h>

void input(int [][4],int);
void sum(int [],int,int);
void most(int [],int,int);
void change(int [],int,int,int []);
void sort(int [],int);



int main(void)
{
    int a[3][4];
    int value;
    input(a,3);    //输入二维数组
    sum(a[0],3,4); //求二维数组每行的和
    most(a[0],3,4); //求二维数组中最值
    int b[4][3];
    change(a[0],3,4,b[0]);
    //输出降维转置后数组
    for(int i=0;i<4; i++){
        for(int j=0; j<3; j++){
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    //输出每行排序后的结果
    printf("此二维数组每行排序后的结果为:\n");
    sort(a[0],3);

    for(int i=0;i<3; i++){
        sort(a[i],3);
        printf("%d ",a[i]);
        printf("\n");
    }
    return 0;
}


void input(int a[][4],int len) //指针 int (*)[4]
{
    printf("输入3行4列数组:\n");
    for (int i=0 ; i<len; i++) {
        for (int j=0; j<4; j++) {
            scanf("%d",&a[i][j]);
        }
    }
}

//降维成一维数组求二维数组每行的和
void sum(int b[],int row,int col)
{
    int sum=0;
    for (int i=0; i<row; i++) {
        sum=0;
        for (int j=0; j<col; j++) {
            sum+=b[i*col+j];   //b[i*row+j]等同于a[i][j]
        }
        printf("第%d行的和是:%d\n",i,sum);
    }
}

//求二维数组最大值
void most(int b[],int row,int col)
{
    int maxValue=b[0];
    int minValue=b[0];
    for (int i=0; i<row*col; i++) {
        if (maxValue<b[i]) {
            maxValue=b[i];
        }
        if (minValue>b[i]) {
            minValue=b[i];
        }
    }
    printf("此二维数组最大值是:%d\n",maxValue);
    printf("此二维数组最小值是:%d\n",minValue);
}



//转置二维数组
void change(int a[],int row,int col,int b[])
{
    for (int i=0; i<row; i++) {
        for (int j=0; j<col; j++) {
            b[j*row+i]=a[i*col+j];
        }
    }
    printf("转置后的数组为:\n");
}


//选择排序
void sort(int a[],int len)
{
    int min=0; //最小值下标位置
    int temp;
    for (int i=0; i<len-1;i++) {
        min=i;
        for (int j=i+1; j<len; j++) {
            if (a[min]>a[j]) {
                min=j;
            }
        }
        temp=a[min];
        a[min]=a[i];
        a[i]=temp;
    }
}

二维数组的转置

//
//数组返回给主调函数,保证返回的地址有用且有效
//
//

//二维数组的转置

#include <stdio.h>
void change(int[],int,int,in[]);
int main(void)
{
    int a[3][4]={1,2,3,4,
                 5,6,7,8,
                 9,10,11,12};
    int b[4][3];
    change(a,3,4,b);
    for (int i=0; i<4; i++) {
        for (int j=0; j<3; j++) {
            printf("%d  ",b[i][j]);
        }
        printf("\n");
    }
}

void change(int a[],int row,int col,int b[])
{
    for (int i=0; i<row; i++) {
        for (int j=0; j<col; j++) {
            b[j*row+i]=a[i*col+j];
        }
    }

}

三维数组

//
//三维数组
//

#include <stdio.h>
int main(void)
{
    int a[2][3][4]={{,,,},{,,,},{},{}};
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值