资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,C 程 序 设 计,1/95,问 题,假如需要处理,1,名学生,10,门课程成绩,用什么来,存放这些数据?,方法一:定义10个变量,每个变量中存放1门成绩。,方法二:定义一个能够存放10门成绩一维数组。,课程,1,课程,2,课程,3,课程,4,课程,5,课程,6,课程,7,课程,8,课程,9,课程,10,90,81,93,77,92,68,79,83,94,70,2/95,变量:杯子,一个变量只能存放一个数据,数组:带多个杯子托盘,一个数组,能够存放多个数据,3/95,数轴上一维向量x=1,2,-2,1,0,3;就相当于一维数组,4/95,直角坐标系中矩阵就相当于二维数组,5/95,4.1 一维数组,4.2 二维数组,4.3,字符数组,6/95,一维数组定义格式:,类型说明符,数组名,整型常量表示式,;,比如:,int,a,10,;,就定义了一个包含10个整型元素数组a,,它内存大小能够存放10个整型数据。,4.1.1 一 维数组定义,7/95,类型说明符,数组名,整型常量表示式,;,int,char等都能够,,说明此数组中每个,元素都属于这类型,命名规则与变量一致,不能和其它变量重名,指定元素个,数,最小为0,不能是变量,#define,N 3,int,a,N,;,int,a,3+5,;,int,a,1.5,;,int,n,;,scanf(“%d”,&,n,);,int,a,n,;,int,a,;,int,a,3,;,int,a,b,3,;,int,n=3,;,int,a,n,;,8/95,【例 4.1】判断以下数组定义是否正当,并说明原因。,(1)int a2.5;(2)int a-3;,(3)int i=3;(4)int i;,int ai;scanf(“%d”,int ai;,(5)#define N 3 (6)int a;,int a N;int a3;,(7)int a2+3;(8)int i,a3,b0;,9/95,4.1.2一维数组元素引用,一维数组引用格式:,数组名,下标,a,0,a,1,a,2,a,3,a,4,a,5,a,6,a,7,a,8,a,9,注意:,1.数组必须先定义,再使用。,2.只能逐一引用数组元素,不能一次引用整个数组。,比如:,int,a,10,;,能够使用,a0、a1.a9,。若有,a,=1;或者,a,10,=1,;,犯错。,a10,不代表整个数组,它是,下标为10元素,越界!,1,10/95,3.下标能够是,常量,或,变量,,它表示元素序号,。,比如:,int,i,=3,a,10,;,a,i,=,1;,表示给下标为3元素赋值为1。,4.,一维数组在内存中连续存放,,先存放下标为0元素,,再存放下标为1元素,,依次直至存放完全部元素。,11/95,【例 4.2】定义一个包含3个整型元素数组a,输出其元素值。,只定义数组,不给数组元素赋值,,数组元素中存放是随机值。,普通要先给数组元素赋值,再使用。,12/95,数组名a中存放是数组起始元素地址,13/95,【例 4.3】定义一个包含3个整型元素数组a,从键盘给数组元素输入值,然后输出。,14/95,【例 4.4】定义一个包含10个整型元素数组a,从键盘给数组元素输入值,然后输出。,15/95,4.1.3一维数组初始化,定义一维数组同时给数组元素赋初值称为一维数,组初始化。其普通格式为:,类型说明符,数组名,N,=,初值1,初值2,初值N,;,其中,N是表示数组元素个数常量。,16/95,一维数组初始化方式有以下几个:,(1)全部元素初始化:,char a3=1,2,n;,int b5=2,11,3,14,5;,int b =2,11,3,14,5;,int b4=2,11,3,14,5;,在对数组全部元素赋初值时,能够不指定数组长度。系统自动定义其长度为5,初值个数不能超出数组长度。不然,会出现语法错误。,17/95,(2)全部元素初始化:,int a10=0,1,2;,char a10=1,2;,(3)全部元素初始化为0:,int a10=0;,将a0a2依次初始化为0、1、2。未赋值元素a3a9值全部被初始化为int中表示假值0。,将元素a0a9 全部初始化为0,将a0a1依次初始化为0、1。未赋值元素a2a9值全部被初始化为char中表示假值0。,若想全部初始化为1,int a10=1;错误,18/95,【例 4.5】定义一个含有10个元素整型一维数组并全部初始化,将数组中全部元素逆序输出。,19/95,【例4.6】,:用冒泡法对5个数排序。,解:冒泡排序过程如后面图所表示,其中,红圈以内为已排好序统计。,规则:令相邻位置数依次比较,若上面,数大,则交换。,20/95,4,1,4,1,3,5,2,41 交换,43 交换,3,42,交换,1,13,不交换,3,4,32,交换,5,1,3,2,4,5,12,交换,1,2,3,4,5,12,不交换,结果,1,2,3,4,5,R,第0趟,第1趟,第2趟,第3趟,第0次,第1次,第2次,第3次,for(i=0;iRj+1 值,),则交换 j增1,for(j=0;j4i;j+),/内循环 假如,(,Rj值R2值),temp,R1;,R1 R2;,R2,temp,;,j增加1,比较Rj 和 Rj+1大小,假如(Rj值Rj+1值),j增加1,比较Rj 和 Rj+1,大小,实现交换,4,3,交换,R1,R2,4,3,不交换,4,R2,5,R3,2,R4,temp,2.交 换 过 程 与 核 心 程 序,4,3,4,22/95,int i;,int j;,for(i=0;i=3;i+),for(j=0;jRj+1大小),temp Rj;,Rj Rj+1;,Rj+1 temp;,3.循 环 与 核 心 程 序 组 合,int i,j;,类型一样,,合并在一起,外循环,将处理5个数推广处处理n个数,for(i=0;i=n-2;i+),内循环,for(j=0;jRj+1),满足交换条件,则交换;在程序中将赋值箭头转换为赋值等号,temp=Rj;,Rj=Rj+1;,Rj+1=temp;,标出交换起始位置,标出内循环起始位置,标出外循环起始位置,23/95,4.冒 泡 算法整理,int i,j;,/定义int 类型变量i,j,int temp;,/定义新存放单元 temp,for(i=0;i=n-2;i+),/外循环 for,1,/外循环for,1,开始,for(j=0;jRj+1),/比较数组R 中相邻元素值大小,/开始交换,temp=Rj;,/先将Rj中值赋给 temp,Rj=Rj+1;,/再将Rj+1中值赋给Rj,Rj+1=temp;,/最终又把temp中值赋给Rj+1,/结束交换,/内循环for,2,结束,/外循环for,1,结束,/经过n1=4 次循环,完成排序功效,24/95,5.冒泡算法真实程序,25/95,26/95,6.优化推广程序,27/95,28/95,改进冒泡排序算法,比如:待排序数组元素为:,3,1,2,5,4,29/95,3,1,3,1,2,4,5,31 交换,32 交换,2,24,不交换,4,5,1,13,不交换,2,3,34,不交换,4,5,45,不交换,12,不交换,结果,1,2,3,4,5,R,i=0,i=1,j=0,j=1,j=2,j=3,排好,设置一个标识量,若某趟中一次交换也没有进行,设置标识量值,代表数据已完全排好,不需要进行后面排序。,30/95,【例 4.7】改进冒泡排序算法。,31/95,32/95,【例 4.8】从键盘输入10个学生成绩,计算出 平均成绩,并输出高于平均分学生成绩。,33/95,34/95,【例】求fibonacci数列前20项,并输出。,fibonacci:1,1,2,3,5,8,13,21,35/95,4.1 一维数组,4.2 二维数组,4.3,字符数组,36/95,问 题,假如需要处理3名学生期末成绩,每名学生有4门课,程成绩,用什么来存放这些数据?,方法一:定义12个变量,每个变量存放1个学生,1门课程成绩。,方法二:,为3名学生各定义3个数组,每个数组能够存,放4门成绩。,方法三:,用一个3行4列二维数组来存放。,成绩表,数学,英语,计算机,C语言,学生1,92,89,96.5,80,学生2,88.5,67,90,70,学生3,71,90,88,60,37/95,4.2.1 二维数组定义,1.格式:,类型说明符,数组名,常量表示式M,常量表示式N,;,例,:,float,a,3,4,;,0,1,2,0 1 2 3,M和N只能是正整数,38/95,例:,float,a,3,4,2.二维数组能够看成是由一维数组组成,39/95,3.二,维数组在内存中连续存放,先次序存放第一行元素,再存放第二行元素,依次直至存放完全部元素。,40/95,4.2.2 二维数组引用,引用格式:,数组名,行下标,列下标,;,例,:,int,a,2,3,;,a00、a01、a02,a10、a11、a12,12 15 36,5 8 13,常出现错误:下标越界!,a23=3;,/*应为a12=3;*/,41/95,4.2.3 二维数组初始化,1、分行赋初值:,例:,int a34=,1,2,3,4,5,6,7,8,9,10,11,12,;,1 2 3 4,5 6 7 8,9 10 11 12,2、全部数据写在一个花括号内,按数组排列次序对,各元素赋初值:,例:,int a34=,1,2,3,4,5,6,7,8,9,10,11,12,;,赋初值时,数组行下标能够省略,比如:,int a 4=.。,42/95,3、对部分元素赋初值:,(1),int a34=,0,1,2,;,0,1,2,0,0 0 0 0,0 0 0 0,功效:,仅对,a00、a01、a02,赋值,其余为0,(2),int a34=,1,5,6,9,;,1,0,0,0,5,6,0 0,9,0 0 0,功效:,仅对,a00、a10、a11、a20,赋值,其余为0,43/95,【例4.9】求一个3*4矩阵最大值及其所在 行列下标。,44/95,45/95,【例4.10】3名学生各有4门课程成绩,计算每个学生平均成绩。,46/95,【例4.11】打印输出杨辉三角形(输出前10行),47/95,48/95,49/95,多维数组,定义格式:,类型,数组名,常量表示式1,常量表示式2,;,例,:,int,a,3,3,3,;,注意:多维数组元素在内存中排列次序是按行存放。,引用格式:,数组名,下标,下标,例,:,a,0,0,0,=100;,a,0,1,2,=20;,a,2,2,2,=50;,一个n维数组能够看成由多个,n-1,维数组组成。,50/95,4.1 一维数组,4.2 二维数组,4.3,字符数组,51/95,在程序中假如要存放姓名、地址等类型数据,例,如:“小明”、“成城市高新西区西园大道1号”等需,要使用什么样类型呢?这些是字符串,C语言中,没有专门字符串变量,,假如要存放字符串,需要,用到字符数组。,字符数组是专门用来存放字符数据,。字符数组中一个元素存放一个字符。,52/95,4.3.1 字符数组,字符数组中能够存放普通字符序列,也,能够存放字符串,二者依据字符数组末,尾是否有字符串结束符0来区分。,比如:,53/95,(1)char c11=“I am happy”;或,char c =“I am happy”;,(2)char c11=“I am happy”;或,char c =“I am happy”;,(3)char c11=I,a,m,h,a,p,p,y,0;,或 char c =I,a,m,h,a,p,p,y,0;,(4)char c11=I,a,m,h,a,p,p,y;,这四种方式,字符数组,c存放是字符串,54/95,(5)char c10=I,a,m,h,a,p,p,y;或,char c =I,a,m,h,a,p,p,y;,这种方式,字符数组,c存放是普通字符序列,55/95,若要重新给字符数组(字符串变量)赋值,使它改而存放别字符串,应注意以下几点:,(1)应充分预计新字符串所需最大空间,不要出,现越界情况。,比如:,char c =“fish”;数组c长度是5。,若要将“chicken”赋给c,新字符串需要8个字节,内存空间,就会犯错。为了预防这类错误发生,,习惯上将字符数组长度设置大一些。比如:,char c20=“fish”;,56/95,(2)不能使用赋值语句对字符串变量集体赋值,而,应该使用赋值语句为每个字符数组元素单独赋值。,比如:,char c=“fish”;若要将数组c内容修改为,“cat”,直接写为:c=“cat”;或者c=“cat”;都是错,误。,能够对c中元素逐一重新赋值:c0=c;c1=a;,c2=t;c3=0;,注意:不要省略给c3赋值为 0,不然c中新字符,串内容为“cath”。,57/95,4.3.2字符数组输入输出,一、使用 scanf 函数输入字符串到字符数组中。,(1)以单个字符格式逐一输入。,比如:,char c5;,scanf(“%c%c%c%c%c”,&s0,&s1,数组元素跟普通变量一样,前面要加取地址符,58/95,(2)以字符串格式输入。,比如:,char c5;,scanf(“%s”,c);,说明:,1.%s是字符串格式字符,数组名代表数组起始地址,所以输入表列中只需要给出数组名即可。若写为&c,程序犯错。,2.,输入字符串时,空格或者回车键是输入结束符,不能作为有效字符输入。,59/95,假如从键盘输入cat或者cat。数组c中存入cat后,C编译,系统会自动在后面补上一个 0。,3.,输入字符串长度应该比字符数组长度短。,比如:从键盘输入,catcat,,数组,c,中存入,catca,,没有,0,位,置,轻易出现内存错误。,60/95,4.,能够用,scanf,输入多个字符串,输入时以空格键或回车键隔开。,比如:,char c15,c25,c35;,scanf(“%s%s%s”,c1,c2,c3);,从键盘输入,Catordog?,61/95,二、使用 printf 函数将字符数组中字符串输出。,(1)以单个字符格式逐一输出。,比如:,char c5;,printf(“%c%c%c%c%c”,c0,c1,c2,c3,c4);,(2)以字符串格式输出,将数组名写在输出表列中。,比如:,char c5;,printf(“%s”,c);,62/95,注意:,(1)若数组长度大于字符串实际长度,也只输出到,碰到0结束。,比如:char c10=“China”;printf(“%s”,c);,(2)假如一个字符数组中包含一个以上0,则遇第一个0时输出就结束。,63/95,【例4.12】删除字符串中空格,并输出。,64/95,三、使用scanf和 printf 为二维数组输入输出字符串,二维数组可看作由一维数组组成。假如将一维字符数,组看作是存放字符串变量,那么二维字符数组就可,以看作是存放字符串一维字符串数组。,比如:,定义char c35;相当于定义了3个字符串变量。,c0、c1、c2分别是3个字符串起始地址。能够使,用scanf 和 printf 函数为其输入、输出字符串。,65/95,【例4.13】利用二维字符数组输入、输出字符串。,66/95,【例】,输出一个菱形图。,67/95,4.3.3 字符串处理函数,C语言提供了多个惯用字符串处理函数。,字符串输入函数、输出函数、比较函数、连接,函数及求字符串长度等函数。,注意:,字符串函数均在头文件,string.h,中定义,,要使用这些函数,需将此文件包含进来。,有编译器会自动包含。,68/95,1.字符串输出函数 puts,格 式:,puts(字符串),功 能:,将字符串结束符,0,转换成,n,后输出字符串。,比如:,char c6=“China”;,执行函数:puts(c);,等价于:,printf(%sn,c);,puts函数也能够直接输出字符串常量。,比如:,puts(“China”);,69/95,2.字符串输入函数 gets,格 式:,gets(字符数组),功 能:,从键盘输入一个字符串到字符数组中。,比如:,char s10;,执行函数:,gets(s);,从键盘输入:,China,将包含,0,在内6个字符送到字符数组s中。,70/95,gets、puts与scanf、printf函数使用区分:,(1)gets()、puts()函数一次只能输入输出一个字符串;,scanf()、printf()则能够输入输出多个字符串。,比如:char s110,s210;,1.gets(s1);gets(s2);puts(s1);puts(s2);,2.scanf(“%s%s”,s1,s2);printf(“%sn%sn”,s1,s2);,71/95,(2)使用gets函数输入字符串以回车符结束;而,scanf函数以空格或回车符结束字符串输入。,比如:char s130,s230;,从键盘输入HELLO WORLD!,,1.执行gets(s1);gets(s2);,执行结果:s1中存入字符串“HELLO WORLD!”,光标,等候用户再次输入字符串,从键盘输入hello world!,s2中取得字符串“hello world!”。,72/95,比如:char s130,s230;,从键盘输入HELLO WORLD!,,2.执行scanf(“%s%s”,s1,s2);,执行结果:s1中存入字符串“HELLO”,s2中存入字符,串“WORLD!”。,73/95,3.字符串,连接函数,strcat,格 式:,strcat(字符数组1,字符数组2或字符串),功 能:,把,字符数组2中字符串,连接到,字符数组1中,字符串,后面,结果放到,字符数组1,中。,注 意:,1),数组1必须足够大,以容纳连接后新字符串。,2),连接时串1后面0被覆盖,只在新串后保留1个0,字符数组2可为字符串常量,1呢?,74/95,比如:char s10=“te”;strcat(s,“st!”);执行过程中数,组s存放情况:,75/95,【例4.14】使用strcat函数实现两个字符串连接功效。,76/95,【例4.15】不使用strcat函数实现两个字符串连接功效。,77/95,4.字符串复制函数,strcpy,格 式:,strcpy(字符数组1,字符数组2或字符串),功 能:,将,字符串2,复制到,字符数组1,中,该字符数组1 中原有内容被覆盖。,说明:,(1)字符数组1必须足够大,能容纳复制过来字符串,(2)复制时连同0一起复制到字符数组1中。,78/95,(3)不能用赋值语句将一个字符串常量或字符数组,直接赋给一个字符数组。,比如,:char,str130=“China”,str230;str2=str1;,(4)能够用strncpy函数将字符串2中前n个字符,复制到字符数组中。字符数组其它位置元素不发,生变换。,比如,:,char str130=Chengdu;,char str230=Beijing;,strncpy(str1,str2,2);,执行结果:,str1,为,Beengdu,。,79/95,【例4.16】使用strcpy函数实现字符串拷贝。,80/95,【例4.17】不使用strcpy函数实现字符串拷贝。,81/95,5.字符串比较函数,strcmp,格 式:,strcmp(字符串1,字符串2),功 能:,比较“字符串1”和“字符串2”。,比较规则:自左至右,逐一字符比较ASCII码,直到遇,到不一样字符或0,比较结果由函数值带回。,字符串1 字符串2,函数返回,正整数,1,比如:,strcmp(“a”,“b”);函数返回-1,即:“a”“compare”,82/95,比如:,strcmp(“CHINA”,“china”);函数值是-1,表示:“CHINA”“CHINA”,注意:字符串只能用strcmp 函数比较,不能用关系,运算符“=”、“”等直接比较。,比如:要判断str1是否比str2大,若使用str1str2,就,会犯错,应该使用,strcmp(str1,str2)0,。,83/95,【例4.18】,使用strcmp函数比较两个字符串。,84/95,【例4.19】不使用strcmp函数比较两个字符串。,85/95,86/95,6.求字符串长度函数,strlen,格 式:,strlen(字符数组或字符串),功 能:,测字符串实际长度,不包含0在内。,例 如:,char str20=“Test”;,printf(“%d”,strlen(str);,说明:输出结果不是 20,也不是5,而是4。,87/95,【例4.20】,使用strlen函数测字符串长度功效。,88/95,【例4.21】不,使用strlen函数测字符串长度功效,89/95,7.字符串大小写转换函数,格 式:,strupr(字符数组),功 能:,将字符数组中字符串小写字母转换成大写字母。,例 如:,char str1,“,abcdef,”,;,strupr(str1);puts(str1);,结果:ABCDEF,90/95,8.字符串大小写转换函数,格 式:strlwr(字符数组),功 能:,将字符数组中字符串大写字母转换成小写字母。,例 如:,char str2=“ABCDEF”;,strlwr(str2);puts(str2);,结果:abcdef,91/95,字符数组应用举例,【例】输入一行字符,统计其中有多少个单词,单,词之间用空格分隔开。,92/95,93/95,【例】输入有3个字符串,要求找出其中最大者。,设一个二维字符数组str,大小为320,即有3行20,列,每一行能够容纳20个字符。,C h i n a 0,str0,str1,str2,J a p a n 0,I n d i a 0,0 1 2 3 4 5 6 7 8 9 10 19,str320,94/95,95/95,
展开阅读全文