栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言数组入门到精通(数组精讲)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言数组入门到精通(数组精讲)

 少一些豪情壮志的承诺,多一些脚踏实地的坚持!

目录

 1.理论理解

1.1二维数组定义:

1.2具体定义分析:

1.3解决思路:

1.3.1具体分析:

1.3.2论证说明 

1.3.3具体分析

1.4矩阵基本预算:矩阵(线性代数会学)

1.4.1转置矩阵: 

 1.4.2矩阵相加:

1.4.3矩阵相乘: 

 2.代码演示详解:

2.1二维数组基本定义和使用方式

 2.2典型应用案例冒泡排序:

2.3二维数组案例程序编译讲解:

案例1:二维数组行列交换

案例2:求二维数组中最大值且输出对应行号

案例3:扩展补充

2.4字符数组分类代码详解:

2.4.1字符数组的定义、使用:

2.4.2字符数组初始化

2.4.3字符数组:strcpy、strcmp、strcat函数应用具体案例详解

2.4.5字符数组:puts、fputs函数具体应用代码案例:

2.4.6字符数组 :scanf、gets、fgets函数应用案例代码详解:

2.4.7综合应用代码详解:


 1.理论理解

1.1二维数组定义:

二维数组基本形式

      二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。

1.2具体定义分析:

int a[3][4];

二维数组—(可以理解成:矩阵)

a[0][0

a[1][0a[2][0]
a[0][1]a[1][1]a[2][1]
a[0][2]a[1][2]a[2][2]
a[0][3]a[1][3]a[2][3]

       一个3行,4列的二维数组。其行号: 0,1,2;其列号: 0,1,2,3最大下标的元素为 a[2][3],没有 a[3][4]这个元素数组共有3行,每一行都是:4个元素的一维数组,每一行的数组名分别为: a[0],a[1],a[2]从整体看,任何一个二维数组都可以看成是一个一维数组,只不过其数组元素又是一个一维数组。
二维数组定义同时若有初始化,可以省略行号不写:如int al[31={1.2.3.4.5.6}系统会按照数据的个数,和规定的列数,来确定数据分几行?
       二维数组定义同时若有初始化,可以省略行号不写,但列号不能省略 :如 int a[3][]={1,2,3,4,5}系统无法按照数据的个数,和规定的行数,来确定数据分几列。 

1.3解决思路:

解题顺口溜:“1定2列3编写”

定义位置行列、数组、数组边界确定

列表说明,考虑scanf、gets函数用法细节(后文有典型案例介绍)

编写程序定义不能重复命名,注意合法性。

1.3.1具体分析:

二维数组的首元素,第二个元素,第三个元素........表示什么?

a[0]、a[1]、a[2]又各自代表什么,有几层含义,为什么有多层含义?

分析思路:

等号左边:a是什么?那a + i呢(为什么)?跟二维数组的元素定义有关

等号右边:a[i]代表的含义

1.3.2论证说明 
int a[3][4]= { 1,3,5,7,9,11,13,15 17,19,21,23 };

a                                                    二维数组名,指向一维数组a[0],即0行地址

a[],*(a+0),*a                                        0行0列元素的地址

a+1,&a[1]                                            第1行首地址

a[1],*(a+1)                                          a[1][0]的地址

a[1]+2,*(a+1)+2,&a[1][2]                             a[1][2]的地址

*(a[1]+2),*(*(a+1)+2),a[1][2]                     a[1][2]的值

1.3.3具体分析

1.4矩阵基本运算: 矩阵(线性代数)

1.4.1转置矩阵: 
//其中A, B是m*n矩阵:

void tramat(matrix A,matrix B){ int i,j;

for(i=0; i 

 1.4.2矩阵相加:
//其中A,B,C是m*n矩阵:

void addmat(matrix C, matrix A, matrix B){

int i, j;

for(i=0; i 

1.4.3矩阵相乘: 
//其中A是m*n矩阵,B是n*1矩阵,C为m*1矩阵

void mutmat(matrix C, matrix A, matrix B){

int i, j, k;

for(i=0; i 

 原理是支持实际编程的思想,需要巩固了解。推荐了解:线性代数、离散数学

 2.代码演示详解:

2.1二维数组基本定义和使用方式
#include 
#include 


int main()
{
    //二维数组初始化
    // 1.分行初始化
    int a1[3][4] = {
        {0, 1, 2, 3},
        {4, 5, 6, 7},
        {8, 9, 10, 11}};
    // 2.将数组元素全部写在{}内,依次赋值
    int a2[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
    // 3.可以向二维数组进行局部编译初始化
    //如果对应位置有值就赋值,没有就系统默认赋值为:0
    //如果对二维数组全部元素赋初值,第一个[]可以省略不写,第二个[]一定不能省略

    int a3[3][4] = {
        {1},
        {5},
        {9}};
    int i, j;

    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("%d ", a3[i][j]);
        }
        printf("n");
    }
}

 2.2典型应用案例冒泡排序:
#include 
#include 


int main()
{

    int a[6] = {5,3,6,2,10,8};
    int i;
    //int n= sizeof(a)/sizeof(int);
    int j;
    for(i=0; i<6-1; i++)
    {
        for(j=0; j<6-1-i; j++)
        {
            //元素交换前提挨着的两个数,前者比后者大/
            if(a[j]>a[j+1])
            {

                int tmp;
                tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;

            }

        }

    }
    for(i=0; i<6; i++)
    {

        printf("%d n", a[i]);

    }
}

2.3二维数组案例程序编译讲解:

案例1:二维数组行列交换

案例2:求二维数组中最大值且输出对应行号

案例3:扩展补充
#include 
int main()
{

    
    int a[5][10];
    printf("sizeof(a)=%dn", sizeof(a));
    // 5个int组成,所以总大小=5*4*10=200
    printf("sizeof(a[0]=%dn)", sizeof(a[0]));
    // a[0][0],因为int占4个字节
    printf("sizeof(a[0][0]=%dn)", sizeof(a[0][0]));
    //求二维数组的行数
    printf("二维数组行数:%dn", sizeof(a) / sizeof(a[0]));
    //求列数;思路:
    printf("二维数组的列数:%dn", sizeof(a[0]) / sizeof(a[0][0]));
    //求行*列
    printf("二维数组行列总数为:%dn", sizeof(a) / sizeof(a[0][0]));
}

2.4字符数组分类代码详解:

2.4.1字符数组的定义、使用:
#include 

int main()
{
    char a[10];
    //定义一个字符串
    char a1[10] = {'h', 'e', 'l', 'l', 'o', ''}; //表示字符串hello
    char a2[10] = {'h', 'e', 'l', 'l', 'o', 0};    //也表示字符串hello
    char a3[10] = {'h', 'e', 'l', 'l', 'o'};       //表示字符数组
    char a4[] = "hao";//h a o (系统会自动加上结束符,所以输出占了4个字节)
    //后面尽量不要加数字;   字符串
    char a5[] = "12hao";
    printf("a1=%sn", a1);
    printf("a2=%sn", a2);
    printf("a3=%sn", a3);
    printf("a4=%sn", a4);
    printf("a5=%sn", a5);
    printf("sizeof(a1)=%dn", sizeof(a1));
    printf("sizeof(a4)=%dn", sizeof(a4));
    printf("sizeof(a5)=%dn", sizeof(a5));
    return 0;
}

2.4.2字符数组初始化
#include 
int main()
{

    
char a1[10] = {'h', 'a', 'o'}; //定义一个一维数组,这是字符数组
    char a2[8] = {'h', 'a', 'o'};  //定义一个一维数组,这是字符数组
    char a3[] = "hao";             //只是一个字符串
    int i;
    for (i = 0; i < 10; i++)
    {
        printf("%C ", a1[i]);
    }
    printf("n");
    printf("a2=%s ", a2);
    printf("n");
    printf("a3=%s", a3);
    printf("n");
    printf("sizeof(a1)=%d", sizeof(a1));
    printf("n");
    printf("sizeof(a2)=%d", sizeof(a2));
   
}

2.4.3字符数组:strcpy、strcmp、strcat函数应用具体案例详解
#include 


int main()
{
    char src[] = "hello word";
    char dest[] = "China";
    //strcat (dest,src);//字串的拼接
   strncat  (dest, src,sizeof("hello")+1);
    
        printf("dest=%sn", dest);
    

    return 0;
}

2.4.5字符数组:puts、fputs函数具体应用代码案例:
#include 


int main()
{
    char str[] = "China";
    char str2[] = "China"; //当检测到有字符,就会自动跳出,结束符所以最后输出的值为:0
    char str3[] = "China";
    //如果[]里面定义的字符个数,那么后面跟的具体值如果超过了给个字符限制,超过部分将不会输出
    //例如:运行前需要把其他的定义数值给注释掉,不然会引起冲突
    char str4[5] = "chinese";
    // int len = strlen(str4);//这个定义为测试超过给定的字符长度而使用
    int len = strlen(str);
    printf("len(str)=%dn", len);

    len = strlen(str2);
    printf("len(str2)=%dn", len); // 0
    // sizeof计算的是数据类型的长度, 不会因为结束符而结束
    printf("sizeof(str2=%dn", sizeof(str2)); //结果:sizeof(str2=7,7个字符

    len = strlen(str3);
    printf("len(str3)=%dn", len); // 0
    // sizeof函数会输出字符数,在计算机内存中,保存形式为:China, 因此会算上所占字符,所以最后输出的字符数是6 printf("sizeof(str3=%dn", sizeof(str3));
    printf("str3=%sn", str3);

    len = strlen(str4);
    printf("len(str4)=%dn", len);
    printf("sizeof(str4=%dn", sizeof(str4));
    // printf("str4=%sn", str4);//这一个为测试超过给的定的字符长度使用
    return 0;
}

2.4.6字符数组 :scanf、gets、fgets函数应用案例代码详解:
#include 
int main()
{
    
    char str[10];
    printf("请输入字符串str: ");
    fgets(str, sizeof(str), stdin);
    printf("str=%s", str);
}
 

2.4.7综合应用代码详解:

案例1:求输入单词个数

案例2:字符串比较大小

#include 

int main()
{
    char str[3][10]; //定义一个二维数组,每一行都是一个字符串
    char tmp[10];    //存放最大的哪个字符串
    int i;
    for (i = 0; i < 3; i++){
        gets(str[i]); //读入三个字符,依次赋值给str[0],str[1],str[2]
    }
    //接下来两两比较
    if (strcmp(str[0], str[1]) > 0) {
        // str[0]大
        strcpy(tmp, str[0]); //将str[0]拷贝至tmp里面
    }
    else {
        // str[1]大
        strcpy(tmp, str[1]);
    }
    if (strcmp(str[2], tmp) > 0){ 
        // str[2]大
        strcpy(tmp, str[2]);
    }
    //tmp存的就是最大字符串
    printf("最大字符串为 %sn",tmp);


    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026083.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号