C语言程序设计 利用数组处理批量数据

1 为什么要用数组

一组具有同一属性的数据,这一组数据就称为一个数组(array)。C语言规定用方括号中的数字来表示下标,如用s[15]表示s15。这样就把具有同一属性的若干个数据组织成为一个整体。
数据是有序数据的集合。
在C语言程序中常根据需要定义数组,并且用循环对数组中的元素进行操作。

2 怎么定义和引用一维数组

2.1 怎么定义一维数组

在定义数组时需要指定这批变量的类型、数组名称和数组中包含多少个元素(即变量)。例如:
int a[10];
它表示定义了一个整型数组,数组名为a,数组有10个元素。
定义一维数组的方式为:
类型符 数组名 [常量表达式];
使用说明:
(1)数组名的命名规则和变量名相同,遵循标识符命名规则。
(2)方括号中的常量表达式用来表示元素的个数,即数组长度。下标从0开始的。
(3)常量表达式中可以包括常量和符号变量,不能包含变量。例如:
在这里插入图片描述这是错误的。

2.2 怎么引用一维数组的元素

必须先定义数组,才能引用数组中的元素。只能住一个引用数组元素而不能一次引用整个数组中的全部元素。例如:
t=a[2];正确
printf("%d %d %d\n",a);错误

引用数组元素的表示形式:
数组名 [下标]
如:a[5]表示a数组中序号为5的元素。

下标可以是整型常量,也可以是整型表达式。例如:
a[2+3],a[2*3],a[7/3] 相当于a[5],a[6],a[2]。

例题:
引用数组元素。利用循环结构把数值0~9赋给数组a[0] ~a[9],然后按逆序输出各元素的值。
编写程序:
在这里插入图片描述
程序分析:
第一个for循环把数值0~9赋给数组a[0] ~a[9],当第一次执行循环时,i=0,所以a[0]=0,以此类推。
第二个for循环按逆序输出a数组中的10个元素,i的初值为9,因此先输出a[9],然后输出a[8],一直到a[0]。

2.3 一维数组的初始化

(1)在定义数组时对全部数组元素赋初值。例如:
在这里插入图片描述
将数组元素的初值依次放在一对大括号内,按顺序赋给相应的数组元素。即a[0]=0,a[1]=1,a[2]=2。
(2)可以只给一部分元素赋值。例如:
在这里插入图片描述
定义的数组a有5个元素,前面3个元素赋值,后5个元素的初值自动为0。
(3)在定义数组时不指定数组长度,系统会根据数据的数列确定数组长度。例如:
在这里插入图片描述
可以写成
在这里插入图片描述
大括号里面有5个数,系统就会根据此自动定义a数组的长度为5。

2.4 一维数组程序举例

用数组来处理求斐波那契数列问题。输出数列中前20个数。
思路:数列中的第一个数放在数组第一个的元素中,数列中的第二个数放在数组第二个的元素中…
数组序号为i的元素的值是其前两个元素值之和。
编写程序:
在这里插入图片描述
冒泡排序
一般形式:对n个数按升序排序。
原则:大的数字下沉,小的数字上升。
如果有n个数,则要进行n-1轮比较。在第一轮比较中进行n-1次两两比较,在第j轮比较中要进行n-j次的两两比较。
每经过一轮比较与交换,最小的数上升一位,最后升到第一个数。
例题:对9 8 5 4 2 0按升序排序。
分析:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
排序结果:
0 2 4 5 9
编写程序:
在这里插入图片描述
程序分析:

3 怎么定义和引用二维数组

3.1 怎么定义二维数组

定义二维数组,例如;
在这里插入图片描述
定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。
定义二维数组的一般形式:
类型名 数组名[常量表达式][常量表达式];
二维数组中元素排序的顺序是按行存放的,在内存中先存放第一行的元素,再存放第二行的元素。对a[3][4]数组存放顺序如下:(逻辑上的概念)
在这里插入图片描述
物理层上的概念图,如下:

在这里插入图片描述

3.2 怎么引用二维数组的元素

二维数组元素的表示形式为:
数组名[下标][下标]
下标可以是整型常量,也可以是整型表达式,如[2*1-1][1+1]
下标值不能超过数组大小的范围内。

3.3 二维数组的初始化

(1)分行给二维数组赋初值。如:
在这里插入图片描述
第1个大括号内的数据赋给第1行的元素,第2个大括号内的数据赋给第2行的元素…按行赋初值。
在这里插入图片描述
(2)可以将所有数据写在一个大括号内,按数组排列的顺序对各元素赋初值。例如:
在这里插入图片描述
写出一大片,容易漏,不易检查。
(3)对部分元素赋初值。例如:
在这里插入图片描述
在这里插入图片描述
(4)给全部元素都赋初值和第二维长度,系统自动算出第一维长度。例如:
在这里插入图片描述

在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例如:
在这里插入图片描述
这写法可以通知系统数组有3行,数组各元素为:
在这里插入图片描述

3.4 二维数组程序举例

将一个二维数组a的行和列的元素互换(即行列转置),存到另一个二维数组b中,例如:
在这里插入图片描述
解题思路:
将a数组中第i行j列元素赋给b数组中j行i列元素,例如a[0][0]赋给b[0][0],a[0][1]赋给b[1][0]…
在这里插入图片描述
用双层循环来处理,外层循环控制行的变化,内循环控制列的变化。
在这里插入图片描述

4 字符数组

用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。

4.1 怎么定义字符数组及对其初始化

把“ab c”一个4个字符(包括空格)存放在一个数组中,可以这样做:
在这里插入图片描述先定义数组c,然后用赋值语句将字符赋给字符数组中的元素。

还可以在定义字符数组时对各元素赋初值,即初始化。如:
在这里插入图片描述
把4个字符分别赋给c[0]~c[3]这4个元素。
在这里插入图片描述
如果初值个数小于数组长度,则将这些字符赋给数组中前面那些元素,区域的元素自动定为空字符(即’\0’)。例如:
在这里插入图片描述
数组状态如下:
在这里插入图片描述

系统会自动根据初值个数确定数组长度。例如:
在这里插入图片描述
数组c的长度自动定为10。这方法可以省去算数组的个数,比较方便。

4.2 怎么引用字符数组

可以引用字符数组中的某个元素,得到一个字符。
例题:输出一个菱形图。
编写程序:
在这里插入图片描述
分析:
在定义字符数组d时没有指定行数,是因为在赋初值中已用了5个大括号,表明赋给5行中的元素,因此在定义字符数时不必指定行数,系统会自顶定义词数组为5行5列。

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

系统在处理字符串常量时会自动加一个\0作为结束符,在遇到字符\0时,表示字符串结束。在程序中往往依靠检测\0的位置来判定字符串是否结束。
\0代表ASCII码为0的字符,ASCII码为0的字符是一个“空操作符”,即它什么也不做,只是一个辨别的标志。
例如:
输出一个字符串。
在这里插入图片描述
系统自动在最后一个字符\n的后面加一个\0作为字符串标志,遇到\0就停止输出。

用字符常量来使字符数组初始化。例如:
在这里插入图片描述
等价于
在这里插入图片描述

4.4 怎么进行字符数组的输入输出

输入输出可以有两种方法。
(1)逐个字符输入输出。用格式声明%c输入或输出一个字符。
(2)将整个字符串一次输入或输出。用格式声明%s,意思是对字符串的输入输出。例如:
在这里插入图片描述
在内存中数组c的状态如下:
在这里插入图片描述

使用说明:
(1)输出字符不包括结束符\0。
(2)用%s格式符输出字符串时,printf函数中输出项是字符数组名,不是数组元素名。
(3)如果数组长度大于字符串的实际长度,也只输出到遇\0结束。例如:
在这里插入图片描述
也只输出字符串的有效字符“abc”,而不是输出10个字符,这就是用字符串结束标志的好处。
(4)如果哟个字符数组中包含一个以上\0,则遇到第一个\0时输出就结束了。
(5)可以用scanf函数输入一个字符串。例如:
在这里插入图片描述
输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。
如果利用一个scanf函数输入多个字符串则在输入时以空格分隔。例如:
在这里插入图片描述
输入数据:
Are you ok?
输入后str1,str2,str3数组状态如下图。
在这里插入图片描述
(6)scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组的起始地址。下面写法错误:
在这里插入图片描述
(7)如果想知道数组str在内存中的起始地址,可以用以下输出语句:
在这里插入图片描述
用十进制数形式表示的数组str的起始地址。
(8)如果以下输出语句:
在这里插入图片描述
按数组字符数组名str找到str数组的起始地址,然后逐个输出其中的字符,直到遇\0为止。

4.5 字符串处理函数

在这里插入图片描述

4.6 字符数组应用举例

有3个字符串,“China”,“Japan”,“India”要求找出其中“最大”者。
“大”者是指ASCII代码较大的那个字符。例如:字符‘B’大于字符‘A’,字符‘a’大于字符‘A’。如果是字符串,则冲第一个字符开始一一进行比较,如果第一个字符相同,就比较下一个字符,直到出现不同为止。如果字符串中都是英文,按字母表的排序,字母表中位置在后的为大,例如“then”<“they”。
思路:
定义二维字符数组,大小为3×10,有3行10列,每一列可以容纳10个字符(包括最后的结束符\0)。二维数组的情况如下:
在这里插入图片描述
编写程序:
在这里插入图片描述
分析:
在使用字符串函数时在本程序的开头要用#include <string.h>。
空格字符参加比较,它“大于”任何字母字符。

5 提高部分

5.1 为什么在定义二维数组时采用两对双括号的形式

定义二维数组,例如;
在这里插入图片描述
定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。
好处:
是的二维数组可被看作是一种特殊的一维数组,a包括3个元素,每个元素又是一个包含4个元素的一维数组。上面定义的二维数可以理解为定义了3个一维数组,相当于:
在这里插入图片描述
a[0]、a[1]、a[2]看作一维数组名。表示一维数组a[0]包含4个元素。

5.2 对C的字符串函数的详细说明

5.2.1 gets函数(读入字符串函数)

作用是从终端输入一个字符串到字符数组。执行函数:gets(str)
从键盘输入:abc
将输入的字符串"abc"送给字符数组str(注意,送给数组的共有4个字符)。

5.2.2 puts函数(输出字符串函数)

puts函数一般形式为:puts(字符数组);
其作用是将一个字符串(以’\0‘结束的字符序列)输出到终端。
在这里插入图片描述
用puts函数输出的字符串中可以包含转义字符。例如:
在这里插入图片描述

5.2.3 strcat函数(字符串连接函数)

strcat函数一般形式为:
strcat(字符数组1,字符数组2)
strcat是STRing CATenate(字符串连接)的缩写。其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,把结果放在字符数组1。例如:
在这里插入图片描述
说明:
(1)字符数组1的长度必须足够大,以便容纳连接后的新字符串。
(2)连接前两个字符串的后面都有’\0’,连接时将字符串1后面的’\0’取消了,只在连接后的字符串保留’\0’。

5.2.4 strcpy函数(字符串复制函数)

strcpy函数一般形式:
strcpy(字符串数组1,字符串2)
strcpy是STRing CoPY(字符串复制)的简写。作用是将字符串2复制到字符数组1中去。例如:
在这里插入图片描述
执行后,c的状态如下:
在这里插入图片描述
说明:
(1)字符数组1的长度不应小于字符串2的长度。
(2)字符数组1必须写成数组名形式(如c1),字符串2可以是字符数组名,也可以是一个字符串常量。例如:
在这里插入图片描述
(3)不能用赋值语句将一个字符常量或字符数组直接给一个字符数组。如:
在这里插入图片描述是错误写法。
(4)可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。例如:
在这里插入图片描述
作用是将str2中最前面2个字符复制到str1中,期待str1中原有的最前面2个字符。但复制的字符个数n不应多于str1中原有的字符(不包括\0)。

5.2.5 strcmp函数(字符串比较函数)

strcmp函数一般形式为:
strcmp(字符串1,字符串2)
strcmp是STRing CoMPare(字符比较)的缩写。它的作用是比较字符串1和字符串2。例如:

字符串比较规则:对于两个字符串自左向右追个字符相比(按ASCII码值大小比较),指导出现不同的字符或遇到’\0’为止。如果全部字符相同,则认为相等;若出现不同的字符,则以第一个不相同的字符的比较结果为准。
如果参加比较的两个字符串有英文字母组成,则按照在英文字典中位置在后面的为“大”。例如:“then”<“they”。
但应注意小写字母比大写字母“大”。
比较的结果由函数值带回。
(1)如果字符串1=字符串2,则函数值为0。
(2)如果字符串1>字符串2,则函数值为一个正整数。
(3)如果字符串1<字符串2,则函数值为一个负整数。
两个字符串比较,只能有strcmp函数。

5.2.6 strlen函数(测字符串长度函数)

strlen函数一般形式:
strlen(字符数组)
strlen是STRing LENgth(字符串长度)的缩写,作用是量出字符串长度的函数,函数值为字符串中的实际长度(不包括’\0’在内)。例如:
在这里插入图片描述
输出为3,不是8,也不是4。

5.2.7 strlwr函数(转换为小写字符函数)

strlwr函数的一般形式:
strlwr(字符串)
strlwr是STRing LoWeRcase(字符串小写)的缩写。作用是将字符串中大写字母换成小写字母。
在这里插入图片描述

5.2.8 strupr函数(转换大写字符函数)

strupr函数的一般形式:
strupr(字符串)
strupr是STRing UPpeRcase(字符串大写)的缩写。作用是将字符串中小写字母换成大写字母。
在这里插入图片描述

6 小结

数组时有序数据的集合。
定义数组要特别注意“下标越界”问题。
区别定义数组和数组元素的引用形式。
二维数组的元素的排列次序为“按行排列”。在对二维数组初始化时,按行赋初值。
字符串是以字符数组形式存放的。
\0不是字符串的组成部分,是字符串结束标志。
对字符串的运算要通过字符串函数来进行。使用字符串函数时,必须在本程序的开头用#include<string.h>。
数组的名字代表数组首元素的地址,不是代表数组中的全部元素的值。

猜你喜欢

转载自blog.csdn.net/qq_45059457/article/details/113926813
今日推荐