




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组
2、概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,第7章数组与字符串,数组概述 一维数组 二维数组 多维数组 字符串 综合应用杨辉三角 跟我上机,7.1 数组概述,到目前为止,所使用的变量都有一个共同的特点,就是每个变量只能存储一个数值,比如定义三个变量num,money和cname,代码如下: int num; doulbe money; char cname; 这三个变量属于不同的数据类型,所以只能一次定义一个变量,如果这三个量属于同一种数据类型,就可以使用数组一起定义多个变量。,7.1 数组概述,数组表示的是一组数据类型相同的数,这组数当中的每一个元素都是一个独立变
3、量,数组就是用来存储和处理一组相同类型的数据的。,7.2 一维数组,7.2.1 一维数组的定义 7.2.2 一维数组的初始化 7.2.3 一维数组元素的操作 7.2.4 数组作为参数传递 7.2.5 一维数组的应用举例,7.2.1 一维数组的定义,一维数组定义的一般形式为: 类型说明符 数组名常量表达式; 例如: int code5; 或者 #define NUM 5 int codeNUM; 上述两种形式都正确的定义一个名称code的整型数组,该数组含有5个整型变量,这5个整型变量的下标,依次是:code0、code1、code2、code3和code4。 在C语言当中,数组的下标总是从0开
4、始记的,而不是从1开始,这一点大家需要格外注意,特别是最初接触到数组。,7.2.1 一维数组的定义,使用code数组存储上节中建立的数据表中的序号列中的数据,如下表所示,7.2.1 一维数组的定义,表中数组code中元素code0是一个整型变量,它存储的是数据5,它在使用上一般的变量没有区别,比如int x=5,code0与x不同的地方只是code0采用了数组名和下标组合的形式。 比如下面的代码: printf(“code0=%d,code4=%dn”,code0,code4); 输出结果是 code0=5,code4=2 又如下面的代码: for(int i=0;i5;i+) printf(
5、“code%d=%dn”,codei); 输出的结果是 code0=5 code1=3 code2=1 code3=4 code4=2,7.2.1 一维数组的定义,1. 数组定义的说明 数组使用的是方括号 ,不要误写成小括号( )。 int name(10);/*是错误的形式*/ 数组命名必须按照命名规则。 数组下标总是从0开始的,以上面定义的code数组为例,数组的元素下标的范围是从0到4,而不是从1到5,大于4的下标会产生数组溢出错误,下标更不能出现负数。 code0/*是存在的,可以正确的访问*/ code4/*是存在的,可以正确的访问*/ code5/*是不存在的,无效的访问*/ co
6、de-1/*是错误的形式*/,7.2.1 一维数组的定义, 定义数组时,code5中括号中的数字5,表示的是数组中元素的总数,使用数组时,code2=1中括号中的数值是下标,表示的是使用的数组中哪一个元素。 在定义数组元素总数时,如上例中的5或者NUM,在数组的定义时,要求括号中数据一定要是常量,而不能是变量,但是数组定义后,使用该数组的元素时,下标可以是常量,也可以是变量,或者表达式。,7.2.1 一维数组的定义,int number=5; int codenumber;/*在编译这样代码时,编译器会报错*/ 假如code数组已经正确定义,下面的使用是正确的 int n = 3; coden
7、 = 100; /*等价于code3=100; */ coden+1=80;/*等价于code4=80; */ coden/2=65;/*等价于code1=65,这个是需要注意的,下标只能是整数,如果是浮点数编译器会舍弃小数位取整数部分*/ code2=code1 + n; code0=99.56/*等价于code0=99,因为code0本就是一个整型变量,赋值时数据类型转换,直接把浮点数舍弃小数位后赋值给了code0*/,7.2.1 一维数组的定义,2. 其他类型数组的定义 整型数组的定义 int array10;/*包含10个整型元素的数组名为array的数组,下标范围从0到9*/ 浮点型
8、数组的定义 float score3;/*包含3个float类型元素的数组名为score的数组,下标范围从0到2*/ 字符型数组的定义 char name5;/*包含5个char类型元素的数组名为name的数组,下标范围从0到4*/,7.2.1 一维数组的定义,3. 数组的地址 数组code的存储区域,在某一个地址中存储了code0元素值5,然后地址从低到高,每次增加4个字节(int类型占用4个字节),顺序存储了其他数组元素的值。 假如现在已知code0在内存的地址,那么code1的地址是多少呢? code1的就是在code0的地址基础上加4个字节,同理,code4的地址就是在code0地址的
9、基础上加4个*4字节,共16个字节。所以对于数组,只要知道数组的首地址,那么就可以根据偏移量计算出待求数组元素的地址。,7.2.1 一维数组的定义,数组的首地址又怎么得到呢?其实C语言在定义数组时就已经为预先设置好了这个地址,这个预设值就是数组名。比如要输出数组的首地址,就可以采用下面的方式。 printf(code的首地址是%dn,code); 输出结果就是code数组的首地址值,关于地址的更多的使用方法,大家可以参看后续指针章节详细讲解。,7.2.2 一维数组的初始化,1. 先定义数组,再进行初始化 如下代码: int code5;/*定义整型数组,数组有5个元素,下标从0到4*/ cod
10、e0=5; /*数组第0个元素赋值*/ code1=3; /*数组第1个元素赋值*/ code2=1; /*数组第2个元素赋值*/ code3=4; /*数组第3个元素赋值*/ code4=2; /*数组第4个元素赋值*/,7.2.2 一维数组的初始化,2. 在定义的同时对其初始化 int code5=5, 3, 1, 4, 2;/*定义整型数组,同时初始化数组的5个元素*/ 数学当中使用 表示的是集合的含义,这里也一样,这对括号就是圈定了这组数组的值,或者省略数组元素个数,如下面的语句: int code =5, 3, 1, 4, 2; 因为 中是每个数组元素的初值,初始化也相当告诉了数组中
11、有多少个元素,所以可以省略 中的5。对于定义数组同时对其初始化,可以省略中括号中数组的个数,但是如果分开写就是错误的,如下面的代码所示。,7.2.2 一维数组的初始化,int code5; /*定义数组*/ code5=5, 3, 1, 4, 2;/*错误的赋值*/ 或者 code=5, 3, 1, 4, 2;/*错误的赋值*/ 上面都是错误的形式。 int code;/*错误的数组定义*/ code0=5; /*错误的赋值*/ code1=3; /*错误的赋值*/ 定义数组时没有定义数组元素的个数,使用时就会发生异常,原因是内存中并没有为数组code开辟任何存储空间,数据自然无处存放。,7.
12、2.2 一维数组的初始化,数组初始化时常见的其他情况如下所示。 定义数组时省略 内元素总数 int code10= 1,2,3,4,5;/*表示code数组共有10个元素,仅对前5个进行了初始化,后面5个元素编译器自动初始化为0*/ int code= 1,2,3,4,5;/*表示code数组共有5个元素,初始化code0=1,code1=2,.,code4=5*/ 元素初始化为0 int code5= 0,0,0,0,0; 或者 int code5=0 二者含义相同,都是对5个元素初始化为0,显然第二种方式更为简洁。,7.2.3 一维数组元素的操作,int i; int array5=1,2
13、,3,4,5; /*定义数组,同时初始化*/ for(i=0;i5;i+)/*循环访问数组元素*/ printf(%d,arrayi); 输出结果是 1,2,3,4,5 此代码中定义array为整型数组,包含5个整型元素,并同时初始元素值,分别是: array0=1,array1=2,array2=1,array3=2,array4=5 for语句中循环变量i初值是0,终值是4,步长是1,调用printf()函数就可以访问到数组array中的每一个元素了。 注意:变量i的范围是04,否则程序会报数组溢出错误。,7.2.3 一维数组元素的操作,【范例7-1】 一维数组的输入输出。 01 #inc
14、lude 02 #define MAXGRADES 5/* 数组元素总数*/ 03 int main(void) 04 05 int codeMAXGRADES; /* 定义数组*/ 06 int i; 07 /*输入数据*/ 08 for (i = 0; i MAXGRADES; i+) ; /* 循环遍历数组*/ 09 10 printf(输入一个数据: ); 11 scanf(%d, 17 ,7.2.3 一维数组元素的操作,【范例7-2】 使用一维数组计算元素的和以及平均值。 01 #include 02 #define MAX 5/* 数组元素总数*/ 03 int main() 04
15、 05 int codeMAX; /* 定义数组*/ 06 int i, total = 0; 07 for (i = 0; i MAX; i+)/* 输入数组元素*/ 08 09 printf(输入一个数据: ); 10 scanf(%d, 19 ,7.2.4 数组作为参数传递,如何把数组作为参数传递给函数?可以使用数组名作为参数进行传递。 例如,主函数中有整型数组定义: int array5; 调用函数的语句如下: findMax(array); 这里使用数组名作为参数传递给函数findMax(),实参数据类型需要和形参数据类型一致才可以,所以可以这样定义findMax()函数的参数。 v
16、oid findMax(int a5) 或者可以省去数组5,写成下面的形式 void findMax(int a),7.2.4 数组作为参数传递,【范例7-3】 求数组最大值。 01 #include 02 #define MAXELS 5 03 void findMax(int MAXELS);/*定义函数*/ 04 int main() 05 06 int numsMAXELS = 2, 18, 1, 27, 16;/*数组初始化*/ 07 findMax(nums); 08 return 0; 09 10 void findMax(int valsMAXELS)/* 查找最大值函数 */
17、 11 12 int i, max = vals0; 13 for (i = 1; i MAXELS; i+) 14 if (max valsi) 15 max = valsi; 16 printf(The maximum value is %dn, max); 17 ,7.2.4 数组作为参数传递,提 示:调用函数时,变量是按照传值方式传递的,而数组是按照传地址方式传递的。这就是说,对于变量,实参可以改变形参,形参的改变不会影响到实参;对于数组,实参可以改变形参,形参的改变也会改变实参。,7.2.4 数组作为参数传递,【范例7-4】 传值和传地址。,7.2.5 一维数组的应用举例,【范例7-
18、5】 将一个数组逆序输出 01 #include 02 #define N 5 03 int main(void) 04 05 int aN=9,6,5,4,1,i,temp; /* 定义数组*/ 06 printf(原数组:n); 07 for(i=0;iN;i+) /*输入元素*/ 08 printf(%4d,ai); 09 for(i=0;iN/2;i+) /*交换数组元素*/ 10 11 temp=ai; 12 ai=aN-i-1; 13 aN-i-1=temp; 14 15 printf(n排序后数组:n); 16 for(i=0;iN;i+) /*输出元素*/ 17 printf(
19、%4d,ai); /*输出格式元素占4列*/ 18 printf(n); 19 return 0; 20 ,7.2.5 一维数组的应用举例,【范例7-6】 输出100内的素数。,7.3 二维数组,7.3.1 二维数组的定义 7.3.2 二维数组的初始化 7.3.3 二维数组元素的操作 7.3.4 二维维数组的应用举例,7.3.1 二维数组的定义,二维数组定义的一般形式为 类型说明符 数组名常量表达式常量表达式 例如: int a34;/*定义a为3行4列的数组*/ int b510;/*b为510(5行10列)的数组*/ 不能写成下面的形式 int a3,4;/*错误数组定义*/ int b5
20、,10; /*错误数组定义*/,7.3.1 二维数组的定义,7.3.1 二维数组的定义,已知a00在内存中的地址,a12的地址是多少呢,计算方法是如下: a12的地址 = a00地址 + 24字节 24字节 = (1行*4*列+2列)*4字节 还需要注意到数组a34元素下标的变化范围,行号范围是从0到2,列号范围是0到3,,7.3.2 二维数组的初始化,1. 先定义再初始化 int a34; a00=1; a23 = 9; 2. 定义同时初始化 int a34= 1,2,3,4,5,6,7,8,9,0,1,2; 或者 int a34= 1,2,3,4,5,6,7,8,9,0,1,2; 已经讲过
21、了,二维数组在内存中是按线性顺序存储的,所以内存括号可以省去,不会产生影响。 还可以这样: int a 4= 1,2,3,4,5,6,7,8,9,0,1,2; 或者 int a4= 1,2,3,4,5,6,7,8,9,0,1,2; 省去3也是可以的,但是4是不能省去的。编译器会根据所赋的数值的个数及数组的列数,自动计算出数组的行数。,7.3.2 二维数组的初始化,分析下面的二维数组的初始化后的值 int a34=1,5,9; 可以认为二维数组是由3个一维数组构成的,每个一维数组有4个元素,那就可以和一维数组初始化衔接上了,经过上述初始化,数组a元素的值如下表所表示的形式。,7.3.3 二维数组
22、元素的操作,二维数组元素的操作和一维数组元素的操作相似,一般使用双重循环遍历数组的元素,外层循环控制数组的行标,内层循环控制数组的列标,如下所示: int i,j; int array34; for(i=0;i3;i+) for(j=0;j4;j+) arrayij=4*i+j; 经过上面双循环的初始化操作,数组array34的元素的值是0,1,2,3,4,5,6,7,8,9,10,11 原因是4*i+j,i表示行号,j表示列号,首先赋值i=0的行的数组元素值是0,1,2,3,然后内层循环结束,接下来外层循环变量i=1,继续对数组元素赋值4,5,6,7,这样反复进行,就会得到上面的元素值。,7
23、.3.4 二维维数组的应用举例,【范例7-7】 求一个3*3矩阵对角线元素之和。 01 #include 02 int main() 03 04 float a33,sum=0; 05 int i,j; 06 printf(请输入3*3个元素:n); 07 for(i=0;i3;i+) /*循环输入9个元素*/ 08 09 for(j=0;j3;j+) 10 scanf(%f, 16 ,7.3.4 二维维数组的应用举例,【范例7-8】 将一个二维数组行和列元素互换,存到另一个二维数组中。 01 #include 02 int main(void) 03 04 int a23=1,2,3,4,5
24、,6; /*数组a*/ 05 int b32,i,j; 06 printf(array a:n); 07 for (i=0;i=1;i+) 08 09 for (j=0;j=2;j+) 10 11 printf(%5d,aij); /*输出数组a*/ 12 bji=aij; /*行列互换存储到数组b*/ 13 14 printf(n); 15 16 printf(array b:n); 17 for(i=0;i=2;i+) /*输出数组b*/ 18 19 for(j=0;j=1;j+) 20 printf(%5d,bij); 21 printf(n); 22 23 return 0; 24 ,
25、7.4 多维数组,例如 定义一个三维数组: int point234; 三维数组point共有2*3*4=24个元素组成,其中多维数组靠左边维变化速度最慢,靠右边维变化速度最快,从左至右逐渐增加。point数组在内存中仍然是按照线性结构占据连续的存储单元,地址从低到高的顺序如下所示:,7.4 多维数组,point000point001point002point003 point010point011point012point013 point020point021point022point023 point100point101point102point103 point110point111
26、point112point113 point120point121point122point123 遍历三维数组,通常使用三重循环实现,以point234数组为例说明。 int i,j,k; /*定义循环变量*/ int pointf234;/*定义数组*/ for (i=0;i2;i+)/*循环遍历数组*/ for(j=0;j3;j+) for(k=0;k4;k+) printf(“%d”,pointijk);,7.5 字符串,字符串是使用双引号包含的字符序列,也把字符串称为字符串常量。比如下面所示的内容就是字符串。 “hello world” “123abc,。?” 在C语言中,字符串存储
27、成一个指定的以0作为结束标志的字符串。其中0是转义符。比如“hello world”字符串,它并不是像看到的占用了11个存储字节,而是占用了内存中12个字节。0是编译器自动加上的,是字符串的一部分,占用一个存储单元。,7.5 字符串,字符串“hello world”在内存中的存储形式如下图所示。,7.5.1 字符串和字符数组,认识了字符串,它和字符数组有着什么的相同和不同点呢?字符数组是由字符构成的数组,它跟之前讲的数组使用方法一样,可以这样定义字符串,如下所示 char c11=h,e,l,l,o, ,w,o,r,l,d; 或者 char c=h,e,l,l,o, ,w,o,r,l,d; c
28、0=h; c11=d; 或者先定义数组再进行初始化都是可以的。,7.5.1 字符串和字符数组,注意到上面提到两个图是不同的,字符所占的字节数是不同的。字符串的最后一位字符,是由编译器自动的加上了“0”,而字符数组没有被添加。字符串的长度是12,而字符数组的长度是11,当然也可以设置字符数组的长度是12,如下所示: char c=h,e,l,l,o, ,w,o,r,l,d,0; 正如上面提到的例子,字符串和字符数组在很多时候是可混用的。 下面仍然是初始化字符串,换一种方式,不再按照数组赋值方法,对数组元素一个个赋值,而是使用一次性初始化的方法。 char c=“hello world”;/*使用
29、双引号*/ 或者 char c=“hello world”; /*等效方法,可以省去大括号*/ 还是可以按照字符数组的方式对字符串进行操作。,7.5.1 字符串和字符数组,【范例7-9】 字符串和字符数组 01 #include 02 int main() 03 04 char c=abc; /*初始化字符串*/ 05 printf(%sn,c); /*输出字符串*/ 06 printf(%cn,c0); /*输出c0字符*/ 07 c1=w; /*修改c1字符为w*/ 08 printf(%sn,c); 09 return 0; 10 ,7.5.2 字符串的输入输出,在第6章中,已经学习了字符串输入输出函数gets()和puts(),此处比较一下它们与scanf()和printf()的异同。 标准输出函数printf和puts函数功能上基本上是完全一样的。例如: char c=message;/*定义字符数组*/ printf(%s,c);/*输出结果是“message”,没有换行*/ puts(c);/*输出结果是“message”,并换行*/ 可以得出当puts()函数在遇到0时,就会被替换为n,实现换行的作用。除此以外,二者没有什么区别。,7.5.2 字符串的输入输出,标准输出函数scanf和gets函数就有些不大相同了,比如 scanf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国纸质包装袋数据监测研究报告
- 二零二五年度互联网企业员工聘用合同规范文本
- 2025年度瑜伽馆合伙经营品牌宣传合作协议
- 二零二五年度二手车交易与翻新服务合同
- 二零二五年度XX能源企业收取管理费合作协议
- 二零二五年度出国工人劳务派遣与职业发展保障协议
- 二零二五年度房产代持协议(股权投资背景下的房产代持)
- 科技产品包装的侘寂风格设计探索
- 物流自动化在电子商务中的应用及前景
- 科技助力医疗老年常见病预防新方法
- 德州环锂新能源科技有限公司2万吨年废旧锂电池回收项目环境影响报告书
- 2025年江苏省中职《英语》学业水平考试核心考点试题库500题(重点)
- 延期实习申请书
- GB/T 1346-2024水泥标准稠度用水量、凝结时间与安定性检验方法
- 2025年湖南中医药高等专科学校高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年江苏信息职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 【历史】金与南宋对峙课件-2024-2025学年统编版七年级历史下册
- 易制毒化学品理论考试试题及答案
- 【MOOC】跨文化交际-苏州大学 中国大学慕课MOOC答案
- 小学全体教师安全工作培训
- 北师大版数学八年级下册全册教案及反思
评论
0/150
提交评论