第六章 数组教学课件.pptx
第6章 数组目录CONTENTS数组的概念一维数组二维数组字符数组与字符串6.16.26.36.4 数组的概念6.1 数组的概念01可以可以对大量的同类型的数据进行处理对大量的同类型的数据进行处理。数组数组:若干个具有相同数据类型的数据的有序集合。:若干个具有相同数据类型的数据的有序集合。数组元素数组元素:数组中的每一个数据称为数组元素。数组中的:数组中的每一个数据称为数组元素。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,所以也称为下标变量。单个变量使用,所以也称为下标变量。数组的下标数组的下标:是数组元素位置的一个索引或指示。:是数组元素位置的一个索引或指示。数组的概念01数组的类型数组的类型:数值数组、字符数组、指针数组、结构数组:数值数组、字符数组、指针数组、结构数组等。等。数组的维数数组的维数:数组元素下标的个数。根据数组的维数可以:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、多维数组。将数组分为一维、二维、多维数组。数组的概念01一维数组6.2 一维数组的定义一维数组的初始化一维数组元素的引用一维数组的存储一维数组的应用一维数组的定义01一般一般形式形式:类型说明符类型说明符 数组名数组名常量表达式常量表达式说明说明:u 类型说明符:类型说明符:每个元素的类型,可以每个元素的类型,可以是基本数据类型,也可以是构造是基本数据类型,也可以是构造数据类型、数据类型、指针;指针;u 数组名:数组名:数组的名字,数组的名字,命名规则遵循标识符命名命名规则遵循标识符命名规则;规则;u 常量表达式:常量表达式:表示数组中所包含的元素的个数,即数组的表示数组中所包含的元素的个数,即数组的长度;长度;u 相同相同类型的数组和变量可以在同一个类型说明符下一起说明,互相间类型的数组和变量可以在同一个类型说明符下一起说明,互相间用用”,”隔开;隔开;u 数组名不能与其它变量名数组名不能与其它变量名相同。相同。如:int a10; /*定义一个整型数组a,它有10个元素*/double b20; /*定义一个双精度型数组b,它有20个元素*/例1:int a5;int是类型说明符,数组元素数据类型为int型;a是数组名;5是常量表达式,数组元素的个数为5。例2:#define M 10char abcM-5;数组类型 数组名 数组元素个数charabc510一维数组的定义0111数组定义时下标要求:一维数组的定义01(1)不能越界;(2)只能是常量表达式;(3)首地址从0开始,n-1结束一维数组元素的引用02数组元素的一般形式数组元素的一般形式数组名数组名下标下标 下标表示了元素在数组中的顺序号,只能为整型常量或整下标表示了元素在数组中的顺序号,只能为整型常量或整型表达式。语言中,规定下标从型表达式。语言中,规定下标从0开始,对下标的上界未作开始,对下标的上界未作规定。例如,规定。例如,a5,ai+j,ai+都是合法的数组元素。都是合法的数组元素。(1)数组元素通常称为下标变量;(2)必须先定义才能使用下标变量;(3)只能逐个使用数组元素,不能一次引用整个数组。13一维数组元素的引用02例3: 下面程序输出结果是多少?14一维数组元素的引用02#include int main() int i,a10;for(i=0;i=0;i-) printf(“%d”,ai);return 0;输出结果: 987654321015例4:程序输出结果是多少?一维数组元素的引用02#include#define M 10int main()char abcM-5; int i; for(i=0;iM-5;i+) abci=A;printf(char abcM-5=);for(i=0;iM-6;i+) printf(%d,abci);printf(%dn,abcM-6);return 0;char abcM-5=65,65,65,65,65一维数组的初始化03概念:概念:在数组定义时给数组元素赋予初值。在数组定义时给数组元素赋予初值。一般一般形式形式:类型说明符类型说明符 数组名数组名常量表达式常量表达式=值值,值值,值值;例如:例如: int a10= 0,1,2,3,4,5,6,7,8,9 ; 相当于相当于 a0=0;a1=1.a9=9;数组初始化是在编译阶段进行的。这样将减数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。少运行时间,提高效率。说说 明明1、可以、可以只给部分元素赋初值。只给部分元素赋初值。例如:例如:int a10=0,1,2,3,4; 表示只给表示只给a0a45个元素赋值,而后个元素赋值,而后5个元素自动赋个元素自动赋0值值。2、只能给元素逐个赋值,不能给数组整体赋值。、只能给元素逐个赋值,不能给数组整体赋值。 例如:给十个元素全部赋例如:给十个元素全部赋1值,只能写为:值,只能写为: int a10=1,1,1,1,1,1,1,1,1,1;而不能写为:而不能写为: int a10=1;3、如、如给全部元素赋值,则在数组说明中,给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。可以不给出数组元素的个数。例如:例如: int a5=1,2,3,4,5;可写为:可写为: int a=1,2,3,4,5;4、当、当数组指定的元素个数小于初值的个数时,作语法错误处理。数组指定的元素个数小于初值的个数时,作语法错误处理。例如:例如:int a4=1,2,3,4,5; 是不合法的是不合法的。一维数组的初始化03一维数组的存储0402例如:例如: int a10; 空间为空间为 10*sizeof(int)。 double b20; 空间为空间为 20*sizeof(double)。 一维数组的各元素按下标的顺序依次存储在一片连续的存储空间中。一维数组的各元素按下标的顺序依次存储在一片连续的存储空间中。空间的大小与数组类型有关,为空间的大小与数组类型有关,为元素的个数乘以每一个元素所占的空间。元素的个数乘以每一个元素所占的空间。例5: 用数组求Fibonacci数列的前20项(每行输出5个数)。一维数组的应用05#include #include int main()int i;int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0) printf(n);printf(%6d,fi);system(pause);return 0; 信息科学与工程学院例6:输入1000个学生的成绩,输出高出平均成绩的成绩。#include #define SNUM 1000int main()int i,scoreSNUM,sum=0;float ave;printf(请输入学生成绩:n);for(i=0;iSNUM;i+)scanf(%d,&scorei);sum+=scorei;ave=(float)sum/SNUM;for(i=0;iave)printf(%d ,scorei);return 0;例7:输入10个整数,按从大到小的顺序输出。排序算法很多,如:比较排序法、选择排序法、冒泡排序法、快速排序法、插入排序法等。 比较排序法:比较排序法的基本思路是以第一个数据作为基点,将后面的所有数据与它进行比较,若不满足大小顺序关系就交换它们;再以第二个数据作为基点,将后面的所有数据与它进行比较,若不满足大小顺序关系就交换它们;.,最后以倒数第二个数据作为基点,将后面的数据与它进行比较,若不满足大小顺序关系就交换它们。 选择排序法:选择排序法的基本思路是以第一个数据作为基点,找出基点及其后面数据中最小的数据,将其与基点位置的数据交换;再以第二个数据作为基点,找出基点及其后面数据中最小的数据,将其与基点位置的数据交换;.最后以倒数第二个数据作为基点,找出基点及其后面数据中最小的数据,将其与基点位置的数据交换。 冒泡排序法:冒泡排序法的基本思路是将相邻的两个数比较,把小的调换到前面。一维数组的应用05下面是比较排序算法的程序。#include#define M 10int main() int i,j,k,aM;printf(请输入10个整数:n);for(i=0;iM;i+) /*通过for循环语句对数组a的各个元素赋值*/printf(请输入第%d个数:,i+1);scanf(%d,&ai); printf(排序前的数据是:n);for(i=0;iM;i+)printf(%d ,ai);for(i=0;iM-1;i+)for(j=i+1;jM;j+)if(aiaj)k=ai;ai=aj;aj=k;printf(n排序后的数据是:n);for(i=0;iM;i+)printf(%d ,ai);return 0; 一维数组的应用0523例8、将数字09存入一个整型数组a中,并输出。#include int main() int a10; int i; for(i=0;i10;i+) ai=i; printf(%d ,ai); printf(n); return 0;思考:将程序改写为先依次写入数字,再依次读出一维数组的应用05二维数组6.3 二维数组的定义二维数组的初始化二维数组元素的引用二维数组的存储二维数组的应用01例如:例如: int a34; 定义了定义了一个三行四列的数组,数组名为一个三行四列的数组,数组名为a,其下标变量,其下标变量的类型为整型。该数组的下标变量共有的类型为整型。该数组的下标变量共有34个。个。二维数组的定义一般形式一般形式类型说明符类型说明符 数组名数组名常量表达式常量表达式1常量表达式常量表达式2例如:例如: int a23; 其行下标最大值为其行下标最大值为1,列元素下标最大值为,列元素下标最大值为2。其数组元。其数组元素为:素为:a00、a01、a02、a10、a11、a12。二维数组元素的引用数组元素的一般形式数组元素的一般形式数组名数组名下标下标1 下标下标2; 下标下标1(行标)、下标(行标)、下标2(列标)可以是整型常量或整型(列标)可以是整型常量或整型表达式。表达式。02例如:例如:int a45;其元素的存储顺序为:其元素的存储顺序为:二维数组元素的存储 C语言规定,二维数组中的元素在存储时要先存放第一行的数据,再语言规定,二维数组中的元素在存储时要先存放第一行的数据,再存放第二行的数据等等,每行数据按下标规定的顺序由小到大的存放。存放第二行的数据等等,每行数据按下标规定的顺序由小到大的存放。032022年4月18日星期一信息科学与工程学院二维数组的初始化1、分行、分行给多维数组赋值。给多维数组赋值。int s34=1,2,3,4,5,6,7,8,9,10,11,12;2、按、按行连续赋初值。行连续赋初值。int s34=1,2,3,4,5,6,7,8,9,10,11,12;3、对、对全部元素赋值,可以省略第一维的长度。全部元素赋值,可以省略第一维的长度。int s4=1,2,3,4,5,6,7,8,9,10,11,12;4、可以、可以只对部分元素赋初值,未赋值的元素自动取只对部分元素赋初值,未赋值的元素自动取0值。值。int s 4=1,2,5,9,10;04二维数组的应用例例7 7:从从键盘上输入一个键盘上输入一个3 3行行3 3列矩阵的各个元素的值列矩阵的各个元素的值, , 然后输出主对角线元素之然后输出主对角线元素之和和。05#include int main() int a33;int i,j,sum=0;for(i=0;i3;i+) for(j=0;j3;j+)printf(请输入第%d行、第%d列的元素的值:,i+1,j+1);scanf(%d,&aij);for(i=0;i3;i+)sum=sum+aii;printf(主对角线元素之和是:%dn,sum);return 0;例例8: 求矩阵的转置。求矩阵的转置。转置前转置前转置后转置后#include #define M 3#define N 4int main()int aMN=1,2,3,4,5,6,7,8,9,10,11,12,bNM,i,j;printf(转置前的矩阵为:n);for(i=0;iM;i+)for(j=0;jN;j+) printf(%3d,aij);printf(n);for(i=0;iN;i+) /*求转置矩阵*/for(j=0;jM;j+) bij=aji;printf(转置后的矩阵为:n);for(i=0;iN;i+)for(j=0;jM;j+) printf(%3d,bij);printf(n);return 0;例例9:编程输出如图编程输出如图:所示的杨辉三角形(要求打印出所示的杨辉三角形(要求打印出10行)行)二维数组的应用05#include int main ()int yh1010;int i, j;for(i=0;i10;i+)yhi0=1;yhii=1;for(j=1;ji;j+)yhij=yhi-1j-1+yhi-1j;for(i=0;i10;i+)for(j=0;j=i;j+)printf(%4d,yhij);printf(n);return 0;二维数组的应用05字符数组与字符串6.4字符数组的定义与初始化字符数组的输入与输出字符串与字符串结束标志字符串处理函数1、字符数组的定义、字符数组的定义字符数组的定义与初始化01 要要处理大批量的同类型的数值数据,可使用数组进行存取及操作。处理大批量的同类型的数值数据,可使用数组进行存取及操作。 数据数据还包括非数值型数据。比如你的姓名、身份证号码、密码等。还包括非数值型数据。比如你的姓名、身份证号码、密码等。这种数据一般会有多个字符即这种数据一般会有多个字符即字符串字符串,那么又该如何对这些数据进行处,那么又该如何对这些数据进行处理?理? 仍然仍然使用数组来对它们存取及操作,不过此时我们称使用数组来对它们存取及操作,不过此时我们称存放字符型数存放字符型数据的数组为字符数组。据的数组为字符数组。即字符数组的每个元素也只能存放一个字符。即字符数组的每个元素也只能存放一个字符。 与数值数组定义类似,字符数组需要给出与数值数组定义类似,字符数组需要给出3个要素:类型、个要素:类型、数组名、数组长度。数组名、数组长度。 char 数组名数组名常量表达式常量表达式;如:如:char name20; char password64;2022年4月18日星期一37字符数组的定义与初始化01 char a5=C,h,i,n, a;把把5个字符分别赋给个字符分别赋给a0,a4。方式一:逐个方式一:逐个为数组中各元素指定初值字符。为数组中各元素指定初值字符。说明:说明:u若若字符个数少于元素个数,则对没有给出初值的数组元素,字符个数少于元素个数,则对没有给出初值的数组元素,系统自动对它们赋值系统自动对它们赋值0(或(或0)。)。u如果对全体元素赋初值,可以省略长度说明。如:如果对全体元素赋初值,可以省略长度说明。如: char b=C,h,i,n, a;系统系统认为认为b数组的长度或大小为数组的长度或大小为5。字符数组的定义与初始化012、字符数组的初始化、字符数组的初始化方式二:方式二: 用用字符串对字符数组进行初始化。字符串对字符数组进行初始化。char a=China;char a=China; 此时字符数组的实际大小为字符串的实际字符个数此时字符数组的实际大小为字符串的实际字符个数+1。因。因最后还有一个空字符最后还有一个空字符0,它称为字符串结束标志。,它称为字符串结束标志。a0a1a2a3a4a5China0字符数组的定义与初始化01在语言中没有专门的字符串变量,通常用一个字符数在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。组来存放一个字符串。当把一个字符串存入一个数组时,也把结束符当把一个字符串存入一个数组时,也把结束符0存入数存入数组,并以此作为该字符串是否结束的标志。组,并以此作为该字符串是否结束的标志。用字符串方式赋初值比用字符逐个赋初值要多占一个字用字符串方式赋初值比用字符逐个赋初值要多占一个字节,节, 用于存放字符串结束标志用于存放字符串结束标志0 字符数组的定义与初始化01例:给例:给字符数组赋值且输出。字符数组赋值且输出。字符数组的定义与初始化01#include int main() int i; char str=I like C language; for(i=0;i17;i+)printf(%c,stri); printf(n); return 0;对字符数组进行初始化对字符数组进行初始化字符串和字符串结束标志在在语言中没有专门的字符串变量,通常用一个字符数组来存放语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。一个字符串。当当把一个字符串存入一个数组时,也把结束符把一个字符串存入一个数组时,也把结束符0存入数组,并存入数组,并以此作为该字符串是否结束的标志。以此作为该字符串是否结束的标志。用用字符串方式赋初值比用字符逐个赋初值要多占一个字节,字符串方式赋初值比用字符逐个赋初值要多占一个字节, 用用于存放字符串结束标志于存放字符串结束标志0 02字符数组的输入输出1、字符数组的输出、字符数组的输出要要将字符数组的内容显示出来,有将字符数组的内容显示出来,有两种方法两种方法:u 按按%c的格式的格式:用用printf()函数将数组元素一个函数将数组元素一个 一一 个输出到屏幕。个输出到屏幕。u 按按%s的格式的格式:用用printf()函数将数组中的内容按字符串的方式输出到屏函数将数组中的内容按字符串的方式输出到屏幕(要判断幕(要判断0字符)字符)。注意注意:系统在输出时只在遇到:系统在输出时只在遇到0字符时才停止输出,否则,即使输出字符时才停止输出,否则,即使输出的内容已经超出数组的长度也不会停止输出的。的内容已经超出数组的长度也不会停止输出的。032、字符数组的输入、字符数组的输入 从从键盘对字符数组赋值,有键盘对字符数组赋值,有两种方法两种方法:u 按按%c的格式的格式:用循环和用循环和scanf()函数读入键盘输入的数据函数读入键盘输入的数据u 按按%s的格式的格式:通过通过scanf()函数来进行字符串的输入。如:函数来进行字符串的输入。如:scanf(%s,a);注意注意:输入时,在遇到分隔符时认为字符串输入完毕:输入时,在遇到分隔符时认为字符串输入完毕,并将分隔符前面的并将分隔符前面的字符后加一个字符后加一个0字符一并存入数组中字符一并存入数组中。字符数组的输入输出03字符串处理函数1、字符数组输入输出函数、字符数组输入输出函数scanf和和printf函数在字符串的使用函数在字符串的使用输入字符串函数输入字符串函数getsgets(字符数组)(字符数组)输出字符串函数输出字符串函数putsputs(字符数组)(字符数组)04说说 明:明:u gets、puts中在被使用时,须包含头文件中在被使用时,须包含头文件 。u 在用在用gets函数输入字符串时,只有按回车键才认为是输入结束。函数输入字符串时,只有按回车键才认为是输入结束。u 在用在用puts函数输出字符串时,遇函数输出字符串时,遇0结束结束。例:从例:从键盘输入键盘输入一个字符串到字符数组一个字符串到字符数组s,并将字符串,并将字符串s输出输出到屏幕。到屏幕。字符串处理函数04输出字符串输出字符串s到屏幕到屏幕#include stdio.hint main() char s80; gets(s); puts(s); return 0; 从键盘输入从键盘输入字符串到字符数组字符串到字符数组s中中2、字符串拷贝函数、字符串拷贝函数strcpy格式:格式:strcpy (字符数组名字符数组名1,字符数组名,字符数组名2)功能:功能:把字符数组把字符数组2中的字符串拷贝到字符数组中的字符串拷贝到字符数组1中。串结中。串结束标志束标志0也一同拷贝。也一同拷贝。要注意的问题:要注意的问题:字符数组字符数组1的长度必须足够大,以便能容纳字符数组的长度必须足够大,以便能容纳字符数组2中中的字符串。的字符串。字符数组名字符数组名2,也可以是一个字符串常量。如,也可以是一个字符串常量。如strcpy(strl, C Language)复制时连同字符串后面的复制时连同字符串后面的 0 一起复制到字符数组一起复制到字符数组1中中例:将例:将一个字符串复制到另外一个字符串中。一个字符串复制到另外一个字符串中。#include #includestring.hint main() static char str115,str2=C Language; strcpy(str1,str2); puts(str1); printf(n); return 0;字符串处理函数043、字符串连接函数、字符串连接函数strcat格式:格式:strcat (字符数组名字符数组名1,字符数组名,字符数组名2)功能:功能:把字符数组把字符数组2中的字符串连接到字符数组中的字符串连接到字符数组1 中字符串的中字符串的后面,并删去字符串后面,并删去字符串1后的串标志后的串标志0。要注意的问题:要注意的问题:字符数组字符数组str1的长度必须足够大,以便能容纳被连接的字的长度必须足够大,以便能容纳被连接的字符串符串str2。连接后系统将自动取消字符串连接后系统将自动取消字符串1后面的结束符后面的结束符0,只在,只在新串最后保留一个新串最后保留一个0。例:将例:将一个字符串连接到另外一个字符串中。一个字符串连接到另外一个字符串中。字符串处理函数04#include #includestring.hint main() char str150=Hello; char str2 =everyone; strcat(str1,str2); puts(str1); return 0;4、字符串比较函数、字符串比较函数strcmp格式:格式:strcmp (字符数组名字符数组名1,字符数组名,字符数组名2)功能:功能:按照按照ASCII码顺序比较两个数组中的字符串,并由函数返回码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。值返回比较结果。字符串字符串1=字符串字符串2,返回值返回值0 字符串字符串2字符串字符串2,返回值返回值0字符串字符串1字符串字符串2,返回值返回值0注意:注意:执行这个函数时,自左到右逐个比较对应字符的执行这个函数时,自左到右逐个比较对应字符的ASCII码值,直码值,直到发现了不同字符或字符串结束符到发现了不同字符或字符串结束符0为止。为止。对字符串不能用数值型比较符。对字符串不能用数值型比较符。字符串比较不能用以下形式字符串比较不能用以下形式 if(str1= =str2) printf(yes);例:输入例:输入5个字符串,将其中最大的字符串输出。个字符串,将其中最大的字符串输出。#include #include int main() char str10,temp10; int i; gets(temp); for(i=0;i4;i+) gets(str); if(strcmp(temp,str)0)strcpy(temp,str); printf(最大的字符串是: %s,temp); return 0;字符串处理函数045、测字符串的长度函数、测字符串的长度函数strlen格式:格式:strlen(字符数组名字符数组名)功能:功能:测字符串的实际长度测字符串的实际长度(不含字符串结束标志不含字符串结束标志0) 并并作为函数返回值。作为函数返回值。 字符串处理函数04例:输入例:输入5个字符串,将其中最长的字符串输出。个字符串,将其中最长的字符串输出。#include #include int main() char str50,temp50; int i,len; gets(str); len=strlen(str); for(i=0;ilen)strcpy(str,temp); printf(最长的字符串是: %s,str); return 0;字符串处理函数04