C语言程序设计-第5章-数组.ppt
《C语言程序设计-第5章-数组.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计-第5章-数组.ppt(82页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、授课教师:授课教师:厦门理工学院厦门理工学院 软件学院软件学院C语言程序设计语言程序设计第一页,编辑于星期六:五点 三十六分。1第5章 数 组C C 语言程序设计语言程序设计第二页,编辑于星期六:五点 三十六分。2第5章 数组 本章重点介绍:一维数组二维数组字符数组与字符串第三页,编辑于星期六:五点 三十六分。35.1概述1用案例说明为什么使用数组【例5-1】设计一个程序,将n个人某门课程的成绩输入计算机,求平均成绩和高于平均成绩的人数。如果不使用数组,以5个人的成绩为例,使用a1、a2、a3、a4、a5来存放5个成绩,程序代码如下:第四页,编辑于星期六:五点 三十六分。4程序代码:#incl
2、ude stdio.hvoid main()int n=0;float s,ave,a1,a2,a3,a4,a5;scanf(%f%f%f%f%f,&a1,&a2,&a3,&a4,&a5);s=a1+a2+a3+a4+a5;ave=s/5;if(a1 ave)n+;if(a2 ave)n+;if(a3 ave)n+;if(a4 ave)n+;if(a5 ave)n+;printf(%f%dn,ave,n);如果要统计如果要统计10个人个人的成绩呢?的成绩呢?第五页,编辑于星期六:五点 三十六分。5#include stdio.hvoid main()int n=0,i;float s=0,av
3、e,a10;for(i=0;i10;i+)scanf(%f,&ai);s=s+ai;ave=s/10;for(i=0;iave)n+;printf(平均成绩为:%.1fn高于平均成绩的人数为:%dn,ave,n);使用数组来存储使用数组来存储10个人的数据,用循环结构个人的数据,用循环结构实现!实现!程序代码如下:程序代码如下:第六页,编辑于星期六:五点 三十六分。65.1概述(续)2数组与数组元素的概念数组:是用一个名字表示的一组相同类型的数据的集合,这个名字就称为数组名。如定义:float a10;a是数组名。下标变量(或数组元素):数组中的数据分别存储在用下标区分的变量中,这些变量称为下
4、标变量或数组元素。如:a0、a1ai。每个下标变量相当于一个简单变量,数组的类型也就是该数组的下标变量的数据类型。数组属于构造类型。构造类型的数据是由基本类型数据按一定规则构成的。第七页,编辑于星期六:五点 三十六分。75.2 一维数组例如:int a10;float score5;“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。5.2.1 5.2.1 5.2.1 5.2.1 一维数组的定义一维数组的定义一维数组的定义一维数组的定义数据类型数据类型 数组名数组名常量表达式常量
5、表达式;第八页,编辑于星期六:五点 三十六分。8以下数组定义是正确的:#define N 10float score1N,score2N;int num10+N;char c26;以下数组定义是不正确的:int array(10);int n;float scoren;char str;5.2.1 一维数组的定义(续)第九页,编辑于星期六:五点 三十六分。9数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score0 的地址值(&score0)相同。score0score1score2score3score491.534.567
6、.572.084.0低地址低地址高地址高地址score数组数组第十页,编辑于星期六:五点 三十六分。105.2.2 一维数组元素的引用1一维数组元素的表示形式例如:输入学生成绩 for(i=0;i5;i+)scanf(%f,&scorei);例如:n=3;fibn=fibn-1+fibn-2;其中:“下标表达式”:只能是整型常量或整型表达式。数组名数组名下标表达式下标表达式 第十一页,编辑于星期六:五点 三十六分。115.2.2 数组元素的引用(续)2.说明 下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:int a10,i;scanf(%d,&a10);/*下标越界*/
7、C编译系统不做越界检查。编译系统不做越界检查。第十二页,编辑于星期六:五点 三十六分。125.2.2 数组元素的引用(续)是是下标运算符下标运算符下标运算符下标运算符如:如:x=score2;(1)计算计算score2地址:地址:2000+2*4=2008(2)取出取出2008的内容的内容(67.5)赋给赋给x2000H2004H2008H200CH2010Hscore0score1score2score3score491.534.567.572.084.0如如果果引引用用的的数数组组元元素素超超出出数数组组范范围围会会破破坏坏其其他他变变量量的的值值。第十三页,编辑于星期六:五点 三十六分。
8、135.2.3 一维数组的初始化初始化:在定义数组时给数组元素赋初值。1在定义数组时,对全部数组元素赋初值 例如:int a5=0,1,2,3,4;此时可以省略数组长度,例如:int a=0,1,2,3,4;2在定义数组时,对部分数组元素赋初值 例如:int a5=1,2,3;系统为其余元素赋 0。3当初值的个数多于数组元素的个数时,编译出错 例如:int a5=0,1,2,3,4,5;第十四页,编辑于星期六:五点 三十六分。145.2.4 一维数组应用举例【例5-2】设计一个程序,将n个人某门课程的成绩输入计算机后输出最高分和最低分。思路:首先将n个人的成绩输入到一个一维数组中。求若干个数的
9、最大值或最小值常采用打擂台的方法:首先指定某数为最大值或最小值的擂主:如:max=a(0),min=a(0)将其他各数依次与擂主进行比较(循环嵌套分支),当所有的数都比较完之后,输出max和min的值。第十五页,编辑于星期六:五点 三十六分。15程序如下:#include stdio.h#define N 5void main()int aN,max,min,i;for(i=0;iN;i+)scanf(%d,&ai);min=max=a0;for(i=1;iN;i+)if(aimax)max=ai;/*max存放最大值*/printf(最高分:%d 最低分:%d,max,min);printf
10、(n);程序运行情况如下:程序运行情况如下:78 98 65 82 45 最高分:最高分:98 最低分:最低分:45第十六页,编辑于星期六:五点 三十六分。165.2.4 一维数组应用举例(续)【例5-3】将5个数存放到一维数组中,再将这5个数按逆序存放在同一数组中并输出。交换交换n/2次次 a0 a1 a2 a3 a41357997531交换前交换前交换后交换后ai与与an-1-i交换交换第十七页,编辑于星期六:五点 三十六分。17程序如下:#define N 5#include stdio.hvoid main()int i,t,aN;for(i=0;iN;i+)scanf(%d,&ai)
11、;for(i=0;iN/2;i+)t=ai;ai=aN-1-i;aN-1-i=t;输出数据 程序运行情况如下:程序运行情况如下:11 13 15 17 19 逆序存放后的结果是:逆序存放后的结果是:19 17 15 13 11第十八页,编辑于星期六:五点 三十六分。185.2.4 一维数组应用举例(续)【例5-4】用冒泡法(也称起泡法)对输入的一组成绩按从低分到高分的顺序排序并输出。例如将6个数:4、7、5、6、8、1按从小到大顺序用冒泡法排序,方法如下:第一趟排序情况如下:4 7 5 6 8 1第一次 4和7比较,不交换 4 7 5 6 8 1第二次 7和5比较,交换 4 5 7 6 8 1
12、第三次 7和6比较,交换 4 5 6 7 8 1第四次 7和8比较,不交换 4 5 6 7 8 1第五次 8和1比较,交换 4 5 6 7 1 8在第一趟排序中,在第一趟排序中,6个数比较了个数比较了5次,把次,把6个数中的最个数中的最大数大数8排在最后。排在最后。第十九页,编辑于星期六:五点 三十六分。19冒泡法排序(续)第二趟排序情况如下:4 5 6 7 1 8第一次 4和5比较,不交换 4 5 6 7 1 8第二次 5和6比较,不交换 4 5 6 7 1 8第三次 6和7比较,不交换 4 5 6 7 1 8第四次 7和1比较,交换 4 5 6 1 7 8在第二趟排序中,最大数8不用参加比
13、较,其余的5个数比较了4次,把其中的最大数7排在最后,排出7 8。以此类推:第三趟比较4次,排出 6 7 8第四趟比较2次,排出 5 6 7 8第五趟比较1次,排出 4 5 6 7 8最后还剩下最后还剩下1个数个数1,不需再比较,得到排序结果:,不需再比较,得到排序结果:1 4 5 6 7 8第二十页,编辑于星期六:五点 三十六分。20冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。冒泡法排序冒泡法排序for(i=0;iN;i+)输入输入ai for(j=1;jN;j+)for(i=0;iai+1 T F ai与与ai+1交换交换输出输出a0
14、aN-1第二十一页,编辑于星期六:五点 三十六分。21程序如下:#define N 6#include stdio.hvoid main()int aN;int i,j,t;printf(请输入%d个成绩,用空格隔开:n,N);for(i=0;iN;i+)scanf(%d,&ai);冒泡法排序(续)第二十二页,编辑于星期六:五点 三十六分。22for(j=1;j=N-1;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;printf(成绩从低分到高分的顺序是:n);for(i=0;iN;i+)printf(%d ,ai);printf(n);程序运行情况如下:程序运行情
15、况如下:请输入请输入6个成绩,用空格隔开:个成绩,用空格隔开:78 56 96 83 72 88 成绩从低分到高分的顺序是:成绩从低分到高分的顺序是:56 72 78 83 88 96冒泡法排序(续)第二十三页,编辑于星期六:五点 三十六分。23以6个数:3、7、5、6、8、0为例,介绍选择法排序方法。思路:第一趟:将第一个数(擂主)依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数(擂主)依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;。【例例例例5-55-5】用选择法对输入的一组
16、成绩按从低分到高分用选择法对输入的一组成绩按从低分到高分的顺序排序并输出。的顺序排序并输出。5.2.4 一维数组应用举例(续)第二十四页,编辑于星期六:五点 三十六分。24【例5-5】选择法排序(续)选择法排序选择法排序for(i=0;iN;i+)输入输入ai for(j=0;jN-1;j+)for(i=j+1;iai T F aj与与ai交换交换 输出输出a0aN-1第二十五页,编辑于星期六:五点 三十六分。25【例5-5】选择法排序(续)程序如下:#define N 6#include stdio.hvoid main()int aN;int i,j,t;printf(请输入%d个成绩,用
17、空格隔开:n,N);for(i=0;iN;i+)scanf(%d,&ai);第二十六页,编辑于星期六:五点 三十六分。26for(j=0;jN-1;j+)for(i=j+1;iai)t=aj;aj=ai;ai=t;printf(成绩从低分到高分的顺序是:n);for(i=0;iN;i+)printf(%d ,ai);printf(n);程序运行情况如下:程序运行情况如下:请输入请输入6个成绩,用空格隔开:个成绩,用空格隔开:78 56 96 83 72 88 成绩从低分到高分的顺序是:成绩从低分到高分的顺序是:56 72 78 83 88 96【例例5-5】选择法排序(续)选择法排序(续)第二
18、十七页,编辑于星期六:五点 三十六分。275.2.5 一维数组作函数参数数组名作函数的实参,传递的是数组的首地址,此时形参也应定义为数组形式,但形参数组的长度可以省略。例如,在主函数中调用sort函数,实现将整型数组a中的10个数据排序,调用语句如下:sort(a,10);sort函数定义如下:void sort(int b,int n)第二十八页,编辑于星期六:五点 三十六分。28void sort(int b,int n);void printarr(int b);main()int a10=11,22,63,97,58,80,45,32,73,36;printf(Before sort:
19、n);printarr(a);sort(a,10);printf(After sort:n);printarr(a);void printarr(int b10)int i;for(i=0;i10;i+)printf(%5d,bi);printf(n);void sort(int b,int n)int i,j,t;for(i=1;in;i+)for(j=0;jbj+1)t=bj;bj=bj+1;bj+1=t;第二十九页,编辑于星期六:五点 三十六分。29 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 9
20、7 58 80 45 32 73 36(a)排序前排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b)排序后排序后2000b形参形参形参形参 b 实际是一个实际是一个实际是一个实际是一个可以存放地址的变量可以存放地址的变量a:2000实参赋给形参实参赋给形参首地址:首地址:2000首地址:首地址:2000第三十页,编辑于星期六:五点 三十六分。305.3 二维数组 数据类型数据类型 数组名数组名常量表达式常量表达式1常量表达式常量表达式2;例如:float x2
21、3;5.3.1 5.3.1 二维数组二维数组的定义的定义X00 X01 X02X10 X11 X12int a3,4,b(3,4),c ,d(3)(4);第三十一页,编辑于星期六:五点 三十六分。31x00 x01x02x10 x11x122000H2004H2008H200cH2010H2014H地址地址 值值 数组元素数组元素二维数组二维数组元素元素在内存中在内存中的的排列顺序:排列顺序:按行存放按行存放按行存放按行存放5.3 二维数组(续)第三十二页,编辑于星期六:五点 三十六分。32二维数组可看作是一种特殊的一维数组二维数组可看作是一种特殊的一维数组x0是数组名,是元素是数组名,是元素
22、x00的地址的地址x1是数组名,是数组名,是元素是元素x10的地址的地址x0 x00,x01,x02x1-x10,x11,x12例如,可以把例如,可以把例如,可以把例如,可以把x x x x数组看作是包含二个大元素的一维数组,数组看作是包含二个大元素的一维数组,数组看作是包含二个大元素的一维数组,数组看作是包含二个大元素的一维数组,每个元素又是一个含有三个元素的一维数组。每个元素又是一个含有三个元素的一维数组。每个元素又是一个含有三个元素的一维数组。每个元素又是一个含有三个元素的一维数组。5.3 二维数组(续)第三十三页,编辑于星期六:五点 三十六分。33a34=3;/*下标越界下标越界*/a
23、1,2=1;/*应写成应写成 a12=1;*/5.3.2 二维数组元素的引用例:例:int a34;a00=3;a01=a00+10;数组名数组名行下标表达式列下标表达式行下标表达式列下标表达式行下标表达式列下标表达式行下标表达式列下标表达式 数组元素的表示形式数组元素的表示形式:第三十四页,编辑于星期六:五点 三十六分。345.3.3 二维数组的初始化例:int a23=1,2,3,4,5,6 1 1 1 1按行赋初值按行赋初值按行赋初值按行赋初值例例:int a23=1,2,3,4,5,6初始化后结果:初始化后结果:初始化后结果:初始化后结果:1 2 3 1 2 3 4 5 6 2 2按数
24、组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值3 3 3 3给部分元素赋初值给部分元素赋初值给部分元素赋初值给部分元素赋初值例:例:int a23=1,4;初始化后结果:初始化后结果:1 0 0 4 0 0第三十五页,编辑于星期六:五点 三十六分。355.3.3 二维数组的初始化(续)4数组初始化时,行长度可省,列长度不能省 例如:int a3=1,2,3,4,5,6,7;int b4=1,4,5;初始化结果:a 结果结果结果结果:a0:1 2 3 a1:4 5 6a2:7 0 0a2:7 0 0b b 结果:结果:结果:结果:b0:1 0 0 0b0:1 0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 数组
限制150内