《第9讲 数组.ppt》由会员分享,可在线阅读,更多相关《第9讲 数组.ppt(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据类型基本数据类型基本数据类型p整型整型p字符型字符型p实型实型构造类型构造类型p数组类型数组类型p结构体类型结构体类型p共用体类型共用体类型例:统计各种字符的个数(前面习题)例:统计各种字符的个数(前面习题)#include main()char c;int letter=0,space=0,digit=0,other=0;printf(请输入一行字符请输入一行字符:n);while(c=getchar()!=n)if(c=a&c=A&c=0&c=9)digit+;else other+;printf(字母数字母数=%d,空格数空格数=%d,数字数数字数=%d,其他字符数其他字符数=%dn
2、,letter,space,digit,other);分析分析从键盘上输入的字符都是同一种数据类型从键盘上输入的字符都是同一种数据类型-字符类型(字符类型(char););字符的个数多于一个;字符的个数多于一个;以前的解决办法:以前的解决办法:char c;while(c=getchar()!=n)还有没有其他办法?还有没有其他办法?数组数组数组数组p多个多个有序有序数据的集合;数据的集合;p数组中的每一个元素都属于数组中的每一个元素都属于同一种数据类型同一种数据类型;p用一个统一的用一个统一的名称(数组名)名称(数组名)和和下标下标来唯一确定来唯一确定数组中的元素。数组中的元素。新的解决办法
3、:新的解决办法:可以通过可以通过数组数组来实现来实现源程序源程序#include main()charc10;int i,letter=0,space=0,digit=0,other=0;printf(请输入一行字符请输入一行字符:n);for(i=0;i10;i+)scanf(%c,&ci);for(i=0;i=a&ci=A&ci=0&ci=9)digit+;else other+;printf(字母数字母数=%d,空格数空格数=%d,数字数数字数=%d,其他字符数其他字符数=%dn,letter,space,digit,other);程序奇怪的地方在哪程序奇怪的地方在哪里?里?基本语法基本
4、语法1数组的定义数组的定义n一维数组:一维数组:类型说明符类型说明符 数组名数组名常量表达式常量表达式n二维数组:二维数组:类型说明符类型说明符 数组名常量表达式常量表达式;数组名常量表达式常量表达式;p类型说明符类型说明符-基本数据类型,如基本数据类型,如int、float、char等;等;p数组名数组名-同变量名,命名规则一样同变量名,命名规则一样p在定义数组时,需要指定数组中元素的个数。在定义数组时,需要指定数组中元素的个数。方括号中的常方括号中的常量表达式用来表示元素的个数,即数组长度;量表达式用来表示元素的个数,即数组长度;p常量表达式可以包括常量和符号常量,不能包括变量。常量表达式
5、可以包括常量和符号常量,不能包括变量。E.g int a10,float score5,char str30例如:例如:定义a为34(3行4列)的数组,b为510(5行10列)的数组。如下:float a34,b510;2.数组元素的引用数组元素的引用一维数组一维数组 数组名数组名下标下标 二维数组二维数组 数组名数组名下标下标下标下标说明说明:数组必须先定义,后使用;(同变量一样)数组必须先定义,后使用;(同变量一样)只能逐个引用数组元素,而不能一次引用整个数组;只能逐个引用数组元素,而不能一次引用整个数组;c中,中,第一个元素的下标从第一个元素的下标从o(零零)开始开始。e.g.int a
6、10;/定义了一个含定义了一个含10个元素的整型数组,这个元素的整型数组,这10个元个元素分别是:素分别是:a0,a1,a2,a3,a9;int sum34;/定义了一个含定义了一个含12个元素个元素(3行行4列列)的二维数的二维数组,元素分别为组,元素分别为 sum00,sum01,sum23;思考思考例:例:int a10如果要让变量如果要让变量t的值等于数组的的值等于数组的第第6个元素,怎么办?个元素,怎么办?t=a6 or t=a5?t=a5/因为第一个元素因为第一个元素的下标从的下标从0开始开始注意注意n在使用数组元素时,应该注意下标值应在在使用数组元素时,应该注意下标值应在已定义的
7、数组大小的范围内。已定义的数组大小的范围内。常出现的错误有:常出现的错误有:inta34;/*/*定义定义a a为为3 34 4的数组的数组*/a34=3;补充补充可以把二维数组看作是一种特殊的一维数可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。组:它的元素又是一个一维数组。例如:例如:a34,可以把a看作是一个一维数组,它有3个元素:a0、a1、a2,每个元素又是一个包含4个元素的一维数组。二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素 二维数组在内存中的存放二维数组在内存中的存放二维数组在内存中的存放二维数组在内存中的存放下
8、图表示对下图表示对下图表示对下图表示对a a3 34 4数组存放的顺序数组存放的顺序数组存放的顺序数组存放的顺序 多维数组的定义多维数组的定义定定义义三三维维数数组组:float a234float a234;三维数组的元素排列顺序三维数组的元素排列顺序问题:有了二维数组的基础,那么多维数组如何定义呢?a000a000a001a001a002a002a003a003 a010 a010a011a011a012a012a013a013 a020a020a021a021a022a022a023a023 a100 a100a101a101a102a102a103a103 a110 a110a111a
9、111a112a112a113a113 a120 a120a121a121a122a122a123a1233.初始化初始化一维数组一维数组E.g int a10=0,1,2,3,4,5,6,7,8,9/定义时初始化定义时初始化int a10=0,1,2,3/只给部分元素赋值只给部分元素赋值详见教材详见教材P132-133二维数组二维数组E.g 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;/按数组元按数组元素的排列赋初值素的排列赋初值详见教材详见教材P137-138补充补充数
10、组初始化时,如果要求其值从键盘输入,如何数组初始化时,如果要求其值从键盘输入,如何操作?操作?对于一维数组对于一维数组 2种方法种方法:数据之间空格隔开,以回车:数据之间空格隔开,以回车结束输入;数据之间以回车隔开;结束输入;数据之间以回车隔开;对于二维数组对于二维数组3种方法,除了上两种方法之外,还可种方法,除了上两种方法之外,还可以按行输入,同一行的数据以空格隔开,不同行的数以按行输入,同一行的数据以空格隔开,不同行的数据以回车隔开。据以回车隔开。#include main()char c10;int i,letter=0,space=0,digit=0,other=0;printf(请输
11、入一行字符请输入一行字符:n);for(i=0;i10;i+)scanf(%c,&ci);for(i=0;i=a&ci=A&ci=0&ci=9)digit+;else other+;printf(字母数字母数=%d,空格数空格数=%d,数字数数字数=%d,其他字符数其他字符数=%dn,letter,space,digit,other);数组定义,字符数组,含数组定义,字符数组,含10个元素个元素数组元素赋值数组元素赋值依次访问数组中的各个元素,进行判断依次访问数组中的各个元素,进行判断例例2:fibonacci数列问题,求前数列问题,求前10项项#includemain()int f1=1,f
12、2=1,f;int i;for(i=3;i=10;i+)f=f1+f2;f1=f2;f2=f;printf(%d,f);用变量来递推用变量来递推用数组来处理用数组来处理分析:分析:有10个元素,都是int型,所以可定义一个含10个元素的一维数组,如:int a10;数组的前两项都等于1,即:a0=a1=1;存在的递推关系:a2=a1+a0,a3=a2+a1,a9=a8+a7.即:ai=ai-1+ai-2附:对于一维数组,由于元素下标都从附:对于一维数组,由于元素下标都从0开始,而且也知道数组的长度开始,而且也知道数组的长度(即元素的个数),所以在实际应用中,一般涉及到数组,都会涉及(即元素的个
13、数),所以在实际应用中,一般涉及到数组,都会涉及到循环,且以到循环,且以for循环运用较普遍。循环运用较普遍。源程序源程序#includevoid main()int i,a10;a0=a1=1;/前两项为前两项为1for(i=2;i10;i+)/为数组各元素赋值为数组各元素赋值ai=ai-1+ai-2;for(i=0;i10;i+)/输出数组的各元素输出数组的各元素printf(%d,ai);思考,程序这样写行不行?思考,程序这样写行不行?#includevoid main()int i,a10;a0=a1=1;/前两项为前两项为1for(i=2;i10;i+)/为数组各元素赋值为数组各元素
14、赋值 ai=ai-1+ai-2;printf(%d,ai);两种程序不同之处在于数两种程序不同之处在于数组元素输出的处理方法上。组元素输出的处理方法上。源程序源程序1,单独运用了一个,单独运用了一个循环语句依次输出数组的循环语句依次输出数组的各元素,而源程序各元素,而源程序2则将元则将元素的赋值和输出合到了一素的赋值和输出合到了一个个for循环中。循环中。两种写法对程序没有什么两种写法对程序没有什么影响;影响;建议采用第一种写法,分建议采用第一种写法,分开写!开写!例例3 3 将一个二维数组行和列元素互换,存到另将一个二维数组行和列元素互换,存到另一个二维数组中。一个二维数组中。例如:例如:a
15、=1 2 3 1 4a=1 2 3 1 4 4 5 6 b=2 5 4 5 6 b=2 5 3 6 3 6规律:规律:aij=bji运行结果如下:运行结果如下:array a:array a:1 2 3 1 2 3 4 5 6 4 5 6array b:array b:1 4 1 4 2 5 2 536 6#include void 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+)bji=aij;/遍历各元素完成相关操作遍历各元素完成相关操作printf(“array b:n”);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(“%d ,bji);/按行输出各元素的值按行输出各元素的值 printf(“n”);作业P153 7.3 7.5 7.6
限制150内