《C语言程序设计教程CJ05数组New潭浩强第3版.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程CJ05数组New潭浩强第3版.ppt(49页珍藏版)》请在三一办公上搜索。
1、辽宁师范大学计算机与信息技术学院 蔡静,C语言程序设计,目录,C语言程序设计初步数据描述与基本操作C程序的流程控制函数数组指针结构体和共用体位运算文件综合应用,第五章 数组,5.1 一维数组5.2 变量的存储属性5.3 编译预处理,程序设计-2005秋,4,数组是构造型数据,由基本类型数据按一定规则组成,是有序 数据的集合。数组中元素类型相同,用数组名和下标来唯一标识数组中元素。,789687.,Stud0stud1stud2.Stud99,Stud,Stud(100)有100个元素:stud0 stud99,数组的概念,程序设计-2005秋,5,5.1 一维数组一维数组的定义,格式:类型说明
2、符 数组名常量表达式例:float fstud100;int inum6;char cname9;说明:数组名命名规则与变量名的命名规则相同;中的常量表达式的值是数组长度,即元素个数;C规定,数组为静态存储(static),所以常量表达式中不能含有变量。,.,程序设计-2005秋,6,数组元素的引用,数组名下标 例:fstud3表示数组 fstud 中第四个元素。说明:先定义后使用;下标从0开始;0,数组长度-1C规定只能引用单个元素,不能一次引用整个数组。例:,程序设计-2005秋,7,一维数组的初始化,1.定义时赋初值(1)对全部元素赋初值;指定长度 static int inum4=8,
3、2,5,4;不指定长度 static int inum=8,2,5,4;(2)对部分元素赋初值;必须指定长度 static int inum5=1,2,3,4;/*给前四个元素赋值*/static int inum5=1,3,4,5;/*error*/static int inum=1,2,3;/*系统认为数组inum的长度为3*/,8254,inum,inum0inum1inum2inum3,程序设计-2005秋,8,一维数组的初始化(续),不能对数组这样整体赋初值 例:static int inum10=7*10;若不赋初值,系统对 static 数组的数值型元素自动赋初值为数值0;对st
4、atic 数组的字符型元素自动赋初值为字符0。例1 CJ_Array_score_sum_ave_grade.C:输入N个学生成绩,求平均分。若该生成绩高于平均分10分,记为“A”等,若低于平均分10分,记为“C”等,其余记为“B”等。,程序设计-2005秋,9,例2:CJ_Array1_ChangeInsertDelete.C,编写程序。N个数,把第1个数给第2个数,第2个数给第3个数,,以此类推,把第N-1个数给第N个数,最后把第N个数给第1个数。编写程序。N个数,把第2个数给第1个数,第3个数给第2个数,,以此类推,把第N个数给第N-1个数,最后把第1个数给第N个数。N个数,删除其中第m
5、个数。N个数,键盘接收一个数插入到其中第m个位置。,程序设计-2005秋,10,一维数组元素的查找与排序,排序冒泡排序算法、选择排序算法例:查找折半查找算法例:,排序之冒泡法。思想:比较相邻两数,小数上浮。,972651,792651,729651,726951,726591,726519,72651,27651,26751,26571,26517,2651,2651,2561,2516,251,251,215,21,12,第一轮6个数比较5次,第二轮5个数比较4次,第三轮4个数比较3次,第四轮3个数比较2次,第五轮2个数比较1次,N个数:比较N-1轮;第 j 轮,N-j+1 个数,比较N-j
6、次。,排序之选择法。思想:分别与其后的各数比较,每轮得到1个当前的最小数.,972651,792651,297651,297651,297651,197652,97652,79652,69752,59762,29765,9765,7965,6975,5976,976,796,697,97,79,第一轮6个数比较5次,第二轮5个数比较4次,第三轮4个数比较3次,第四轮3个数比较2次,第五轮2个数比较1次,N个数:比较N-1轮;第 j 轮,N-j+1 个数,比较N-j次,查找之折半查找法。前提:数据已排序思想:先检索序列1/2处的数据,看它是否为所需的数据,若不是,则判断要找的数据是在当中数的哪一
7、边,下次就在这个范围内查找,。每次将查找范围缩小一半,直到找到这个数或得出找不到的结论为止。,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,2,5,6,7,8,13,15,17,19,21,23,25,26,27,28,35,41,52,63,第1轮查找,top=0,mid=(top+bot)/2,bot=n-1,10,11,12,13,14,15,16,17,18,23,25,26,27,28,35,41,52,63,第2轮查找,top,mid,bot,10,11,12,13,23,25,26,27,第3轮查找,top,mid,bot,bot=
8、mid-1,12,13,26,27,第4轮查找,top,mid,bot,top=mid+1,折半查找中的三个临时变量间的迭代,1.键盘接收10个数,按由小到大排序,再输入一个数,插在相应位置。2.将一个数组中的元素按逆序重新存放。如:2,15,8,9-9,8,15,2,一维数组作业,CJ_Array2_YangHuiTriangle.C.打印杨辉三角形 的前10行。,二维数组导入,11 11 2 11 3 3 1 1 4 6 4 11 5 10 10 5 1.,程序设计-2005秋,17,5.2 二维数组和多维数组5.2.1 二维数组及其定义,类型说明符 数组名常量表达式 常量表达式;例:st
9、atic float fstud564;static int inum783;说明:数组元素从 00 到 M-1N-1一共M*N 个,按行存放;如:数组 inum24:inum00 inum01 inum03inum10 inum11 inum13,inum00inum01inum02.inum12inum13,inum,程序设计-2005秋,18,二维数组元素的存储按行存放,程序设计-2005秋,19,把二维数组看作一种特殊的一维数组,这个一维数组的元素又是一个一维数组。,程序设计-2005秋,20,5.2.2 二维数组的初始化,方1:分行 赋初值例:static int inum23=1,
10、2,3,2,6,4,0,6,9;方2:按序 赋初值例:static int inum23=1,2,3,2,4,6,0,6,9;,1.定义时赋初值(1)对全部元素赋初值。可以缺省第一维的长度(分行、按序皆可);例:static int inum 3=1,2,3,4,5,6;static int inum 3=1,2,3,4,5,6;(2)对部分元素赋初值。若缺省第一维长度则必须分行赋值。例:static int inum 3=0,0,3,7,6/*0,0,3,0,0,0,7,6,0*/,2.不赋初值,则系统自动赋初值为数值0或字符0。例:static int inum24;/*0,0,0,0,0
11、,0,0,0*/static char cname23;/*0,0,0,0,0,0*/,程序设计-2005秋,22,二维数组的引用,数组名下标 1 下标 2 说明:先定义后使用;下标为常量表达式,对于数组 MN,范围在 0 M-1,0 N-1,即 00 到 M-1N-1,不存在元素 MN。例CJ_Array2_MatrixSum.C:已知一个 M*N 的矩阵,求每一行、每一列的和,并输出(以 2*4 矩阵为例)。例CJ_Array2_MatrixTranspose.c:已知一个 M*N 的矩阵,将矩阵转置(即行列互换),并输出(以 2*4 矩阵为例)。,M个学生N门课程,求每门课程的平均分,求
12、每个学生的总分,并将学生总分按序输出(由低到高).,程序设计-2005秋,24,5.3 字符数组5.3.1 字符数组和字符串,字符数组的定义格式:char或int 数组名常量表达式说明:同数值型数组。static char str8;字符数组的初始化方1:单个字符逐个赋值 例:static char cname5=C,h,i,n,a;说明:每个元素(字符)用单引号括起来;字符可以是转义字符;数组长度=字符个数。,程序设计-2005秋,25,5.3.1 字符数组的定义和初始化(续),字符数组的初始化方2:字符串赋值 例:static char cname6=“China”;说明:所有元素(字符串
13、)用双引号括起来;字符可以是转义字符;数组长度=字符个数+1,但字符数组的元素并不包括结束符0。二维字符数组同理(也可分行或逐个赋值)。,程序设计-2005秋,26,字符串和字符串的存储方法,系统自动为字符串数组和字符串常量加一个0作为结束符。因此得到一种新的字符数组初始化方法:char c=I,a,m,h,a,p,p,y,0;等价于:char c=“I am happy”;或char c=“I am happy”;不等价于:char c=I,a,m,h,a,p,p,y;此写法仍合法,因为C不要求数组最后一个字符是0,只是人们为与系统自动加0保持一致就人为也加0。,程序设计-2005秋,27,
14、字符串的输入输出,方1:单个字符输入输出。%c-数组元素 例:scanf(“%c”,说明:字符串中可以有多个0,但遇到第一个结束符 0就结束字符串的输出。输出的结束仅取决于0,而与数组的长度无关。方3:字符串输入输出函数 gets()puts(),此处无&,方3:字符串I/O函数 gets()puts()1、字符串输出函数格式:puts(字符数组)相关:printf(“%sn”,字符数组名)功能:输出字符数组的内容。说明:字符数组可以为字符串(可有转义字符)或数组名;把字符串末的0转化为n输出,即自动转换;只对一个字符串操作。执行成功时返回字符数组收元素的地址。例:,2.字符串输入函数格式:g
15、ets(字符数组)相关:scanf(“%s”,字符数组名)功能:键盘输入字符串到字符数组,返回字符数组的地址。说明:getchar()从输入流中取一字符,无参数,返回该字符;gets(字符数组)只对一个字符串操作。例:puts(gets();输入DaLian 则输出 DaLian 执行成功时返回字符数组收元素的地址。,程序设计-2005秋,30,例:字符串的输入/输出,CJ_Array1_Str01_InOut1.cCJ_Array1_Str01_InOut2.c,程序设计-2005秋,31,小结1:,不需要在scanf函数中的字符数组名前加地址运算符&。用scanf函数输入字符串时,并不按照
16、定义的字符数组大小决定实际输入的字符个数,而是按照下面的两种情况决定形实际输入的字符个数:由输入格式控制符中指定输入宽度。遇到输入的字符中有空白(空格、换行或制识表符)时本输入结束。因此,在向一个字符数组输入字符串时,不要含空白字符。C语言没有数组超界检查功能。为了防止过多输入数据,造成对其他数据的副作用,应当确保字符串长度(包括字符串结束标志)足够。字符数组按照以上分割原则从缓冲区中读取字符。系统会自动为每个字符串添加一个字符串结束标志符0。如果其后还有未被赋值的元素,它们的值是不可预测的。使用printf函数输出字符串时,遇到一个0就认为是该字符串的结束,但只输出0之前的字符。,程序设计-
17、2005秋,32,小结2:,用gets()可以读入包括空格字符的字符串。用puts()输出时,将“0”字符转换成换行符,因此用puts()时一次输出一行,不必另加换行符。gets()和puts()函数都是具有返回值的函数,它们执行成功时将返回字符数组首元素的地址。,程序设计-2005秋,33,字符串处理函数 字符串连接函数,strcat(字符数组1,字符数组2)功能:把字符串2连在字符串1的后面,返回串1的地址。说明:字符数组1应有足够长度。例:static char s120=“China”,s2=“Japan”;puts(strcat(s1,s2);puts(strcat(s2,s1);则
18、:ChinaJapan/*0 转化为 n*/JapanChinaJapan/*此时的s1已改变*/,程序设计-2005秋,34,字符串拷贝函数1.,strcpy(字符数组1,字符数组2/字符串2)功能:把串2拷贝到字符数组1中,将其内容覆盖。说明:字符数组1应有足够长度;字符数组1只能是数组名,不能是字符串形式;不可直接赋值的方式来拷贝,只能用strcpy(,)例:s1=s2;s1=“China”s1=“China”strcpy(s1,“China”),程序设计-2005秋,35,字符串拷贝函数2.,strncpy(字符数组1,字符数组2/字符串2,n)功能:把串2的前n个字符拷贝到字符数组1
19、中,将其内容覆盖。说明:字符数组1应有足够长度;字符数组1只能是数组名,不能是字符串形式;可拷贝串2中前面若干字符到字符数组1中。例:static char s120=1234567890,s2=Republic;puts(strncpy(s1,s2,4);/*输出 Repu567890*/,程序设计-2005秋,36,字符串比较函数,strcmp(字符数组1,字符数组2)功能:比较两个字符串的大小(按ASCII码值逐个字符比较),返回:正整数(串1 串2)0(串1=串2)负整数(串1 串2)说明:比较两个字符串的大小,if(s1=s2)/*/if(strcmp(s1,s2)=0)./*/,测
20、字符串长度函数 strlen(字符数组)功能:测字符串的长度(字符个数,不包括0),返回长度。例:printf(“%d”,strlen(“computer”);/*8*/字符串转换成小写的函数 strlwr(字符串)功能:字符串被改为小写,返回字符串地址。字符串转换成大写函数 strupr(字符串)功能:字符串被改为小写,返回字符串地址。,程序设计-2005秋,38,字符串函数:,程序设计-2005秋,39,例:字符串处理函数,例:puts(strlwr(“China”);/*china*/puts(strupr(“China”);/*CHINA*/puts(“China”);/*China*
21、/例:CJ_Array1_Str02_Functions1.c 字符串函数应用例:CJ_Array1_Str02_Functions2.c 键盘输入5个字符串,输出其中最小的字符串,例CJ_Array1_StrWordsCount.c:键盘输入一行字符,统计其中共有多少个单词,单词之间用空格隔开。例CJ_Array1_StrDeleteChar.c:键盘输入一字符串,删除指定的第 m个字符。,例CJ_Array1_StrTelegraphCoding.c:翻译密码。有一行电文,按规律译成密码:A-Z,B-Y,C-X,a-z,b-y,c-x,.非字母字符不变,要求编程序将密码译回原文,并打印密码
22、和原文。分析:大写字母 A B C.strk.Z 相对位置 1 2 3.i.绝对位置 64 65 66 67.64+i.相对位置为i的字母的ASCII值为:64+i该字母的译码的相对位置为:27-i该字母的译码的ASCII值=64+(27-i)=64+(27-(strk-64)=155-strk 小写字母同理可得:=96+(27-i)=96+(27-(strk-96)=219-strk,CJ_Array2_StrArray.c、将多个字符串(BASIC,FORTRAN,PASCAL)赋给数组并输出。,程序设计-2005秋,43,5.2.4 多维数组,三维数组及多维数组的概念:一个n维的数组可以
23、看作是一个n-1维的同类型的数组组成的一维数组(这个定义是递归的)。一个三维数组,可以看作是类型相同的二维数组组成的向量,而每个二维数组又可以看成类型相同的一维数组组成的向量。关于三维数组的形象表示:一个三维数组,可以看成由一些“页”(二维数组)组成;每一页又可以看成又由一些“行”(一维数组)组成;每一行看成由一些“列”组成。每个三维数组,要按页的顺序存储,每页又按行的顺序存储,每行按列顺序存储。,程序设计-2005秋,44,三维数组及其存储:,程序设计-2005秋,45,int a234=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,2
24、1,22,23,24;在外层花括号内,有2对中层的花括号,在每一对中层花括号中又各有3对内层花括号,每一对内层花括号中各有4整数。分别向2页、3行、4列元素赋值。,三维数组的定义及其初始化(仿照二维数组的形式):(1)按页全部初始化,程序设计-2005秋,46,把三维数组中全部元素数据(注意数据个数不能少于元素个数)连续写在一个花括号内,按元素在内存中排列顺序依次赋初值。如:int a234=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24;也可以省写第一维的大小:int a234=1,2,3,4,5,6,7,8,9,
25、10,11,12,13,14,15,16,17,18,19,20,21,22,23,24;系统会根据初值个数,算出第一维的大小为2。但不能省写两个维的大小。用花括弧把属于同一行中的数据括起来,概念清楚,含义明确,尤其在初始值比较多的情况下不易出错,也不必一个一个地数,只需找到相应行的数据即可。,(2)不按页全部初始化,程序设计-2005秋,47,注意这时不能缺少数组的大小。如 int a234=1,2,0,0,7,8,13,14,17,21,0,0,24;,(3)不完全初始化,程序设计-2005秋,48,例CJ_Array3_InOut.c:向一个三维数组输入值并输出此数组全部元素。,三维数组应用,Thanks,