C语言程序设计-7 数组

	在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这

些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数

组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组

元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别 。本

章介绍数值数组和字符数组,其余的在以后各章陆续介绍。

7.1 一维数组的定义和引用

7.1.1 一维数组的定义方式

7.1.2 一维数组元素的引用

【例 7.1】

c 复制代码
main()
{
    int i, a[10];
    for (i = 0; i <= 9; i++)
        a[i] = i;
    for (i = 9; i >= 0; i--)
        printf("%d ", a[i]);
}

【例 7.2】

c 复制代码
main()
{
    int i, a[10];
    for (i = 0; i < 10;)
        a[i++] = i;
    for (i = 9; i >= 0; i--)
        printf("%d", a[i]);
}

【例 7.3】

c 复制代码
main()
{
    int i, a[10];
    for (i = 0; i < 10;)
        a[i++] = 2 * i + 1;
    for (i = 0; i <= 9; i++)
        printf("%d ", a[i]);
    printf("\n%d %d\n", a[5.2], a[5.8]);
}

本例中用一个循环语句给 a 数组各元素送入奇数值,然后用第二个循环语句输出各个奇

数。在第一个 for 语句中,表达式 3 省略了。在下标变量中使用了表达式 i++,用以修改循

环变量。当然第二个 for 语句也可以这样作,C语言允许用表达式表示下标。 程序中最后

一个 printf 语句输出了两次 a[5]的值,可以看出当下标不为整数时将自动取整。

7.1.3 一维数组的初始化

7.1.4 一维数组程序举例

【例 7.4】

c 复制代码
main()
{
    int i, max, a[10];
    printf("input 10 numbers:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    max = a[0];
    for (i = 1; i < 10; i++)
        if (a[i] > max)
            max = a[i];
    printf("maxmum=%d\n", max);
}

【例 7.5】

c 复制代码
main()
{
    int i, j, p, q, s, a[10];
    printf("\n input 10 numbers:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < 10; i++)
    {
        p = i;
        q = a[i];
        for (j = i + 1; j < 10; j++)
            if (q < a[j])
            {
                p = j;
                q = a[j];
            }
        if (i != p)
        {
            s = a[i];
            a[i] = a[p];
            a[p] = s;
        }
        printf("%d", a[i]);
    }
}

7.2 二维数组的定义和引用

7.2.1 二维数组的定义

7.2.2 二维数组元素的引用

c 复制代码
#include <stdio.h>

main()
{
    int i, j, s = 0, average, v[3], a[5][3];
    printf("input score\n");
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            scanf("%d", &a[j][i]);
            s = s + a[j][i];
        }
        v[i] = s / 5;
        s = 0;
    }
    average = (v[0] + v[1] + v[2]) / 3;
    printf("math:%d\nc languag:%d\ndbase:%d\n", v[0], v[1], v[2]);
    printf("total:%d\n", average);
}

【例 7.7】

c 复制代码
#include <stdio.h>

main()
{
    int i, j, s = 0, average, v[3];
    int a[5][3] = {{80, 75, 92}, {61, 65, 71}, {59, 63, 70}, {85, 87, 90}, {76, 77, 85}};
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
            s = s + a[j][i];
        v[i] = s / 5;
        s = 0;
    }
    average = (v[0] + v[1] + v[2]) / 3;
    printf("math:%d\nc languag:%d\ndFoxpro:%d\n", v[0], v[1], v[2]);
    printf("total:%d\n", average);
}

7.2.4 二维数组程序举例

7.3 字符数组

7.3.1 字符数组的定义

7.3.2 字符数组的初始化

7.3.3 字符数组的引用

【例 7.8】

c 复制代码
#include <stdio.h>

main()
{
    int i, j;
    char a[][5] = {{
                       'B',
                       'A',
                       'S',
                       'I',
                       'C',
                   },
                   {'d', 'B', 'A', 'S', 'E'}};
    for (i = 0; i <= 1; i++)
    {
        for (j = 0; j <= 4; j++)
            printf("%c", a[i][j]);
        printf("\n");
    }
}

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

7.3.5 字符数组的输入输出

【例 7.9】

c 复制代码
#include <stdio.h>

main()
{
    char c[] = "BASIC\ndBASE";
    printf("%s\n", c);
}

注意在本例的 printf 函数中,使用的格式字符串为"%s",表示输出的是一个字符串。

而在输出表列中给出数组名则可。不能写为:

printf("%s",c[]);

【例 7.10】

c 复制代码
#include <stdio.h>

main()
{
    char st[15];
    printf("input string:\n");
    scanf("%s", st);
    printf("%s\n", st);
}

【例 7.11】

c 复制代码
#include <stdio.h>

main()
{
    char st1[6], st2[6], st3[6], st4[6];
    printf("input string:\n");
    scanf("%s%s%s%s", st1, st2, st3, st4);
    printf("%s %s %s %s\n", st1, st2, st3, st4);
}

7.3.6 字符串处理函数

【例 7.12】

c 复制代码
#include "stdio.h"
main()
{
    char c[] = "BASIC\ndBASE";
    puts(c);
}

【例 7.13】

c 复制代码
#include "stdio.h"
main()
{
    char st[15];
    printf("input string:\n");
    gets(st);
    puts(st);
}

【例 7.14】

c 复制代码
#include "string.h"
main()
{
    static char st1[30] = "My name is ";
    int st2[10];
    printf("input your name:\n");
    gets(st2);
    strcat(st1, st2);
    puts(st1);
}

【例 7.15】

c 复制代码
#include "string.h"
main()
{
    char st1[15], st2[] = "C Language";
    strcpy(st1, st2);
    puts(st1);
    printf("\n");
}

【例 7.16】

c 复制代码
#include "string.h"
main()
{
    int k;
    static char st1[15], st2[] = "C Language";
    printf("input a string:\n");
    gets(st1);
    k = strcmp(st1, st2);
    if (k == 0)
        printf("st1=st2\n");
    if (k > 0)
        printf("st1>st2\n");
    if (k < 0)
        printf("st1<st2\n");
}

【例 7.17】

c 复制代码
#include "string.h"
main()
{
    int k;
    static char st[] = "C language";
    k = strlen(st);
    printf("The lenth of the string is %d\n", k);
}

7.4 程序举例

【例 7.18】把一个整数按大小顺序插入已排好序的数组中。

为了把一个数按大小插入已排好序的数组中,应首先确定排序是从大到小还是从小到大

进行的。设排序是从大到小进序的,则可把欲插入的数与数组中各数逐个比较,当找到第一

个比插入数小的元素 i 时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元

素为止,逐个后移一个单元。最后把插入数赋予元素 i 即可。如果被插入数比所有的元素值

都小则插入最后位置。

c 复制代码
#include "string.h"
main()
{
    int i, j, p, q, s, n, a[11] = {127, 3, 6, 28, 54, 68, 87, 105, 162, 18};
    for (i = 0; i < 10; i++)
    {
        p = i;
        q = a[i];
        for (j = i + 1; j < 10; j++)
            if (q < a[j])
            {
                p = j;
                q = a[j];
            }
        if (p != i)
        {
            s = a[i];
            a[i] = a[p];
            a[p] = s;
        }
        printf("%d ", a[i]);
    }
    printf("\ninput number:\n");
    scanf("%d", &n);
    for (i = 0; i < 10; i++)
        if (n > a[i])
        {
            for (s = 9; s >= i; s--)
                a[s + 1] = a[s];
            break;
        }
    a[i] = n;
    for (i = 0; i <= 10; i++)
        printf("%d ", a[i]);
    printf("\n");
}
	本程序首先对数组 a 中的 10 个数从大到小排序并输出排序结果。然后输入要插入的整

数 n。再用一个 for 语句把 n 和数组元素逐个比较,如果发现有 n>a[i]时,则由一个内循环

把 i 以下各元素值顺次后移一个单元。后移应从后向前进行(从 a[9]开始到 a[i]为止)。 后

移结束跳出外循环。插入点为 i,把 n 赋予 a[i]即可。 如所有的元素均大于被插入数,则

并未进行过后移工作。此时 i=10,结果是把 n 赋于 a[10]。最后一个循环输出插入数后的数

组各元素值。

程序运行时,输入数 47。从结果中可以看出 47 已插入到 54 和 28 之间。

【例 7.19】在二维数组 a 中选出各行最大的元素组成一个一维数组 b。
a=( 3 16 87 65
4 32 11 108
10 25 12 37)
b=(87 108 37)
本题的编程思路是,在数组 A 的每一行中寻找最大的元素,找到之后把该值赋予数组 B
相应的元素即可。程序如下:

c 复制代码
#include "string.h"
main()
{
    int a[][4] = {3, 16, 87, 65, 4, 32, 11, 108, 10, 25, 12, 27};
    int b[3], i, j, l;
    for (i = 0; i <= 2; i++)
    {
        l = a[i][0];
        for (j = 1; j <= 3; j++)
            if (a[i][j] > l)
                l = a[i][j];
        b[i] = l;
    }
    printf("\narray a:\n");
    for (i = 0; i <= 2; i++)
    {
        for (j = 0; j <= 3; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }
    printf("\narray b:\n");
    for (i = 0; i <= 2; i++)
        printf("%5d", b[i]);
    printf("\n");
}
	程序中第一个 for语句中又嵌套了一个 for语句组成了双重循环。外循环控制逐行处理,

并把每行的第 0 列元素赋予 l。进入内循环后,把 l 与后面各列元素比较,并把比 l 大者赋

予 l。内循环结束时 l 即为该行最大的元素,然后把 l 值赋予 b[i]。等外循环全部完成时,

数组 b 中已装入了 a 各行中的最大值。后面的两个 for 语句分别输出数组 a 和数组 b。

【例 7.20】输入五个国家的名称按字母顺序排列输出。
本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把
一个二维数组当成多个一维数组处理。 因此本题又可以按五个一维数组处理, 而每一个一
维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结
果即可。
编程如下:

c 复制代码
#include "string.h"
main()
{
    char st[20], cs[5][20];
    int i, j, p;
    printf("input country's name:\n");
    for (i = 0; i < 5; i++)
        gets(cs[i]);
    printf("\n");
    for (i = 0; i < 5; i++)
    {
        p = i;
        strcpy(st, cs[i]);
        for (j = i + 1; j < 5; j++)
            if (strcmp(cs[j], st) < 0)
            {
                p = j;
                strcpy(st, cs[j]);
            }
        if (p != i)
        {
            strcpy(st, cs[i]);
            strcpy(cs[i], cs[p]);
            strcpy(cs[p], st);
        }
        puts(cs[i]);
    }
    printf("\n");
}
	本程序的第一个 for 语句中,用 gets 函数输入五个国家名字符串。上面说过C语言允

许把一个二维数组按多个一维数组处理,本程序说明 cs[5][20]为二维字符数组,可分为五

个一维数组 cs[0],cs[1],cs[2],cs[3],cs[4]。因此在 gets 函数中使用 cs[i]是合法的。

在第二个 for 语句中又嵌套了一个 for 语句组成双重循环。这个双重循环完成按字母顺序排

序的工作。在外层循环中把字符数组 cs[i]中的国名字符串拷贝到数组 st 中,并把下标 i

赋予 P。进入内层循环后,把 st 与 cs[i]以后的各字符串作比较,若有比 st 小者则把该字

符串拷贝到 st 中,并把其下标赋予 p。内循环完成后如 p 不等于 i 说明有比 cs[i]更小的字

符串出现,因此交换 cs[i]和 st 的内容。至此已确定了数组 cs 的第 i 号元素的排序值。然

后输出该字符串。在外循环全部完成之后即完成全部排序和输出。

7.5 本章小结

1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组

以及后面将要介绍的指针数组,结构数组等。

2.数组可以是一维的,二维的或多维的。

3.数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又

称为下标变量。 数组的类型是指下标变量取值的类型。

4.对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。

对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行

操作。

相关推荐
小牛itbull6 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i15 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落18 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜27 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198731 分钟前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰35 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔37 分钟前
《线性代数的本质》
线性代数·算法·决策树
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis