《C语言程序设计-第七章数组.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计-第七章数组.ppt(65页珍藏版)》请在三一办公上搜索。
1、2023/11/7,信管教研室,1,第七章 数组,2023/11/7,信管教研室,2,什么构造类型?所谓构造类型是指由基本类型数据按一定的规则组成的,是用户自己按规则定义的。数组是构造类型之一。什么是数组?在数学中我们学过数列、矩阵的概念,数列通常表示为:a1、a2、a3、.、an,矩阵通常表示为:,2023/11/7,信管教研室,3,在C语言中表示数组的方法是:a0、a1、a2、a3、a4、a5;其中a:称为数组名。方括号中的数:称为下标。下标是一个数时,也就是数列,称为一维数组。下标是两个数时,也就是矩阵,称为二维数组。还有三维数组、四维数组等。,2023/11/7,信管教研室,4,例如:
2、有五名学生的一组学号:2004035012、2004035013、2004035014、2004035015、2004035016。如果用数组来表示的话可以用统一的数组名,比如 num,用下标区别每个变量。即 num0、num1、num2、num3、num4 表示一个学号数组。,2023/11/7,信管教研室,5,7.1 一维数组的定义和引用1、一维数组的定义定义方式:类型说明符 数组名常量表达式;,例 long num4;表示num数组包含五个元素,分别是:num0、num1、num2、num3、num4。注意:下标从 0 开始,数组元素取值类型是长整型。,定义数组中元素的取值类型,定义数组
3、中元素的个数,即数组长度。,数组名的命名规则和变量名相同,遵循标识符命名规则。常量表达式中可以包括常量和符号常量,不能包括变量。,2023/11/7,信管教研室,6,一维数组在内存的存储形式:num 就是数组存储区域的首地址,即 num=200。,一组变量,2023/11/7,信管教研室,7,2、一维数组的引用数组必须先定义,后使用;只能逐个引用数组元素,不能一次引用整个数组;数组元素表示形式:数组名下标。其中:下标可以是整型常量、变量或表达式。,例 int a10;scanf(“%d”,a);(),必须 int a10;for(j=0;j10;j+)scanf(“%d”,例如:int k=5
4、;a1、ak、a10-k 都是合法的。,2023/11/7,信管教研室,8,3、一维数组元素值的输入与输出例如:main()int i,a10;for(i=0;i10;i+)scanf(“%d”,一维数组元素的输出。,一维数组元素的输入。,2023/11/7,信管教研室,9,使用数组定义和数组元素时的几点注意:1、把数组定义时方括号中的数和元素下标值区别开。方括号中的数表示数组含有的元素个数;元素下标值是标识具体的数组元素的;方括号中的数不能是变量,只能是常量。2、数组元素的下标可以是常量,也可以是变量,其值必须是非负数,如果是小数,系统自动取整。3、数组必须先定义后使用。4、系统不检查数组元
5、素下标的越界问题。5、一维数组元素的输入、输出使用单层循环语句。,2023/11/7,信管教研室,10,4、一维数组的初始化,在定义数组时,为数组元素赋初值。(在编译阶段使之得到初值),当全部数组元素赋初值时,可不指定数组长度。,如 int a5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;如 int a3=6,2,3,5,1;(),只给部分数组元素赋初值。,int a=1,2,3,4,5,6;编译系统根据初值个数确定数组维数值。,int a5=1,2,3,4,5;等价于:a0=1;a1=2;a2=3;a3=4;a4=5;,初始化方式:,在定义数组时对数组元素赋予初值
6、。,2023/11/7,信管教研室,11,5、程序举例,例1 读10个整数存入数组,找出其中最大值和最小值。,步骤:1.输入:for循环输入10个整数;2.处理:(a)先令max=min=x0(b)依次用xi和max,min比较(循环)若maxxi,令min=xi3.输出:max和min。,#include#define SIZE 10void main()int xSIZE,i,max,min;printf(Enter 10 integers:n);for(i=0;ixi)min=xi;printf(Maximum value is%dn,max);printf(Minimum value
7、is%dn,min);,2023/11/7,信管教研室,12,例2 用数组求Fibonacci数列前20个数。,#include void 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(%12d,fi);,分析:定义一个含有20个元素的数组f,即int f20;其中f0=1,f1=1,fn=fn-1+fn-2(n2)用一个循环结构,让循环变量n从2到19,循环体为 fn=fn-1+fn-2 程序如右面所示:,2023/11/7,信管教研室,13,2023/
8、11/7,信管教研室,14,例3 用冒泡法对8个数排序(输入时数据无次序,输出按升序)。,排序过程:首先把八个数放到数组a9 中。a1=38、a2=49、a3=65、a4=76、a5=13、a6=27、a7=30、a8=97。(1)比较第一个数与第二个数,若为逆序a1a2,则交换值;然后比较第二个数与第三个数,若为逆序a2a3,则交换值;依次类推,直至第7个数和第8个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上,即在a8中。(2)对前7个数进行第二趟冒泡排序,结果使次大的数被安置在第7个元素位置,即在a7中。(3)重复上述过程,共经过7趟冒泡排序后,排序结束。,2023/1
9、1/7,信管教研室,15,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,2023/11/7,信管教研室,16,#include void main()int a11,i,j,t;printf(Input 10 numbers:n);for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(The sorted numbers:n);for(i=1;i11;i+)printf(%d,ai);,若有n个数,则要进行
10、n-1趟比较;在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j趟两两比较。,2023/11/7,信管教研室,17,7.2 二维数组及多维数组 一维数组通常是用来处理数列问题的。例如:a1、a2、a3、.、an、.可以用一维来表示。二维数组通常是用来处理矩阵问题的,例如下面的数表(矩阵):,2023/11/7,信管教研室,18,1、二维数组的定义定义方式:类型说明符数组名常量表达式常量表达式;,数组元素的存放顺序在内存中按行顺序存放。即先存第一行,接着存第二行,以此类推。例如:,例 int a34;float b25;int a3,4;(),行数,列数,元素个数=行数*列数,20
11、23/11/7,信管教研室,19,2、二维数组理解,由按上述定义的二维数组的方式(比如:int a34),我们可以把二维数组看成是一种特殊的一维数组,它的元素又是一维数组。例如,把a看成是一维数组,它有3个元素,分别是a0、a1、a2,每个元素又是一个包含4个元素的一维数组。如下表:,其中 a 是数组 a0、a1、a2 的数组名,而 a0是数组 a00、a01、a02、a03 的数组名 a1是数组 a10、a11、a12、a13的数组名 a2是数组 a20、a21、a22、a23的数组名,2023/11/7,信管教研室,20,3、二维数组元素的引用 形式:数组名下标下标4、二维数组的输入输出。
12、使用双层循环,例如:main()int a45,i,j;for(i=0;i=3;i+)for(j=0;j=4;j+)scanf(“%d”,输入,数据用空格或回车隔开。,输出,2023/11/7,信管教研室,21,5、二维数组元素的初始化分行初始化:,2023/11/7,信管教研室,22,5、二维数组元素的初始化分行初始化:,2023/11/7,信管教研室,23,5、二维数组元素的初始化分行初始化:,2023/11/7,信管教研室,24,5、二维数组元素的初始化按元素排列顺序初始化,2023/11/7,信管教研室,25,5、二维数组元素的初始化按元素排列顺序初始化,2023/11/7,信管教研室
13、,26,5、二维数组元素的初始化按元素排列顺序初始化,2023/11/7,信管教研室,27,程序举例,例 将二维数组行列元素互换,存到另一个数组中。,#include void main()int a23=1,2,3,4,5,6;int b32,i,j;printf(array a:n);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(%5d,aij);bji=aij;printf(n);,printf(array b:n);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(%5d,bij);printf(n);,2023/11/7,信管教研室
14、,28,例 求二维数组中最大元素值及其行列号。,#include void main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,row=0,colum=0,max;max=a00;for(i=0;imax)max=aij;row=i;colum=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);,2023/11/7,信管教研室,29,例 读入下表中值到数组,分别求各行、各列及表中所有数之和。,#include main()int x54,i,j;for(i=0;i4;i+)for(j=0;j3;j+)
15、scanf(%d,for(i=0;i5;i+)for(j=0;j4;j+)printf(%5dt,xij);printf(n);,2023/11/7,信管教研室,30,思考题:1、float a10;是一个定义一维数组的例子:理解 float、a、10 各部分的含义。2、下面定义哪一个是错的?为什么?1)#define N 10 2)int an;int aN;3、下面对数组元素的引用是否正确?为什么?a3.5、a3+5、a-5、int n=3;an+1。4、下面对一维数组的初始化是否正确?为什么?int a3=1,2,3、int a=1,2,3、int a3=1、int a3=1,2,3,4
16、5、为什么对一维数组赋值使用单层循环?6、下面对二维数组初始化是否正确?为什么?int a23=1,2、int a2=1,2,3,4,5,6、int a34=1,0,6,0,0,1,2023/11/7,信管教研室,31,参考程序:main()int a6,i,j,k;a1=1;printf(%3dn,a1);for(i=2;i=2;j-)aj=aj+aj-1;for(k=1;k=i;k+)printf(%3d,ak);printf(n);,11 11 2 11 3 3 11 4 6 4 1,功能:编程实现用一维数组实现杨辉三角形的打印。,2023/11/7,信管教研室,32,用筛选法求100之
17、内的素数。分析:3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50分别用 2,3,4,5,,7.07 即 2,3,4,5,6,7,2023/11/7,信管教研室,33,用筛法求100之内的素数。程序:#include main()int a101,j,k,n;for(j=1;j=100;j+)aj=j;for(j=2;j=sqrt(100);j+)for(k=j+1;k=10
18、0;k+)if(aj!=0,2023/11/7,信管教研室,34,矩阵主对角线的概念:,a11,a12,a13,a14,a21,a22,a23,a24,a31,a32,a33,a34,a41,a42,a44,主对角线,a43,2023/11/7,信管教研室,35,本次课的主要内容:1、字符数组的定义2、字符数组的初始化3、字符数组与字符串常量之间的关系4、字符数组(字符串常量)的输入输出5、字符串处理函数,2023/11/7,信管教研室,36,7.3 字符数组和字符串一、字符数组定义 字符数组的定义方法与前面讲过的类似。,二、字符数组的初始化,例 char c10,ch34;,例 char c
19、h5=H,e,l,l,o;,逐个字符赋值,1、逐个字符赋值,在内存中情况示意,字符是以ASCll码存的。,2023/11/7,信管教研室,37,初值个数小于数组长度,1、逐个字符赋值,2023/11/7,信管教研室,38,初值个数与预定数组长度相同,可省略数组长度。,1、逐个字符赋值,2023/11/7,信管教研室,39,2、用字符串常量,用字符串常量,系统自动加的字符串结束标记”0”。,2023/11/7,信管教研室,40,用字符串常量,2、用字符串常量,2023/11/7,信管教研室,41,char ch6=“Hello”;char ch6=“Hello”;char ch=H,e,l,l,
20、o,0;char ch=“Hello”;数组中有6个元素。char ch=h,e,l,l,o;数组中有5个元素。最后一个元素是o而不是0。,2023/11/7,信管教研室,42,例 char f7=A,p,p,l,e,O,r,a,n,g,e,G,r,a,p,e;也可以这样:char fruit7=“Apple”,“Orange”,“Grape”;,二维字符数组初始化,2023/11/7,信管教研室,43,三、字符数组的引用,例7.6 输出一个字符串#includevoid main()char c10=I,a,m,a,b,o,y;int i;for(i=0;i10;i+)printf(%c,c
21、i);printf(n);,2023/11/7,信管教研室,44,例7.7 输出一个菱形图 P142#includevoid main()char diamond5=,*,*,*,*,*,*,*,*;int i,j;for(i=0;i5;i+)for(j=0;j5;j+)printf(%c,diamondij);printf(n);,三、字符数组的引用,2023/11/7,信管教研室,45,四、字符串以及结束标记1、字符串及其结束标志字符串:双引号扩起来的一串字符。结束标志:0。2、无字符串变量,用字符数组处理字符串。,内存存放字符ASCII码,2023/11/7,信管教研室,46,五、一维字
22、符数组(字符串)的输入输出 使用函数 scanf 与 printf 1、整个字符串的输入与输出:格式符为:%s,例 用%s main()char str6;scanf(“%s”,str);printf(“%s”,str);,运行结果:输入:China 输出:China,用字符数组名,不要加&输入串长度数组长度,遇空格或回车结束,自动加0。,2023/11/7,信管教研室,47,2、逐个字符输入与输出:格式符为%c。,例 用%c main()char str5;int i;for(i=0;i5;i+)scanf(“%c”,运行结果:输入:abcde输出:abcde,2023/11/7,信管教研室
23、,48,例 main()char a5=H,e,l,l,o;printf(“%s”,a);,例 main()char a=“Hello”;printf(“%s”,a);,结果:Hello#-=*,结果:Hello,用“%s”输出时,遇0结束。,2023/11/7,信管教研室,49,例 字符串输入举例。,#include main()char a15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);scanf(%s,a);printf(a=%sn,a);,运行情况:输入:How are you?输出:a=How b=are c=yo
24、u?输入:How are you?输出:a=How,scanf中%s输入时,遇空格或回车结束。,2023/11/7,信管教研室,50,六、常用的字符串处理函数 包含在头文件 string.h,1、字符串输出函数 puts格式:puts(字符数组名)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以0结束。,例#include#include main()char str20=“How are you?”;puts(str);/*printf(“%sn”,str);*/,运行结果:输出:How are you?,2023/11/7,信管教研室,51,2、字符串输入函数 gets格式:g
25、ets(字符数组名)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加0。说明:输入串长度应小于字符数组长度。,例#include main()char str30;printf(“Input a string:”);gets(str);/*scanf(“%s”,str);*/puts(str);,输入:How are you?输出:How are you?,2023/11/7,信管教研室,52,3、字符串连接函数 strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面。说明:字符数组1必须足够大;连接前,两串均以0结束;连接后,串1的0取消,新
26、串最后加0。,例#include main()char a20=Turbo;char b=“C+”;strcat(a,b);printf(%sn,a);,输出结果:Turbo C+,2023/11/7,信管教研室,53,例 char str120,str220;str1=“Hello!”;()str2=str1;(),4、字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去。说明:字符数组1必须足够大;拷贝时0一同拷贝;不能使用赋值语句为一个字符数组赋值。,例:#include main()char a25;char b=“C+,c=Tur
27、bo;strcpy(a,c);strcat(a,b);printf(%sn,a);输出结果:Turbo C+,2023/11/7,信管教研室,54,5、字符串比较函数 strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串。比较规则:对两串从左向右逐个字符比较(ASCII码)直到遇到不同字符或0为止。返值:返回int型整数:a.若字符串1 字符串2,返回正整数;c.若字符串1=字符串2,返回零。说明:字符串比较不能用“=”,必须用 strcmp。,例如:比较:Hello!与 Hell0!H e l l o!H e l I 0!,2023/11/7,信管教研室,55,例#inc
28、lude#include main()char str1=“Hell0!”,str2=“Hello!”;if(strcmp(str1,str2)0)printf(“Hell0!Hello!”);else if(strcmp(str1,str2)=0)printf(“Hell0!=Hello!”);else printf(“Hell0!Hello!”);,输出结果:Hell0!Hello!,2023/11/7,信管教研室,56,6、字符串长度函数 strlen格式:strlen(字符数组)功能:计算字符串长度;返值:返回字符串实际长度,不包括0在内。,例:#include main()char
29、str1=”Hello!,str2=”How are you?”;int len1,len2;len1=strlen(str1);len2=strlen(str2);printf(“len1=%d len2=%dn”,len1,len2);,结果:len1=6 len2=12,2023/11/7,信管教研室,57,应用举例,例 1、输入一行字符,统计其中有多少个单词,单词之间用空格间隔。,单词的数目可以由空格出现的次数决定。如果测出某一个字符为非空格,而它的前面的字符是空格,则表示“新的单词开始了”,此时使num的值加1。如果当前字符为非空格而其前面的字符也是非空格,则意味着仍然是原来那个单词
30、的继续,num不应再累加1。前面一个字符是否空格可以从word的值看出来,若word等于0,则表示前一个字符是空格;如果word等于1,意味着前一个字符为非空格。num用来统计单词的个数,word作为判别是否单词的标志,若word=0表示未出现单词,如出现单词word就置成1。,2023/11/7,信管教研室,58,2023/11/7,信管教研室,59,流程图:,2023/11/7,信管教研室,60,#include void main()char string81;int i,num=0,word=0;char c;gets(string);for(i=0;(c=stringi)!=0;i+
31、)if(c=)word=0;else if(word=0)word=1;num+;printf(There are%d words in the linen,num);,2023/11/7,信管教研室,61,例2、有三个字符串,找出其中最大者。,定义三个一维字符数组 str120,str220,str320 定义部分:char str120,str220,str20,str 20;输入部分:scanf(“%s%s%s”,str1,str2,str3);比较部分:if(strcmp(str1,str2)0)strcpy(str,str1);else strcpy(str,str2);if(str
32、cmp(str3,str)0)strcpy(str,str3);输出部分:printf(“n the largest string is:%sn”,str);,2023/11/7,信管教研室,62,例 2、有三个字符串,找出其中最大者。,#include#include main()char string20,str320;int i;for(i=0;i0)strcpy(string,str0);else strcpy(string,str1);if(strcmp(str2,string)0)strcpy(string,str2);printf(nThe largest string is:n
33、%sn,string);,定义一个二维字符数组str320即 3行20列。每一行可以容纳20个字符。如下图:,2023/11/7,信管教研室,63,(在有序数组中插入一个数)main()int a11=1,4,6,9,13,16,19,28,40,100;int number,i,j;for(i=0;i a9)a10=number;else for(i=0;inumber)for(j=9;j=i;j-)aj+1=aj;ai=number;break;for(i=0;i11;i+)printf(%5d,ai);printf(n);,2023/11/7,信管教研室,64,#includevoid main()int num1=0,num2=0,num3=0,num4=0;char ch;ch=getchar();while(ch!=n)if(ch=a,2023/11/7,信管教研室,65,#includevoid main()float a11,sum=0,avg;int i;for(i=1;i=10;i+)scanf(%f,