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

来源:互联网 发布:最好的矩阵论教材 编辑:程序博客网 时间:2024/05/29 08:38

数组的定义

一维数组

/*数组:相同数据类型的有序集合一维数组定义:元素类型 数组名[元素个数];元素个数可以是常量,常量表达式,常量*/#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 10int 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;}
0 0
原创粉丝点击