版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 数 组 数组:是构造类型,元素由基类型(整、实、字符)组成。 它是有序的、同类型数据的集合。 7.1 一维数组的定义和引用 7.1.1 一维数组的定义 形式:类型说明符 数组名常量表达式 如:int a5; float b10; 说明: 1.命名规则:数组名是由合法的标识符组成。,1,2.数组名后是用 括起来的是常量表达式 包括:整、字符、符号常量表达式。 如: int a2+3, b5, ca , _d8, xyz# (#=35) #define N 5 main() int aN;printf(“%dn”,a1=100); 而:int a(10) , bx, %5, 83, x-y
2、50, 5x100 是否正确? 又如: int i=5; int a5+i 是否正确性? 3.数组的长度 int a5 a0, a1, a2, a3, a4 5个元素 ,下标从0 4 注意: 在Turbo C 中超过定义的数组下标元素是可以引用的,系统不作检查。,2,例T7-0-1.c main( ) int i, a5; for(i=0;i=4;i+) printf (“a%d=%d n”,i,ai=i+1); printf (“a5=%dt”,a5); printf (“a6=%d n”,a6); ,运行结果: a0=1 a1=2 a2=3 a3=4 a4=5 a5=-30 a6=285,
3、3,4.数组大小的定义只能是常量,而不能是变量或动态地定义。 例7-0-2. C main( ) int n=5,an; a1=100; printf (“a1=%dn”,a1); 编译指出:constant expression required in function main (主函数中要求常量表达式),4,7.1.2 一维数组元素的引用 引用规则:1.先定义,后使用。 2.引用形式:数组名下标 下标可以是整、字符 型的常量、变量或表达式。 3.引用方法:针对元素而不是整个数组。 如:a0=ab - a + a b -96 +a3 - a2*2 例T7-1. C 对数组a 顺序赋值,逆序
4、输出 main( ) int a5,i; for(i=0; i=0;i- -) printf( “a%d=%dn”, i, ai ); ,运行结果: a4=4 a3=3 a2=2 a1=1 a0=0,5,7.1.3 一维数组的初始化 实现的方法有: 1.定义时对数组元素初始化 如: int a5=1, 2, 3, 4, 5; 2. 只给部分元素赋值 如: int a5=1, 3, 5; 3. 初始化时给全部元素赋0值 如:int a5=0,0,0,0,0; 或 int a5=0; 4. 对全部元素赋初值时可以不指出长度 如:int a5=2,4,6,8,10; 或 int a =2,4,6,8
5、,10; 效果一样。,6,例T7-1-1.c 定义时对数组元素初始化 main( ) int i; int a5=2,4,6,8,10; for(i=0;i=4;i+) printf(“%dn”,ai); 注意:static 存储类别,这和新ANSI新标准一致, 若采用static,数组元素的值被存储在静态区。,运行结果: 2 4 6 8 10,7,7.1.4 一维数组程序举例 例T7-2.c 求Fibonacci 数列问题 关于菲波那契算法:头两个数各为1, 以后的每个数皆为前两个数之和。 main( ) int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2
6、+fi-1; for(i=0;i20;i+) if(i%5=0) printf (“ n” ); printf (“%12d”,fi; ,运行结果: 1 1 2 3 5 8 13 21 34 55 144 233 377 610 987 1597 2584 4181 6765,8,例T7-3.c 用起泡法对6个数排序(由小到大),思路:将相邻两数两两比较,若小则调到前头,不小也要比较,第一轮大数沉底 第二轮 第三轮 第四轮 第五轮,此处:n=6,外层循环j(1n-1)次 内层循环i (1n-j)次,9 8 8 8 8 8,8 9 5 5 5 5,5 5 9 4 4 4,4 4 4 9 2 2,
7、2 2 2 2 9 0,0 0 0 0 0 9,8 5 5 5 5,5 8 4 4 4,4 4 8 2 2,2 2 2 8 0,0 0 0 0 8,5 4 4 4,4 5 2 2,2 2 5 0,0 0 0 5,4 2 2,2 4 0,0 0 4,2 0,0 2,9,10,main( ) int a7; int i, j , t; printf (“input 6 numbers: n”); for(i=1;iai+1) t=ai;ai=ai+1;ai+1=t; printf (“the sorted numbers: n”); for(i=1;i7;i+) printf(“%d _ _”,a
8、i); ,运行:input 6 numbers: 输入:9 8 5 4 2 0 输出:0 2 4 5 8 9,11,12,7.2 二维数组的定义和引用 7.2.1 二维数组的定义 1.一般形式:类型说明符 数组名常量表达式常量表达式 如:float a34 定义数组a具有三行四列 在C中,可将二维数组看着是特殊形式的一维数组。 如上述定义可看着是具有三个元素的一维数组,而每个元素又可看作是包含四个元素的一维数组。 因此,上述定义相当于: float a04, a14, a24 注 :实际应用时若如此定义则被认为是重定义。 2.二维数组各个元素在内存中的存放顺序是: 按先行后列的顺序依次存放,1
9、3,例T7-3-1.c main( ) int i, j, a23; for(i=0; i2; i+) for(j=0; j3; j+) scanf(“%d”, ,输入:1 3 5 7 9 11 输出: float a23,k; for(i=0;i2;i+) for(j=0;j3;j+) scanf(%f, ,for(j=0;j3;j+) scanf(“%f%f”, 共24个元素,在内存中排列的顺序是:第三维变化最快,然后是第二维,第一维最慢。,16,7.2.2 二维数组的引用 形式:数组名下标下标 其中:下标是整型或字符型的常量,变量或表达式。(定义时不能使用变量) 如: a12 aij 1
10、.数组元素可出现在表达式中,如: a12=a22/2 2.使用数组元素时,应注意不要超出其定义的范围; 如: int a23; a23=5;,17,7.2.3 二维数组的初始化 1.按行给二维数组赋初值 如: int a23=1,2,3,4,5,6; 2.按数组元素排列的顺序赋初值 如:int a23=1,2,3,4,5,6; 3.对部分元素赋初值,按行赋值较直观 如:int a23=2,5,3;,18,4.全部元素赋值时,第一维下标可省略 如: int a 3=1,2,3,4,5,6; 又如:int a 4=0,0,3,0,0,10;,19,7.2.4 二维数组程序举例 例T7-4 将一个二
11、维数组的行和列元素互换,存到另一个二维数组中 。,20,T7-4.c两数组行列互换 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+) printf(“%4d”, aij); bji=aij; printf( n”); printf(“array b: n”); for(i=0;i=2; i+) for(j=0;j=1;j+) printf(“%4d”,bij); printf(“ n”); ,21,例T7-5.c 有3 4矩阵,求出其中最大元素所在的行号和
12、列号 main( ) int i, j, r=0,c=0, max; int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for(i=0;imax) max=aij; r=i;c=j printf(“max=%d,row=%d, colum=%dn”,max,r,c); ,运行结果: max=10,row=2,colum=1 问题:在比较前 为什么要把a00赋给max?,22,23,7.3 字符数组 字符型数组:用于存放字符型数据。 一维字符数组:存放一个字符串(每个数组元素存放一个字符) 二维字符数组:存放多个字符串(行数是字符串的个数) 7.3.1
13、字符数组的定义 形式:char 数组名常量表达式 char 数组名常量表达式常量表达式 常量表达式:整、字符、符号常量。 例: char a5; a0=C; a1=H;a2=I; a3=N; a4=A;,24,7.3.2 字符数组的初始化 如:char a5=C, H, I, N, A; char b5=C, H, I, N, W, U; 编译时将指出:初始化值太多 char c5=C, H, I; char d =C, H, I, N, A 系统自动确认其长度为5,25,7.3.3 字符数组的引用 例T7-6.c 输出一个字符串 main( ) char c10=I, _, a, m, _,
14、 h, a, p, p, y; int i; for(i=0;i10;i+)printf(“%c”, ci); print(“ n”); ,运行结果: I_am_happy,26,T7-7.C输出一个钻石图 main() char diamond5= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; int i; int j; for (i=0;i5;i+) for(j=0;j5;j+) printf(%c,diamondij); printf(n); ,27,7.3.4 字符串和字符串结束标志 几点说明: (1)字符串:用双引号括起的若干字符,可将其存放在一维或两
15、维字符型数组中。 (2)字符串结束标志为: 0 (既无动作,又不显示) (3)字符串的长度:第一个 0以前字符的个数,28,(4)在字符型数组或字符串中遇 0,即认为该字符结束; (5)字符串可对字符型数组初始化 如:char c =“ I_am_happy” ; 系统自动在数组的最后加了 0 ,长度为11 或char c =“ I_am_happy”; 系统自动在数组的最后加了 0 ,长度为11,29,相当于 c = I,_,a,m,_,h,a,p,p,y, 0; 而 char c10=“CHINA ” 注意:字符 0 并不一定都在字符数组的后面,输出时遇到第一个 0 结束; 例T7-7-1
16、.c main( ) char a = a, b, 0, 1, 2; char b =“ab 0cd” ; printf (“%s n%s n”, a,b); ,运行结果: a b a b,30,7.3.5 字符数组的输入输出 1.字符数组的输出:,31,例T7-7-2.c main( ) int i; char a10= “CHINA” ; char b18=“CHINA 0CHINA 0CHINA” ; for(i=0;i10;i+) printf(“%c”,ai); printf (“ n”); printf (“%s n”,a); for(i=0;i18;i+) printf (“%c
17、”, bi); printf(“ n”); printf (“%sn”,b); ,运行结果: CHINA CHINA CHINA_CHINA_CHINA CHINA,32,注意: (1)%s格式输出时,遇第一个 0时结束; (2)%c格式输出时,按指定的长度输出,当遇 0 时输出_ ; (3)%s格式输出字符型数组元素时, 如printf (“%s” , a2); 编译时虽然无错,但输出的是不可确定的字符,因此,这里必须是数组名; 2.字符数组的输入 形式: scanf (“ %s” , a); 其中:a是一个已被定义的字符型的数组名,字符数组名前不加地址运算符 ,scanf (“%s%s%s
18、”,a1, a2, a3);,printf(“a1=%s na2=%s na3=%s n”,a1, a2, a3);,printf (“,printf (“,printf (“,说明:,(1)用scanf函数输入 多个字符串时,可用_, , Tab分隔。 (2)在printf 函数中,用%s打印字符型数组的内容;而用%x,或%o可打印字符型数组的地址。,输入:,how_are_you?,输出:a1=how,a2=are,a3=you?, char a2 =“china 0beijing” ; puts(a1); puts(a2); puts(“WUHAN” ); ,运行结果: china be
19、ijing china WUHAN,这里是将 0 n 因此光标移 到下行,35,2. 字符串输入函数 形式: gets(字符数组) 功能: 从键盘输入一个字符串到字符数组。 在输入过程中,遇“” 结束,并将其转换为 0 存入字符串尾部,对输入的_, Tab 作为字符存入字符型数组中。,36,例T7-7-5.c 用gets 和scanf 函数分别输入字符串, 在scanf 中遇_ 字符串便结束了, 而gets 中,却将_ 作为字符存入字符型 数组中。 main( ) char a115, a215 ; gets(a1); scanf(“%s”,a2); printf (“a1=%s n”,a1)
20、; printf (“a2=%s n”,a2); ,输入:china_beijing china_beijing 输出:a1=china_beijing a2=china,37,3.字符串连接函数 形式: strcat(字符数组1,字符数组2) 功能: 连接两个数组中的字符串。 操作: 把字符数组2 (串2)中的内容连接到字符数组1的后面,结果是两串相加存放到字符数组1中,使用时要考虑字符数组1的容量要足够大。,38,例T7-7-6.c,main( ),char str130=“Peoples_Republic_of_” ;,char str2 =“china” ;,printf(“%s n”
21、, strcat(str1, str2);,i,a,h,n,l,e,-,e,o,p,l,s,i,c,-,o,f,-,l,e,-,o,p,l,e,p,u,i,c,-,o,f,-,n,a,39,4.字符串拷贝函数 形式:strcpy(字符数组1,字符数组2) 功能:将字符串2(也可以是字符数组)拷贝到字符数组1中,字符数组1中原来的内容被覆盖。 例T7-7-7.c main( ) char a18, a2 =“ china”, a3 =“wuhan” ; strcpy(a1, a2); strcpy(a2, a3); strcpy(a3, “ beijing” ); printf(“a1=%s n
22、a2=%s na3=%s n”, a1,a2,a3); ,运行结果: a1=china a2=wuhan a3=beijing,40,注意: (1)字符串拷贝不能用赋值语句“=”; 如:char a110,a210=“china”; a1=a2; 只能用strcpy(a1,a2); (2)字符数组的元素可用赋值语句, 如:a11=a21; (2)字符数组初始化时可用“=” ,其它地方对字符数组赋值时不能用“=”;,41,5.字符串比较函数 形式:strcmp(字符串1,字符串2) 功能:两串按Ascii码值从左向右逐个比较,直到出现不同字符或 0 为止; 比较结果: (1)串1 = = 串2 返回值为0 (2)串1 串2 返回值为正数 其值是Ascii码的差值 (3)串1 串2 返回值为负数 其值也是Ascii码的差值,42,例T7-7-8.c main( ) int i,j,k; char a1 =“wuhan”, a2 =“beijing” ; i=strcmp(a1,a2); j=strcmp(“china”, “korea”); k=strcmp(a2, “beijing” ); printf(“i=%d nj=%d nk=%d n”,i,j,k
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 主管年度工作计划安排目标
- 跨国公司品牌管理的难点与对策计划
- 订购合同范本封面
- 杭州房屋托管合同范本
- 2024年票务服务项目规划申请报告
- 品牌形象的多维构建计划
- 2024年低噪声对旋式局部通风机合作协议书
- 品牌与社会发展的协同作用计划
- 基于地域文化的品牌策略探索计划
- 广东省韶关市(2024年-2025年小学五年级语文)人教版期末考试((上下)学期)试卷及答案
- GB/T 19633.2-2024最终灭菌医疗器械包装第2部分:成型、密封和装配过程的确认的要求
- 信息技术知识点
- 小班幼儿优势分析总结与反思
- 养老机构照护机构长期护理服务安全风险评估、风险防范记录表1-3-5
- 信息化工程分包合同范本
- FZ∕T 71006-2021 山羊绒针织绒线
- 消防培训四懂四会
- 慢性创面的治疗及护理课件
- 第9课发展全过程人民民主(课件+视频)(高教版2023·基础模块)
- 高考高中语文必背古诗文72篇-必考古诗词全总结
- 2024年物业行业职业技能竞赛(物业管理员赛项)考试题库500题(含答案)
评论
0/150
提交评论