第4章数组和字符串.ppt
《第4章数组和字符串.ppt》由会员分享,可在线阅读,更多相关《第4章数组和字符串.ppt(93页珍藏版)》请在三一办公上搜索。
1、1,第4章数组和字符串,2,第4章 数组和字符串,4.1 数组的概念 4.2 一维数组4.3 二维数组4.4 字符串与字符函数,3,4.1 数组的概念,问题的提出:第一个问题:输入100个学生的“C程序设计”课程的成绩,将这100个分数从小到大输出。第二个问题:输入100个学生的“C程序设计”课程的期中和期末成绩,算出总评成绩,总评成绩为“30%期中成绩+70%期末成绩”,计算总评成绩的分数段情况。,4,1.数组的定义,按序排列的同类数据元素的集合就称为数组。从概念上来说,数组是一组变量,这组变量应该满足下列条件:具有有相同的名字 具有相同的数据类型 在存储器中连续存放。按数组元素类型的不同,
2、数组又可分为数值型数组字符型数组指针型数组结构体型数组,5,2.数组的数据类型,数组的数据类型可以是各种基本数据类型如int、float、double、char、long等。还可以是:指针型结构体型共用体型枚举型(以上类型后续章节介绍)同一数组中的所有元素必须是相同类型的。,6,3.数组的维数,一维数组元素有一个下标,如a1二维数组元素有两个下标,如a11三维数组三个下标,如a111C语言的数组可以是多维的,但一般常用的是一维数组和二维数组。,7,4.2一维数组,4.2.1一维数组的定义4.2.2一维数组的初始化4.2.3一维数组的引用,8,4.2.1一维数组的定义,一维数组定义的语法格式如下
3、:类型说明符 数组名 数组长度;其中:(1)“类型说明符”可以是任何一种基本数据类型或构造数据类型。例如:int data5;/*整型数组data,有5个元素。*/char string20;/*字符型数组string,有20个元素*/(2)“数组名”命名规则和变量命名规则相同。(3)数组名后的“数组长度”表示数组中数据元素的个数,数组长度只能是一个整型常量。,9,(4)一个数组定义语句中可以只定义一个数组,也可以定义多个数组,还可以同时定义数组和变量。例如:float b10,c20,f;定义了:单精度浮点型数组b,有10个元素;单精度浮点型数组c,有20个元素;浮点型变量f。,10,程序段
4、一:#define Size 5main()int aSize,bSize+10;/*正确*/程序段二:main()int n=5;int datan;/*错误*/,例如:,11,一组red整数,12,16位,数组red有13个元素,下标为012注意:没有red13。,定义整型数组red,13,4.2.2一维数组的初始化,初始化是指在数组定义时给数组元素赋予初值。格式:类型说明符 数组名常量表达式=数据值1,数据值2,数据值n;注意:数组初始化是在编译阶段进行的,由可执行语句完成的,因此不能将初始化的“=”与赋值号混淆。规定:可以只给部分元素赋初值。没有赋初值的元素:对于数值型数组,自动赋初值
5、为0;对字符型数组,自动赋初值为空字符。例如:,14,int red13=1,2,3,4;则red4red12的初值都为0。只能给元素逐个赋值,不能给数组整体赋值。例如:给数组red中的13个元素全部赋值“2”只能用以下形式来表示:int red13=2,2,2,2,2,2,2,2,2,2,2,2,2;而不能为了方便写成如下的形式:int red13=2;初始化数组时,允许省略数组的长度。例如:int red13=1,2,3,4,5,6,7,8,9,10,11,12,13;可写为:int red=1,2,3,4,5,6,7,8,9,10,11,12,13;,15,4.2.3一维数组的引用,格式
6、:数组名下标表达式其中:数组下标可以是整型变量或整型表达式,任何一个数组元素的引用都可以看成是一个变量的使用。下标从0开始,不能大于数组长度-1例如:data4、datai+j、datai+都是合法的引用方式。,16,【例4.1】数组m8存储其下标值,反向输出m的值。#includemain()int i,m8;for(i=0;i=0;i-)printf(%d,mi);,程序的运行结果如下:7 6 5 4 3 2 1 0,17,允许用表达式表示下标。【例4.2】在数组m8中存储偶数并输出。#includemain()int i,m8;for(i=0;i8;)mi+=2*i+2;for(i=0;
7、i=7;i+)printf(%d,mi);,程序的最后运行结果如下:2 4 6 8 10 12 14 16,18,一维数组应用举例,19,例1:用数组方式读入5个整数,并求和。,/*sum of 5 interger*/#include stdio.hvoid main()int i,data5,sum=0;printf(nPlease enter 5 integer:);for(i=0;i5;i+)scanf(%d,20,例2:用数组方式解决Fibonacci数列问题,求出Fibonacci数列的前20项存储在数组中,并将数组内容输出。,前一章的程序:用迭代思想#include stdio.
8、hvoid main()int a,b,j,f;a=1;b=1;printf(%10d%10d,a,b);for(j=3;j=20;j+)f=a+b;a=b;b=f;printf(%10d,f);if(j%5=0)printf(n);,21,#include stdio.hvoid main()int i,fib20=1,1;/*初始化*/printf(n);for(i=2;i20;i+)fibi=fibi-1+fibi-2;for(i=1;i=20;i+)printf(%10d,fibi-1);if(i%5=0)printf(“n”);/*每行输出5个*/,22,例3:输入100个整数,求出
9、最小的数以及第一个最小的数在数组中的下标。分析:用一个变量min_allo记住最小元素的下标开始时,假设第0的元素最小,min_allo=0循环从第一个元素开始,到第99个元素结束判断该元素是否比下标为min_allo的元素还要小,如果是,就让min_allo记住这个新的最小元素的位置。,23,#include stdio.h#define SIZE 100void main()int i,dataSIZE;int min_allo;/*记录最小元素的下标*/printf(nPlease input%d int:,SIZE);for(i=0;iSIZE;i+)scanf(%d,24,例4:输入
10、10个整数,从小到大排列并输出。,何为冒泡排序法算法:(从小到大)将两个相邻的数比较,将小的调换到前头.每一趟把最大的数放到正确的位置。何为选择排序法算法:每次找到最小的数,再和相应位置的数调换位置。,25,985420,1、用冒泡法对10个数进行升序排序算法:(从小到大)将两个相邻的数比较,将小的调换到前头.每一趟把最大的数放到正确的位置。,895420,859420,854920,854290,854209,第一趟,结果,第5次,第4次,第3次,第2次,第1次,第二趟,26,27,冒泡法程序main()int a11,i,j,t;printf(“input 10 number:n”);fo
11、r(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(“the sorted numbers:n”);for(i=1;i11;i+)printf(“%4d”,ai);,28,985420,085429,025489,024589,交换过程,结果,第5步,第4步,第3步,第2步,第1步,024589,024589,2、用选择法对10个数进行升序排序。算法:每次将最小的数放到正确的位置。,思路:设有m个数,排序过程分为m-1个步骤:第1步、在m个数中找出最小数,然后和第一个数交换,前1个数已经排好序。第2步、在m-1个数中找出最小数,然后和第2个数交换,前2个数已经排好序。
12、第k步、在m-k+1个数中找出最小数,然后和第k个数交换,前k个数已经排好序。这样一直到第m-1步结束。,29,main()int a10,i,j,t,k;for(i=0;i10;i+)scanf(“%d”,选择法程序:,作业:请画出选择排序法的流程图。并分析两种排序法的区别。,30,思考用冒泡法和选择法如何解决第一个问题:输入100个学生的“C程序设计”课程的成绩,将这100个分数从小到大输出?,31,用一维数组解决第二个问题:输入100个学生的“C程序设计”课程的期中和期末成绩,算出总评成绩,总评成绩为“30%期中成绩+70%期末成绩”,计算总评成绩的分数段情况。分析:本题要使用三个平行的
13、一维数组。两个数组的第i个元素分别记录了一个学生的期中成绩和期末成绩。第三个数组的第i个元素由另两个数组的第i个元素计算得到。,32,score1,期中成绩,score2,期末成绩,finalScore,总评期中成绩30期末成绩70,剪不断,理还乱!有没有更好的方法?请看二维数组!,33,4.3 二维数组,4.3.1 二维数组的定义4.3.2 二维数组的初始化4.3.3 二维数组的引用,34,4.3.1二维数组的定义,语法:类型说明符 数组名行数列数其中“行数”表示第一维下标的长度“列数”表示第二维下标的长度。,35,如果一维数组是一排平房,那么二维数组就是一栋楼房,36,例如:int m45
14、;/*定义了一个数组名为m的二维数组,其中行数为4、列数为5*/该数组的数组元素共有45=20个,分别为:m00,m01,m02,m03,m04m10,m11,m12,m13,m13m20,m21,m22,m23,m23m30,m31,m32,m33,m34,37,题外话.多维数组的扩展,多维数组可以由二维数组扩展而得到,例如:int m234;定义了一个数组名为m的三维数组,按顺序进行展开后的各个元素值分别如下:m000,m001,m002,m003m010,m011,m012,m013m020,m021,m022,m023m100,m101,m102,m103m110,m111,m112,
15、m113m120,m121,m122,m123,38,关于二维数组的说明:,(1)二维数组在概念上是二维的,也就是说其下标在两个方向上变化。(2)在语言中,二维数组是按行排列的。(3)数组元素所占的存储空间大小跟其类型有关系。(4)一个二维数组可以看成为若干个一维数组。如m45中包括了四个一维数组:m0,m1,m2,m3注意:m0、m1、m2和m3不能当作数组元素使用,因为它们是一维数组名,不是一个单纯的数组元素。,39,stu_score是一个53的二维数组。表示共有5个学生(5行),每行第一列是期中成绩,第二列是期末成绩,第三列期中30%期末70,存储方式,40,计算机的内存是连续编址的,
16、C语言的编译系统采用按行排列。,a34,41,4.3.2二维数组的初始化,语法:数据类型说明符 数组名行数列数=数据值,数据值,数据值,数据值,数据值,数据值;或者数据类型说明符 数组名行数列数=数据值,数据值,数据值;,42,说明:,(1)二维数组初始化和一维数组初始化的方法基本相同。区别:二维数组可按行分段初始化,也可以按行连续初始化。例如对数组m43:按行分段初始化可写为:int m43=78,65,80,67,89,65,53,68,98,57,88,67;其中,78,65,80是赋给第一行3个数组元素的,这里可以看成是赋给一维数组m0的;67,89,65是赋给第二行3个数组元素的,这
17、里可以看成是赋给一维数组m1的;依次类推。,43,按行连续初始化可写为:int m43=78,65,80,67,89,65,53,68,98,57,88,67;各元素获得的初值和第种方式的结果完全相同。C语言规定,用这种方式给二维数组赋初值时,是先按行、后按列的顺序进行的。(2)可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:int m34=1,2,3;是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值依次为:1 0 0 02 0 0 03 0 0 0,44,例如:对数组a32:int a32=5,6,7,8,9,10;/*按行分段初始化*/int a32=5,6,7,8
18、,9,10;/*按行连续初始化*/上面两种初始化的结果是完全相同的。,45,下面两种初始化int a32=5,7,9;/*按行分段初始化*/int a32=5,7,9;/*按行连续初始化*/则结果却完全不一样。,46,(3)如果对全部元素赋初值,则第一维的长度可以省略,编译系统会自动计算出来。例如:int m33=1,2,3,4,5,6,7,8,9;可以写为:int m3=1,2,3,4,5,6,7,8,9;注意:使用这种方法赋初值,必须给出所有数组元素的初值,否则系统将作出错处理。列数绝对不能省略,即不能写成:int m3=1,2,3,4,5,6,7,8,9;,为什么?,47,【例4.4】从
19、键盘上输入一个34的矩阵,将其转换后形成43矩阵输出。分析:矩阵的转置是将矩阵的行和列进行互换,使其行成为列,列成为行例如:,即:mji,nij,m34,n43,48,#includemain()int m34,n43,i,j;printf(Please enter the number of m34:n);for(i=0;i3;i+)/*输入一个34的矩阵存放在数组m中*/for(j=0;j4;j+)scanf(%d,49,程序的运行情况为:Please enter the number of m34:1 1 1 12 2 2 23 3 3 3The number of n43 is:1 2
20、 31 2 31 2 31 2 3,50,4.3.3二维数组的引用,二维数组元素的引用形式为:数组名下标表达式1下标表达式2其中,行下标不能大于行数-1,列下标不能大于列数-1。例如:定义了int stu_score53;则以下都是正确的引用:stu_score00stu_score12stu_score31而stu_score33是不正确的引用。,51,【例4.5】求矩阵m34各个元素中的最小值,并输出最小值元素所在的行和列。#includemain()int i,j;int x,y;int m34=12,1,2,4,2,3,4,5,5,6,7,8;int min=m00;for(i=0;i
21、mij)min=mij;x=i;y=j;printf(The min of m34 is%d.n,min);printf(The row of min is%d and the colum of min is%d.,x,y);,The min of m34 is 1.The row of min is 0 and the colum of min is 1.,52,练一练:判断下面程序的运行结果:,#include stdio.hvoid main()int i,j,a32;for(i=0;i3;i+)for(j=0;j2;j+)aij=i+j;for(i=0;i3;i+)for(j=0;j2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 字符串
链接地址:https://www.31ppt.com/p-5912129.html