《jin7第七章数组与字符串.ppt》由会员分享,可在线阅读,更多相关《jin7第七章数组与字符串.ppt(62页珍藏版)》请在三一办公上搜索。
1、2023/11/7,1,第七章 数组与字符串,李 书 涛,2023/11/7,2,目 录,1 一维数组2 多维数组3 字符数组4 字符串处理函数5 字符数组应用实例6 本章小结,第 七 章 数组与字符串,2023/11/7,3,C 中定义了在基本数据类型基础上的构造数据类型(数组,结构体,共同体等)。,变量先定义,再使用,如果变量个数少,且彼此独立时,可以用:int a,b,c;a=5;b=10;c=23;printf(“%d,%d,%d”,a,b,c);,当变量个数比较多,并且有内在的关系时,例如:全班有30个人,每人一个成绩。定义:int a1,a2,a30?不方便!,第七章 数组与字符串
2、,数组的基本概念,2023/11/7,4,数组是一组有序数据的集合。,在这一组有序数据的集合中,各个元素属于同一个类型,用统一的名称标识这一组数,用下标唯一地确定这组数中的每一个值。,数组的特性,2023/11/7,5,数组的三要素,数组,数组是有限个相同数据类型数据分量的有序集合。,相同的数据类型(定义数组时规定),有限的成员个数(定义数组时规定),彼此有序的排列(引用数组元素时的下标),int a5,int a5;a0=1;a1=2;.,1 一维数组,1 一维数组,2023/11/7,6,格式:,类型 标识符 长度;,int a10;,所有元素为同一类型,变量名,即数组名,数组中所含元素的
3、个数,int a10;由10个整数组成的数组,共同拥有数组名:,a,数组长度必须是整型量,int a2*3;,int an,n=10;,一.一维数组的定义,原则,数组必须先定义,再使用。,数组中的元素必须逐一引用。,方法:通过数组名及其元素的下标逐一引用。,定义:类型 数组名N int a10;,引用:数组名下标,下标范围从 0 到 N-1,a0,a1,a9为数组a中的所有元素。,二.一维数组元素的引用,说明,下标表示了元素在数组中的位置下标可以用表达式 a2*3相当于a6,(a6是数组中第?个元素),?,2023/11/7,8,变量在使用之前必须使其有值。,如果没有初值,会怎样?,数组初始化
4、的方法:,在说明语句 int a4;中赋值,称赋初值,又称数组初始化。,可以对静态或外部存储类型的数组进行初始化。,三.一维数组的初始化,如果不赋初值,里面也会有一个不确定值。,2023/11/7,9,数据类型 数组名 常量表达式=初始化数据;,1.定义数组时,对全部元素赋值 int a5=1,2,3,4,5;,用 包括所有初值,用逗号分隔各数值。,2.对部分元素赋值,按顺序给前2个元素赋值,float x5=1.9,2.0;,x0=1.9;x1=2.0;其余元素为,?,若要对数组的全部元素初始化,则可省略数组说明中的大小。int a=1,2,3,4;,在数组说明的同时进行初始化的格式,202
5、3/11/7,10,要求,C规定,只有静态数组(static)才能初始化,(第7章内容),Turbo C中,允许为数组(非静态)初始化。区别:static int a5=1,2,3;后两个元素值为0。int a5=1,2,3;后两个元素为随机数。,int i,a10=1,2,3,4,5,6,7,8,9,10;for(i=0;i10;i+)printf(“%d,”,a i);,通过数组名和下标引用数组中的每一个数据,运行结果:1,2,3,4,5,6,7,8,9,10,初值的个数不能超过定义的数组长度,2023/11/7,11,有一个数组,内有10个数,求出最小的数和它的下标,然后将它与数组中的第
6、一个数对换。,int a10;,a0,a i,a9,i=?,定义两个临时变量 min(保存最小数)和 k(保存下标)。,假定第一个元素就是最小的:min=a0,k=0。,思路,用min与数组中的每一个元素ai比较,若ai比min小,将ai赋给min,将下标i赋给k,否则,继续比较。,实例分析,2023/11/7,12,26,min=a0,i=1i=2i=3i=4i=5i=6i=7i=8i=9,1326 min=a1 k=1,循环,313 min=a2 k=2,683 min和k的值不变,13,3,203 min和k的值不变,13 min=a5,k=5,71 min和k的值不变,1,&min,5
7、31 min和k的值不变,121 min和k的值不变,651 min和k的值不变,min=1k=5,ak=a0a0=min,比 较 过 程,2023/11/7,13,main()int i,a10,min,k;for(i=0;iai)min=ai;k=i;ak=a0;a0=min;for(i=0;i10;i+)printf(“%4d,”,ai);printf(“%d,%dn”,k,min);,循环输入10个数,循环找出最小的,交换数据,输出数组,输出最小值和原始下标,找数程序,2023/11/7,14,当一个一维数组中的每个元素本身又是一个一维数组时,该数组为一个二维数组。,一、二维数组的定义
8、,1.格式:类型 标识符长度1长度2;,2.二维数组元素需要两个下标表示:例:int a34表示数组a中有3行4列共12个数据。,3.二维数组在存储空间中是按行优先存储。,int a34;,行,列,第一行,最后一个元素,矩阵,2 多维数组,2 多维数组,2023/11/7,15,原则:,逐一引用,数组名下标1下标2下标1从0到长度N1-1下标2从0到长度N2-1,方法:,格式:标识符N1N2,int a42,a00.a31共8个数据,(对本例,决不可能有元素a42),三、二维数组的初始化,方法:1.对全部元素赋初值,分行,各用一个 int a23=1,2,3,4,5,6;,二、二维数组的引用,
9、2023/11/7,16,int a23=1,2,3,4,5,6;,1,2,3,4,5,6.,3.对部分元素赋初值,注意区别:,(1)int a23=1,2,3;,(2)int a23=1,2,3;,(3)int a23=0,1,2,3;,当为全部元素赋值时,一维长度可省略,int a 3=1,2,3,4,5,6;类似可以推广到三维或多维数组。,2.整体赋值,系统自动分行,2023/11/7,17,用数组定义 int a?a111=?,四、三维数组举例,2 3 4,2023/11/7,18,若定义int a34,则对a的正确引用是:A)a 2 4 B)a 1,3 C)a(2)(1)D)a 1+
10、1 0,以下二维数组说明方式中正确的是:A)int a3;B)float a(3,4);C)double a14;D)float a(3)(4);,引用,假设二维数组a有m列,则计算任一元素aij在数中的位置的公式为:i*m+j+1即a00位于数组的第一个位置上。,i*m+j+1,例题分析,2023/11/7,19,main()int i,j,a55,k;k=2;for(i=0;i5;i+)/*按行循环*/for(j=0;j5;j+)/*按列循环*/if(j=i)a i j=1;/*下三角*/else a i j=k+;/*上三角*/for(i=0;i5;i+)for(j=0;j5;j+)pr
11、intf(“%4d”,a i j);printf(“n”);/*输出一行后换行*/,例题:不用输入,自动生成下列矩阵,1 2 3 4 51 1 6 7 81 1 1 9 101 1 1 1 111 1 1 1 1,元素值为 1,按行递增,2023/11/7,20,int a10,已经赋值,如何进行从小到大排序?,1.选择排序2.冒泡排序3.插入排序,找出数组中最小的,与第一个元素对换,再在其余的元素中重复上述操作。,顺序比较相邻两元素的大小,若左边元素比右边的大,则交换,否则不交换,比较需进行多次。,假定第一个元素是合适的,取出第二个元素与之比较,若小,插到前面;否则,位置不变,再将第三个元素
12、与前面两个比较,放到有序序列中合适的位置,依次类推.,五、应用实例,2023/11/7,21,冒泡排序,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,第1轮9次,第2轮8次,排序思路:从底部开始,顺序比较相邻两元素的大小,若左边元素比右边的大,则交换,否则不交换,比较需进行多轮。,共需N-1=9 轮,每轮 10-i 次,i=19,例:int a10;即N=10,冒泡排序过程如下:,2023/11/7,22,有一数组:(9,7,18,3,4,10,8),将它从小到大排序。,7,9,3,4,10,8,18,第一轮比较结束,较小的数向前移动,较大的数向后移动。,冒泡排序,也可以从头部开
13、始,顺序比较相邻两元素,2023/11/7,23,7,3,4,9,8,10,18,第二轮比较结束,第二轮比较,2023/11/7,24,3,4,7,8,9,10,18,第三轮比较结束,(4)3,4,7,8,9,10,18,排序完毕,第三轮比较,(5)3,4,7,8,9,10,18,(6)3,4,7,8,9,10,18,第四轮比较结束,第五轮比较结束,第六轮比较结束,2023/11/7,25,main()int i,j,t,a10;printf(Input 10 number:n);for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;/*交换数据*/printf(The sort
14、ed numbers:n);for(i=0;i=9;i+)/*输出排序后数据*/printf(“%4d”,ai);printf(“nn”);,冒泡排序程序,2023/11/7,26,一、C中的字符数据,字符数据,字符常量字符变量字符串常量,a,An,t,char c;,“Turbo C”,二、字符数据的输入和输出,char c,d;scanf(“%c”,char c=a,d=b;printf(“%c”,c);putchar(d);,3 字符数组,3 字符数组 7.3.1 字符数据,2023/11/7,27,一、数组中的各个元素均为字符变量,二、每个元素只能存放一个字符,例:char c20=a
15、,b,c,.;c0=a,c1=b,.最后一个元素:c19,其中字符的个数不得多于20,字符串,用字符数组可以存放长度不同的字符串,串:用双引号“”括起来的字符或转义符序列。串长:字符串中所包含的字符数。串结束标记:C中的串以0结束。0称为串结束标记。,7.3.2 字符串数据,2023/11/7,28,字符串在字符数组中一个字符占用一个字节。字符串实际占有的存储单元数量等于字符串长度+1。要定义一个存放字符串“CHINA”的字符数组c,应定义为:char c6;,数组c在内存中实际存放情况,0是在字符串存入字符数组时由系统自动填加的,并不是字符串本身的一部分,在计算串长的时候不包括0。,字符串在
16、数组中的存储格式,2023/11/7,29,1.为每一个元素赋初值 char c6=a,b,c,d,e,f;,2.C中可以使用字符串常量为字符数组初始化,可有三种格式。,char ch6=“CHINA”;char ch6=“CHINA”;/*省略*/char ch=“CHINA”;/*省略说明中字符串长度值*/,7.3.3 字符数组的初始化,2023/11/7,30,1.字符串在内存中,系统自动加上0,作为字符串结束标记,字符串所占字节数为串中字符个数+1 char c6=“abcde”;该串共占6个字节。,2.程序中系统根据0来判断字符串是否结束,而不是通过数组长度。例如:char c6=“
17、ab”;c的长度为6,而实际到b就结束。,7.3.4 关于字符数组的几点说明,2023/11/7,31,判断:(1)char c10=“abcde”;(2)char c10=a,b,c,d,e;(3)char c10=“abcde”;(4)char c10=a,b,c,d,e,0;,这四种初始化是否等价?,C语言并不要求所有的字符数组的最后一个元素必须是0(如果使用串,系统自动加上)。,(1)=(3)=(4),结论,用字符串常量为数组初始化的比较,2023/11/7,32,基本数据类型中所有的数组都可以通过循环语句,逐一赋值。,int a10,i;for(i=0,i10;i+)scanf(“%
18、d”,字符数组除采用此方法之外,还有其他方式,输入,字符串%s,输出,是否循环?是否自动换行?是否用数组名?是否用取址符?,只能是字符型,7.3.5 字符数组的输入输出,2023/11/7,33,介绍三种方法:,(1)用scanf函数,用循环结构,逐一输入元素的值,元素前用取址符&,格式为%c。,char c10;int i;for(i=0;i10;i+)scanf(“%c”,(2)用scanf函数,整串输入,不用取址符,只写数组名,格式为%s。,char c10;scanf(“%s”,c);,注意:遇回车,空格输入结束。,任何数组的数组名代表了数组在存储空间中的起始地址,数组名,1.字符数组
19、的输入,2023/11/7,34,char str10;gets(str);,数组名,任何数组的数组名代表了数组在存储空间中的起始地址,总结:,scanf,%c 循环&ciscanf,%s 数组名 空格,回车结束gets()数组名,回车结束,(3)用gets()函数,一次输入 一个整串,遇回车结束,2023/11/7,35,介绍三种方法:,(1)用printf 函数,循环结构,逐一元素输出,格式为%c。,char c10;int i;(假定已有值).for(i=0;i10;i+)printf(“%c”,ci);,(2)用printf函数,格式为%s,用数组名,整串输出,char c10=“ab
20、cdef”;printf(“%sn”,c);,数组名,不自动换行,(3)用puts()函数,一次输出整串。,char str10=“abcde”;puts(str);,自动换行,2.字符数组的输出,2023/11/7,36,总结:,printf,%c 循环 ciprintf,%s 数组名 不自动换行puts()数组名 自动换行,*字符数组可以按字符串输出,输出时,遇0结束*字符数组中,若有多个0,遇到第一个0,输出结束,char str10=a,b,e,0,s,r,0;puts(str);,abe,说 明,main()int i;char str13;printf(“1:scanf,整串输入输
21、出,三次输入:computer&C,程序举例,2023/11/7,38,4 字符串处理函数,4 字符串处理函数,C的库函数中提供了有关字符串输入,输出,字符串复制,字符串连接,字符串比较,求字符串长度,字母大小写转换等函数。,所有的函数在使用时,程序开始加文件包含:#include,格式:puts(字符数组);功能:从终端输出 指定字符数组,1.字符数组输出,char str=“Turbo C”;puts(str);,字符数组名,自动换行,#include,2023/11/7,39,格式:gets(字符数组);功能:从输入设备上输入一个字符串,,char str80;gets(str);put
22、s(str);,遇回车结束,格式:strcat(字符数组1,字符数组2);功能:将字符数组2连接到字符数组1的后面。,3.字符串连接,char c110=“abc”;strcat(c1,“efg”);puts(c1);,可以是字符数组,也可以字符串常量,abcefg,2.字符数组输入,2023/11/7,40,格式:strcpy(字符数组1,字符数组2);功能:将字符数组2复制给字符数组1。,char c120=“abcde”,C2=“LMN”;strcpy(c1,c2);或:strcpy(c1,“LMN”);puts(c1);,显示LMN,c1,c2,c1,4.字符串拷贝,2023/11/7
23、,41,(1)字符串不能彼此赋值,只能用拷贝函数。(2)字符数组1定义的长度必须比字符数组2大(或相等)。(3)字符数组2可以用字符串常量,字符数组1必须写成变量名。(4)连同0一起复制。(5)可以复制部分字符,即 char c120,c2=“Trubo C”;strcpy(c1,c2,4);只复制前4个字符。(6)如果原数组1中有字符,则复制后将原有内容覆盖(没覆盖的部分保留,但不显示)。,说 明,1.整型数据:int a,b=5;a=b;2.实型数据:float x,y=0.5;x=y;3.字符型数据:char c1,c2=A;c1=c2;4.字符数组:char str110=“abcde
24、”;char str210;strcpy(str2,str1);,赋值,字符串拷贝,C语言中的数据赋值,课堂作业,char a7=“abcdef”,b4=“ABC”;strcpy(a,b);printf(“%c”,a5);A)空格 B)0 C)e D)f,2023/11/7,43,格式:strcmp(字符数组1,字符数组2);功能:从左到右逐一比较数组1和数组2各字符的ASCII 值,若相同,继续,若不同,返回一个整数(以第一个不相同的字符比较为准)。,如果数组1数组2 函数值为正如果数组1数组2 函数值为负如果数组1=数组2 函数值为0,5.字符串比较,2023/11/7,44,1.整型数据
25、:int a,b if(a=b)2.实型数据:float x,y if(abs(x-y)1e-5)3.字符型数据:char c1,c2 if(c1=c2)4.字符串:char str110,str210if(strcmp(str1,str2)=0),记住!,绝对值,两个字符串怎样交换?,C语言中的数据比较,从键盘输入五个字符不多于7个的字符串,输出其中最大的串。,c18,c28,C1数组中存放当前最大的串,输入一个串c1,c1 c2?,输入一个串c2,i4?,字符串拷贝,Y,Y,N,N,输出c1,program,开始c18,c28,例 题,#includemain()char c18,c28;
26、int i;printf(”Input c1:”);gets(c1);for(i=0;i4;i+)printf(”Input c2:”);gets(c2);if(strcmp(c1,c2)0)strcpy(c1,c2);printf(”The result is:”);printf(”%s”,c1);,例 题 程 序,2023/11/7,47,怎样将五个字符串排序输出?,怎样交换两个字符数组?,怎样将100本英文书名做字典排序?,冒泡排序,思 考 问 题,2023/11/7,48,格式:strlen(字符数组)功能:测试字符数组中所含字符的个数,不包含字符串结束标记0,char str10=“
27、Turbo C”;printf(“%d”,strlen(str);结果:7,char str=“tv0willn”;printf(“%d”,strlen(str);,?,转义字符,结束,3,6.求字符数组(串)的长度,2023/11/7,49,格式:strlwr(字符数组)功能:将数组中的大写字母转换成小写。格式:strupr(字符数组)功能:将数组中的小写字母转换成大写。,单向的转换不是对换,char str=“Turbo C”;printf(“%s”,strupr(str);printf(“%s”,strlwr(str);,TURBO C,turbo c,7.字符串字母大小写转换,2023
28、/11/7,50,5 字符数组应用实例,5 字符数组应用实例,按行输入字符(用哪个函数?循环几次?)对第 i行的每一列(每个字符)进行判断,是否为大写,小写,数字,空格或其他。(循环几次?),有一篇文章,共 三行 文字,每行有 80个字符,要求统计出其中英文大写字母,小写字母,数字,空格,以及其他字符的个数。,题目分析,三行,i,80个字符,定义二维字符数组 char text380;循环嵌套,外层循环对行共3次,内层循环对列共80次,且遇0终止。对二维数组中的每一个元素text i j 进行判断。,2023/11/7,51,统计英文分类字符个数的N-S图,2023/11/7,52,int a
29、10,已经赋值,如何进行从小到大排序?,选择排序:找出数组中最小的,与第一个元素对换,再在其余的元素中重复上述操作。,选择排序,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,第1轮9次,第2轮8次,共需N-1=9 轮,每轮 10-i 次,i=19,2023/11/7,53,define N 10main()int aN,i,j,t;printf(Input%d number:n,N);for(i=0;iN;i+)/*输入10个整数*/scanf(%d,选择排序程序,2023/11/7,54,运行结果,Input 10 numbers:4 6 7 10 13 2 1 9 20 3
30、The sorted numbers:1 2 3 4 6 7 9 10 13 20,2023/11/7,55,#include main()int length=0;char line100;gets(line);while(linelength!=0)length+;printf(“String length=%d”,length);,根据字符串中0的位置来计算字符串长度。,字符数组应用举例1.求字符串的长度程序,2023/11/7,56,#include main()char str1100,str2100;int i;printf(Enter string 1:);gets(str1);
31、for(i=0;(str2i=str1i)!=0;i+);printf(Output string 2:%sn,str2);,将字符串str1拷贝到串str2中。,根据字符串中 0的位置来复制字符串。,2.字符串复制程序,空循环体,2023/11/7,57,二.数组的初始化方法(字符数组的特殊性)int a=1,2,3,4,5,6;int a6=1,2,4;char c6=a,b,c,d,e;char c6=“abcde”;char c=“abcde”;char c 6=a,b,c,d,e,0;int a 3=1,2,3,4,5,6;int a23=2,3,0,4,5;char str310=
32、“aaa”,”bbb”,”ccccc”;,一.定义数组三要素:类型,数组名,长度,6 本章小结,6 本章小结,2023/11/7,58,下标从0开始,四.字符数组的输入和输出*字符数组可以整串操作%s*数组名代表数组元素的起始地址*字符串一定是以 0结尾,strcat 连接(将某串接在一字符数组之后)strcpy 复制(字符串不允许赋值,只能将某串 复制给一个字符数组)strcmp 比较(判断两串是否相等)常用于字符串按ASCII顺序排序的操作,五.字符串处理函数,三.数组元素的引用,2023/11/7,59,上机与作业四,必做题:1.求4*4矩阵两条对角线元素值的和。2.用选择排序法对数组中
33、的10个整数排序,按由小到大顺序输出。3.输入并判断字符串是否回文。先将程序编写在稿纸上,上机调试运行得到正确结果。其它为选做题。选做题:定义一个数组,输入从2开始的30个偶数,分组(5个数一组)求平均值,放在数组的末尾并输出。,2023/11/7,60,E N D,交作业注意事项,1.只收word文件,其它如txt文件或文件夹均退回重做。2.word文件名格式:如:090104011001-自动化1班-段均波(作业4).doc3.作业内容,每道题都要有:题目、程序和运行结果。4.,学号-班号-姓名(作业号).doc,完,2023/11/7,61,define N 10main()int aN,i,j,k,t;printf(Input%d number:n,N);for(i=0;iN;i+)scanf(%d,改进选择排序程序,2023/11/7,62,main()int i,j,m,p,a10;for(i=0;iaj)p=j;/*确定本轮最小值的下标p*/if(p!=i)/*当最小值不是ai时,交换*/m=ap;ap=ai;ai=m;for(i=0;i10;i+)printf(“%4d”,ai);printf(“n”);,改进冒泡排序程序,
链接地址:https://www.31ppt.com/p-6510370.html