C语言第6章--数组PPT课件.ppt

上传人:rrsccc 文档编号:10909708 上传时间:2021-06-12 格式:PPT 页数:78 大小:200.50KB
返回 下载 相关 举报
C语言第6章--数组PPT课件.ppt_第1页
第1页 / 共78页
C语言第6章--数组PPT课件.ppt_第2页
第2页 / 共78页
C语言第6章--数组PPT课件.ppt_第3页
第3页 / 共78页
C语言第6章--数组PPT课件.ppt_第4页
第4页 / 共78页
C语言第6章--数组PPT课件.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《C语言第6章--数组PPT课件.ppt》由会员分享,可在线阅读,更多相关《C语言第6章--数组PPT课件.ppt(78页珍藏版)》请在三一文库上搜索。

1、第6章 数组,6.1 数组的概念 6.2 一维数组 6.3 二维数组 6.4 字符数组与字符串,6.1 数 组 的 概 念,数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。,如,全班40个学生成绩都是单精度类型,并且按照学号的顺序排列组合而成一个数组。为了区分不同的数组,每个数组用一个名字来表示,称为数组名。40个学生的成绩可表示为:a0,a1, ,a39,用它们分别来存放第一个学生的成绩、第二个学生的成绩、 、第四十个学生的成绩。,数组有两个特点: (1) 其长度是确定的

2、,在定义的同时确定了其大小,在程序中不允许随机变动。 (2) 其元素必须是相同类型,不允许出现混合类型。,6.2 一 维 数 组,6.2.1 一维数组的定义 【例6.1】 已知全班40个学生的计算机基础课的考试成绩,求全班的平均成绩。,#include main() float a41; /*定义一个一维实型数组a*/ float sum=0,aver; int i; for(i=1;i=40;i+) scanf(%f,i+),sum+=ai; aver=sum/40; printf(全班平均成绩:%f,aver); 在上例中,“float a41;”是一个一维数组的说明语句,说明数组名为a,

3、它由41个元素组成,每个数组元素为单精度实型。任何一个数组在使用之前必须先定义。,一维数组的定义格式为 例如: auto int num40; static float score40,average40; char ch20;,说明: (1) :如前面章节的有关规定,可以为auto,static,extern等。 (2) :说明了数组元素所属的数据类型,可以为 int,float,char 等。 (3) :其命名规则和变量名相同,同样遵循标识符命名规则。,图6-1 数组元素存储形式,(4) :表示数组元素的个数,即数组长度。例如,b20表示b数组有20个元素,最小下标为0,最大下标为19,不

4、能使用b20。常量表达式中只能是常量和符号常量,不允许使用变量。例如: int an; /* 定义错误:常量表达式不能是变量n */ 是错误的。 (5) 在说明一个数组后,系统会在内存中分配一片连续的存储空间用于存放数组元素,如说明语句“int a10;”,它在内存中的存放形式如图6-1所示,其下标取值范围是09。,6.2.2 一维数组的引用 C语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的引用形式为 数组名下标表达式 其中,“下标表达式”可以是整型常量、整型变量或整型表达式,其值均为非负数。例如,在说明语句“int a10;”中,a5表示数组中第6个数组元素;a2*4表示数组

5、中第8个数组元素;ai(0i10)表示数组中第i个数组元素。,【例6.2】 求数组中最大值和最小值。 程序如下: #include main() int a10; int i,max,min; printf(请输入10个整数:); for(i=0;i10;i+) scanf(%d, ,max=min=a0; for(i=1;imax) max=ai; printf(最大数为%d, max); printf(最小数为%d, min); ,6.2.3 一维数组的初始化 在定义数组元素时,系统为其分配了一定的存储空间,所有的存储空间的赋初始值可以在程序运行之前,即在编译阶段进行,也可在运行期间,用赋

6、值语句或输入语句使数组中元素得到初始值。,1在编译阶段赋初值 (1) 对全部数组元素赋初值。例如: static int a6=1,2,3,4,5,6; 其中,数组元素的个数和花括号中初值的个数是相同的,并且花括号中的初值从左到右依次赋给每个数组元素,即a0=1,a1=2,a2=3,a3=4,a4=5,a5=6。,(2) 只给一部分元素赋初值。例如: static int a10=0,1,2,3,4; 此语句定义a数组有10个元素,但花括号中只提供了5个初值,表示只给前5个数组元素a0a4赋初值,后面5个元素a5a9 系统自动赋0。,(3) 给数组全部元素赋初值时,可以省略数组长度。例如: i

7、nt a=10,20,30,40,50; 省略数组长度时,系统将根据赋初值的个数确定数组长度。上述大括号内共有5个初值,说明数组a的元素个数为5,即数组长度为5。,2在运行阶段赋初值 举例如下: int a10; int i; for(i=0;i10;i+) scanf(%d, ,6.2.4 一维数组应用举例 【例6.3】 用数组的方法求Fibonacci数列。 程序如下: #include main() int i; static int f20=1,1; for(i=2;i20;i+),fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); p

8、rintf(%12d, fi); ,运行结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,【例6.4】 用冒泡法对10个数按由小到大的顺序排序。 分析:冒泡法排序又称为交换排序。基本思想是:从最后一个元素开始,两两相邻元素比较,将较小的元素交换到前面,直到把最小元素交换到最前面为止。排序过程如下:,原始状态 7 4 10 1 20 5 3 9 第一次比较结果 7 4 10 1 20 5 3 9 第二次比较结果 7 4 10 1 20 3 5 9 第三次比较结果 7 4 10 1 3 20 5 9 第

9、四次比较结果 7 4 10 1 3 20 5 9 第五次比较结果 7 4 1 10 3 20 5 9 第六次比较结果 7 1 4 10 3 20 5 9 第七次比较结果 1 7 4 10 3 20 5 9,经上述过程完成对8个数的第一轮比较,比较结果将最小数1交换到最前面。然后,以同样的方式完成对其余7个数的第二轮比较,比较结果将最小数3交换到前面。以此类推,经七轮比较,最后完成对8个数由小到大的全部排序。各轮比较结果如下:,第一轮结果:1 7 4 10 3 20 5 9 第二轮结果:1 3 7 4 10 5 20 9 第三轮结果:1 3 4 7 10 5 20 9 第四轮结果:1 3 4 5

10、 7 10 20 9 第五轮结果:1 3 4 5 7 10 20 9 第六轮结果:1 3 4 5 7 9 10 20 第七轮结果:1 3 4 5 7 9 10 20 结束状态: 1 3 4 5 7 9 10 20,图6-2 冒泡法排序流程图,冒泡法排序的流程图如图6-2所示,其源程序如下: #define n 8 main() int i,j,t; int an=7,4,10,1,20,5,3,9; for(i=0;ii;j-) /*控制每轮比较次数*/ if(aj-1aj) /*进行交换的条件*/,t=aj-1; aj-1=aj; aj=t; printf(排序结果为:); for(i=0;

11、in;i+) printf(%d, ai); 运行结果如下: 排序结果为:1 3 4 5 7 9 10 20,6.3 二 维 数 组,引例:全班40个学生,每人有四门功课:高数、计算机、英语、政治的成绩,现求成绩最高的三个学生的成绩。 对于这样一个问题,若用一维数组描述,就要用到四个数组。这种表示方法不能很好地反映它们之间的密切关系,因此引入了二维数组来表示。,6.3.1 二维数组的定义 二维数组的定义格式: 例如: int a25; 二维数组的说明和一维数组的说明形式基本相同,只不过它的有两个,第一个表示二维数组的行数,第二个表示二维数组的列数。,在C语言中,把二维数组看成一个数组的数组,即

12、可以把二维数组看作是一个特殊的一维数组,该一维数组的每个数据元素也是一个一维数组。 二维数组在内存中的存放顺序是按行存放,即先存放第一行的元素,再存放第二行的元素。,6.3.2 二维数组的引用 二维数组元素的引用的一般形式为 数组名下标表达式1下标表达式2 引用二维数组元素的下标表达式的值只能取0到定义数组时所规定的下标上界之间的整数。即行下标的取值范围是0下标表达式1-1,列下标的取值范围是0下标表达式2-1。例如: int a35; 这个二维数组的最小下标的元素是a00,最大下标的元素是a24。,【例6.5】 通过键盘给2*3的二维数组输入数据,第一行赋1、3、5,第二行赋2、4、6,然后

13、按行输出此二维数组。 程序如下:,#include main() int a23,i,j; printf(Enter data by line:n); for(i=0;i2;i+) for(j=0;j3;j+) scanf(%d, ,printf(Output a array:n); for(j=0;j2;j+) for(i=0;i3;i+) printf(%4d, aji); printf(n); ,6.3.3 二维数组的初始化 二维数组同样存在初始化的问题。二维数组的初始化有以下四种形式: (1) 按行依次对二维数组赋初值。例如: static int a34=1,2,3,4,5,6,7,

14、8,9,10,11,12; (2) 将所有数据写在一个花括号内,按数组排列顺序对各数组元素赋初值。例如: static int a34=1,2,3,4,5,6,7,8,9,10,11,12; (3) 同一维数组一样,可以对部分元素显式赋初值。例如: static int a34=1,2,3;,它的作用只对各行第一列的元素赋初值,其余元素值自动为0,故相当于: static int a34=1,0,0,2,0,0,3,0,0; 思考题:static int a34=1, ,5,6;的含义是什么? (4) 若对全部元素显式赋初值,则数组第一维的元素个数在说明时可以不指定,但第二维的元素个数仍然不能

15、缺省。例如: static int a4=1,2,3,4,5,6,7,8;,6.3.4 二维数组应用举例 【例6.6】 有一个3*4的矩阵,要求编程序以求出其中值最大的那个元素的值以及其所在的行号和列号。 程序如下: main() int i,j,row=0,colum=0,max; static int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for(i=0;i=2;i+) for(j=0;j=3;j+),if(aijmax) max=aij; row=i; colum=j; printf(max=%d,row=%d,colum=%dn, max,

16、row,colum); 输出结果: max=10,row=2,colum=1,【例6.7】 编写程序,打印出以下形式的杨辉三角形。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1,分析:可以将杨辉三角形的值放在一个方形矩阵的下半三角中,如果需打印7行杨辉三角形,应该定义等于或大于77的方形矩阵,只是矩阵的上半部和其余部分并不使用。 杨辉三角形的特点如下: (1) 第0列和对角线上的元素都为1; (2) 除第0列和对角线上的元素以外,其他元素的值均为前一行上的同列元素和前一列元素之和。,定义函数setdata,按上述规律给

17、数组元素置数,定义函数outdata以输出杨辉三角形。 程序如下: #include stdio.h #define N 10 main() int yNN,n=7; setdata(y,n); outdata(y,n); ,setdata(int sN,int n) int i,j; for(i=0;in;i+) sii=1;si0=1; for(i=2;in;i+) for(j=1;ji;j+) sij=si-1j-1+si-1j; outdata(int sN,int n) int i,j;,printf(杨辉三角形:n); for(i=0;in;i+) for(j=0;j=i;j+)

18、printf(n); ,【例6.8】 有M个学生,学习N门课程,已知所有学生的各科成绩。编程:分别求每个学生的平均成绩和每门课程的平均成绩。设各学生成绩如表6.1所示。,表6.1 学 生 成 绩 表,程序如下: /*功能:计算个人平均成绩与各科平均成绩,并在屏幕上显示出来。*/ #define N 5 /*定义符号常量人数为5*/ #define M 4 /*定义符号常量课程为4*/ #include stdio.h main() int i,j;,static float scoreN+1 M +1=78,85,83,65,88,91,89,93,72,65,54,75, 86,88,75,

19、60,69,60,50,72; for(i=0;iN;i+) for(j=0;jM;j+) scorei M+=scoreij; /*求第i个人的总成绩*/ scoreNj+=scoreij; /*求第j门课的总成绩*/ ,scorei M/= M; /*求第i个人的平均成绩*/ for(j=0;jM;j+) scoreNj/=N; /*求第j门课的平均成绩*/ clrscr(); /*输出表头*/ printf(学生编号 课程1 课程2 课程3 课程4 个人平均n); /*输出一条短划线*/,for(j=0;j8*(M+2);j+) printf(-); /*输出每个学生的各科成绩和平均成绩

20、*/ for(i=0;iN;i+) printf(学生%dt, i+1); for(j=0;jM +1,j+) print(%6.1ft, scoreij; printf(n); /*输出一条短划线*/,for(j=0;j8*(M+2);j+) printf(-); printf(n课程平均); /*输出每门课程的平均成绩*/ for(j=0;jM;j+) printf(%6.1ft, scoreNj); printf(n); getch(); ,程序运行结果如下: 学生编号 课程1 课程2 课程3 课程4 个人平均 学生1 78.0 85.0 83.0 65.0 77.8 学生2 88.0

21、91.0 89.0 93.0 90.2 学生3 72.0 65.0 54.0 75.0 66.5 学生4 86.0 88.0 75.0 60.0 77.2 学生5 69.0 60.0 50.0 72.0 62.8 课程平均 78.6 77.8 70.2 73.0,6.4 字符数组与字符串,6.4.1 字符数组的定义和基本操作 1字符数组的定义形式和初始化 字符数组是数组元素类型为字符的数组,字符数组中的每一个元素均为字符。它的定义形式如下: char ,例如: char c10; 该语句说明了c是一个含有10个字符型数据的字符数组。它和一般数组的初始化一样,可以在定义时赋初值,如下所示:,字符

22、数组的长度可用初值来确定,如: char str=a, b, c, d; 编译程序,可以计算出字符数组str的长度为4。 注意:如果花括号中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即0)。如: char c5= a, b, c, d; 则c4自动赋为0。,2字符数组的输入和输出 字符数组是以单个字符的形式进行输入和输出的。 【例6.9】 输入一个字符串,并将它逆序输出。 main() char c20; int i, j; i=0; scanf(%c,; for(j=i-1;j=0;j

23、-) printf(%c, cj); 程序运行结果如下: abefhj jhfeba,6.4.2 字符数组的整体操作 1字符串和字符结束符 字符串是一组字符数据,在C语言中没有提供字符串数据类型,因而需通过字符数组来处理字符串。经常有一种情况,如当定义一个字符数组为40时,而实际存入的有效字符只有20个。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符0代表。,有了结束标志0,字符数组的长度就显得不那么重要了。在程序中往往依靠检测0来确定字符串是否结束,而不是根据数组长度来确定字符串是否结束。0代表ASCII码为0的字符,它不是一个可以显示的字符,而是一个“空操作符”,即它

24、什么也不干。用它来作字符串结束标志不会产生附加的操作或增加无效字符,只起一个供辨别的标志。 字符串的说明形式与字符数组是一样的,考虑到字符串有一个串结束符,因此为了存放一个有N个字符的字符串,字符数组的元素个数至少应说明为N+1。,2字符串的初始化形式 (1) 在赋初值时直接赋字符串常量。例如: char str10=string; 习惯上省略花括号,简写成: char str10= string!; 在这里,由于string是字符串常量,系统自动在最后加入0,所以不必人为加入。 还可以用以下形式进行定义: char str=string; 系统将按字符串中实际的字符个数来定义数组的大小。,(

25、2) 在执行过程中给一维字符数组赋值。例如: char s20; scanf(%s,s); printf(%s,s); 其中,scanf()函数中的输入项s是数组名。从键盘输入的字符串应短于已定义的字符数组的长度。,【例6.10】 将二维字符数组初始化,并在屏幕上输出。 程序如下: /*功能:将二维字符数组进行初始化,并在屏幕上输出*/ main() int i; char name59= zhao, qian, sun,li, wang ; for(i=0;i5;i+),printf(n%st, namei); /*namei代表该行数组元素的首地址*/ getch(); 程序运行结果如下:

26、 zhao qian sun li wang,6.4.3 常用的字符串处理函数 C语言中没有提供对字符串进行整体操作的运算符,但提供了很多有关字符串操作的库函数。下面介绍几种常用的库函数。 1字符串复制(拷贝)函数strcpy() 调用的形式如下: strcpy(s1,s2) 此函数用来把s2所指字符串(源)的内容复制到s1所指存储空间(目的)中,函数返回s1的值,即目的串的首地址。,例如: static char str110,str2=China; strcpy(str1,str2); 执行后,str1的状态如下所示:,2字符串连接函数strcat() 调用形式如下: strcat(s1,

27、s2) 该函数将s2所指字符串的内容连接到s1所指的字符串后面,并自动覆盖s1串尾的0, 函数返回s1的地址值。 注意:s1所指的字符串应有足够的空间容纳两串合并后的内容。,例如: static char str130=People; static char str2=China; printf(%s,strcat(str1,str2); 输出结果如下: PeopleChina,3求字符串长度函数strlen() strlen()函数的调用形式如下: strlen(s) 此函数计算出以s为起始地址的字符串的长度,并作为函数的返回值。这一长度不包括串尾的结束标志0。例如: char c10=Bo

28、at; printf(%d, strlen(c); 的输出结果为4。,4字符串的比较函数strcmp() 调用形式如下: strcmp(字符串1,字符串2) strcmp函数用于比较两个字符串的大小,比较时对两个字符串自左至右逐个相比较(按ASCII码值大小比较),直到出现不同的字符或遇到0为止。比较结果由函数值返回:,(1) 若字符串1=字符串2 ,函数值为0。 (2) 若字符串1字符串2,函数值是正整数,为两个字符中第一个不同字符的ASCII码的差值。在字符串比较时,字符结束符0也参加比较,下同。 (3) 若字符串1字符串2,函数值是负整数,为两字符串中第一个不同字符的ASCII码的差值。

29、 例如: printf(%d, strcmp(Book,Boat); 的输出结果为14。,6.4.4 程序举例 【例6.11】 从键盘上输入字符串,求字符串的长度。 main() char str30; int len=0,i=0; printf(请输入字符串:); scanf(%s, str); while(stri!=0) i+;len+; printf(字符串的个数:%d,len); ,【例6.12】 输入两个字符串,在字符串中查找字符串,并返回字符串在字符串中第一次出现的位置。,#include int find_str(char x,char y) int i,j,k; i=0; W

30、hile(xi) k=i; j=0; while(xi ,j+; if(!yj) return(k+1); else i=k+1; return(0); main() char a80,b80; int pos; printf();,gets(a); printf(); gets(b); pos=find_str(a,b); if(pos) printf(子串%s在字符串%s中第一次出现的位置:%dn, a,b,pos); else printf(未找到子串%s!n, b); ,【例6.13】 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 #includestdio.h main() char string81; int i,num=0,word=0; char c; gets(string); for(i=0;(c=string(i)!=0;i+),if(c= ) word=0; else if(word=0) word=1; num+; printf(There are %d words in the linen, num); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1