C语言学习与总结---第六章:数组(Array)

数组(Array)

  • 6.1 一维数组
    • 6.1.1 一维数组的定义
    • 6.1.2 一维数组在内存中的存放
    • 6.1.3 一位数组的引用
    • 6.1.4 一位数组的初始化
  • 6.2 二维数组
    • 6.2.1 二维数组的定义
    • 6.2.2 二维数组在内存中的存放
    • 6.2.3 二维数组的引用
    • 6.2.4 二维数组的初始化
  • 6.3 字符数组
    • 6.3.1 字符数组的定义
    • 6.3.2 字符数组的初始化
    • 6.3.3 二维字符数组
    • 6.3.4 字符串和字符串结束标志
    • 6.3.5 字符数组的输入输出
    • 6.3.6 字符串处理函数
  • 6.4 程序应用

数组:一组具有相同数据类型的数据的有序集合

6.1 一维数组

6.1.1 一维数组的定义

一般格式:

类型说明符  数组名[常量表达式];

例如,int[10]
定义了一个整形数组,数组名为a,包含10个元素
注意:
(1)数组名命名规则和变量相同
(2)在定义数组时,需要指定数组中元素的 个数,即数组长度。
注意数组元素的下标是从0开始的
a[0] a[1] a[2] a[3] a[4]
a[5] a[6] a[7] a[8] a[9]
(3)常量表达式可以包括常量和符号常量, 但不能包含变量。C语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:

int n;
scanf(“%d″,&n);
int a[n];

6.1.2 一维数组在内存中的存放

一维数组

int a[10]={1,2,3,4,5,6,7,8,9,10};

数组元素1,2,3,…,10从低地址a[0]开始向高地址a[9]依次存放。
每个数据元素所占字节数就是基类型字节数
这句话的意思是,每个数组元素1,2,3…所占字节数为数组的类型int所占字节数,即sizeof(int)

6.1.3 一位数组的引用

引用方式

数组名[下标]

下标可以是整型常量或整型表达式
例如:

a[0]= a[5]+ a[7]- a[2*3]
#include  
int main()  
{  
    int i, a[10];  
    for (i = 0; i < 10; i++)  
        a[i] = i;   //将i的值赋给a[1]  
    for (i = 0; i < 10; i++)  
        printf("%d ", a[i]);   //输出数组a的每个元素  
    return 0;  
} 

6.1.4 一位数组的初始化

(1)在定义数组时对数组元素赋以初值。

int a[10]={0,1,2,3,4,5,6,7,8,9};

经过上面的初始化后
a[0]= 0 a[1]= 1 a[2]= 2 a[3]= 3 a[4]= 4
a[5]= 5 a[6]= 6 a[7]= 7 a[8]= 8 a[9]= 9

(2)可以只给一部分元素赋值。

 int a[10]={0,1,2,3,4};    

只给前面5个元素赋初值

(3)在对全部数组元素赋初值时,可以不指定数组长度。

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

可以写成

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

例,用数组来处理,求解Fibonacci数列

#include  
int main()  
{  
    int i, f[20] = { 1,1 };  
    for (i = 2; i < 20; i++)  
        f[i] = f[i - 2] + f[i - 1];  
    for (i = 0; i < 20; i++)  
    {  
        if (i % 5 == 0) printf("\n");  
        printf("%12d", f[i]);  
    }  
    printf("\n");  
    return 0;  
}  

运行结果
C语言学习与总结---第六章:数组(Array)_第1张图片

6.2 二维数组

6.2.1 二维数组的定义

一般形式为

类型说明符 数组名[常量表达式][常量表达式];

例如:

float a[3][4],b[5][10];

可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。

6.2.2 二维数组在内存中的存放

数组元素在内存中按行存放,即先顺序存放第零行的元素,再存放第一行的元素,再存放第二行的元素…

int b[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };

C语言学习与总结---第六章:数组(Array)_第2张图片

6.2.3 二维数组的引用

二维数组元素的表示形式为:

数组名[下标][下标]

例如:

	a[2][3];		a[2-1][2*2-1];

数组元素可以出现在表达式中,也可以被赋值,例如:

b[1][2] = a[2][3] / 2

在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内

6.2.4 二维数组的初始化

(1) 分行给二维数组赋初值。

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 

(2) 将所有数据写在一个大括弧内,按数组排列的顺序对各元素赋初值。

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

(3) 可以对部分元素赋初值。

 int a[3][4] = {{1},{5},{9}};    

[ 1 0 0 5 0 0 9 0 0 ] \left[\begin{matrix} 1&0&0\\ 5&0&0\\ 9&0&0\\ \end{matrix}\right] 159000000
(4) 如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

等价于

int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

6.3 字符数组

6.3.1 字符数组的定义

字符数组的每个元素都是一个字符,定义方式与普通数组一样。一维字符数组也叫字符串
**区别:**字符’a’ 字符串”a”

char c[3]={‘d’,’o’,’g’};

它在计算机中的存储其实是’d’,’o’,’g’,’\0’,即每个字符串末尾都有一个\0,叫结束标识符

6.3.2 字符数组的初始化

(1)逐个字符赋给数组中各元素例如,

char c[3]={‘d’,’o’,’g’};

如果提供的初值个数大于数组长度,按语法错误处理
(2)如果初值个数与数组长度相同,在定义时可以省略数组长度

char c[]={‘d’,’o’,’g’};

(3)如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素定为空字符\0

6.3.3 二维字符数组

定义与普通二维数组一样,例如

char c[3][5] = { { ' ',' ','*',' ',' ' },{' ','*',' ','*',' '},{'*',' ','*',' ','*'} };

6.3.4 字符串和字符串结束标志

‘ \0 ’:字符串结束标志
例如,“dog”,其实是d, o, g, \0
可以用字符串常量初始化字符数组,但此时\0占数组的位置,所以数组长度为字符串长度+1

char c[] = {″I  am  happy″};

char c[] = ″I am happy″; 

等价

char c[] = {′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′,′\0′};

6.3.5 字符数组的输入输出

(1)逐个字符输入输出:用格式符”%c”输入或输出一个字符

#include  
int main()  
{  
    char c[4] = "dog";  
    for (int i = 0; i < 4; i++)  
        printf("%c", c[i]);  
    return 0;  
}  

(2)将整个字符串整体输入或输出用格式符”%s”输入输出整个字符串

#include  
int main()  
{  
    char c[4] = "dog";  
    printf("%s", c);  
    return 0;  
}  

(3)用scanf函数输入一个字符串。

char c[6];
scanf(″%s″,c);

从键盘输入:China↙
注意
scanf函数中的输入项如果是字符数组名,不要再加地址符&。在C语言中数组名代表该数组的起始地址。下面写法不对:

scanf(″%s″,&c);

如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。

char strl[5],str2[5],str3[5]; scanf(″%s%s%s″,str1,str2,str3);

6.3.6 字符串处理函数

(1)puts函数
一般形式为:puts(字符数组)
作用:将一个字符串输出到终端

char str[]={″China\nBeijing″}; puts(str);

输出结果:
China
Beijing

(2)gets函数

一般形式为:gets(字符数组)
作用:从终端输入一个字符串到字符数组

char str[9]; gets(str);

从键盘输入:
Computer↙

(3)strcat函数

一般形式为:strcat(字符数组1,字符数组2)
作用:连接两个字符数组中的字符串。把字符串2接到字符串1的后面,结果放在字符数组1中。
例如:

char str1[30]={″People′s Republic of ″}; char str2[]={″China″}; strcat(str1,str2);  

数组str1变为:People′s Republic of China

(4)strcpy函数

一般形式为:strcpy(字符数组1,字符串2)
作用:将字符串2复制到字符数组1中

char str1[10],str2[]={″China″}; strcpy(str1,str2); 

(5)strncpy函数

作用:将字符串2中前面若干个字符复制到字符数组1中

strncpy(str1,str2,2);

作用:将str2中前面2个字符复制到str1中

(6)strcmp函数

一般形式为:strcmp(字符串1,字符串2)
作用:比较字符串1和字符串2
例如:

strcmp(str1,str2);
strcmp(″China″,″Korea″);
strcmp(str1,″Beijing″);

自左至右逐个字符相比(按ASCII码值大小比较),如果全部字符都相同,则认为相等;若出现不相同的字符,则以第一对不相同的字符的比较结果为准。 例如

"computer">"compare"   "CHINA">"CANADA"   "DOG"<"cat" 

比较的结果由函数值带回
(1) 如果字符串1=字符串2,函数值为0。
(2) 如果字符串1>字符串2,函数值为一正整数。
(3) 如果字符串1<字符串2,函数值为一负整数。

(7)strlen函数

一般形式为:strlen(字符数组)
作用:求字符串的实际长度(不包括′\0′)

char str[10]={″China″}; printf(″%d″,strlen(str));

输出结果是5

(8)strlwr函数

一般形式为:strlwr(字符串)
作用:将字符串中大写字母换成小写字母

(9) strupr函数

一般形式为:strupr(字符串)
作用:将字符串中小写字母换成大写字母

6.4 程序应用

(1)用起泡法对10个数从小到大排序
思路:将相邻两个数比较,将小的调到前头
C语言学习与总结---第六章:数组(Array)_第3张图片
C语言学习与总结---第六章:数组(Array)_第4张图片
结论
如果有n个数,则要进行n-1趟比较。
在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。
C语言学习与总结---第六章:数组(Array)_第5张图片

#include  
int main()  
{  
    int i, j, t;  
    int a[10];  
    printf("input 10 numbers: \n");  
    for (i = 0; i < 10; i++)  
        scanf_s("%d", &a[i]);  
    printf("\n");  
    for (j = 0; j < 9; j++)  
    {  
        for (i = 0; i < 9 - j; i++)  
        {  
            if (a[i] > a[i + 1])  
            {  
                t = a[i];  
                a[i] = a[i + 1];  
                a[i + 1] = t;  
            }  
        }  
    }  
    printf("the sorted numbers: \n");  
    for (i = 0; i < 10; i++)  
        printf("%d ", a[i]);  
    printf("\n");  
    return 0;  
}

运行结果
C语言学习与总结---第六章:数组(Array)_第6张图片
(2)将一个二维数组行和列元素互换,存到另一个二维数组中
A = [ 1 2 3 4 5 6 ] A=\left[\begin{matrix} 1&2&3\\ 4&5&6\\ \end{matrix}\right] A=[142536]
b = [ 1 4 2 5 3 6 ] b=\left[\begin{matrix} 1&4\\ 2&5\\ 3&6\\ \end{matrix}\right] b=123456

#include  
int main()  
{  
    int A[2][3] = { 1,2,3,4,5,6 }, B[3][2];  
    int i, j;  
    printf("array A : \n");  
    for (i = 0; i < 2; i++)  
    {  
        for (j = 0; j < 3; j++)  
        {  
            printf("%5d", A[i][j]);  
            B[j][i] = A[i][j];  
        }  
        printf("\n");  
    }  
    printf("array B : \n");  
    for (i = 0; i < 3; i++)  
    {  
        for (j = 0; j < 2; j++)  
        {  
            printf("%5d", B[i][j]);  
        }  
        printf("\n");  
    }  
    return 0;  
} 

运行结果
C语言学习与总结---第六章:数组(Array)_第7张图片
(3)有一个3×4的矩阵,输出值最大的数组元素的值,以及其所在的行号和列号

#include  
int main()  
{  
    int a[3][4] = { {1,2,3,4},{11,23,-56,46},{-45,51,31,67} };  
    int i, j, max, row = 0, colum = 0;  
    max = a[0][0];  
    for (i = 0; i < 3; i++)  
    {  
        for (j = 0; j < 4; j++)  
        {  
            if (a[i][j] > max)  
            {  
                max = a[i][j];  
                row = i;  
                colum = j;  
            }  
        }  
    }  
    printf("max = %d\nrow = %d\ncolum = %d\n", max, row, colum);  
    return 0;  
} 

运行结果
C语言学习与总结---第六章:数组(Array)_第8张图片
(4)输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
算法
在这里插入图片描述
C语言学习与总结---第六章:数组(Array)_第9张图片

#include  
int main()  
{  
    char str[100], c;  
    int num = 0, word = 0;  
    gets_s(str);  
    for (int i = 0; (c = str[i]) != '\0'; i++)  
    {  
        if (c == ' ') word = 0;  
        else if (word == 0)  
        {  
            word = 1;  
            num++;  
        }  
    }  
    printf("There are %d words in the line.\n", num);  
    return 0;  
}

运行结果
C语言学习与总结---第六章:数组(Array)_第10张图片
(5)有3个字符串,要求找出其中最大者

#include  
#include  
int main()  
{  
    char string[20];  
    char str[3][20];  
    for (int i = 0; i < 3; i++)  
        gets_s(str[i]);  
    if (strcmp(str[0], str[1]) > 0)  
        strcpy_s(string, str[0]);  
    else strcpy_s(string, str[1]);  
    if (strcmp(str[2], string) > 0)  
        strcpy_s(string, str[2]);  
    printf("The largest string is %s.\n", string);  
    return 0;  
}  

运行结果
C语言学习与总结---第六章:数组(Array)_第11张图片

你可能感兴趣的:(C语言,数组,c语言)