《第 7 章数组.ppt》由会员分享,可在线阅读,更多相关《第 7 章数组.ppt(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 7 章 数 组 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望【教学目标教学目标】1)熟练掌握数组的定义,元素引用,典型算法)熟练掌握数组的定义,元素引用,典型算法2)结合前面循环有关章节,灵活使用各种排序算法)结合前面循环有关章节,灵活使用各种排序算法3)明确数组元素的存储方式)明确数组元素的存储方式【要点重点要点重点】数组名、数组元素、下标边界、排序的实现数组名、数组元素、下标边界、排序的实现基本概念:基本概念:u数组:数组:就是同类型数据的集合。为构造数
2、据类型之一就是同类型数据的集合。为构造数据类型之一u数组名:数组名:为该数据集合起的一个名字为该数据集合起的一个名字 。u数组元素:数组元素:该集合的各数据项。属同一数据类型该集合的各数据项。属同一数据类型,用数用数组名和组名和下标下标确定确定1,5,9,26,18,335XX0X2X4X5数组元素数组元素数组名数组名n7.1.1 一维数组的定义n定义方式:数据类型数据类型 数组名数组名 常量常量表达式表达式;7.1 一维数组的定义和引用 合法标识符表示元素个数下标从下标从0开始开始定义时不能定义时不能为变量为变量:数组运算符优先级(1)左结合,不能用()a00145a1a2a3a4a523a
3、数组名数组名表示内存首表示内存首地址,是地址,是地址常量地址常量例例 int data5;data5=10;/C语言对数组不作越界检查,使用时要注意语言对数组不作越界检查,使用时要注意例例int i=15;int datai;(不能用变量定义数组维数不能用变量定义数组维数)例例 int a6;定义时分配连续的内存定义时分配连续的内存空间给空间给a数组,每个元素数组,每个元素空间大小一致空间大小一致n7.1.2 一维数组的引用n数组必须先定义,后使用先定义,后使用n只能逐个引用数组元素逐个引用数组元素,不能一次引用整个数组.数组元素的引用与同类型的一般变量使用方式一样。n例例int a10;np
4、rintf(“%d”,a);(这是不合法的这是不合法的)n数组元素表示形式:数组名数组名下标下标n注意:下标从注意:下标从0开始开始,其中:下标可以是常量或整型表达式下标可以是常量或整型表达式n当逐个使用数组中的每一个元素时,常借助for循环语句。int i,a10;for(i=0;i=0;i-)printf(“%2d”,ai);9 8 7 6 5 4 3 2 1 0n7.1.3 一维数组的初始化n初始化是指在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)n初始化方式 n说明:n数组不初始化,其元素值为随机数n对static数组元素不赋初值,系统会自动赋以0值;如:static int
5、 a5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;n可以只给部分数组元素赋初值,其余的自动赋以0值,如:int a10=0,1,2,3,4;n要想使数组中全部元素数据为要想使数组中全部元素数据为0,则采用如下形式,则采用如下形式:int a10=0;n当全部数组元素赋初值时,可不指定数组长度当全部数组元素赋初值时,可不指定数组长度,如:int a=0,1,2,3,4;编译系统根据初值个数确定数组长度。int a5=1,2,3,4,5;效果上等价于:a0=1;a1=2;a2=3;a3=4;a4=5;例例1.读读10个整数存入数组,找出其中最大值和最小值个整数存入数组,找出其中最大
6、值和最小值步骤步骤:1.输入输入:for循环输入循环输入10个整数个整数2.处理处理:(a)先令先令max=min=x0(b)依次用依次用xi和和max,min比较比较(循环循环)若若maxxi,令令min=xi3.输出输出:max和和min/*ch7-1-1.c*/#include#define SIZE 10main()int xSIZE,i,max,min;printf(Enter 10 integers:n);for(i=0;i=SIZE-1;i+)printf(%d:,i+1);scanf(%d,&xi);max=min=x0;for(i=1;i=SIZE-1;i+)if(maxxi
7、)min=xi;printf(Maximum value is%dn,max);printf(Minimum value is%dn,min);7.1.4 一维数组程序举例一维数组程序举例例例2.用数组求用数组求Fibonacci数列:数列:1,1,2,3,5,8,前前20个数。个数。F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n3)f0f1f2f3f4f5f19.11f1901452319235/*ch7-2.c*/#include main()int i;int f20=1,1;for(i=2;i=19;i+)fi=fi-2+fi-1;for(i=0;ia1,则交,则交换
8、;然后比较第二个数与第三个数;依次类推,直至换;然后比较第二个数与第三个数;依次类推,直至第第n-1个数和第个数和第n个数比较为止个数比较为止第一趟冒泡排序第一趟冒泡排序,结果结果最大最大的数被安置在最后一个元素位置上(的数被安置在最后一个元素位置上(第一个第一个最大的泡泡冒出最大的泡泡冒出)(2)对前)对前n-1个数进行第二趟冒泡排序,结果使个数进行第二趟冒泡排序,结果使次大次大的数被的数被安置在第安置在第n-1个元素位置个元素位置(3)重复上述过程,共经过)重复上述过程,共经过n-1趟冒泡排序后,排序结束趟冒泡排序后,排序结束49 38 65 97 76 13 27 0 初始序列初始序列
9、n=84938aiai+1 交换元素交换元素ii=0384949 38 65 97 76 13 27 30 初始序列初始序列 n=8例子:例子:38 49 65 97 76 13 27 30 n=84965aiai+1 保持元素保持元素ii=1496538 49 65 97 76 13 27 30i=238 49 65 76 97 13 27 30i=338 49 65 76 13 97 27 30i=438 49 65 76 13 27 97 30i=538 49 65 76 13 27 30 97i=638 49 65 76 13 27 30 n=73849aiai+1真真假假aiai+1
10、输出输出a0 到到 an-1/*ch7-3.c*/#include main()int a10,i,j,t;printf(Input 10 numbers:n);for(i=0;i=9;i+)scanf(%d,&ai);printf(n);for(j=0;j=8;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;printf(The sorted numbers:n);for(i=0;i=9;i+)printf(%d,ai);printf(n);冒泡排序具体实现:选择排序过程:选择排序过程:(1 1)首先通过)首先通过n-1n-1次比较,从次比较,从n n个数中找出最小
11、的,将它与个数中找出最小的,将它与第一个数交换第一个数交换-第一趟选择排序第一趟选择排序,结果,结果最小最小的数被的数被安置在第一个元素位置上安置在第一个元素位置上(2 2)再通过)再通过n-2n-2次比较,从剩余的次比较,从剩余的n-1n-1个数中找出关键字个数中找出关键字次次小小的记录,将它与第二个数交换的记录,将它与第二个数交换-第二趟选择排序第二趟选择排序(3 3)重复上述过程,共经过)重复上述过程,共经过n-1n-1趟排序后,排序结束趟排序后,排序结束思考:和冒泡排序的差别。思考:和冒泡排序的差别。例例4.用简单选择法对用简单选择法对10个数排序个数排序 例初始:4938659776
12、1327kji=11349一趟:13386597764927i=22738二趟:13276597764938三趟:13273897764965四趟:13273849769765五趟:13273849659776六趟:13273849657697kkkkjjjjjjjjjj输入输入n个数给个数给a0到到an-1for i=0 to n-2for j=i+1 to n-1ajak真真假假k=j输出输出a0 到到 an-1k=iaiaki!=k真真假假/*ch7-3-1.c*/#include main()int a10,i,j,k,x;printf(Input 10 numbers:n);for(
13、i=0;i=9=9;i+)scanf(%d,&ai);printf(n);for(i=0;i=8=8;i+)k=i;/记录最小的数所在的位置记录最小的数所在的位置 for(j=i+1;j=9;j+)if(aj ak)k=j;if(i!=k)x=ai;ai=ak;ak=x;printf(The sorted numbers:n);for(i=0;i=9=9;i+)printf(%d,ai);选择排序具体实现:/例:两个数组相加例:两个数组相加对应元素相加对应元素相加#define N 6main()int aN,bB-60,c=1,2,3,4,5,6,i;for(i=0;iN;i+)scanf(
14、%d%d,&ai,&bi);for(i=0;i=N-1;i+)printf(%d,ai);printf(n);for(i=0;i=N-1;i+)printf(%d,bi);printf(n);for(i=0;i=N-1;i+)ci=ai+bN-i-1;for(i=0;i=N-1;i+)printf(%d ,ci);数组定义:必须用常量表达式数组元素引用u定义方式:定义方式:数据类型数组名数据类型数组名常量表达式常量表达式常量表达式常量表达式;u数组元素的存放顺序数组元素的存放顺序原因原因:内存是一维的内存是一维的二维数组:按行序优先二维数组:按行序优先多维数组:最右下标变化最快多维数组:最右下
15、标变化最快例例 int a34;float b25;int c234;int a3,4;()行数行数列数列数元素个数元素个数=行数行数*列数列数int a32014523a00a01 a10a11a20a217.2 二维数组的定义和引用二维数组的定义和引用 int c23401234567 7.20212223c000c001c002c003c010c011c012c013c020c021c022c023c100c101c102c103c110c111c112c113c120c121c122c1237.2.1 二维数组的定义二维数组的定义aa2 211aa2 200aa1 111aa1 100
16、a01a01a00a00例例 int a34;2008920101120121320141520001200232004520067a00a01a02a03a10a11a12a13a20a21a22a23u二维数组理解二维数组理解 0 1 4 5 2 3a01a02a03a10a11a00a13a20a21a22a23a12 6 71011 8 9 a0a1a2行名每个元素ai由包含4个元素的一维数组组成二维数组a是由3个元素组成a0a1a2 例 int a23=1,2,3,4,5,6;a00a01a02a10a11a12123456全部初始化u按元素排列顺序初始化按元素排列顺序初始化 例 i
17、nt a23=1,2,4;a00a01a02a10a11a12120400部分初始化 例 int a3=1,4,5;a00a01a02a10a11a12100450第一维长度省略初始化 例 int a23=1,2,3,4,5,6;a00a01a02a10a11a12123456全部初始化 例 int a23=1,2,4;a00a01a02a10a11a12124000部分初始化 例 int a3=1,2,3,4,5;a00a01a02a10a11a12123450第一维长度省略初始化u引用形式:引用形式:数组名数组名下标下标 下标下标7.2.3 二维数组元素的初始化二维数组元素的初始化u分行初
18、始化:分行初始化:7.2.2 二维数组的引用二维数组的引用例例5.将二维数组行列元素互换,将二维数组行列元素互换,存到另一个二维数组中存到另一个二维数组中a=123456b=142536/*ch7-4.c*/#include 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;jmax真真假假max=aijrow=icolum=
19、j输出:输出:max和和row,colum/*ch7-5.c*/#include 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;i=2;i+)for(j=0;jmax)max=aij;row=i;colum=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);例例 求二维数组中最大元素值及其行列号求二维数组中最大元素值及其行列号12 4 615 7 9 8 23 3 2 5 1712 4 6 2215 7 9 31 8 23 3
20、34 2 5 17 2437 39 35 111/*ch7-5-1.c*/#include main()int x54,i,j;for(i=0;i=3;i+)for(j=0;j=2;j+)scanf(“%d”,&xij);/最后一列不输入最后一列不输入 for(i=0;i=2;i+)x4i=0;for(j=0;j=4;j+)xj3=0;for(i=0;i=3;i+)for(j=0;j=2;j+)xi3+=xij;x4j+=xij;x43+=xij;for(i=0;i=4;i+)for(j=0;j=3;j+)printf(%5dt,xij);printf(n);例例6.读入下表中值到数组,分别求
21、各行、各列及表读入下表中值到数组,分别求各行、各列及表中所有数之和中所有数之和 例例 char ch5=B,o,y;ch0Boy00逐个字符赋值逐个字符赋值ch1ch2ch3ch4 例例 char ch5=“Boy”;ch0Boy00用字符串常量用字符串常量ch1ch2ch3ch4 例例 char ch6=“Hello”;char ch6=“Hello”;char ch=“Hello”;用字符串常量用字符串常量ch0Helloch1ch2ch3ch40ch5 例例 char ch5=H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3ch47.3.1 7.3.1 字符
22、数组的定义字符数组的定义u定义定义 char c10,ch34;7.3.2 7.3.2 字符数组的初始化字符数组的初始化u逐个字符赋值逐个字符赋值 例例 char ch5=H,e,l,l,o;注:如果初值个数小于数组长度,其余的元素自动定为空字符注:如果初值个数小于数组长度,其余的元素自动定为空字符(0)u用字符串常量用字符串常量例例 char ch6=“Hello”;u自动加上空字符(自动加上空字符(0),长度增加长度增加1,所以定义时长度要主动增加,所以定义时长度要主动增加17.3 7.3 字符数组字符数组 例例 char fruit7=“Apple”,”Orange”,”Grape”,”
23、Pear”,”Peach”;二维字符数组初始化二维字符数组初始化fruit0fruit1fruit2fruit3fruit4Apple00Orange0Grape00Pear000Peach00例例 char diamond5=.,.,*,.,*,.,*,*,.,.,.,*,.,*,.,*,.,.,*;二维字符数组初始化二维字符数组初始化.*00.*.*0*.*.*.*0.*00diamond0diamond1diamond2diamond3diamond4例例7.输出一个字符串输出一个字符串/*ch7-6.c*/#include main()char c10=I,a,m,a,b,o,y;in
24、t i;for(i=0;i=9;i+)printf(%c,ci);printf(n);Iamaboy01234567897.3.3 7.3.3 字符数组的引用字符数组的引用例例 “hello”共共5个字符,在内存占个字符,在内存占6个字节个字节 字符串长度字符串长度5 内存存放字符内存存放字符ASCII码码u无字符串变量,用字符数组处理字符串无字符串变量,用字符数组处理字符串u字符串结束标志:空字符字符串结束标志:空字符00,其,其ASCIIASCII码为码为0 07.3.4 7.3.4 字符串和字符串结束标志字符串和字符串结束标志1111110 01081081081081011011041
25、04o o00l ll le eh h例例 用用%c%c#include main()char str5;int i;for(i=0;i5;i+)scanf(“%c”,&stri);for(i=0;i5;i+)printf(“%c”,stri);例例 用用%s#include main()char str5;scanf(“%s”,str);printf(“%s”,str);用字符数组名用字符数组名,不要加不要加&输入串长度输入串长度数组维数数组维数遇空格或回车结束遇空格或回车结束自动加自动加0用字符数组名用字符数组名,遇遇0结束结束u逐个字符逐个字符I/OI/O:%c%cu整个字符串整个字符串
26、I/OI/O:%s%s7.3.4 7.3.4 字符串的输入输出字符串的输入输出例例#include main()char a5=H,e,l,l,o;printf(“%s”,a);例例#include main()char a=“Hello”;printf(“%s”,a);结果:结果:Hello(随机随机Hello02314结果:结果:Hello用用“%s%s”输出时,遇输出时,遇00结结束束#include main()char a=h,e,l,0,l,o,0;printf(%s,a);例例输出:输出:hel 0 0o ol l 0 0l le eh h数组中有多个数组中有多个00时时,遇第一
27、个结束遇第一个结束 How0 are0 you?0#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=Howb=arec=you?输入:输入:How are you?输出:输出:a=How运行情况:运行情况:输入:输入:How are you?scanfscanf中中%s%s输入时输入时,遇遇空格或回车结束空格或回车结束例例 字符串输入举例字符串输入举例例例 若
28、准备将字符串若准备将字符串“This is a string.”记录下来,记录下来,输入语句为:输入语句为:最好用最好用 scanf(“%20s”,s);不要用不要用for(k=0;k=16;k+)sk=getchar();以及以及 while(c=getchar()!=n)sk+=c;u字符串输出函数字符串输出函数putsputs格式:格式:putsputs(字符数组字符数组)功能:向显示器输出字符串(输出完,换行)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以说明:字符数组必须以00结束结束u字符串输入函数字符串输入函数getsgets格式:格式:getsgets(字符数组字
29、符数组)功能:从键盘输入一以功能:从键盘输入一以回车结束回车结束的字符串放入的字符串放入 字符数组中,并自动加字符数组中,并自动加00说明:输入串长度应小于字符数组维数说明:输入串长度应小于字符数组维数例例#include#include main()char string80;printf(“Input a string:”);gets(string);puts(string);输入输入:How are you?输出输出:How are you?包含在头文件包含在头文件 string.hstring.h,大量字符串函数参考教材大量字符串函数参考教材372372页。页。7.3.6 字符串处理函
30、数字符串处理函数u字符串连接函数字符串连接函数strcatstrcat格式:格式:strcatstrcat(char*strDestination,const char*strSource )功能:把功能:把strSource连到连到strDestination后面后面返值:返回返值:返回strDestination的首地址的首地址说明:说明:strDestination必须足够大必须足够大 连接前连接前,两串均以两串均以00结束结束;连接后连接后,串串1 1的的 00取消取消,新串最后加新串最后加00u字符串拷贝函数字符串拷贝函数strcpystrcpy格式:格式:strcpy(strcpy
31、(char*strDestination,const char*strSource)功能:将功能:将strSource,拷贝到,拷贝到strDestination中去中去返值:返回返值:返回strDestination的首地址的首地址说明:说明:strDestination必须足够大必须足够大 拷贝时拷贝时00一同拷贝一同拷贝 不能使用赋值语句为一个字符数组赋值不能使用赋值语句为一个字符数组赋值例例 char str120,str220;str1=“Hello!”;()str2=str1;()例例 strcpy与与strcat举例举例#include#include void main()ch
32、ar destination25;char blank=,c=C+,turbo=Turbo;strcpy(destination,turbo);strcat(destination,blank);strcat(destination,c);printf(%sn,destination);Trbo0123456789u024.Trbo00123456789u24.TrboC+0123456789u024.u字符串比较函数字符串比较函数strcmp格式:格式:strcmp(const char*string1,const char*string2)功能:比较两个字符串功能:比较两个字符串比较规则:
33、对两串从左向右逐字符比较比较规则:对两串从左向右逐字符比较(按按ASCII码码),直到遇到不同字符或直到遇到不同字符或0为止为止返值:返回返值:返回int型整数型整数:a.若若string1 string2,返回,返回正整数正整数 c.若若string1=string2,返回,返回零零说明:说明:字符串比较不能用字符串比较不能用“=”,必须用必须用strcmpu字符串长度函数字符串长度函数strlen格式:格式:strlen(字符数组字符数组)功能:计算字符串长度功能:计算字符串长度返值:返回字符串实际长度,返值:返回字符串实际长度,不包括不包括0在内在内例例 对于以下字符串,对于以下字符串,
34、strlen(s)的值为:的值为:(1)char s10=A,0,B,C,0,D;(2)char s=“tb0willn”;(3)char s=“x69082n”;答案:答案:13#include#include main()char str1=”Hello!,str2=”How are you?”,str20;int len1,len2,len3;len1=strlen(str1);len2=strlen(str2);if(strcmp(str1,str2)0)strcpy(str,str1);strcat(str,str2);else if(strcmp(str1,str2)0)strcp
35、y(str,str2);strcat(str,str1);else strcpy(str,str1);len3=strlen(str);puts(str);printf(”Len1=%d,Len2=%d,Len3=%dn”,len1,len2,len3);How are you?Hello!Len1=6,Len2=12,Len3=18例例 strcmp与与strlen举例举例例例8.输入一行字符,统计其中有多少个单词输入一行字符,统计其中有多少个单词当前字符当前字符=空格空格?是是否否前一个单词已经结束,尚未出现新单词前一个单词已经结束,尚未出现新单词(可能有多个空格),可能有多个空格),使使
36、newword=0,num不累加不累加前一字符为空格前一字符为空格(此时,此时,newword=0),新单词出现,新单词出现,newword=1,num加加1前一字符为非空格前一字符为非空格(newword=1),未出现新单词未出现新单词,num不变不变例例 输入:输入:IV VamV VaV Vboy.当前字符当前字符是否空格是否空格newword原值原值新单词开始否新单词开始否newword新值新值num值值V VV VV VIamaboy.否否0是是11是是1未未01否否0是是12否否1未未12是是1未未02否否0是是13是是1未未03否否0是是14否否1未未14否否1未未14否否1未未
37、147.3.6 字符数组应用举例字符数组应用举例输入一字符串给输入一字符串给 string i=0 num=0 newword=0当当(c=stringi)!=0)c=空格空格真真真真假假假假newword=0newword=1num=num+1i=i+1输出:输出:numnewword=0#include main()char string81;int i,num=0,newword=0;/注意标志变量注意标志变量newword的使用的使用/标志是否开始一个新的单词:标志是否开始一个新的单词:0否;否;1是是 char c;gets(string);for(i=0;(c=stringi)!=
38、0;i+)if(c=)newword=0;else if(newword=0)newword=1;num+;printf(There are%d words in the linen,num);00h hg gi ih h00o ol ll le eh h00w wo oh hstr0str1str2#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)
39、;printf(nThe largest string is:n%sn,string);例例9.有三个字符串,找出其中最大者有三个字符串,找出其中最大者9285687554889845617992856854889845756179a0a1a2a3a4a5a6a7a8a9a例例 有三个学生四门课成绩有三个学生四门课成绩二维数组二维数组例例10.有十个学生的成绩,求平均分有十个学生的成绩,求平均分:4040818179796161王二王二4545989888885454李四李四7575686885859292张三张三物理物理化学化学英语英语数学数学#include main()int sum,k
40、,a10;for(k=0;k=9;k+)scanf(“%d”,&ak);for(k=0;k=9;k+)sum+=ak;printf(“Average is%dn”,sum/10);例例 比较比较 int a23=5,6,7,8;与与 int a23=5,6,7,8;560780567800例例 int a10;float f2=1.2,2.2;例例 int a5;a=2,4,6,8,10;例例 int a10;float i=3;ai=10;例例 char name0;float weight10.3;int array-100;例例 char str=“Hello”;char str=H,e,l,l,o;02314023145o ol ll le eh ho o 00l ll le eh h