C语言程序设计课件.ppt_第1页
C语言程序设计课件.ppt_第2页
C语言程序设计课件.ppt_第3页
C语言程序设计课件.ppt_第4页
C语言程序设计课件.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/9/19,1,第六章 数组与指针,6 1 数组 6.2 指针的概念 6.3 指针与数组 6.4 字符串的指针 6.5 指针数组和指向指针的指针 6.5 常用程序设计方法-迭代法和递推法,2019/9/19,2,6.1 数组,6.1.1 数组的概念 6.1.2 数组的定义、初始化和引用 6.1.3 字符数组,2019/9/19,3,数组的概念,由若干个类型相同的相关数据按顺序存储在一起形成的一组同类型有序数据的集合,就称为数组。,如果用一个统一的名称标识这组数据,那么这个名字就称为数组名,构成数组的每一个数据项称为数组的元素,用一个统一的数组名和下标来唯一的确定数组中的元素。,同一数组中的元素必须具有相同的数据类型,而且这组数据在内存中将占据一段连续的存储单元。,2019/9/19,4,一维数组的定义和引用,1、一维数组的定义,一维数组的定义方式为 类型说明符 数组名常量表达式;,例如: int a10; 它表示数组名为a,此数组有10个元素。,2019/9/19,5,(l)数组名定名规则和变量名相同,遵循标识符定名 规则。,说明:,(2)数组名后是用方括弧括起来的常量表达式,不能 用圆括弧。,(3)常量表达式表示元素的个数,即数组长度。,(4)常量表达式中可以包括常量和符号常量,不能包 含变量。,2019/9/19,6,2、一维数组元素的引用,数组必须先定义,然后使用。C语言规定只能逐 个引用数组元素而不能一次引用整个数组。,数组元素的表示形式为 数组名下标 下标可以是整型常量或整型表达式。 例如:a0a5 a7 a2*3,2019/9/19,7,3、一维数组的初始化,对数组元素的初始化可以用以下方法实现:,(l)在定义数组时对数组元素赋以初值。例如: int a100,l,2,3,4,5,6,7,8,9; 将数组元素的初值依次放在一对花括弧内。经过上面的定义 和初始化之后, a0 0, a11, a22, a33, a44, a55, a66, a7 7, a8 8, a9 9。,2019/9/19,8,(2)可以只给一部分元素赋值。例如: int a100,l,2,3,4;,定义a数组有10个元素,但花括弧内只提供5个初值,这表 示只给前面5个元素赋初值,后5个元素值为0。,(3)如果想使一个数组中全部元素值为0,可以写成 int a10 0,0,0,0,0,0,0,0,0,0; 不能写成 int a10 0*10;,2019/9/19,9,(4)在对全部数组元素赋初值时,可以不指定数组长度。数 组的长度就是初值的个数。例如: int a 0,l,2,3,4,5;,花括弧中有6个数,系统就会据此自动定义a数组的长度 为6。但若被定义的数组长度与提供初值的个数不相同,则 数组长度不能省略。,2019/9/19,10,4、例子, 用数组求Fibonacci数组的前20个数,,程序如下:,main() int i; int f20=1,1; for (i=2;i20;i+) fi=fi-2+fi-1; for (i=0;i20;i+) if (i%50) printf(“n”); printf(“%12d”,fi); ,2019/9/19,11, 用冒泡法对10个整数进行排序(从小到大),起泡法的思路是:将相邻两个数比较,将小的调到前头。,9 8 5 4 2 0,5 4 2 8 0,8 9 5 4 2 0,8 5 4 2 9 0,5 4 8 2 0,8 5 4 2 0 9,8 5 9 4 2 0,5 8 4 2 0,5 4 2 0 8,8 5 4 2 0,第一次,第二次,第一次,第三次,第四次,第五次,第二次,第三次,第四次,结 果,结 果,8 5 4 9 2 0,2019/9/19,12,根据流程图写出程序(今设n10),定义数组长度为11, 本例中对a0不用,只用 a1到a10,以符合人们的习惯。,流程图如下:,2019/9/19,13,程序如下:,main() int a11; int 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) ,2019/9/19,14,二维数组的定义和引用,1、二维数组的定义,二维数组定义的一般形式为 类型说明符 数组名常量表达式常量表达式 例如:float a34,b510;,C语言对二维数组采用这样的定义方式,使我们可以把 二维数组看作是一种特殊的一维数组,它的元素又是一个一 维数组。,2019/9/19,15,上面定义的二维数组可以理解为定义了3个一维数组,即 相当于 float a04,a14,a24,例如,可以把a看作是一个一维数组,它有3个元素: a0、a1、a2,每个元素又是一个包含4个元素的一维数组。,2019/9/19,16,2、二维数组的引用,(1)二维数组的元素的表示形式为 数组名下标下标 如a23。下标可以是整型表达式,如a212*21。不要 写成a2,3,a21,2*21的形式。,(2)数组元素可以出现在表达式中,也可以被赋值。,(3)在使用数组元素时,应该注意下标值应在已定义的数组大 小的范围内。常出现的错误是 int a34;,a34=3;,定义a为34的数组,它可用的行下标值最大为2,列坐标值最 大为3。用a34超过了数组的范围。,2019/9/19,17,3、二维数组的初始化,可以用下面的方法对二维数组初始化:,(1)分行给二维数组赋初值。如 int a34 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;,注意:,用第2种方法如果数据多,写成一大片,容易遗漏, 也不易检查。,2019/9/19,18,(3)可以对部分元素赋初值。,int a34 =1,5,9;,它的作用是只对各行第1列的元素赋初值,其余元素值自动 为0。赋初值后数组各元素为,0 0 0 0 0 0 0 0 0,也可以对各行中的某一元素赋初值: int a34 =1,0,6,0,0,11;,初始化后的数组元素如下:,0 0 0 0 6 0 0 0 0 11 0,2019/9/19,19,(4)如果对全部元素都赋初值(即提供全部初始数据),则定 义数组时对第一维的长度可以不指定,但第二维的长度不 能省。如: int a34 =1,2,3,4,5,6,7,8,9,10,11,12;,与下面的定义等价: int a 4 =1,2,3,4,5,6,7,8,9,10,11,12;,系统会根据数据总个数分配存储空间,一共12个数据,每 行4列,当然可确定为3行。,2019/9/19,20,(5)在定义时也可以只对部分元素赋初值而省略第一维的长度, 但应分行赋初值。如: int a 4 =0,0,3, ,0,10;,这样的写法,能通知编译系统,数组共有3行。 数组各元素为,0 0 3 0 0 0 0 0 0 10 0 0,4、例题,将一个二维数组行和列元素互换后到另一个二维数组中。,2 3 5 6,a,b=,4 5 3 6,2019/9/19,21,程序如下:,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=a ij; printf(“n”); ,printf(“array b:n”); for (i=0;i=2;i+) for (j=0;j=1;j+) printf(“%5d”,bij); printf(“n”); ,array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,运行结果:,2019/9/19,22,有一个34的矩阵,要求编程序求出其中值最大的那个元素 的值,以及其所在的行号和列号。,先用NS流程图表示算法:,2019/9/19,23,程序如下:,main() int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for (i=0;imax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum); ,输出结果为: max=10,row=2,colum=1,2019/9/19,24,字符数组,用来存放字符数据的数组是字符数据的数组是字符数组, 字符数组中的一个元素存放一个字符,字符数组的定义和引用 的方式与一般的数组类似。,1、字符数组的定义,Char 字符数组名常量表达式;,例如 char c10; c0=I ; c1= ; c2=a ; c3=m ; c4= ; c5=h ; c6=a ; c7=p ; c8=p ; c9=y ;,定义C为字符数组,包含10个元素。在赋值以后数组的状态 如图所示:,c0 c1 c2 c3 c4 c5 c6 c7 c8 c9,2019/9/19,25,2、字符数组的初始化,与一般数组的初始化方法类似。 例如char c =I, ,a,m, ,a, ,s,t,u,d,e, n,t 数组c的长度自动定义为14。,3、字符数组的引用, 输出一个字符串,main() char c10=I, , a,m, ,a, ,b,o,y; int i; for (i=0;i10;i+) printf(“%c”,ci); printf(“n”); ,运行结果: I am a boy,2019/9/19,26, 输出一个钻石图形,main() char diamond 5= , , *, , *, , *, *, , , , *, , *, , *, , , *; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(“%c”,diamondij); printf(“n”); ,运行结果为:,2019/9/19,27,4、字符串和字符串结束标志,在C语言中,将字符串作为字符数组来处理。字符串必须 要有一个字符串结束标志0。字符串的长度为字符串所包含 字符个数,不包含0,因此,“I am a student”这个字符串存放 在数组中,数组的长度需要15,如下图所示:,2019/9/19,28,对字符串的赋初值有两种方式,(1)按单个字符的方式赋初值。 例如: char c=I, ,a,m, ,a, ,s,t,u,d,e, n,t, o;,(2)直接在初值表中写一个字符串常量。 例如: char c= “I am a student”,(1)、(2)两种方式的执行结果完全一致,2019/9/19,29,5、字符数组的输入输出,字符数组的输入输出可以有两种方法:,(l)逐个字符输入输出。用格式“c”输入或输出一个字符。,(2)将整个字符串一次输入或输出。用“s ”格式符,意思是 输出字符串(string)。,请注意:,(1) 输出字符不包括结束符o。 (2)用“s”格式符输出字符串时, printf函数中的输出项是字 符数组名,而不是数组元素名。写成下面这样是不对的: printf(“%s”,c0);,2019/9/19,30,(3)如果数组长度大于字符串实际长度,也只输出到遇o 结束。如: char c10=“China”; printf(“%s”,c); 也只输出“China”5个字符,而不是输出 10个字符。,(4)如果一个字符数组中包含一个以上o,则遇第一个o时 输出就结束。 可以用 scanf函数输人一个字符串。例如 scanf (“%s”,c);,scanf函数中的输入项 c是字符数组名,它应该在先前已被定义。,2019/9/19,31,(5)如果利用一个scanf函数输入多个字符串,则以空格分隔。 例如: char str15,str25,str35; scanf(“%s%s%s”,str1, str2, str3); 输入数据: How are you?,(6)scanf函数中的输入项是字符数组 名。输入项为字符数组名时,不要 再加地址符,因为在C语言中数组名代表该数组的起始地 址。下面写法不对: scanf(“%s”,输入后str1、str2、str3数组状态见图,2019/9/19,32,6、字符串处理函数,在C的函数库中提供了一些用来处理字符串的函数,使用 方便。几乎所有版本的C都提供这些函数。下面介绍几种常用 的函数。,其作用是:将一个字符串(以o结束的字符序列)输出到终端。,(1)puts(字符数组),例如: char str =“ChinanBeijing”; puts(str); 输出: China Beijing 在输出时将字符串结束标志o转换成n,即输出完字符 串后换行。,2019/9/19,33,(2)gets (字符数组),其作用是:从终端输入一个字符串到字符数组,并且得到 一个函数值。该函数值是字符数组的起始地址。 如执行下面的函数: gets(str) 从键盘输入:Computer,注意:, 用puts和gets函数只能输入或输出一个字符串。 gets(str) str以回车作为结束。,将输入的字符串“Computer”送给字符数组str,函数值为字符数组str的起始地址。,2019/9/19,34,(3)strcat(字符数组1,字符数组2),其作用是:连接两个字符数组中的字符串,把字符串2接到字 符串1的后面,结果放在字符数组1中,函数调用后得到一个 函数值字符数组1的地址。例如: char str130=“Peoples Republic of”; char str2 =“China”; printf(“%s”,strcat(str1,str2);,说明:, 字符数组1必须足够大,以便容纳连接后的新字符串。 连接前两个字符串的后面都有一个o,连接时将字符串1 后面的o取消,只在新串最后保留一个o。,输出: Peoples Republic of China,2019/9/19,35,(4)strcpy(字符数组1,字符串2),作用是将字符串2复制到字符数组1中去。例如: char str110, str2 =“China”; strcpy(str1,str2); 执行后,strl的状态如图,说明:,字符数组1必须定义得足够大,以便容纳被复制的字符串。 字符数组1的长度不应小于字符串2的长度。 字符数组1必须写成数组名形式(如strl),“字符串2”可以 是字符数组名,也可以是一个字符串常量。如 strcpy(str1,“China”); 作用与前相同。,2019/9/19,36,复制时连同字符串后面的o一起复制到字符数组1中。 不能用赋值语句将一个字符串常量或字符数组直接赋给一个 字符数组。如下面两行都是不合法的: str1=“China”; str1=str2; 可以用strcpy函数将字符串2中前面若干个字符复制到字符 数组1中去。即部分复制. 例如: strcpy(str1,str2,2); 作用是将 str2中前面2个字符复制到 strl中去,然后再加一 个o。,(5)strcmp(字符串1,字符串2),作用是比较字符串1和字符串2。,2019/9/19,37,字符串比较的规则与其他语言中的规则相同,即对两个字 符串自左至右逐个字符相比(按 ASC码值大小比较),直到 出现不同的字符或遇到o为止。如全部字符相同,则认为相 等;若出现不相同的字符,则以第一个不相同的字符的比较结 果为准。,如果参加比较的两个字符串都由英文字母组成,则有一个 简单的规律:在英文字典中位置在后面的为“大”。 例如computer在字典中的位置在compare之后。但应注意小写字 母比大写字母“大”,所以“DOG”“cat”。,2019/9/19,38,比较的结果由函数值带回。 如果字符串1字符串2,函数值为0。 如果字符串1字符串2,函数值为一正整数。 如果字符串l字符串2,函数值为一负整数。,(6)strlen(字符数组),它是测试字符串长度的函数。函数的值为字符串中的实际 长度,不包括o在内。如: char str10=“China”; printf(“%d”,strlen(str); 输出结果不是10,也不是6,而是5。也可以直接测字符串 常量的长度,如: strlen(“China”);,2019/9/19,39,(7)strlwr(字符串),strlwr是 STRing LoWeRcase(字符串小写)的缩写。函数 的作用是将字符串中大写字母换成小写字母。,(8)strupr(字符串),strupr是STRingUPpeRcase(字符串大写)的编写。函数 的作用是将字符串中小写字母换成大写字母。,7、例题,(1)输入一个字符串存入数组a。对字符串a中的每个字符用 3 的方法加密并存入数组b。再对数组b中的字符解密存 入数组c。 最后依次输出数组b、c中的字符串。,注意:若使用上述函数,必须在函数的开头加上#include “string.h”,2019/9/19,40,程序如下:,# include “stdio.h” main() char a80,b80,c80; int i; g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论