C语言(第七章数组).ppt_第1页
C语言(第七章数组).ppt_第2页
C语言(第七章数组).ppt_第3页
C语言(第七章数组).ppt_第4页
C语言(第七章数组).ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

,第七章 数组,本章目标,1. 了解数组的数据结构,2. 理解一维和多维数组的定义和关系,3. 了解数组元素在内存的存放规则,4. 了解数组元素和数组名的作用,5. 掌握数组的使用方法,6. 掌握基本的排序算法,一、数组具有的特征,数组名 数组元素的个数 数组元素的类型。 例如 int a10;,7.1.1 引言,二、数组的作用, 数组元素的作用相当于简单变量, 数组名代表的是数组在内存中的首地址, 同一个数组中的元素在内存中是按顺序连续存放的,7.1.2 一维数组,一、一维数组的定义,形式: 类型说明符 数组名常量表达式;,例: int a 20; float x 100;,代表数组元素的个数,其中 a 和 x 都是数组名。,1. 数组名的确定方法同变量名。,2. C语言用方括号 表示数组元数个数。,对于 int a5; 表示有5个元素, 元素的下标从0开始. 数组a的元素分别为:a0,a1, a2, a3, a 4,说明:,3. 常量表达式中可以包括常量和符号常量,不能包含变量。,int n6; int a5;,数组 a 在内存中的存放顺序:,注意:在没有给数组元素赋值以前,没有确定的值。,二、一维数组的引用,2. 引用数组元素的方式: 数组名下标,1. 必须象使用变量那样,先定义,后使用,则 a 05+a1 6 为正确的算术表达式 a0a5+a3+2a2*3,例:int a5;,a0=1;,a1=2;,三、一维数组初始化, 对全部元素赋初值。如:,int a10=10, 11, 12, 13, 14, 15, 16, 17, 18, 19,表示数组元素的值为:,a0=10;,a1=11;,.,a9=19;, 对部分元素赋初值(前面的连续元素)。如:,后5个元素的初值为0。,int b10=0,1,2,3,4;,表示数组元素的值为:,b0=0;,b1=1;,b2=2;,b3=3;,b4=4;,注意:不能只对不连续部分元素或后面的连续元素赋初值。,语句: int a10=, , , , ,1,2,3,4,5;,int a10=1, ,3, ,5 , ,7, ,9, ,; 是错误的。, 如对数组元素赋同一初值,必须一一写出: int a10=2,2,2,2,2,2,2,2,2,2; 不可写成任何其他形式。 int a10=2*10;, 若赋全部元素的初值,可省略常量表达式 int a =0,1,2,3; 表示a4,即只有4个元素。,一、采用循环方式对数组元素赋初值,main( ) int i,a10; for(i=0;i=10;i+) scanf(“%d”, ,7.1.3 数组应用实例,二、内存与数组的关系,前面已讲过:数组元素在内存中是按顺序连续存放的;,重要特性:系统对超出数组元素的使用不查错。,例:# include ,main( ), int a5=0, 1, 2, 3, 4, i;,char ch5=a, b, c, d, e;,for (i=0; i10; i+),printf(“a%d=%d, ch%d=%cn“, i, ai, i, chi);,printf(“%s“, ch);,a0=0, ch0=a,a1=1, ch1=b,a2=2, ch2=c,a3=3, ch3=d,a4=4, ch4=e,a5=25185, ch5=,a6=25699, ch6=,a7=23909, ch7=,a8= 22, ch8= ,a9=285, ch9=,三、一维数组的应用,求Fibonacci 数列的前20项。, 定义数组,并赋初值,static int f 20=1,1; /*定义数组的前两个元素*/,fi=fi-1+fi-2 ,且f1 = f2= 1。, 用循环for求数列的后18项:,注意: 下标越界问题: i =2且i20,for (i=2; i20; i+),f i=f i 1+f i 2;,程序如下:,1 8 89 987,5 55 610 6765,运行结果如下:,1 13 144 1597,2 21 133 1584,3 34 377 4181,四、简单预处理指令,1. 指令格式:,#define 符号常量 文本串,2. 指令作用,用整型表达式替换程序中所有的符号常量。,例:#define MAX 15,main ( ), int aMAX;,.,相当于,.,main ( ), int a15;,在数组中使用预处理指令可提高程序的可读性和可维护性。,例2 冒泡排序,一、排序的概念,将一组连续的数据按一定的顺序排列。,如:升序、降序, 冒泡排序:一种简单的快速排序法。,二、冒泡排序的算法思想,对于有n个数据的集合,要经过(n1)趟排序;,每一趟排序都会把集合中最大的那个数排到最后。,例如:有一组数据为: 48, 37, 64, 97, 75, 12, 26, 49,补充例:用起泡法排序(由小到大),思路:将相邻两数两两比较,若小则调到前头,不小也要比较,第一轮大数沉底 第二轮 第三轮 第四轮 第五轮,此处:n=6,外层循环j: 1 n-1 内层循环i: 1 n-j,9 8 8 8 8 8,8 9 5 5 5 5,5 5 9 4 4 4,4 4 4 9 2 2,2 2 2 2 9 0,0 0 0 0 0 9,8 5 5 5 5,5 8 4 4 4,4 4 8 2 2,2 2 2 8 0,0 0 0 0 8,5 4 4 4,4 5 2 2,2 2 5 0,0 0 0 5,4 2 2,2 4 0,0 0 4,2 0 0,0 2,main( ) int a7; int i, j , t; printf (“input 6 numbers: n”); for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf (“the sorted numbers: n”); for(i=1;i7;i+) printf(“%d _ _”,ai); ,运行:input 6 numbers: 输入:9 8 5 4 2 0 输出:0 2 4 5 8 9,例3 简单查找,一、查找,在一堆数据中查找指定的数据。,二、两种简单的查找方法, 线性查找,思想:把数组中的每一个元素的值与关键值比较。, 二分查找(或折半查找),思想:把数组中排在中间的那个元素的值与关键值比较。每次查找可缩小1/2的范围。,适合于已排序的数组,且数组元素较多。,例1. 线性查找 给定存放10个数的数组,输入一个数,查找该数在数组中的存放位置,例2. 二分查找 给定一个排好序的n个数的数组,输入一个数,查找该数在数组中的存放位置 12 34 38 45 50 56 68 78 87 98 99 100 104 110 230,7.3 二维数组,一、二维数组的定义,形式:,例: int a4 10; float x8 20;,类型说明符 数组名常量表达式1 常量表达式2,2. 可将二维数组的元素看成为若干个特殊的一维数组。,可看成:有三个特殊的一维数组b0,b1, b2,每一个又有四个元素:,1. 不可将定义写为int a4,10。,注意:,b00, b01, b02, b03, b10, b11, b12, b13, b20, b21, b22, b23,如: int b3 4;,3. 二维数组的存放方式为: 按行优先。由此可推广 至三维、n维数组的定义和存放。,4. 初始化:,即: 最右边的下标变化最快。, 按行给二维数组赋初值:,int a34=1,2,3,4, 5,6,7,8, 9,10,11,12;,或:,int a34=1,2,3,4,5,6,7,8,9,10,11,12;, 可以对部分元素赋初值,但需表达清楚。,则相当于,若: int a34=1,2,3,8,则相当于,如: int a34=1,2,3,8。, 可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小。,static int a 4=1,2,3,12;,二维数组与一维数组的对应关系:,二维数组的元素在内存中是按先行后例的顺序存放的,因此可以将二维数组看作是一维数组。,注意:,二、二维数组元素的引用,形式:,其中的下标为整型表达式,但不得越界。 与一维数组元素一样,二维数组元素相当于同类型的简单变量。,数组名下标1下标2,三、程序举例,例1: 将一个二维数组行和列元素互换,存到另一个二维数组中。例如:,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; j=1; j+) printf(“%5d“, bij); printf(“n“); ,#include main ( ) int a2 3=1, 2,3,4, 5,6; int b3 2, i, j;,程序如下:,array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,运行结果如下:,注意:, 数组元素数据的输入必须以循环方式进行或者定义时置初值。, 二维数组一般用二重循环对每个元素赋值。,举例:键盘输入2X3矩阵,输入各元素地址和值 main( ) int i, j, a23; for(i=0; i2; i+) for(j=0; j3; j+) scanf(“%d”, ,输入:1 3 5 7 9 11 输出:&a00=ffce a00=1 &a01=ffd0 a01=3 &a02=ffd2 a02=5 &a10=ffd4 a10=7 &a11=ffc6 a11=9 &a12=ffd8 a12=11,3. 多维数组的定义和在内存中的存放顺序: 如 int a234; 共24个元素,在内存中排列的顺序是:第三维变化最快,然后是第二维,第一维最慢。 #include void main() int i,j,k; float a222; for(i=0;i2;i+) for(j=0;j2;j+) for(k=0;k2;k+) scanf(“%f“, 注:从键盘给数组元素赋值,可通过一中间变量进行。,要求: 打印出所有元素的和;, 打印出所有大于平均值的元素。,举例:有3 4矩阵,求出其中最大元素所在的行号和列号,运行结果: max=10,row=2,colum=1 问题:在比较前 为什么要把a00赋给max?,main( ) int i, j, r=0,c=0, max; int a34 = 1,2,3,4, 9,8,7,6, -10,10,-5,2 ; max=a00; for(i=0;imax) max=aij; r=i;c=j; printf(“max=%d,row=%d, colum=%dn”,max,r,c); ,7.3 字符数组 字符型数组:用于存放字符型数据。 一维字符数组:存放一个字符串(每个数组元素存放一个字符) 二维字符数组:存放多个字符串(行数是字符串的个数) 7.3.1 字符数组的定义 形式:char 数组名常量表达式 char 数组名常量表达式常量表达式 常量表达式:整、字符、符号常量。 例: char a5; a0=C; a1=H;a2=I; a3=N; a4=A;,7.3.2 字符数组的初始化 如:char a5=C, H, I, N, A; char b5=C, H, I, N, W, U; 编译时将指出:初始化值太多 char c5=C, H, I; char d =C, H, I, N, A 系统自动确认其长度为5,7.3.3 字符数组的引用 举例: 输出一个字符串 main( ) char c10=I, _, a, m, _, h, a, p, p, y; int i; for(i=0;i10;i+) printf(“%c”, ci); print(“ n”); ,运行结果: I_am_happy,举例:输出一个钻石图 main() char diamond5= , , *, ,*, , * , *, , , , *, , *, , *, , , * ; int i; int j; for (i=0; i5; i+) for(j=0;j5;j+) printf(“%c“, diamondij); printf(“n“); ,7.3.4 字符串和字符串结束标志 (1)字符串(常量):用双引号括起的若干字符(隐含结束符), 可将其存放在一维或两维字符型数组中。 (2)字符串结束标志为: 0 (既无动作,又不显示) (3)字符串的长度:第一个0以前字符的个数 (4)在字符型数组或字符串中遇0 ,即认为该字符串结束; (5)字符串可用于字符型数组初始化 如:char c =“I_am_happy” ; 或:char c =“I_am_happy”; 系统自动在数组最后加0,长度为11 ,相当于: char c = I,_,a,m,_,h,a,p,p,y, 0; 而char c =I, , a, m, , h, a, p, p, y ; 10个元素,注意:字符 0 并不一定都在字符数组的后面,输出时遇到第一个 0 结束; 举例: main( ) char a = a, b, 0, 1, 2; char b =“ab 0cd” ; printf (“%sn%s n”, a,b); ,运行结果: a b a b,7.3.5 字符数组的输入输出 1.字符数组的输出printf,当然还可用putchar(c),举例: main( ) int i; char a10= “CHINA” ; char b18=“CHINA 0CHINA 0CHINA” ; for(i=0;i10;i+) printf(“%c”,ai); printf (“ n”); printf (“%s n”,a); for(i=0; i18; i+) printf (“%c”, bi); printf(“ n”); printf (“%sn”,b); ,运行结果: CHINA CHINA CHINA_CHINA_CHINA CHINA,注意: (1)%s格式输出时,遇第一个 0时结束; (2)%c格式输出时,按指定的长度输出,当遇 0 时输出_ ; (3)%s格式输出字符型数组元素时,如printf (“%s” , a2); 编译时虽然无错,但输出的是不可确定的字符,因此,这里必须是数组名; 2.字符数组的输入 scanf 形式: scanf (“%s” , a); 其中:a是一个已被定义的字符型的数组名,字符数组名前不加地址运算符 &, 数组名代表数组的首地址 当然还可用getchar( ),举例:多个字符型数组输入字符串 main( ) char a15, a25, a35; scanf (“%s%s%s”,a1, a2, a3); printf(“a1=%s na2=%s na3=%s n”,a1, a2, a3); printf (“ 说明: (1)用scanf函数输入 多个字符串时, 可用_, , t分隔(Tab键)。 (2)在printf 函数中,用%s打印字符型数组的内容; 而用%x,或%o可打印字符型数组的地址。,输入:how_are_you? 输出: a1=how a2=are a3=you? &a1=ffcc &a2=ffd2 &a3=ffd8,a10 a11 a12 a13 a14 a20 a21 a22 a23 a24 a30 a31 a32 a33 a34,h o w 0 0 a r e 0 0 y o u ? 0,例: 计算字符串的有效长度,并输入该串 例: 输入一个以问号结束的字符串(少于80个字符), 统计其中数字字符的个数 例:输入一个以回车结束的字符串(少于10个字符), 它由数字字符组成,将其转换成整数后输出,7.3.6 字符串处理函数 1.字符串输出函数 puts 形式: puts(字符数组或字符串) 功能:输出一个字符串(以 0结束,并输出 n) 。 举例: #include main() char a1 =“chinanbeijing“; char a2 =“china0beijing“; puts(a1); puts(a2); puts(“WUHAN“); ,运行结果: china beijing china WUHAN,2. 字符串输入函数 gets 形式: gets(字符数组) 功能: 从键盘输入一个字符串到字符数组。 在输入过程中,遇“” 结束,并将其转换为 0 存入字符串尾部,对输入的_, t(Tab键) 作为字符存入字符型数组中。,举例: 用gets 和scanf 函数分别输入字符串 scanf 遇_ 字符便结束, 而gets 却将_ 存入字符型 数组。 main( ) char a115, a215 ; gets(a1); scanf(“%s”,a2); printf (“a1=%s n”,a1); printf (“a2=%s n”,a2); ,输入:china_beijing china_beijing 输出:a1=china_beijing a2=china,3.字符串连接函数strcat 形式:strcat(字符数组1,字符数组2) 功能:连接两个数组中的字符串。 操作:把字符数组2 (串2)中的内容连接到字符数组1的后面,结果是两串相加存放到字符数组1中,使用时要考虑字符数组1的容量要足够大。 举例: main( ) char str130 = “Peoples_Republic_of_” ; char str2 = “china” ; printf(“%s n”, strcat(str1, str2); ,4.字符串拷贝函数strcpy 形式:strcpy(字符数组1,字符串2) 功能:将字符串2(也可以是字符数组)拷贝到字符数组1中,字符数组1中原来的内容被覆盖。 举例: main( ) char a18, a2 =“china”, a3 =“wuhan” ; strcpy(a1, a2); strcpy(a2, a3); strcpy(a3, “ beijing” ); printf(“a1=%s na2=%sna3=%s n”, a1,a2,a3); ,运行结果: a1=china a2=wuhan a3=beijing,注意: (1)字符串拷贝不能用赋值语句“=”; 如: char a110, a210=“china”; a1=a2; 只能用strcpy(a1,a2); (2)字符数组的元素可用赋值语句, 如:a11=a21; (3)字符数组初始化时可用“=” ,其它地方对字符数组赋值时不能用“=”;,5.字符串比较函数strcmp 形式:strcmp(字符串1,字符串2) 功能:两串按Ascii码值从左向右逐个比较,直到出现不同字符或0 为止;返回值是第一个不同Ascii码值的差值。 比较结果: (1) 串1 = 串2 返回值为0 (2) 串1 串2 返回值为正数 (3) 串1 串2 返回值为负数,举例: main( ) int i, j, k; char a1 =“wuhan”,

温馨提示

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

评论

0/150

提交评论